From 9e992d521d61de832f657e4e5da70f5d7e725cad Mon Sep 17 00:00:00 2001 From: "Documenter.jl" Date: Wed, 7 Feb 2024 10:16:11 +0000 Subject: [PATCH] build based on 4ece0b8 --- stable | 2 +- v2 | 2 +- v2.10 | 2 +- v2.10.1/.documenter-siteinfo.json | 1 + v2.10.1/api/aggregation/index.html | 62 ++ v2.10.1/api/bags/index.html | 25 + v2.10.1/api/data_nodes/index.html | 128 +++ v2.10.1/api/model_nodes/index.html | 165 +++ v2.10.1/api/special_arrays/index.html | 184 ++++ v2.10.1/api/switches/index.html | 2 + v2.10.1/api/utilities/index.html | 106 ++ v2.10.1/assets/bagmodel-dark.svg | 225 ++++ v2.10.1/assets/bagmodel.svg | 250 +++++ v2.10.1/assets/custom.css | 46 + v2.10.1/assets/dag.svg | 67 ++ v2.10.1/assets/documenter.js | 889 +++++++++++++++ v2.10.1/assets/favicon.ico | Bin 0 -> 312931 bytes v2.10.1/assets/favicon.svg | 99 ++ v2.10.1/assets/graph.svg | 59 + v2.10.1/assets/iris-dark.svg | 422 ++++++++ v2.10.1/assets/iris.svg | 437 ++++++++ v2.10.1/assets/iris2-dark.svg | 1012 ++++++++++++++++++ v2.10.1/assets/iris2.svg | 1130 ++++++++++++++++++++ v2.10.1/assets/logo-dark.svg | 110 ++ v2.10.1/assets/logo.svg | 106 ++ v2.10.1/assets/logo_simple.svg | 20 + v2.10.1/assets/productmodel-dark.svg | 261 +++++ v2.10.1/assets/productmodel.svg | 267 +++++ v2.10.1/assets/themes/documenter-dark.css | 7 + v2.10.1/assets/themes/documenter-light.css | 9 + v2.10.1/assets/themeswap.js | 84 ++ v2.10.1/assets/warner.js | 52 + v2.10.1/citation/index.html | 14 + v2.10.1/examples/dag/index.html | 31 + v2.10.1/examples/gnn/index.html | 50 + v2.10.1/examples/jsons/index.html | 9 + v2.10.1/examples/musk/Manifest.toml | 918 ++++++++++++++++ v2.10.1/examples/musk/Project.toml | 8 + v2.10.1/examples/musk/musk.ipynb | 429 ++++++++ v2.10.1/examples/musk/musk.jl | 34 + v2.10.1/examples/musk/musk.jld | Bin 0 -> 200275 bytes v2.10.1/examples/musk/musk.jld2 | Bin 0 -> 336068 bytes v2.10.1/examples/musk/musk/index.html | 101 ++ v2.10.1/examples/musk/musk_literate.jl | 78 ++ v2.10.1/index.html | 3 + v2.10.1/manual/aggregation/index.html | 47 + v2.10.1/manual/custom/index.html | 60 ++ v2.10.1/manual/leaf_data/index.html | 111 ++ v2.10.1/manual/missing/index.html | 73 ++ v2.10.1/manual/more_on_nodes/index.html | 86 ++ v2.10.1/manual/nodes/index.html | 61 ++ v2.10.1/manual/reflectin/index.html | 104 ++ v2.10.1/motivation/index.html | 4 + v2.10.1/references/index.html | 2 + v2.10.1/search_index.js | 3 + v2.10.1/siteinfo.js | 1 + v2.10.1/tools/hierarchical/index.html | 83 ++ versions.js | 2 +- 58 files changed, 8539 insertions(+), 4 deletions(-) create mode 100644 v2.10.1/.documenter-siteinfo.json create mode 100644 v2.10.1/api/aggregation/index.html create mode 100644 v2.10.1/api/bags/index.html create mode 100644 v2.10.1/api/data_nodes/index.html create mode 100644 v2.10.1/api/model_nodes/index.html create mode 100644 v2.10.1/api/special_arrays/index.html create mode 100644 v2.10.1/api/switches/index.html create mode 100644 v2.10.1/api/utilities/index.html create mode 100644 v2.10.1/assets/bagmodel-dark.svg create mode 100644 v2.10.1/assets/bagmodel.svg create mode 100644 v2.10.1/assets/custom.css create mode 100644 v2.10.1/assets/dag.svg create mode 100644 v2.10.1/assets/documenter.js create mode 100644 v2.10.1/assets/favicon.ico create mode 100644 v2.10.1/assets/favicon.svg create mode 100644 v2.10.1/assets/graph.svg create mode 100644 v2.10.1/assets/iris-dark.svg create mode 100644 v2.10.1/assets/iris.svg create mode 100644 v2.10.1/assets/iris2-dark.svg create mode 100644 v2.10.1/assets/iris2.svg create mode 100644 v2.10.1/assets/logo-dark.svg create mode 100644 v2.10.1/assets/logo.svg create mode 100644 v2.10.1/assets/logo_simple.svg create mode 100644 v2.10.1/assets/productmodel-dark.svg create mode 100644 v2.10.1/assets/productmodel.svg create mode 100644 v2.10.1/assets/themes/documenter-dark.css create mode 100644 v2.10.1/assets/themes/documenter-light.css create mode 100644 v2.10.1/assets/themeswap.js create mode 100644 v2.10.1/assets/warner.js create mode 100644 v2.10.1/citation/index.html create mode 100644 v2.10.1/examples/dag/index.html create mode 100644 v2.10.1/examples/gnn/index.html create mode 100644 v2.10.1/examples/jsons/index.html create mode 100644 v2.10.1/examples/musk/Manifest.toml create mode 100644 v2.10.1/examples/musk/Project.toml create mode 100644 v2.10.1/examples/musk/musk.ipynb create mode 100644 v2.10.1/examples/musk/musk.jl create mode 100644 v2.10.1/examples/musk/musk.jld create mode 100644 v2.10.1/examples/musk/musk.jld2 create mode 100644 v2.10.1/examples/musk/musk/index.html create mode 100644 v2.10.1/examples/musk/musk_literate.jl create mode 100644 v2.10.1/index.html create mode 100644 v2.10.1/manual/aggregation/index.html create mode 100644 v2.10.1/manual/custom/index.html create mode 100644 v2.10.1/manual/leaf_data/index.html create mode 100644 v2.10.1/manual/missing/index.html create mode 100644 v2.10.1/manual/more_on_nodes/index.html create mode 100644 v2.10.1/manual/nodes/index.html create mode 100644 v2.10.1/manual/reflectin/index.html create mode 100644 v2.10.1/motivation/index.html create mode 100644 v2.10.1/references/index.html create mode 100644 v2.10.1/search_index.js create mode 100644 v2.10.1/siteinfo.js create mode 100644 v2.10.1/tools/hierarchical/index.html diff --git a/stable b/stable index 1f38bc0e..d43f5946 120000 --- a/stable +++ b/stable @@ -1 +1 @@ -v2.10.0 \ No newline at end of file +v2.10.1 \ No newline at end of file diff --git a/v2 b/v2 index 1f38bc0e..d43f5946 120000 --- a/v2 +++ b/v2 @@ -1 +1 @@ -v2.10.0 \ No newline at end of file +v2.10.1 \ No newline at end of file diff --git a/v2.10 b/v2.10 index 1f38bc0e..d43f5946 120000 --- a/v2.10 +++ b/v2.10 @@ -1 +1 @@ -v2.10.0 \ No newline at end of file +v2.10.1 \ No newline at end of file diff --git a/v2.10.1/.documenter-siteinfo.json b/v2.10.1/.documenter-siteinfo.json new file mode 100644 index 00000000..e78d053d --- /dev/null +++ b/v2.10.1/.documenter-siteinfo.json @@ -0,0 +1 @@ +{"documenter":{"julia_version":"1.10.0","generation_timestamp":"2024-02-07T10:16:07","documenter_version":"1.2.1"}} \ No newline at end of file diff --git a/v2.10.1/api/aggregation/index.html b/v2.10.1/api/aggregation/index.html new file mode 100644 index 00000000..d533bf1e --- /dev/null +++ b/v2.10.1/api/aggregation/index.html @@ -0,0 +1,62 @@ + +Aggregation · Mill.jl

Aggregation

Index

API

Mill.AggregationStackType
AggregationStack{T <: Tuple{Vararg{AbstractAggregation}}} <: AbstractAggregation

A container that implements a concatenation of one or more AbstractAggregations.

Construct with e.g. AggregationStack(SegmentedMean([t::Type, ]d)) for single operators and with e.g. SegmentedPNormLSE([t::Type, ]d) for concatenations. With these calls all parameters inside operators are initialized randomly as Float32 arrays, unless type t is further specified. Another option is to vcat two operators together.

Nested stacks are flattened into a single-level structure upon construction, see examples.

Intended to be used as a functor:

(a::AggregationStack)(x, bags[, w])

where x is either AbstractMatrix or missing, bags is AbstractBags structure and optionally w is an AbstractVector of weights.

Examples

julia> a = AggregationStack(SegmentedMean(2), SegmentedMax(2))
+AggregationStack:
+ SegmentedMean(ψ = Float32[0.0, 0.0])
+ SegmentedMax(ψ = Float32[0.0, 0.0])
+
+julia> a(Float32[0 1 2; 3 4 5], bags([1:1, 2:3]))
+4×2 Matrix{Float32}:
+ 0.0  1.5
+ 3.0  4.5
+ 0.0  2.0
+ 3.0  5.0
+
+julia> a = AggregationStack(SegmentedMean(2), AggregationStack(SegmentedMax(2)))
+AggregationStack:
+ SegmentedMean(ψ = Float32[0.0, 0.0])
+ SegmentedMax(ψ = Float32[0.0, 0.0])
+
+julia> a = SegmentedMeanMax(Float32, 2)
+AggregationStack:
+ SegmentedMean(ψ = Float32[0.0, 0.0])
+ SegmentedMax(ψ = Float32[0.0, 0.0])
+
+julia> vcat(SegmentedMean(2), SegmentedMax(2))
+AggregationStack:
+ SegmentedMean(ψ = Float32[0.0, 0.0])
+ SegmentedMax(ψ = Float32[0.0, 0.0])
+

See also: AbstractAggregation, SegmentedSum, SegmentedMax, SegmentedMean, SegmentedPNorm, SegmentedLSE.

source
Mill.SegmentedPNormType
SegmentedPNorm{V <: AbstractVector{<:AbstractFloat}} <: AbstractAggregation

AbstractAggregation implementing segmented p-norm aggregation:

$f(\{x_1, \ldots, x_k\}; p, c) = \left(\frac{1}{k} \sum_{i = 1}^{k} \vert x_i - c \vert ^ {p} \right)^{\frac{1}{p}}$

Stores a vector of parameters ψ that are filled into the resulting matrix in case an empty bag is encountered, and vectors of parameters p and c used during computation.

See also: AbstractAggregation, AggregationStack, SegmentedMax, SegmentedMean, SegmentedSum, SegmentedLSE.

source
Mill.SegmentedLSEType
SegmentedLSE{V <: AbstractVector{<:AbstractFloat}} <: AbstractAggregation

AbstractAggregation implementing segmented log-sum-exp (LSE) aggregation:

$f(\{x_1, \ldots, x_k\}; r) = \frac{1}{r}\log \left(\frac{1}{k} \sum_{i = 1}^{k} \exp({r\cdot x_i})\right)$

Stores a vector of parameters ψ that are filled into the resulting matrix in case an empty bag is encountered, and a vector of parameters r used during computation.

See also: AbstractAggregation, AggregationStack, SegmentedMax, SegmentedMean, SegmentedSum, SegmentedPNorm.

source
Mill.SegmentedMeanMaxFunction
SegmentedMeanMax([t::Type, ]d::Int)

Construct AggregationStack consisting of SegmentedMean and SegmentedMax operators.

Examples

julia> SegmentedMeanMax(4)
+AggregationStack:
+ SegmentedMean(ψ = Float32[0.0, 0.0, 0.0, 0.0])
+ SegmentedMax(ψ = Float32[0.0, 0.0, 0.0, 0.0])
+
+julia> SegmentedMeanMax(Float64, 2)
+AggregationStack:
+ SegmentedMean(ψ = [0.0, 0.0])
+ SegmentedMax(ψ = [0.0, 0.0])

See also: AbstractAggregation, AggregationStack, SegmentedSum, SegmentedMax, SegmentedMean, SegmentedPNorm, SegmentedLSE.

source
Mill.BagCountType
BagCount{T <: AbstractAggregation}

A wrapper type that when called applies the AbstractAggregation stored in it, and appends one more element containing bag size after $x ↦ \log(x + 1)$ transformation to the result.

Used as a functor:

(bc::BagCount)(x, bags[, w])

where x is either AbstractMatrix or missing, bags is AbstractBags structure and optionally w is an AbstractVector of weights.

Examples

julia> x = Float32[0 1 2; 3 4 5]
+2×3 Matrix{Float32}:
+ 0.0  1.0  2.0
+ 3.0  4.0  5.0
+
+julia> b = bags([1:1, 2:3])
+AlignedBags{Int64}(UnitRange{Int64}[1:1, 2:3])
+
+julia> a = vcat(SegmentedMean(2), SegmentedMax(2))
+AggregationStack:
+ SegmentedMean(ψ = Float32[0.0, 0.0])
+ SegmentedMax(ψ = Float32[0.0, 0.0])
+
+julia> a(x, b)
+4×2 Matrix{Float32}:
+ 0.0  1.5
+ 3.0  4.5
+ 0.0  2.0
+ 3.0  5.0
+
+julia> BagCount(a)(x, b)
+5×2 Matrix{Float32}:
+ 0.0       1.5
+ 3.0       4.5
+ 0.0       2.0
+ 3.0       5.0
+ 0.693147  1.09861

See also: AbstractAggregation, AggregationStack, SegmentedSum, SegmentedMax, SegmentedMean, SegmentedPNorm, SegmentedLSE.

source
diff --git a/v2.10.1/api/bags/index.html b/v2.10.1/api/bags/index.html new file mode 100644 index 00000000..1a00ac66 --- /dev/null +++ b/v2.10.1/api/bags/index.html @@ -0,0 +1,25 @@ + +Bags · Mill.jl

Bags

Index

API

Mill.AlignedBagsType
AlignedBags{T <: Integer} <: AbstractBags{T}

AlignedBags struct stores indices of bags' instances in one or more UnitRange{T}s. This is only possible if instances of every bag are stored in one contiguous block.

See also: ScatteredBags.

source
Mill.AlignedBagsMethod
AlignedBags()

Construct a new AlignedBags struct containing no bags.

Examples

julia> AlignedBags()
+AlignedBags{Int64}(UnitRange{Int64}[])
source
Mill.AlignedBagsMethod
AlignedBags(bags::UnitRange{<:Integer}...)

Construct a new AlignedBags struct from bags in arguments.

Examples

julia> AlignedBags(1:3, 4:8)
+AlignedBags{Int64}(UnitRange{Int64}[1:3, 4:8])
source
Mill.AlignedBagsMethod
AlignedBags(k::Vector{<:Integer})

Construct a new AlignedBags struct from Vector k specifying the index of the bag each instance belongs to. Throws ArgumentError if this is not possible.

Examples

julia> AlignedBags([1, 1, 2, 2, 2, 4])
+AlignedBags{Int64}(UnitRange{Int64}[1:2, 3:5, 0:-1, 6:6])
source
Mill.ScatteredBagsMethod
ScatteredBags(k::Vector{<:Integer})

Construct a new ScatteredBags struct from Vector k specifying the index of the bag each instance belongs to.

Examples

julia> ScatteredBags([2, 2, 1, 1, 1, 3])
+ScatteredBags{Int64}([[3, 4, 5], [1, 2], [6]])
source
Mill.length2bagsFunction
length2bags(ls::Vector{<:Integer})

Convert lengths of bags given in ls to AlignedBags with contiguous blocks.

Examples

julia> length2bags([1, 3, 2])
+AlignedBags{Int64}(UnitRange{Int64}[1:1, 2:4, 5:6])

See also: AlignedBags.

source
Mill.bagsFunction
bags(k::Vector{<:Integer})
+bags(k::Vector{T}) where T <: UnitRange{<:Integer}
+bags(b::AbstractBags)

Construct an AbstractBags structure that is most suitable for the input (AlignedBags if possible, ScatteredBags otherwise).

Examples

julia> bags([1, 1, 3])
+AlignedBags{Int64}(UnitRange{Int64}[1:2, 0:-1, 3:3])
+
+julia> bags([2, 3, 1, 2])
+ScatteredBags{Int64}([[3], [1, 4], [2]])
+
+julia> bags([1:3, 4:5])
+AlignedBags{Int64}(UnitRange{Int64}[1:3, 4:5])
+
+julia> bags(ScatteredBags())
+ScatteredBags{Int64}(Vector{Int64}[])

See also: AlignedBags, ScatteredBags.

source
Mill.remapbagsFunction
remapbags(b::AbstractBags, idcs::VecOrRange{<:Integer}) -> (rb, I)

Select a subset of bags in b corresponding to indices idcs and remap instance indices appropriately. Return new bags rb as well as a Vector of remapped instances I.

Examples

julia> remapbags(AlignedBags([1:1, 2:3, 4:5]), [1, 3])
+(AlignedBags{Int64}(UnitRange{Int64}[1:1, 2:3]), [1, 4, 5])
+
+julia> remapbags(ScatteredBags([[1,3], [2], Int[]]), [2])
+(ScatteredBags{Int64}([[1]]), [2])
source
Mill.adjustbagsFunction
adjustbags(b::AlignedBags, mask::AbstractVector{Bool})

Remove indices of instances brom bags b and remap the remaining instances accordingly.

Examples

julia> adjustbags(AlignedBags([1:2, 0:-1, 3:4]), [false, false, true, true])
+AlignedBags{Int64}(UnitRange{Int64}[0:-1, 0:-1, 1:2])
source
diff --git a/v2.10.1/api/data_nodes/index.html b/v2.10.1/api/data_nodes/index.html new file mode 100644 index 00000000..37d80ccf --- /dev/null +++ b/v2.10.1/api/data_nodes/index.html @@ -0,0 +1,128 @@ + +Data nodes · Mill.jl

Data nodes

Index

API

Mill.AbstractProductNodeType
AbstractProductNode <: AbstractMillNode

Supertype for any structure representing a data node implementing a Cartesian product of data in subtrees.

source
Mill.AbstractBagNodeType
AbstractBagNode <: AbstractMillNode

Supertype for any data node structure representing a multi-instance learning problem.

source
Mill.ArrayNodeType
ArrayNode{A <: AbstractArray, C} <: AbstractMillNode

Data node for storing array-like data of type A and metadata of type C. The convention is that samples are stored along the last axis, e.g. in columns of a matrix.

See also: AbstractMillNode, ArrayModel.

source
Mill.BagNodeMethod
BagNode(d, b, m=nothing)

Construct a new BagNode with data d, bags b, and metadata m.

d is either an AbstractMillNode or missing. Any other type is wrapped in an ArrayNode.

If b is an AbstractVector, Mill.bags is applied first.

Examples

julia> BagNode(ArrayNode(maybehotbatch([1, missing, 2], 1:2)), AlignedBags([1:1, 2:3]))
+BagNode  # 2 obs, 104 bytes
+  ╰── ArrayNode(2×3 MaybeHotMatrix with Union{Missing, Bool} elements)  # 3 obs, 87 bytes
+
+julia> BagNode(randn(2, 5), [1, 2, 2, 1, 1])
+BagNode  # 2 obs, 200 bytes
+  ╰── ArrayNode(2×5 Array with Float64 elements)  # 5 obs, 128 bytes

See also: WeightedBagNode, AbstractBagNode, AbstractMillNode, BagModel.

source
Mill.WeightedBagNodeMethod
WeightedBagNode(d, b, w::Vector, m=nothing)

Construct a new WeightedBagNode with data d, bags b, vector of weights w and metadata m.

d is either an AbstractMillNode or missing. Any other type is wrapped in an ArrayNode.

If b is an AbstractVector, Mill.bags is applied first.

Examples

julia> WeightedBagNode(ArrayNode(NGramMatrix(["s1", "s2"])), bags([1:2, 0:-1]), [0.2, 0.8])
+WeightedBagNode  # 2 obs, 184 bytes
+  ╰── ArrayNode(2053×2 NGramMatrix with Int64 elements)  # 2 obs, 140 bytes
+
+julia> WeightedBagNode(zeros(2, 2), [1, 2], [1, 2])
+WeightedBagNode  # 2 obs, 160 bytes
+  ╰── ArrayNode(2×2 Array with Float64 elements)  # 2 obs, 80 bytes

See also: BagNode, AbstractBagNode, AbstractMillNode, BagModel.

source
Mill.ProductNodeMethod
ProductNode(dss, m=nothing)
+ProductNode(m=nothing; dss...)

Construct a new ProductNode with data dss, and metadata m.

dss should be a Tuple or NamedTuple and all its elements must contain the same number of observations.

If any element of dss is not an AbstractMillNode it is first wrapped in an ArrayNode.

Examples

julia> ProductNode((ArrayNode(zeros(2, 2)), ArrayNode(Flux.onehotbatch([1, 2], 1:2))))
+ProductNode  # 2 obs, 24 bytes
+  ├── ArrayNode(2×2 Array with Float64 elements)  # 2 obs, 80 bytes
+  ╰── ArrayNode(2×2 OneHotArray with Bool elements)  # 2 obs, 80 bytes
+
+julia> ProductNode(x1 = ArrayNode(NGramMatrix(["Hello", "world"])),
+                   x2 = BagNode(ArrayNode([1 2; 3 4]), [1:2, 0:-1]))
+ProductNode  # 2 obs, 48 bytes
+  ├── x1: ArrayNode(2053×2 NGramMatrix with Int64 elements)  # 2 obs, 146 bytes
+  ╰── x2: BagNode  # 2 obs, 96 bytes
+            ╰── ArrayNode(2×2 Array with Int64 elements)  # 2 obs, 80 bytes
+
+julia> ProductNode([1 2 3])
+ProductNode  # 3 obs, 8 bytes
+  ╰── ArrayNode(1×3 Array with Int64 elements)  # 3 obs, 72 bytes
+
+julia> ProductNode((ArrayNode([1 2; 3 4]), ArrayNode([1 2 3; 4 5 6])))
+ERROR: AssertionError: All subtrees must have an equal amount of instances!
+[...]

See also: AbstractProductNode, AbstractMillNode, ProductModel.

source
Mill.LazyNodeMethod
LazyNode([Name::Symbol], d, m=nothing)
+LazyNode{Name}(d, m=nothing)

Construct a new LazyNode with name Name, data d, and metadata m.

Examples

julia> LazyNode(:Codons, ["GGGCGGCGA", "CCTCGCGGG"])
+LazyNode{:Codons, Vector{String}, Nothing}:
+ "GGGCGGCGA"
+ "CCTCGCGGG"

See also: AbstractMillNode, LazyModel, Mill.unpack2mill.

source
Mill.unpack2millFunction
Mill.unpack2mill(x::LazyNode)

Return a representation of LazyNode x using Mill.jl structures. Every custom LazyNode should have a special method as it is used in LazyModel.

Examples

julia> function Mill.unpack2mill(ds::LazyNode{:Sentence})
+    s = split.(ds.data, " ")
+    x = NGramMatrix(reduce(vcat, s))
+    BagNode(x, Mill.length2bags(length.(s)))
+end;
julia> LazyNode{:Sentence}(["foo bar", "baz"]) |> Mill.unpack2mill
+BagNode  # 2 obs, 120 bytes
+  ╰── ArrayNode(2053×3 NGramMatrix with Int64 elements)  # 3 obs, 274 bytes

See also: LazyNode, LazyModel.

source
Mill.dataFunction
Mill.data(n::AbstractMillNode)

Return data stored in node n.

Examples

julia> Mill.data(ArrayNode([1 2; 3 4], "metadata"))
+2×2 Matrix{Int64}:
+ 1  2
+ 3  4
+
+julia> Mill.data(BagNode(ArrayNode([1 2; 3 4]), [1, 2], "metadata"))
+2×2 ArrayNode{Matrix{Int64}, Nothing}:
+ 1  2
+ 3  4

See also: Mill.metadata

source
Mill.metadataFunction
Mill.metadata(n::AbstractMillNode)

Return metadata stored in node n.

Examples

julia> Mill.metadata(ArrayNode([1 2; 3 4], "metadata"))
+"metadata"
+
+julia> Mill.metadata(BagNode(ArrayNode([1 2; 3 4]), [1, 2], "metadata"))
+"metadata"

See also: Mill.data

source
Mill.datasummaryFunction
datasummary(n::AbstractMillNode)

Print summary of parameters of node n.

Examples

julia> n = ProductNode(ArrayNode(randn(2, 3)))
+ProductNode  # 3 obs, 8 bytes
+  ╰── ArrayNode(2×3 Array with Float64 elements)  # 3 obs, 96 bytes
+
+julia> datasummary(n)
+"Data summary: 3 obs, 112 bytes."

See also: modelsummary.

source
Mill.dropmetaFunction
dropmeta(n:AbstractMillNode)

Drop metadata stored in data node n (recursively).

Examples

julia> n1 = ArrayNode(NGramMatrix(["foo", "bar"]), ["metafoo", "metabar"])
+2053×2 ArrayNode{NGramMatrix{String, Vector{String}, Int64}, Vector{String}}:
+ "foo"
+ "bar"
+
+julia> n2 = dropmeta(n1)
+2053×2 ArrayNode{NGramMatrix{String, Vector{String}, Int64}, Nothing}:
+ "foo"
+ "bar"
+
+julia> isnothing(Mill.metadata(n2))
+true

See also: Mill.metadata.

source
Mill.catobsFunction
catobs(ns...)

Merge multiple nodes storing samples (observations) into one suitably promoting in the process if possible.

Similar to Base.cat but concatenates along the abstract "axis" where samples are stored.

In case of repeated calls with varying number of arguments or argument types, use reduce(catobs, [ns...]) to save compilation time.

Examples

julia> catobs(ArrayNode(zeros(2, 2)), ArrayNode([1 2; 3 4]))
+2×4 ArrayNode{Matrix{Float64}, Nothing}:
+ 0.0  0.0  1.0  2.0
+ 0.0  0.0  3.0  4.0
+
+julia> n = ProductNode(t1=ArrayNode(randn(2, 3)), t2=BagNode(ArrayNode(randn(3, 8)), bags([1:3, 4:5, 6:8])))
+ProductNode  # 3 obs, 24 bytes
+  ├── t1: ArrayNode(2×3 Array with Float64 elements)  # 3 obs, 96 bytes
+  ╰── t2: BagNode  # 3 obs, 112 bytes
+            ╰── ArrayNode(3×8 Array with Float64 elements)  # 8 obs, 240 bytes
+
+julia> catobs(n[1], n[3])
+ProductNode  # 2 obs, 24 bytes
+  ├── t1: ArrayNode(2×2 Array with Float64 elements)  # 2 obs, 80 bytes
+  ╰── t2: BagNode  # 2 obs, 96 bytes
+            ╰── ArrayNode(3×6 Array with Float64 elements)  # 6 obs, 192 bytes

See also: Mill.subset.

source
Mill.subsetFunction
subset(n, i)

Extract a subset i of samples (observations) stored in node n.

Similar to Base.getindex or MLUtils.getobs but defined for all Mill.jl compatible data as well.

Examples

julia> Mill.subset(ArrayNode(NGramMatrix(["Hello", "world"])), 2)
+2053×1 ArrayNode{NGramMatrix{String, Vector{String}, Int64}, Nothing}:
+ "world"
+
+julia> Mill.subset(BagNode(ArrayNode(randn(2, 8)), [1:2, 3:3, 4:7, 8:8]), 1:3)
+BagNode  # 3 obs, 112 bytes
+  ╰── ArrayNode(2×7 Array with Float64 elements)  # 7 obs, 160 bytes

See also: catobs.

source
Mill.mapdataFunction
mapdata(f, x)

Recursively apply f to data in all leaves of x.

Examples

julia> n1 = ProductNode(a=zeros(2,2), b=ones(2,2))
+ProductNode  # 2 obs, 16 bytes
+  ├── a: ArrayNode(2×2 Array with Float64 elements)  # 2 obs, 80 bytes
+  ╰── b: ArrayNode(2×2 Array with Float64 elements)  # 2 obs, 80 bytes
+
+julia> n2 = Mill.mapdata(x -> x .+ 1, n1)
+ProductNode  # 2 obs, 16 bytes
+  ├── a: ArrayNode(2×2 Array with Float64 elements)  # 2 obs, 80 bytes
+  ╰── b: ArrayNode(2×2 Array with Float64 elements)  # 2 obs, 80 bytes
+
+julia> Mill.data(n2).a
+2×2 ArrayNode{Matrix{Float64}, Nothing}:
+ 1.0  1.0
+ 1.0  1.0
+
+julia> Mill.data(n2).b
+2×2 ArrayNode{Matrix{Float64}, Nothing}:
+ 2.0  2.0
+ 2.0  2.0
source
Mill.removeinstancesFunction
removeinstances(n::AbstractBagNode, mask)

Remove instances from n using mask and remap bag indices accordingly.

Examples

julia> b1 = BagNode(ArrayNode([1 2 3; 4 5 6]), bags([1:2, 0:-1, 3:3]))
+BagNode  # 3 obs, 112 bytes
+  ╰── ArrayNode(2×3 Array with Int64 elements)  # 3 obs, 96 bytes
+
+julia> b2 = removeinstances(b1, [false, true, true])
+BagNode  # 3 obs, 112 bytes
+  ╰── ArrayNode(2×2 Array with Int64 elements)  # 2 obs, 80 bytes
+
+julia> b2.data
+2×2 ArrayNode{Matrix{Int64}, Nothing}:
+ 2  3
+ 5  6
+
+julia> b2.bags
+AlignedBags{Int64}(UnitRange{Int64}[1:1, 0:-1, 2:2])
source
diff --git a/v2.10.1/api/model_nodes/index.html b/v2.10.1/api/model_nodes/index.html new file mode 100644 index 00000000..3c19183e --- /dev/null +++ b/v2.10.1/api/model_nodes/index.html @@ -0,0 +1,165 @@ + +Model nodes · Mill.jl

Model nodes

Index

API

Mill.ArrayModelType
ArrayModel{T} <: AbstractMillModel

A model node for processing ArrayNodes. It applies a (sub)model m stored in it to data in an ArrayNode.

Examples

julia> Random.seed!(0);
julia> n = ArrayNode(randn(Float32, 2, 2))
+2×2 ArrayNode{Matrix{Float32}, Nothing}:
+ 0.94... 1.53...
+ 0.13... 0.12...
julia> m = ArrayModel(Dense(2, 2))
+ArrayModel(Dense(2 => 2))  # 2 arrays, 6 params, 104 bytes
julia> m(n)
+2×2 Matrix{Float32}:
+ -0.50... -0.77...
+  0.25...  0.49...

See also: AbstractMillModel, ArrayNode.

source
Mill.BagModelType
BagModel{T <: AbstractMillModel, A <: Union{AbstractAggregation, BagCount}, U}
+    <: AbstractMillModel

A model node for processing AbstractBagNodes. It first applies its "instance (sub)model" im on every instance, then performs elementwise segmented aggregation a and finally applies the final model bm on the aggregated representation of every bag in the data node.

Examples

julia> Random.seed!(0);
+
+julia> n = BagNode(ArrayNode(randn(Float32, 3, 2)), bags([0:-1, 1:2]))
+BagNode  # 2 obs, 96 bytes
+  ╰── ArrayNode(3×2 Array with Float32 elements)  # 2 obs, 72 bytes
+
+julia> m = BagModel(ArrayModel(Dense(3, 2)), SegmentedMeanMax(2), Dense(4, 2))
+BagModel ↦ [SegmentedMean(2); SegmentedMax(2)] ↦ Dense(4 => 2)  # 4 arrays, 14 params, 216 bytes
+  ╰── ArrayModel(Dense(3 => 2))  # 2 arrays, 8 params, 112 bytes
+
+julia> m(n)
+2×2 Matrix{Float32}:
+ 0.0  1.05...
+ 0.0  0.49...
+
+julia> m(n) == m.bm(m.a(m.im(n.data), n.bags))
+true

See also: AbstractMillModel, AbstractAggregation, AbstractBagNode, BagNode, WeightedBagNode.

source
Mill.BagModelMethod
BagModel(im, a, bm=identity)

Construct a BagModel from the arguments. im should be AbstractMillModel, a AbstractAggregation or BagCount, and bm ArrayModel.

It is also possible to pass any function as im instead of a model node. In that case, it is wrapped into an ArrayNode.

Examples

julia> m = BagModel(ArrayModel(Dense(3, 2)), SegmentedMeanMax(2), Dense(4, 2))
+BagModel ↦ [SegmentedMean(2); SegmentedMax(2)] ↦ Dense(4 => 2)  # 4 arrays, 14 params, 216 bytes
+  ╰── ArrayModel(Dense(3 => 2))  # 2 arrays, 8 params, 112 bytes
+
+julia> m = BagModel(Dense(4, 3), BagCount(SegmentedMean(3)))
+BagModel ↦ BagCount(SegmentedMean(3)) ↦ identity  # 1 arrays, 3 params (all zero), 52 bytes
+  ╰── ArrayModel(Dense(4 => 3))  # 2 arrays, 15 params, 140 bytes

See also: AbstractMillModel, AbstractAggregation, BagCount, AbstractBagNode, BagNode, WeightedBagNode.

source
Mill.ProductModelType
ProductModel{T <: Mill.VecOrTupOrNTup{<:AbstractMillModel}, U} <: AbstractMillModel

A model node for processing ProductNodes. For each subtree of the data node it applies one (sub)model from ms and then applies m on the concatenation of results.

Examples

julia> Random.seed!(0);
+
+julia> n = ProductNode(a=ArrayNode([0 1; 2 3]), b=ArrayNode([4 5; 6 7]))
+ProductNode  # 2 obs, 16 bytes
+  ├── a: ArrayNode(2×2 Array with Int64 elements)  # 2 obs, 80 bytes
+  ╰── b: ArrayNode(2×2 Array with Int64 elements)  # 2 obs, 80 bytes
+
+julia> m1 = ProductModel(a=ArrayModel(Dense(2, 2)), b=ArrayModel(Dense(2, 2)))
+ProductModel ↦ identity
+  ├── a: ArrayModel(Dense(2 => 2))  # 2 arrays, 6 params, 104 bytes
+  ╰── b: ArrayModel(Dense(2 => 2))  # 2 arrays, 6 params, 104 bytes
julia> m1(n)
+4×2 Matrix{Float32}:
+ -2.36...  -3.58...
+ -2.11...  -3.40...
+ -6.31...  -7.61...
+ -2.54...  -2.66...
julia> m2 = ProductModel(a=identity, b=identity)
+ProductModel ↦ identity
+  ├── a: ArrayModel(identity)
+  ╰── b: ArrayModel(identity)
+
+julia> m2(n)
+4×2 Matrix{Int64}:
+ 0  1
+ 2  3
+ 4  5
+ 6  7

See also: AbstractMillModel, AbstractProductNode, ProductNode.

source
Mill.ProductModelMethod
ProductModel(ms, m=identity)
+ProductModel(m=identity; ms...)

Construct a ProductModel from the arguments. ms should an iterable (Tuple, NamedTuple or Vector) of one or more AbstractMillModels.

It is also possible to pass any function as elements of ms. In that case, it is wrapped into an ArrayNode.

Examples

julia> ProductModel(a=ArrayModel(Dense(2, 2)), b=identity)
+ProductModel ↦ identity
+  ├── a: ArrayModel(Dense(2 => 2))  # 2 arrays, 6 params, 104 bytes
+  ╰── b: ArrayModel(identity)
+
+julia> ProductModel(Dense(4, 2); a=ArrayModel(Dense(2, 2)), b=Dense(2, 2))
+ProductModel ↦ Dense(4 => 2)  # 2 arrays, 10 params, 120 bytes
+  ├── a: ArrayModel(Dense(2 => 2))  # 2 arrays, 6 params, 104 bytes
+  ╰── b: ArrayModel(Dense(2 => 2))  # 2 arrays, 6 params, 104 bytes
+
+julia> ProductModel((identity, BagModel(ArrayModel(Dense(2, 2)), SegmentedMean(2), identity)))
+ProductModel ↦ identity
+  ├── ArrayModel(identity)
+  ╰── BagModel ↦ SegmentedMean(2) ↦ identity  # 1 arrays, 2 params (all zero), 48 bytes
+        ╰── ArrayModel(Dense(2 => 2))  # 2 arrays, 6 params, 104 bytes
+
+julia> ProductModel(identity)
+ProductModel ↦ identity
+  ╰── ArrayModel(identity)

See also: AbstractMillModel, AbstractProductNode, ProductNode.

source
Mill.LazyModelType
LazyModel{Name, T} <: AbstractMillModel

A model node for processing LazyNodes. It applies a (sub)model m stored in it to data of the LazyNode after calling Mill.unpack2mill.

Examples

julia> function Mill.unpack2mill(ds::LazyNode{:Sentence})
+    s = split.(ds.data, " ")
+    x = NGramMatrix(reduce(vcat, s))
+    BagNode(x, Mill.length2bags(length.(s)))
+end
julia> Random.seed!(0);
+
+julia> n = LazyNode{:Sentence}(["foo", "bar", "baz"])
+LazyNode{:Sentence, Vector{String}, Nothing}:
+ "foo"
+ "bar"
+ "baz"
+
+julia> m = LazyModel{:Sentence}(BagModel(Dense(2053, 3), SegmentedMean(3), identity))
+LazyModel{Sentence}
+  ╰── BagModel ↦ SegmentedMean(3) ↦ identity  # 1 arrays, 3 params (all zero), 52 bytes
+        ╰── ArrayModel(Dense(2053 => 3))  # 2 arrays, 6_162 params, 24.148 KiB
julia> m(n)
+3×3 Matrix{Float32}:
+ -0.06... -0.03... -0.04...
+  0.02...  0.00... -0.07...
+ -0.00...  0.06... -0.07...

See also: AbstractMillModel, LazyNode, Mill.unpack2mill.

source
Mill.LazyModelMethod
LazyModel([Name::Symbol], m::AbstractMillModel)
+LazyModel{Name}(m::AbstractMillModel)

Construct a new LazyModel with name Name, and model m.

It is also possible to pass any function as m instead of a model node. In that case, it is wrapped into an ArrayNode.

Examples

julia> LazyModel{:Sentence}(ArrayModel(Dense(2, 2)))
+LazyModel{Sentence}
+  ╰── ArrayModel(Dense(2 => 2))  # 2 arrays, 6 params, 104 bytes
+
+julia> LazyModel(:Sentence, Dense(2, 2))
+LazyModel{Sentence}
+  ╰── ArrayModel(Dense(2 => 2))  # 2 arrays, 6 params, 104 bytes

See also: AbstractMillModel, LazyNode, Mill.unpack2mill.

source
Mill.reflectinmodelFunction
reflectinmodel(x::AbstractMillNode, fm=d -> Dense(d, 10), fa=BagCount ∘ SegmentedMeanMax;
+    fsm=Dict(), fsa=Dict(), single_key_identity=true, single_scalar_identity=true, all_imputing=false)

Build a Mill.jl model capable of processing x.

All inner Dense layers are constructed using fm, a function accepting input dimension d and returning a suitable model. All aggregation operators are constructed using fa in a similar manner.

More fine-grained control can be achieved with fsm and fsa keyword arguments, which should be Dicts of c => f pairs, where c is a String traversal code from HierarchicalUtils.jl and f is a function. These definitions override fm and fa.

If a ProductNode with only a single child (subtree) is encountered, its final m model is instantiated as identity instead of using fm and fsm. This can be controlled with single_key_identity.

Similarly, if an ArrayNode contains data X where size(X, 1) is 1, the corresponding model is instantiated as identity unless single_scalar_identity is false.

By default, reflectinmodel makes first Dense layers in leafs imputing only if the datatype suggests that missing data is present. This applies to

types with eltype of {Union{Missing, T}} where T. If all_imputing is true, all leaf Dense layers in these types are replaced by their imputing variants.

Examples

julia> n1 = ProductNode(a=ArrayNode(NGramMatrix(["a", missing])))
+ProductNode  # 2 obs, 32 bytes
+  ╰── a: ArrayNode(2053×2 NGramMatrix with Union{Missing, Int64} elements)  # 2 obs, 129 bytes
+
+julia> n2 = ProductNode((ArrayNode([0 1]), BagNode(ArrayNode([0 1; 2 3]), bags([1:1, 2:2]))))
+ProductNode  # 2 obs, 24 bytes
+  ├── ArrayNode(1×2 Array with Int64 elements)  # 2 obs, 64 bytes
+  ╰── BagNode  # 2 obs, 96 bytes
+        ╰── ArrayNode(2×2 Array with Int64 elements)  # 2 obs, 80 bytes
+
+julia> n = ProductNode((n1, n2))
+ProductNode  # 2 obs, 56 bytes
+  ├── ProductNode  # 2 obs, 32 bytes
+  │     ╰── a: ArrayNode(2053×2 NGramMatrix with Union{Missing, Int64} elements)  # 2 obs, 129 bytes
+  ╰── ProductNode  # 2 obs, 24 bytes
+        ├── ArrayNode(1×2 Array with Int64 elements)  # 2 obs, 64 bytes
+        ╰── BagNode  # 2 obs, 96 bytes
+              ╰── ArrayNode(2×2 Array with Int64 elements)  # 2 obs, 80 bytes
+
+julia> reflectinmodel(n)
+ProductModel ↦ Dense(20 => 10)  # 2 arrays, 210 params, 920 bytes
+  ├── ProductModel ↦ identity
+  │     ╰── a: ArrayModel([postimputing]Dense(2053 => 10))  # 3 arrays, 20_550 params, 80.391 KiB
+  ╰── ProductModel ↦ Dense(11 => 10)  # 2 arrays, 120 params, 560 bytes
+        ├── ArrayModel(identity)
+        ╰── BagModel ↦ BagCount([SegmentedMean(10); SegmentedMax(10)]) ↦ Dense(21 => 10)  # 4 arrays, 240 params, 1.094 KiB
+              ╰── ArrayModel(Dense(2 => 10))  # 2 arrays, 30 params, 200 bytes
+
+julia> reflectinmodel(n, d -> Dense(d, 3), SegmentedMean, all_imputing=true)
+ProductModel ↦ Dense(6 => 3)  # 2 arrays, 21 params, 164 bytes
+  ├── ProductModel ↦ identity
+  │     ╰── a: ArrayModel([postimputing]Dense(2053 => 3))  # 3 arrays, 6_165 params, 24.199 KiB
+  ╰── ProductModel ↦ Dense(4 => 3)  # 2 arrays, 15 params, 140 bytes
+        ├── ArrayModel([preimputing]Dense(1 => 1))  # 3 arrays, 3 params, 132 bytes
+        ╰── BagModel ↦ SegmentedMean(3) ↦ Dense(3 => 3)  # 3 arrays, 15 params, 180 bytes
+              ╰── ArrayModel([preimputing]Dense(2 => 3))  # 3 arrays, 11 params, 164 bytes
+
+julia> printtree(n; trav=true)
+ProductNode [""]  # 2 obs, 56 bytes
+  ├── ProductNode ["E"]  # 2 obs, 32 bytes
+  │     ╰── a: ArrayNode(2053×2 NGramMatrix with Union{Missing, Int64} elements) ["M"]  # 2 obs, 129 bytes
+  ╰── ProductNode ["U"]  # 2 obs, 24 bytes
+        ├── ArrayNode(1×2 Array with Int64 elements) ["Y"]  # 2 obs, 64 bytes
+        ╰── BagNode ["c"]  # 2 obs, 96 bytes
+              ╰── ArrayNode(2×2 Array with Int64 elements) ["e"]  # 2 obs, 80 bytes
+
+julia> reflectinmodel(n, d -> Dense(d, 3), SegmentedMean;
+                        fsm=Dict("e" => d -> Chain(Dense(d, 2), Dense(2, 2))),
+                        fsa=Dict("c" => SegmentedLSE),
+                        single_key_identity=false,
+                        single_scalar_identity=false)
+ProductModel ↦ Dense(6 => 3)  # 2 arrays, 21 params, 164 bytes
+  ├── ProductModel ↦ Dense(3 => 3)  # 2 arrays, 12 params, 128 bytes
+  │     ╰── a: ArrayModel([postimputing]Dense(2053 => 3))  # 3 arrays, 6_165 params, 24.199 KiB
+  ╰── ProductModel ↦ Dense(6 => 3)  # 2 arrays, 21 params, 164 bytes
+        ├── ArrayModel(Dense(1 => 3))  # 2 arrays, 6 params, 104 bytes
+        ╰── BagModel ↦ SegmentedLSE(2) ↦ Dense(2 => 3)  # 4 arrays, 13 params, 212 bytes
+              ╰── ArrayModel(Chain(Dense(2 => 2), Dense(2 => 2)))  # 4 arrays, 12 params, 208 bytes

See also: AbstractMillNode, AbstractMillModel, ProductNode, BagNode, ArrayNode.

source
Mill.modelsummaryFunction
modelsummary(m::AbstractMillModel)

Print summary of parameters of model m.

Examples

julia> m = ProductModel(ArrayModel(Dense(2, 3)))
+ProductModel ↦ identity
+  ╰── ArrayModel(Dense(2 => 3))  # 2 arrays, 9 params, 116 bytes
+
+julia> modelsummary(m)
+"Model summary: 2 arrays, 9 params, 116 bytes"

See also: datasummary.

source
diff --git a/v2.10.1/api/special_arrays/index.html b/v2.10.1/api/special_arrays/index.html new file mode 100644 index 00000000..0191106f --- /dev/null +++ b/v2.10.1/api/special_arrays/index.html @@ -0,0 +1,184 @@ + +Special Arrays · Mill.jl

Special arrays

Index

API

Mill.maybehotFunction
maybehot(l, labels)

Return a MaybeHotVector where the first occurence of l in labels is set to 1 and all other elements are set to 0.

Examples

julia> maybehot(:b, [:a, :b, :c])
+3-element MaybeHotVector with eltype Bool:
+ ⋅
+ 1
+ ⋅
+
+julia> maybehot(missing, 1:3)
+3-element MaybeHotVector with eltype Missing:
+ missing
+ missing
+ missing

See also: maybehotbatch, MaybeHotVector, MaybeHotMatrix.

source
Mill.maybehotbatchFunction
maybehotbatch(ls, labels)

Return a MaybeHotMatrix in which each column corresponds to one element of ls containing 1 at its first occurence in labels with all other elements set to 0.

Examples

julia> maybehotbatch([:c, :a], [:a, :b, :c])
+3×2 MaybeHotMatrix with eltype Bool:
+ ⋅  1
+ ⋅  ⋅
+ 1  ⋅
+
+julia> maybehotbatch([missing, 2], 1:3)
+3×2 MaybeHotMatrix with eltype Union{Missing, Bool}:
+ missing    ⋅
+ missing   true
+ missing    ⋅

See also: maybehot, MaybeHotMatrix, MaybeHotVector.

source
Mill.maybecoldFunction
maybecold(y, labels=1:size(y,1))

Similar to Flux.onecold but when y contains missing values, missing is in the result as well.

Therefore, it is roughly the inverse operation of maybehot or maybehotbatch.

Examples

julia> maybehot(:b, [:a, :b, :c])
+3-element MaybeHotVector with eltype Bool:
+ ⋅
+ 1
+ ⋅
+
+julia> maybecold(ans, [:a, :b, :c])
+:b
+
+julia> maybehot(missing, 1:3)
+3-element MaybeHotVector with eltype Missing:
+ missing
+ missing
+ missing
+
+julia> maybecold(ans)
+missing
+
+julia> maybecold(maybehotbatch([missing, 2], 1:3))
+2-element Vector{Union{Missing, Int64}}:
+  missing
+ 2

See also: Flux.onecold, maybehot, maybehotbatch.

source
Mill.NGramIteratorType
NGramIterator{T}

Iterates over ngram codes of collection of integers s using Mill.string_start_code() and Mill.string_end_code() for padding. NGram codes are computed as in positional number systems, where items of s are digits, b is the base, and m is modulo.

In order to reduce collisions when mixing ngrams of different order one should avoid zeros and negative integers in s and should set base b to the expected number of unique tokens in s.

See also: NGramMatrix, ngrams, ngrams!, countngrams, countngrams!.

source
Mill.NGramIteratorMethod
NGramIterator(s, n=3, b=256, m=typemax(Int))

Construct an NGramIterator. If s is an AbstractString it is first converted to integers with Base.codeunits.

Examples

julia> NGramIterator("deadbeef", 3, 256, 17) |> collect
+10-element Vector{Int64}:
+  2
+ 16
+  9
+  9
+  6
+ 10
+ 11
+ 15
+  2
+  6
+
+julia> NGramIterator(collect(1:9), 3, 10, 1009) |> collect
+11-element Vector{Int64}:
+ 221
+ 212
+ 123
+ 234
+ 345
+ 456
+ 567
+ 678
+ 789
+ 893
+ 933
+
+julia> Mill.string_start_code()
+0x02
+
+julia> Mill.string_end_code()
+0x03

See also: NGramMatrix, ngrams, ngrams!, countngrams, countngrams!.

source
Mill.ngrams!Function
ngrams!(o, x, n=3, b=256)

Store codes of n grams of x using base b to o.

Examples

julia> o = zeros(Int, 5)
+5-element Vector{Int64}:
+ 0
+ 0
+ 0
+ 0
+ 0
+
+julia> ngrams!(o, "foo", 3, 256)
+5-element Vector{Int64}:
+  131686
+  157295
+ 6713199
+ 7302915
+ 7275267

See also: ngrams, countngrams, countngrams!, NGramMatrix, NGramIterator.

source
Mill.countngramsFunction
countngrams(o, x, n, b, m)

Count the number of of n grams of x using base b and modulo m into a vector of length m in case x is a single sequence or into a matrix with m rows if x is an iterable of sequences.

Examples

julia> countngrams("foo", 3, 256, 5)
+5-element Vector{Int64}:
+ 2
+ 1
+ 1
+ 0
+ 1
+
+julia> countngrams(["foo", "bar"], 3, 256, 5)
+5×2 Matrix{Int64}:
+ 2  1
+ 1  0
+ 1  2
+ 0  0
+ 1  2

See also: countngrams!, ngrams, ngrams!, NGramMatrix, NGramIterator.

source
Mill.countngrams!Function
countngrams!(o, x, n, b, m=length(o))

Count the number of of n grams of x using base b and modulo m and store the result to o.

Examples

julia> o = zeros(Int, 5)
+5-element Vector{Int64}:
+ 0
+ 0
+ 0
+ 0
+ 0
+
+julia> countngrams!(o, "foo", 3, 256)
+5-element Vector{Int64}:
+ 2
+ 1
+ 1
+ 0
+ 1

See also: countngrams, ngrams, ngrams!, NGramMatrix, NGramIterator.

source
Mill.NGramMatrixType
NGramMatrix{T, U, V} <: AbstractMatrix{U}

A matrix-like structure for lazily representing sequences like strings as ngrams of cardinality n using b as a base for calculations and m as the modulo. Therefore, the matrix has m rows and one column for representing each sequence. Missing sequences are supported.

See also: NGramIterator, ngrams, ngrams!, countngrams, countngrams!.

source
Mill.NGramMatrixMethod
NGramMatrix(s, n=3, b=256, m=2053)

Construct an NGramMatrix. s can either be a single sequence or any AbstractVector.

Examples

julia> NGramMatrix([1,2,3])
+2053×1 NGramMatrix{Vector{Int64}, Vector{Vector{Int64}}, Int64}:
+ [1, 2, 3]
+
+julia> NGramMatrix(["a", missing, "c"], 2, 128)
+2053×3 NGramMatrix{Union{Missing, String}, Vector{Union{Missing, String}}, Union{Missing, Int64}}:
+ "a"
+ missing
+ "c"

See also: NGramIterator, ngrams, ngrams!, countngrams, countngrams!.

source
Mill.PostImputingMatrixType
PostImputingMatrix{T <: Number, U <: AbstractMatrix{T}, V <: AbstractVector{T}} <: AbstractMatrix{T}

A parametrized matrix that fills in a default vector of parameters whenever a "missing" column is encountered during multiplication.

Supports multiplication with NGramMatrix, MaybeHotMatrix and MaybeHotVector. For any other AbstractMatrix it falls back to standard multiplication.

Examples

julia> A = PostImputingMatrix(ones(2, 2), -ones(2))
+2×2 PostImputingMatrix{Float64, Matrix{Float64}, Vector{Float64}}:
+W:
+ 1.0  1.0
+ 1.0  1.0
+
+ψ:
+ -1.0
+ -1.0
+
+julia> A * maybehotbatch([1, missing], 1:2)
+2×2 Matrix{Float64}:
+ 1.0  -1.0
+ 1.0  -1.0

See also: PreImputingMatrix.

source
Mill.PostImputingMatrixMethod
PostImputingMatrix(W::AbstractMatrix{T}, ψ=zeros(T, size(W, 1))) where T

Construct a PostImputingMatrix with multiplication parameters W and default parameters ψ.

Examples

julia> PostImputingMatrix([1 2; 3 4])
+2×2 PostImputingMatrix{Int64, Matrix{Int64}, Vector{Int64}}:
+W:
+ 1  2
+ 3  4
+
+ψ:
+ 0
+ 0

See also: PreImputingMatrix.

source
Mill.PreImputingMatrixType
PreImputingMatrix{T <: Number, U <: AbstractMatrix{T}, V <: AbstractVector{T}} <: AbstractMatrix{T}

A parametrized matrix that fills in elements from a default vector of parameters whenever a missing element is encountered during multiplication.

Examples

julia> A = PreImputingMatrix(ones(2, 2), -ones(2))
+2×2 PreImputingMatrix{Float64, Matrix{Float64}, Vector{Float64}}:
+W:
+ 1.0  1.0
+ 1.0  1.0
+
+ψ:
+ -1.0  -1.0
+
+julia> A * [0 1; missing -1]
+2×2 Matrix{Float64}:
+ -1.0  0.0
+ -1.0  0.0

See also: PreImputingMatrix.

source
Mill.PreImputingMatrixMethod
PreImputingMatrix(W::AbstractMatrix{T}, ψ=zeros(T, size(W, 2))) where T

Construct a PreImputingMatrix with multiplication parameters W and default parameters ψ.

Examples

julia> PreImputingMatrix([1 2; 3 4])
+2×2 PreImputingMatrix{Int64, Matrix{Int64}, Vector{Int64}}:
+W:
+ 1  2
+ 3  4
+
+ψ:
+ 0  0

See also: PostImputingMatrix.

source
diff --git a/v2.10.1/api/switches/index.html b/v2.10.1/api/switches/index.html new file mode 100644 index 00000000..9218eb70 --- /dev/null +++ b/v2.10.1/api/switches/index.html @@ -0,0 +1,2 @@ + +Switches · Mill.jl

General

Index

    API

    Mill.string_start_code!Function
    Mill.string_start_code!(c::Integer; persist=false)

    Set the new value to the string_start_code parameter used as a code point of the abstract string-start character to c. The default value of the parameter is 0x02, which corresponds to the STX character in ASCII encoding.

    c should fit into UInt8.

    Set persist=true to persist this setting between sessions.

    See also: Mill.string_start_code, Mill.string_end_code, Mill.string_end_code!.

    source
    Mill.string_end_code!Function
    Mill.string_end_code!(c::Integer; persist=false)

    Set the new value to the string_end_code parameter used as a code point of the abstract string-end character to c. The default value of the parameter is 0x03, which corresponds to the ETX character in ASCII encoding.

    c should fit into UInt8.

    Set persist=true to persist this setting between sessions.

    See also: Mill.string_end_code, Mill.string_start_code, Mill.string_start_code!.

    source
    diff --git a/v2.10.1/api/utilities/index.html b/v2.10.1/api/utilities/index.html new file mode 100644 index 00000000..3d920cb5 --- /dev/null +++ b/v2.10.1/api/utilities/index.html @@ -0,0 +1,106 @@ + +Utilities · Mill.jl

    Utilities

    Index

    API

    Mill.list_lensFunction
    list_lens(n)

    Return a Vector of Accessors.jl lenses for accessing all nodes/fields in n.

    Examples

    julia> n = ProductNode((BagNode(missing, bags([0:-1, 0:-1])), ArrayNode([1 2; 3 4])))
    +ProductNode  # 2 obs, 16 bytes
    +  ├── BagNode  # 2 obs, 88 bytes
    +  │     ╰── ∅
    +  ╰── ArrayNode(2×2 Array with Int64 elements)  # 2 obs, 80 bytes
    +
    +julia> list_lens(n)
    +9-element Vector{Any}:
    + identity (generic function with 1 method)
    + (@optic _.data[1])
    + (@optic _.data[1].data)
    + (@optic _.data[1].bags)
    + (@optic _.data[1].metadata)
    + (@optic _.data[2])
    + (@optic _.data[2].data)
    + (@optic _.data[2].metadata)
    + (@optic _.metadata)

    See also: pred_lens, find_lens, findnonempty_lens.

    source
    Mill.find_lensFunction
    find_lens(n, x)

    Return a Vector of Accessors.jl lenses for accessing all nodes/fields in n that return true when compared to x using Base.===.

    Examples

    julia> n = ProductNode((BagNode(missing, bags([0:-1, 0:-1])), ArrayNode([1 2; 3 4])))
    +ProductNode  # 2 obs, 16 bytes
    +  ├── BagNode  # 2 obs, 88 bytes
    +  │     ╰── ∅
    +  ╰── ArrayNode(2×2 Array with Int64 elements)  # 2 obs, 80 bytes
    +
    +julia> find_lens(n, n.data[1])
    +1-element Vector{Any}:
    + (@optic _.data[1])

    See also: pred_lens, list_lens, findnonempty_lens.

    source
    Mill.findnonempty_lensFunction
    findnonempty_lens(n)

    Return a Vector of Accessors.jl lenses for accessing all nodes/fields in n that contain at least one observation.

    Examples

    julia> n = ProductNode((BagNode(missing, bags([0:-1, 0:-1])), ArrayNode([1 2; 3 4])))
    +ProductNode  # 2 obs, 16 bytes
    +  ├── BagNode  # 2 obs, 88 bytes
    +  │     ╰── ∅
    +  ╰── ArrayNode(2×2 Array with Int64 elements)  # 2 obs, 80 bytes
    +
    +julia> findnonempty_lens(n)
    +3-element Vector{Any}:
    + identity (generic function with 1 method)
    + (@optic _.data[1])
    + (@optic _.data[2])

    See also: pred_lens, list_lens, find_lens.

    source
    Mill.pred_lensFunction
    pred_lens(p, n)

    Return a Vector of Accessors.jl lenses for accessing all nodes/fields in n conforming to predicate p.

    Examples

    julia> n = ProductNode((BagNode(missing, bags([0:-1, 0:-1])), ArrayNode([1 2; 3 4])))
    +ProductNode  # 2 obs, 16 bytes
    +  ├── BagNode  # 2 obs, 88 bytes
    +  │     ╰── ∅
    +  ╰── ArrayNode(2×2 Array with Int64 elements)  # 2 obs, 80 bytes
    +
    +julia> pred_lens(x -> x isa ArrayNode, n)
    +1-element Vector{Any}:
    + (@optic _.data[2])

    See also: list_lens, find_lens, findnonempty_lens.

    source
    Mill.code2lensFunction
    code2lens(n, c)

    Convert code c from HierarchicalUtils.jl traversal to a Vector of Accessors.jl lenses such that they access each node in tree n egal to node under code c in the tree.

    Examples

    julia> n = ProductNode((BagNode(missing, bags([0:-1, 0:-1])), ArrayNode([1 2; 3 4])));
    +
    +julia> printtree(n; trav=true)
    +ProductNode [""]  # 2 obs, 16 bytes
    +  ├── BagNode ["E"]  # 2 obs, 88 bytes
    +  │     ╰── ∅ ["M"]
    +  ╰── ArrayNode(2×2 Array with Int64 elements) ["U"]  # 2 obs, 80 bytes
    +
    +julia> code2lens(n, "U")
    +1-element Vector{Any}:
    + (@optic _.data[2])

    See also: lens2code.

    source
    Mill.lens2codeFunction
    lens2code(n, l)

    Convert Accessors.jl lens l to a Vector of codes from HierarchicalUtils.jl traversal such that they access each node in tree n egal to node accessible by lens l.

    Examples

    julia> n = ProductNode((BagNode(missing, bags([0:-1, 0:-1])), ArrayNode([1 2; 3 4])));
    +
    +julia> printtree(n; trav=true)
    +ProductNode [""]  # 2 obs, 16 bytes
    +  ├── BagNode ["E"]  # 2 obs, 88 bytes
    +  │     ╰── ∅ ["M"]
    +  ╰── ArrayNode(2×2 Array with Int64 elements) ["U"]  # 2 obs, 80 bytes
    +
    +julia> lens2code(n, (@optic _.data[2]))
    +1-element Vector{String}:
    + "U"
    +
    +julia> lens2code(n, (@optic _.data[∗]))
    +2-element Vector{String}:
    + "E"
    + "U"
    +

    See also: code2lens.

    source
    Mill.model_lensFunction
    model_lens(m, l)

    Convert Accessors.jl lens l for a data node to a new lens for accessing the same location in model m.

    Examples

    julia> n = ProductNode((BagNode(randn(Float32, 2, 2), bags([0:-1, 0:-1])),
    +                        ArrayNode(Float32[1 2; 3 4])))
    +ProductNode  # 2 obs, 24 bytes
    +  ├── BagNode  # 2 obs, 96 bytes
    +  │     ╰── ArrayNode(2×2 Array with Float32 elements)  # 2 obs, 64 bytes
    +  ╰── ArrayNode(2×2 Array with Float32 elements)  # 2 obs, 64 bytes
    +
    +julia> m = reflectinmodel(n)
    +ProductModel ↦ Dense(20 => 10)  # 2 arrays, 210 params, 920 bytes
    +  ├── BagModel ↦ BagCount([SegmentedMean(10); SegmentedMax(10)]) ↦ Dense(21 => 10)  # 4 arrays, 240 params, 1.094 KiB
    +  │     ╰── ArrayModel(Dense(2 => 10))  # 2 arrays, 30 params, 200 bytes
    +  ╰── ArrayModel(Dense(2 => 10))  # 2 arrays, 30 params, 200 bytes
    +
    +julia> model_lens(m, (@optic _.data[2]))
    +(@optic _.ms[2])

    See also: data_lens.

    source
    Mill.data_lensFunction
    data_lens(n, l)

    Convert Accessors.jl lens l for a model node to a new lens for accessing the same location in data node n.

    Examples

    julia> n = ProductNode((BagNode(randn(Float32, 2, 2), bags([0:-1, 0:-1])), ArrayNode(Float32[1 2; 3 4])))
    +ProductNode  # 2 obs, 24 bytes
    +  ├── BagNode  # 2 obs, 96 bytes
    +  │     ╰── ArrayNode(2×2 Array with Float32 elements)  # 2 obs, 64 bytes
    +  ╰── ArrayNode(2×2 Array with Float32 elements)  # 2 obs, 64 bytes
    +
    +julia> m = reflectinmodel(n)
    +ProductModel ↦ Dense(20 => 10)  # 2 arrays, 210 params, 920 bytes
    +  ├── BagModel ↦ BagCount([SegmentedMean(10); SegmentedMax(10)]) ↦ Dense(21 => 10)  # 4 arrays, 240 params, 1.094 KiB
    +  │     ╰── ArrayModel(Dense(2 => 10))  # 2 arrays, 30 params, 200 bytes
    +  ╰── ArrayModel(Dense(2 => 10))  # 2 arrays, 30 params, 200 bytes
    +
    +julia> data_lens(n, (@optic _.ms[2]))
    +(@optic _.data[2])

    See also: data_lens.

    source
    Mill.replaceinFunction
    replacein(n, old, new)

    Replace in data node or model n each occurence of old by new.

    Short description

    Examples

    julia> n = ProductNode((BagNode(randn(2, 2), bags([0:-1, 0:-1])), ArrayNode([1 2; 3 4])))
    +ProductNode  # 2 obs, 24 bytes
    +  ├── BagNode  # 2 obs, 96 bytes
    +  │     ╰── ArrayNode(2×2 Array with Float64 elements)  # 2 obs, 80 bytes
    +  ╰── ArrayNode(2×2 Array with Int64 elements)  # 2 obs, 80 bytes
    +
    +julia> replacein(n, n.data[1], ArrayNode(maybehotbatch([1, 2], 1:2)))
    +ProductNode  # 2 obs, 24 bytes
    +  ├── ArrayNode(2×2 MaybeHotMatrix with Bool elements)  # 2 obs, 80 bytes
    +  ╰── ArrayNode(2×2 Array with Int64 elements)  # 2 obs, 80 bytes
    source
    diff --git a/v2.10.1/assets/bagmodel-dark.svg b/v2.10.1/assets/bagmodel-dark.svg new file mode 100644 index 00000000..fa718c26 --- /dev/null +++ b/v2.10.1/assets/bagmodel-dark.svg @@ -0,0 +1,225 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v2.10.1/assets/bagmodel.svg b/v2.10.1/assets/bagmodel.svg new file mode 100644 index 00000000..500feb90 --- /dev/null +++ b/v2.10.1/assets/bagmodel.svg @@ -0,0 +1,250 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v2.10.1/assets/custom.css b/v2.10.1/assets/custom.css new file mode 100644 index 00000000..1780d6d9 --- /dev/null +++ b/v2.10.1/assets/custom.css @@ -0,0 +1,46 @@ +article#documenter-page img { + width: 100%; + margin: 1em; + margin-left: auto; + margin-right: auto; +} + +.content pre { + border: none !important; + border-radius: 4px !important; +} + +.documenter-example-output { + border-radius: 4px !important; +} + +.theme--documenter-light .documenter-example-output { + border: 1px solid #dbdbdb !important; +} + +.theme--documenter-dark .documenter-example-output { + border: 1px solid #5e6d6f !important; +} + +.admonition { + border-width: 0px !important; +} + +.admonition-header { + font-weight: normal !important; + border-radius: 4px 4px 0px 0px; +} + +.docstring { + border-radius: 4px !important; +} + +.docstring>header { + border-radius: 4px 4px 0px 0px !important; + border-bottom: 0px !important; +} + +.display-light-only {display: block;} +.display-dark-only {display: none;} +.theme--documenter-dark .display-light-only {display: none;} +.theme--documenter-dark .display-dark-only {display: block;} diff --git a/v2.10.1/assets/dag.svg b/v2.10.1/assets/dag.svg new file mode 100644 index 00000000..6a673041 --- /dev/null +++ b/v2.10.1/assets/dag.svg @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v2.10.1/assets/documenter.js b/v2.10.1/assets/documenter.js new file mode 100644 index 00000000..f5311607 --- /dev/null +++ b/v2.10.1/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 = ` + +`; + +$(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/v2.10.1/assets/favicon.ico b/v2.10.1/assets/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..deeef24febacd734cb35667a9e5b61a0062a9037 GIT binary patch literal 312931 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 + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + diff --git a/v2.10.1/assets/graph.svg b/v2.10.1/assets/graph.svg new file mode 100644 index 00000000..25169372 --- /dev/null +++ b/v2.10.1/assets/graph.svg @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v2.10.1/assets/iris-dark.svg b/v2.10.1/assets/iris-dark.svg new file mode 100644 index 00000000..e87459fd --- /dev/null +++ b/v2.10.1/assets/iris-dark.svg @@ -0,0 +1,422 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v2.10.1/assets/iris.svg b/v2.10.1/assets/iris.svg new file mode 100644 index 00000000..55b6ceef --- /dev/null +++ b/v2.10.1/assets/iris.svg @@ -0,0 +1,437 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v2.10.1/assets/iris2-dark.svg b/v2.10.1/assets/iris2-dark.svg new file mode 100644 index 00000000..648299a7 --- /dev/null +++ b/v2.10.1/assets/iris2-dark.svg @@ -0,0 +1,1012 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v2.10.1/assets/iris2.svg b/v2.10.1/assets/iris2.svg new file mode 100644 index 00000000..0196d572 --- /dev/null +++ b/v2.10.1/assets/iris2.svg @@ -0,0 +1,1130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v2.10.1/assets/logo-dark.svg b/v2.10.1/assets/logo-dark.svg new file mode 100644 index 00000000..bef84da0 --- /dev/null +++ b/v2.10.1/assets/logo-dark.svg @@ -0,0 +1,110 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + Mill.jl + + diff --git a/v2.10.1/assets/logo.svg b/v2.10.1/assets/logo.svg new file mode 100644 index 00000000..4cbd4ca8 --- /dev/null +++ b/v2.10.1/assets/logo.svg @@ -0,0 +1,106 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + Mill.jl + + diff --git a/v2.10.1/assets/logo_simple.svg b/v2.10.1/assets/logo_simple.svg new file mode 100644 index 00000000..8be06796 --- /dev/null +++ b/v2.10.1/assets/logo_simple.svg @@ -0,0 +1,20 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + diff --git a/v2.10.1/assets/productmodel-dark.svg b/v2.10.1/assets/productmodel-dark.svg new file mode 100644 index 00000000..08a66074 --- /dev/null +++ b/v2.10.1/assets/productmodel-dark.svg @@ -0,0 +1,261 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v2.10.1/assets/productmodel.svg b/v2.10.1/assets/productmodel.svg new file mode 100644 index 00000000..367ecbd3 --- /dev/null +++ b/v2.10.1/assets/productmodel.svg @@ -0,0 +1,267 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v2.10.1/assets/themes/documenter-dark.css b/v2.10.1/assets/themes/documenter-dark.css new file mode 100644 index 00000000..9f5449f4 --- /dev/null +++ b/v2.10.1/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/v2.10.1/assets/themes/documenter-light.css b/v2.10.1/assets/themes/documenter-light.css new file mode 100644 index 00000000..2f168c77 --- /dev/null +++ b/v2.10.1/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/v2.10.1/assets/themeswap.js b/v2.10.1/assets/themeswap.js new file mode 100644 index 00000000..9f5eebe6 --- /dev/null +++ b/v2.10.1/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/v2.10.1/assets/warner.js b/v2.10.1/assets/warner.js new file mode 100644 index 00000000..3f6f5d00 --- /dev/null +++ b/v2.10.1/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/v2.10.1/citation/index.html b/v2.10.1/citation/index.html new file mode 100644 index 00000000..3ccc8d01 --- /dev/null +++ b/v2.10.1/citation/index.html @@ -0,0 +1,14 @@ + +Citation · Mill.jl

    Citation

    For citing, please use the following entry for the original paper:

    @misc{mandlik2021milljl,
    +      title={Mill.jl and JsonGrinder.jl: automated differentiable feature extraction for learning from raw JSON data}, 
    +      author={Simon Mandlik and Matej Racinsky and Viliam Lisy and Tomas Pevny},
    +      year={2021},
    +      eprint={2105.09107},
    +      archivePrefix={arXiv},
    +      primaryClass={stat.ML}
    +}

    and the following for the implementation (fill in the used version):

    @software{mill2018,
    +  author = {Tomas Pevny and Simon Mandlik},
    +  title = {Mill.jl framework: a flexible library for (hierarchical) multi-instance learning},
    +  url = {https://github.com/CTUAvastLab/Mill.jl},
    +  version = {...},
    +}
    diff --git a/v2.10.1/examples/dag/index.html b/v2.10.1/examples/dag/index.html new file mode 100644 index 00000000..484ec2ca --- /dev/null +++ b/v2.10.1/examples/dag/index.html @@ -0,0 +1,31 @@ + +DAGs · Mill.jl

    DAGs

    using Mill, Flux, Zygote, ChainRulesCore, Graphs

    Imagine a data/knowledge base represented in a form of a directed acyclic graph (DAG), where a vertex would be modelled based on its parents (and their parents), but not on its descendants. We will make one assumption (common in graphical models) that two children are independent given their parent or, in other words, once we have access to the data or inferred values of the parent, we do not have to inspect its other children.

    For example, in the graph below, when we infer some value for vertex e, we ignore vertices d, g, and h:

    Firstly, we define a new type for our graph that would be able to store a structure of the graph together with vertex features:

    struct DagGraph{G <: SimpleDiGraph,T}
    +    g::G
    +    vertex_features::T
    +end

    Then, we specify a model type:

    Here, m is a function realizing one step of the message passing procedure, and od is output dimension.

    In the course of calculating the value of vertex e, it may happen that for some vertices we will have to compute their value multiple times (for example for c, once when reached from e and once from f). Ideally, we would like to have a cache of already calculated values, which is difficult to do when autodifferentiating with Zygote as it does not support setindex operation. However, since the cache is assigned only once this can be realized through Zygote.buffer. We begin by initializing the cache:

    initcache(g, k) = [Zygote.Buffer(zeros(Float32, k, 1)) for _ in 1:nv(g)]
    +ChainRulesCore.@non_differentiable initcache(g, k)

    To get the already computed value of a vertex when using the model, we just delegate the question to cache as

    function (model::DagModel)(g::DagGraph, i)
    +    cache = initcache(g.g, model.od)
    +    ArrayNode(getfromcache!(cache, g, model, i))
    +end
    +
    +(model::DagModel)(g::SimpleDiGraph, vertex_features, i) = model(DagGraph(g, vertex_features), i)

    which means that the getfromcache! will do all the heavy lifting. It turns out that this function just has to check if the value in cache has been already calculated. If not, it will calculate the value (applying model on millvertex!) and freeze the calculated item in cache:

    function getfromcache!(cache, g::DagGraph, model::DagModel, i::Int)
    +    cache[i].freeze && return(copy(cache[i]))
    +    ds = millvertex!(cache, g, model, i)
    +    cache[i][:] = model.m(ds)
    +    return(copy(cache[i]))
    +end
    +
    +function getfromcache!(cache, g::DagGraph, model::DagModel, ii::Vector{Int})
    +    reduce(catobs, [getfromcache!(cache, g, model, i) for i in ii])
    +end

    And what does millvertex! function do? It just takes the representation of ancestors (from cache) and put them together:

    function millvertex!(cache, g::DagGraph, model::DagModel, i)
    +    ProductNode(neighbours = millneighbors!(cache, g, model, i),
    +                vertex = vertex_features[i]
    +    )
    +end

    The last missing piece is millneighbors! definition:

    function millneighbors!(cache, g::DagGraph, model::DagModel, ii::Vector{Int})
    +    isempty(ii) && return(BagNode(missing, [0:-1]))
    +    xs = [getfromcache!(cache, g, model, i) for i in  ii]
    +    BagNode(ArrayNode(reduce(catobs, xs)), [1:length(xs)])
    +end
    +
    +millneighbors!(cache, g::DagGraph, model::DagModel, i::Int) = millneighbors!(cache, g, model, inneighbors(g.g, i))
    +ChainRulesCore.@non_differentiable inneighbors(g, i)

    Note that this recursive approach is not the most efficient way to implement this. It would be better to spent a little time with graphs to identify sets of vertices that can be processed in parallel and for which all ancestors are known. But this was a fun little exercise.

    diff --git a/v2.10.1/examples/gnn/index.html b/v2.10.1/examples/gnn/index.html new file mode 100644 index 00000000..a9cfaa41 --- /dev/null +++ b/v2.10.1/examples/gnn/index.html @@ -0,0 +1,50 @@ + +GNNs in 16 lines · Mill.jl

    GNN in 16 lines

    As has been mentioned in [4], multiple instance learning is an essential piece for implementing message passing inference over graphs, the main concept behind spatial Graph Neural Networks (GNNs). It is straightforward and quick to achieve this with Mill.jl. We begin with some dependencies:

    using Mill, Flux, Graphs, Statistics

    Let's assume a graph g, represented as a SimpleGraph from Graphs.jl

    julia> g = SimpleGraph(10){10, 0} undirected simple Int64 graph
    julia> for e in [(1, 2), (1, 3), (1, 4), + (2, 4), (2, 5), + (3, 4), (3, 5), (3, 6), (3, 8), (3, 10), + (4, 5), (4, 6), (4, 9), + (5, 7), (5, 8), + (6, 5), (6, 7), (6, 8), + (7, 8), (7, 10), + (8, 9) + ] + add_edge!(g, e...) + end

    Furthermore, let's assume that each vertex is described by three features stored in a matrix X:

    julia> X = ArrayNode(randn(Float32, 3, 10))3×10 ArrayNode{Matrix{Float32}, Nothing}:
    + -0.12679662  -0.35648802   0.23759837    0.20088904   0.62448514   0.79077834  0.09222726   0.43388435   0.22977903   0.43026266
    + -1.4965914    0.9500747    0.100587904   0.7685701   -0.5699189   -1.7732544   0.7748581   -0.4591931   -1.9597241    0.13925342
    +  0.55790013  -0.2023222   -0.29415077   -0.9071946    1.8288428    0.7437802   0.03481543  -0.54106444  -1.4010159   -1.1463006

    We use ScatteredBags from Mill to encode neighbors of each vertex. In other words, each vertex is described by a bag of its neighbors. This information is conveniently stored in fadjlist field of g, therefore the bags can be constructed as:

    julia> b = ScatteredBags(g.fadjlist)ScatteredBags{Int64}([[2, 3, 4], [1, 4, 5], [1, 4, 5, 6, 8, 10], [1, 2, 3, 5, 6, 9], [2, 3, 4, 6, 7, 8], [3, 4, 5, 7, 8], [5, 6, 8, 10], [3, 5, 6, 7, 9], [4, 8], [3, 7]])

    Finally, we create two models. First model called lift will pre-process the description of vertices to some latent space for message passing, and the second one will realize the message passing itself, which we will call mp:

    julia> lift = reflectinmodel(X, d -> Dense(d, 4), SegmentedMean)ArrayModel(Dense(3 => 4))  # 2 arrays, 16 params, 144 bytes
    julia> U = lift(X)4×10 Matrix{Float32}: + -0.694824 0.258204 0.0814909 0.215787 0.65529 -0.288069 0.48572 -0.204361 -1.43213 -0.0876108 + 0.879013 -0.96611 0.280733 0.0831417 -0.352433 1.62898 -0.666979 1.10082 2.93841 0.983724 + 0.0666068 0.271312 -0.127492 0.00239504 -0.889856 -0.692153 -0.131364 -0.190791 0.269199 -0.084715 + -0.696617 0.140971 0.312877 0.801602 -0.931404 -0.426887 0.175684 0.446852 0.578479 0.932872
    julia> mp = reflectinmodel(BagNode(U, b), d -> Dense(d, 3), SegmentedMean)BagModel ↦ SegmentedMean(3) ↦ Dense(3 => 3) # 3 arrays, 15 params, 180 bytes + ╰── ArrayModel(Dense(4 => 3)) # 2 arrays, 15 params, 140 bytes

    Notice that BagNode(U, b) now essentially encodes vertex features as well as the adjacency matrix. This also means that one step of message passing algorithm can be realized as:

    julia> Y = mp(BagNode(U, b))3×10 Matrix{Float32}:
    + -0.0082195  -0.120252  -0.101056  -0.0294421  -0.0679054  -0.144934  -0.180778  -0.102704  -0.0260114  -0.097558
    +  0.419286   -0.447769  -0.782418  -0.842742   -0.164005   -0.117499  -0.9737    -0.871548  -0.266853    0.244904
    +  0.0970756  -0.180819  -0.33871   -0.30544    -0.122763   -0.126487  -0.441643  -0.362073  -0.195841    0.0180091

    and it is differentiable, which can be verified by executing:

    julia> gradient(m -> sum(sin.(m(BagNode(U, b)))), mp)((im = (m = (weight = Float32[1.0392458 6.510017 -3.7478795 2.4142144; 0.08109954 -0.010272092 -0.03964295 0.1283999; -0.07554098 0.14852655 -0.03163761 -0.10566347], bias = Float32[18.271505, 0.40853584, -0.10218148], σ = nothing),), a = (ψ = Float32[0.0, 0.0, 0.0],), bm = (weight = Float32[-3.1607635 -2.3542614 1.4167144; -2.2538667 -1.481414 0.82637876; -3.0010657 -2.1960394 1.314742], bias = Float32[9.947762, 8.309763, 9.68031], σ = nothing)),)

    If we put everything together, the GNN implementation is implemented in the following 16 lines:

    struct GNN{L, M, R}
    +    lift::L
    +    mp::M
    +    m::R
    +end
    +
    +Flux.@functor GNN
    +
    +function mpstep(m::GNN, U, bags, n)
    +    n == 0 && return(U)
    +    mpstep(m, m.mp(BagNode(U, bags)), bags, n - 1)
    +end
    +
    +function (m::GNN)(g, X, n)
    +    U = m.lift(X)
    +    bags = Mill.ScatteredBags(g.fadjlist)
    +    o = mpstep(m, U, bags, n)
    +    m.m(vcat(mean(o, dims = 2), maximum(o, dims = 2)))
    +end

    As it is the case with whole Mill, even this graph neural network is properly integrated with Flux.jl ecosystem and suports automatic differentiation:

    zd = 4
    +f(d) = Chain(Dense(d, zd, relu), Dense(zd, zd))
    +agg = SegmentedMeanMax
    +gnn = GNN(reflectinmodel(X, f, agg),
    +          BagModel(f(zd), agg(zd), f(2zd)),
    +          f(2zd))
    julia> gnn(g, X, 5)4×1 Matrix{Float32}:
    + -0.007986622
    +  0.0060284752
    + -0.054141466
    +  0.107666224
    julia> gradient(m -> m(g, X, 5) |> sum, gnn)((lift = (m = (layers = ((weight = Float32[-0.026549693 -0.0202079 0.048458014; 0.002715659 -0.13651448 0.06966947; 0.014111388 -0.008991994 -0.019004177; -0.026339926 0.050892036 -0.0039073415], bias = Float32[-0.008255225, 0.08427074, 0.055815943, 0.0010151814], σ = nothing), (weight = Float32[-0.002248382 0.016910437 0.0074784313 0.012096357; 0.009800602 -0.0093543865 -0.041285932 0.06456998; -0.0066256425 0.0034387442 0.030442864 -0.051204596; -0.006306767 -0.021136036 0.014636796 -0.091573276], bias = Float32[0.025005637, -0.0717659, 0.050707463, 0.0151686715], σ = nothing)),),), mp = (im = (m = (layers = ((weight = Float32[0.0025906733 -0.05646565 -0.0017295398 -0.012856863; 0.026618699 -0.015067812 0.0023268894 0.0073023317; -0.040334925 -0.04906101 -0.02352902 -0.0034152204; -0.036234714 0.21536386 -0.10198096 0.031541757], bias = Float32[0.042300627, 0.07221058, -0.046473194, 1.6086328], σ = nothing), (weight = Float32[-0.04510419 -0.010275664 -0.23416512 -0.2068704; 0.039779283 0.009614375 0.05877488 0.07339244; 0.08261877 0.019420702 -0.010461925 0.021526186; -0.011292875 -0.004899059 0.22268918 0.22738567], bias = Float32[-1.7061087, 0.59313864, -0.07346799, 1.9785393], σ = nothing)),),), a = (fs = ((ψ = Float32[0.0, 0.0, 0.0, 0.0],), (ψ = Float32[0.0, 0.0, 0.0, 0.0],)),), bm = (layers = ((weight = Float32[0.12306693 -0.06842939 … 0.0070986785 0.034823626; -0.2140295 0.08474175 … 0.042847574 -0.08543894; -0.16144809 0.15957336 … -0.055416133 -0.02598799; -0.0028243416 0.0007603243 … 0.0009992825 6.847396f-5], bias = Float32[-1.5316496, 1.4613681, 2.0013745, 0.009669691], σ = nothing), (weight = Float32[0.0412966 -0.033584822 0.011519421 -0.00012691459; 0.14572217 0.09025797 -0.00036558858 -0.00019095119; -0.1489384 -0.2040917 -0.08113609 0.00018183977; -0.33841395 -0.25317866 -0.0887108 0.0005282514], bias = Float32[-0.43640125, -0.14298038, -2.2016888, -1.8105818], σ = nothing)),)), m = (layers = ((weight = Float32[-0.06176482 0.036445152 … -0.07472322 -0.010564245; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; 0.036752846 -0.021686504 … 0.04446368 0.006286201], bias = Float32[1.4930656, -0.0, -0.0, -0.88844115], σ = nothing), (weight = Float32[0.071569055 0.0 0.0 0.06223336; 0.071569055 0.0 0.0 0.06223336; 0.071569055 0.0 0.0 0.06223336; 0.071569055 0.0 0.0 0.06223336], bias = Fill(1.0f0, 4), σ = nothing)),)),)

    The above implementation is surprisingly general, as it supports an arbitrarily rich description of vertices. For simplicity, we used only vectors in X, however, any Mill hierarchy is applicable.

    To put different weights on edges, one can use Weighted aggregation.

    diff --git a/v2.10.1/examples/jsons/index.html b/v2.10.1/examples/jsons/index.html new file mode 100644 index 00000000..2385abe6 --- /dev/null +++ b/v2.10.1/examples/jsons/index.html @@ -0,0 +1,9 @@ + +Processing JSONs · Mill.jl

    + + JsonGrinder.jl logo + JsonGrinder.jl logo + +

    Processing JSONs

    Processing JSONs is actually one of the main motivations for building Mill.jl. As a matter of fact, with Mill one is now able to process a set of valid JSON documents that follow the same meta schema. JsonGrinder.jl is a library that helps with infering the schema and other steps in the pipeline. For some examples, please refer to its documentation.

    diff --git a/v2.10.1/examples/musk/Manifest.toml b/v2.10.1/examples/musk/Manifest.toml new file mode 100644 index 00000000..59aba561 --- /dev/null +++ b/v2.10.1/examples/musk/Manifest.toml @@ -0,0 +1,918 @@ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.10.0" +manifest_format = "2.0" +project_hash = "c980577c0415d2c228751f8ca1d6579dbbffa98a" + +[[deps.AbstractFFTs]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "d92ad398961a3ed262d8bf04a1a2b8340f915fef" +uuid = "621f4979-c628-5d54-868e-fcf4e3e8185c" +version = "1.5.0" +weakdeps = ["ChainRulesCore", "Test"] + + [deps.AbstractFFTs.extensions] + AbstractFFTsChainRulesCoreExt = "ChainRulesCore" + AbstractFFTsTestExt = "Test" + +[[deps.Accessors]] +deps = ["CompositionsBase", "ConstructionBase", "Dates", "InverseFunctions", "LinearAlgebra", "MacroTools", "Test"] +git-tree-sha1 = "cb96992f1bec110ad211b7e410e57ddf7944c16f" +uuid = "7d9f7c33-5ae7-4f3b-8dc6-eff91059b697" +version = "0.1.35" + + [deps.Accessors.extensions] + AccessorsAxisKeysExt = "AxisKeys" + AccessorsIntervalSetsExt = "IntervalSets" + AccessorsStaticArraysExt = "StaticArrays" + AccessorsStructArraysExt = "StructArrays" + + [deps.Accessors.weakdeps] + AxisKeys = "94b1ba4f-4ee9-5380-92f1-94cde586c3c5" + IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" + Requires = "ae029012-a4dd-5104-9daa-d747884805df" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" + +[[deps.Adapt]] +deps = ["LinearAlgebra", "Requires"] +git-tree-sha1 = "0fb305e0253fd4e833d486914367a2ee2c2e78d0" +uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" +version = "4.0.1" +weakdeps = ["StaticArrays"] + + [deps.Adapt.extensions] + AdaptStaticArraysExt = "StaticArrays" + +[[deps.ArgCheck]] +git-tree-sha1 = "a3a402a35a2f7e0b87828ccabbd5ebfbebe356b4" +uuid = "dce04be8-c92d-5529-be00-80e4d2c0e197" +version = "2.3.0" + +[[deps.ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" +version = "1.1.1" + +[[deps.Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" + +[[deps.Atomix]] +deps = ["UnsafeAtomics"] +git-tree-sha1 = "c06a868224ecba914baa6942988e2f2aade419be" +uuid = "a9b6321e-bd34-4604-b9c9-b65b8de01458" +version = "0.1.0" + +[[deps.BangBang]] +deps = ["Compat", "ConstructionBase", "InitialValues", "LinearAlgebra", "Requires", "Setfield", "Tables"] +git-tree-sha1 = "7aa7ad1682f3d5754e3491bb59b8103cae28e3a3" +uuid = "198e06fe-97b7-11e9-32a5-e1d131e6ad66" +version = "0.3.40" + + [deps.BangBang.extensions] + BangBangChainRulesCoreExt = "ChainRulesCore" + BangBangDataFramesExt = "DataFrames" + BangBangStaticArraysExt = "StaticArrays" + BangBangStructArraysExt = "StructArrays" + BangBangTypedTablesExt = "TypedTables" + + [deps.BangBang.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" + TypedTables = "9d95f2ec-7b3d-5a63-8d20-e2491e220bb9" + +[[deps.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" + +[[deps.Baselet]] +git-tree-sha1 = "aebf55e6d7795e02ca500a689d326ac979aaf89e" +uuid = "9718e550-a3fa-408a-8086-8db961cd8217" +version = "0.1.1" + +[[deps.CEnum]] +git-tree-sha1 = "389ad5c84de1ae7cf0e28e381131c98ea87d54fc" +uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82" +version = "0.5.0" + +[[deps.ChainRules]] +deps = ["Adapt", "ChainRulesCore", "Compat", "Distributed", "GPUArraysCore", "IrrationalConstants", "LinearAlgebra", "Random", "RealDot", "SparseArrays", "SparseInverseSubset", "Statistics", "StructArrays", "SuiteSparse"] +git-tree-sha1 = "213f001d1233fd3b8ef007f50c8cab29061917d8" +uuid = "082447d4-558c-5d27-93f4-14fc19e9eca2" +version = "1.61.0" + +[[deps.ChainRulesCore]] +deps = ["Compat", "LinearAlgebra"] +git-tree-sha1 = "ab79d1f9754a3988a7792caec43bfdc03996020f" +uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" +version = "1.21.0" +weakdeps = ["SparseArrays"] + + [deps.ChainRulesCore.extensions] + ChainRulesCoreSparseArraysExt = "SparseArrays" + +[[deps.Combinatorics]] +git-tree-sha1 = "08c8b6831dc00bfea825826be0bc8336fc369860" +uuid = "861a8166-3701-5b0c-9a16-15d98fcdc6aa" +version = "1.0.2" + +[[deps.CommonSubexpressions]] +deps = ["MacroTools", "Test"] +git-tree-sha1 = "7b8a93dba8af7e3b42fecabf646260105ac373f7" +uuid = "bbf7d656-a473-5ed7-a52c-81e309532950" +version = "0.3.0" + +[[deps.Compat]] +deps = ["TOML", "UUIDs"] +git-tree-sha1 = "75bd5b6fc5089df449b5d35fa501c846c9b6549b" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "4.12.0" +weakdeps = ["Dates", "LinearAlgebra"] + + [deps.Compat.extensions] + CompatLinearAlgebraExt = "LinearAlgebra" + +[[deps.CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" +version = "1.0.5+1" + +[[deps.CompositionsBase]] +git-tree-sha1 = "802bb88cd69dfd1509f6670416bd4434015693ad" +uuid = "a33af91c-f02d-484b-be07-31d278c5ca2b" +version = "0.1.2" +weakdeps = ["InverseFunctions"] + + [deps.CompositionsBase.extensions] + CompositionsBaseInverseFunctionsExt = "InverseFunctions" + +[[deps.ConstructionBase]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "c53fc348ca4d40d7b371e71fd52251839080cbc9" +uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9" +version = "1.5.4" + + [deps.ConstructionBase.extensions] + ConstructionBaseIntervalSetsExt = "IntervalSets" + ConstructionBaseStaticArraysExt = "StaticArrays" + + [deps.ConstructionBase.weakdeps] + IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + +[[deps.ContextVariablesX]] +deps = ["Compat", "Logging", "UUIDs"] +git-tree-sha1 = "25cc3803f1030ab855e383129dcd3dc294e322cc" +uuid = "6add18c4-b38d-439d-96f6-d6bc489c04c5" +version = "0.1.3" + +[[deps.Crayons]] +git-tree-sha1 = "249fe38abf76d48563e2f4556bebd215aa317e15" +uuid = "a8cc5b0e-0ffa-5ad4-8c14-923d3ee1735f" +version = "4.1.1" + +[[deps.DataAPI]] +git-tree-sha1 = "abe83f3a2f1b857aac70ef8b269080af17764bbe" +uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" +version = "1.16.0" + +[[deps.DataFrames]] +deps = ["Compat", "DataAPI", "DataStructures", "Future", "InlineStrings", "InvertedIndices", "IteratorInterfaceExtensions", "LinearAlgebra", "Markdown", "Missings", "PooledArrays", "PrecompileTools", "PrettyTables", "Printf", "REPL", "Random", "Reexport", "SentinelArrays", "SortingAlgorithms", "Statistics", "TableTraits", "Tables", "Unicode"] +git-tree-sha1 = "04c738083f29f86e62c8afc341f0967d8717bdb8" +uuid = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" +version = "1.6.1" + +[[deps.DataStructures]] +deps = ["Compat", "InteractiveUtils", "OrderedCollections"] +git-tree-sha1 = "ac67408d9ddf207de5cfa9a97e114352430f01ed" +uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +version = "0.18.16" + +[[deps.DataValueInterfaces]] +git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6" +uuid = "e2d170a0-9d28-54be-80f0-106bbe20a464" +version = "1.0.0" + +[[deps.Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" + +[[deps.DefineSingletons]] +git-tree-sha1 = "0fba8b706d0178b4dc7fd44a96a92382c9065c2c" +uuid = "244e2a9f-e319-4986-a169-4d1fe445cd52" +version = "0.1.2" + +[[deps.DelimitedFiles]] +deps = ["Mmap"] +git-tree-sha1 = "9e2f36d3c96a820c678f2f1f1782582fcf685bae" +uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" +version = "1.9.1" + +[[deps.DiffResults]] +deps = ["StaticArraysCore"] +git-tree-sha1 = "782dd5f4561f5d267313f23853baaaa4c52ea621" +uuid = "163ba53b-c6d8-5494-b064-1a9d43ac40c5" +version = "1.1.0" + +[[deps.DiffRules]] +deps = ["IrrationalConstants", "LogExpFunctions", "NaNMath", "Random", "SpecialFunctions"] +git-tree-sha1 = "23163d55f885173722d1e4cf0f6110cdbaf7e272" +uuid = "b552c78f-8df3-52c6-915a-8e097449b14b" +version = "1.15.1" + +[[deps.Distributed]] +deps = ["Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" + +[[deps.DocStringExtensions]] +deps = ["LibGit2"] +git-tree-sha1 = "2fb1e02f2b635d0845df5d7c167fec4dd739b00d" +uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" +version = "0.9.3" + +[[deps.Downloads]] +deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" +version = "1.6.0" + +[[deps.FLoops]] +deps = ["BangBang", "Compat", "FLoopsBase", "InitialValues", "JuliaVariables", "MLStyle", "Serialization", "Setfield", "Transducers"] +git-tree-sha1 = "ffb97765602e3cbe59a0589d237bf07f245a8576" +uuid = "cc61a311-1640-44b5-9fba-1b764f453329" +version = "0.2.1" + +[[deps.FLoopsBase]] +deps = ["ContextVariablesX"] +git-tree-sha1 = "656f7a6859be8673bf1f35da5670246b923964f7" +uuid = "b9860ae5-e623-471e-878b-f6a53c775ea6" +version = "0.1.1" + +[[deps.FileIO]] +deps = ["Pkg", "Requires", "UUIDs"] +git-tree-sha1 = "c5c28c245101bd59154f649e19b038d15901b5dc" +uuid = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" +version = "1.16.2" + +[[deps.FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" + +[[deps.FillArrays]] +deps = ["LinearAlgebra", "Random"] +git-tree-sha1 = "5b93957f6dcd33fc343044af3d48c215be2562f1" +uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" +version = "1.9.3" + + [deps.FillArrays.extensions] + FillArraysPDMatsExt = "PDMats" + FillArraysSparseArraysExt = "SparseArrays" + FillArraysStatisticsExt = "Statistics" + + [deps.FillArrays.weakdeps] + PDMats = "90014a1f-27ba-587c-ab20-58faa44d9150" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" + +[[deps.FiniteDifferences]] +deps = ["ChainRulesCore", "LinearAlgebra", "Printf", "Random", "Richardson", "SparseArrays", "StaticArrays"] +git-tree-sha1 = "d77e4697046989f44dce3ed66269aaf1611a3406" +uuid = "26cc04aa-876d-5657-8c51-4c34ba976000" +version = "0.12.31" + +[[deps.Flux]] +deps = ["Adapt", "ChainRulesCore", "Compat", "Functors", "LinearAlgebra", "MLUtils", "MacroTools", "NNlib", "OneHotArrays", "Optimisers", "Preferences", "ProgressLogging", "Random", "Reexport", "SparseArrays", "SpecialFunctions", "Statistics", "Zygote"] +git-tree-sha1 = "39a9e46b4e92d5b56c0712adeb507555a2327240" +uuid = "587475ba-b771-5e3f-ad9e-33799f191a9c" +version = "0.14.11" + + [deps.Flux.extensions] + FluxAMDGPUExt = "AMDGPU" + FluxCUDAExt = "CUDA" + FluxCUDAcuDNNExt = ["CUDA", "cuDNN"] + FluxMetalExt = "Metal" + + [deps.Flux.weakdeps] + AMDGPU = "21141c5a-9bdb-4563-92ae-f87d6854732e" + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + Metal = "dde4c033-4e86-420c-a63e-0dd931031962" + cuDNN = "02a925ec-e4fe-4b08-9a7e-0d78e3d38ccd" + +[[deps.ForwardDiff]] +deps = ["CommonSubexpressions", "DiffResults", "DiffRules", "LinearAlgebra", "LogExpFunctions", "NaNMath", "Preferences", "Printf", "Random", "SpecialFunctions"] +git-tree-sha1 = "cf0fe81336da9fb90944683b8c41984b08793dad" +uuid = "f6369f11-7733-5829-9624-2563aa707210" +version = "0.10.36" +weakdeps = ["StaticArrays"] + + [deps.ForwardDiff.extensions] + ForwardDiffStaticArraysExt = "StaticArrays" + +[[deps.Functors]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "9a68d75d466ccc1218d0552a8e1631151c569545" +uuid = "d9f16b24-f501-4c13-a1f2-28368ffc5196" +version = "0.4.5" + +[[deps.Future]] +deps = ["Random"] +uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820" + +[[deps.GPUArrays]] +deps = ["Adapt", "GPUArraysCore", "LLVM", "LinearAlgebra", "Printf", "Random", "Reexport", "Serialization", "Statistics"] +git-tree-sha1 = "47e4686ec18a9620850bad110b79966132f14283" +uuid = "0c68f7d7-f131-5f86-a1c3-88cf8149b2d7" +version = "10.0.2" + +[[deps.GPUArraysCore]] +deps = ["Adapt"] +git-tree-sha1 = "ec632f177c0d990e64d955ccc1b8c04c485a0950" +uuid = "46192b85-c4d5-4398-a991-12ede77f4527" +version = "0.1.6" + +[[deps.HierarchicalUtils]] +deps = ["DataStructures", "OrderedCollections"] +git-tree-sha1 = "67fa5f3d076d86264f13263a21d4317cd8a2f18b" +uuid = "f9ccea15-0695-44b9-8113-df7c26ae4fa9" +version = "2.1.6" + +[[deps.IRTools]] +deps = ["InteractiveUtils", "MacroTools", "Test"] +git-tree-sha1 = "5d8c5713f38f7bc029e26627b687710ba406d0dd" +uuid = "7869d1d1-7146-5819-86e3-90919afe41df" +version = "0.4.12" + +[[deps.InitialValues]] +git-tree-sha1 = "4da0f88e9a39111c2fa3add390ab15f3a44f3ca3" +uuid = "22cec73e-a1b8-11e9-2c92-598750a2cf9c" +version = "0.3.1" + +[[deps.InlineStrings]] +deps = ["Parsers"] +git-tree-sha1 = "9cc2baf75c6d09f9da536ddf58eb2f29dedaf461" +uuid = "842dd82b-1e85-43dc-bf29-5d0ee9dffc48" +version = "1.4.0" + +[[deps.InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" + +[[deps.InverseFunctions]] +deps = ["Test"] +git-tree-sha1 = "68772f49f54b479fa88ace904f6127f0a3bb2e46" +uuid = "3587e190-3f89-42d0-90ee-14403ec27112" +version = "0.1.12" + +[[deps.InvertedIndices]] +git-tree-sha1 = "0dc7b50b8d436461be01300fd8cd45aa0274b038" +uuid = "41ab1584-1d38-5bbf-9106-f11c6c58b48f" +version = "1.3.0" + +[[deps.IrrationalConstants]] +git-tree-sha1 = "630b497eafcc20001bba38a4651b327dcfc491d2" +uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" +version = "0.2.2" + +[[deps.IteratorInterfaceExtensions]] +git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856" +uuid = "82899510-4779-5014-852e-03e436cf321d" +version = "1.0.0" + +[[deps.JLD2]] +deps = ["FileIO", "MacroTools", "Mmap", "OrderedCollections", "Pkg", "PrecompileTools", "Printf", "Reexport", "Requires", "TranscodingStreams", "UUIDs"] +git-tree-sha1 = "7c0008f0b7622c6c0ee5c65cbc667b69f8a65672" +uuid = "033835bb-8acc-5ee8-8aae-3f567f8a3819" +version = "0.4.45" + +[[deps.JLLWrappers]] +deps = ["Artifacts", "Preferences"] +git-tree-sha1 = "7e5d6779a1e09a36db2a7b6cff50942a0a7d0fca" +uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" +version = "1.5.0" + +[[deps.JuliaVariables]] +deps = ["MLStyle", "NameResolution"] +git-tree-sha1 = "49fb3cb53362ddadb4415e9b73926d6b40709e70" +uuid = "b14d175d-62b4-44ba-8fb7-3064adc8c3ec" +version = "0.2.4" + +[[deps.KernelAbstractions]] +deps = ["Adapt", "Atomix", "InteractiveUtils", "LinearAlgebra", "MacroTools", "PrecompileTools", "Requires", "SparseArrays", "StaticArrays", "UUIDs", "UnsafeAtomics", "UnsafeAtomicsLLVM"] +git-tree-sha1 = "4e0cb2f5aad44dcfdc91088e85dee4ecb22c791c" +uuid = "63c18a36-062a-441e-b654-da1e3ab1ce7c" +version = "0.9.16" + + [deps.KernelAbstractions.extensions] + EnzymeExt = "EnzymeCore" + + [deps.KernelAbstractions.weakdeps] + EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" + +[[deps.LLVM]] +deps = ["CEnum", "LLVMExtra_jll", "Libdl", "Preferences", "Printf", "Requires", "Unicode"] +git-tree-sha1 = "cb4619f7353fc62a1a22ffa3d7ed9791cfb47ad8" +uuid = "929cbde3-209d-540e-8aea-75f648917ca0" +version = "6.4.2" + + [deps.LLVM.extensions] + BFloat16sExt = "BFloat16s" + + [deps.LLVM.weakdeps] + BFloat16s = "ab4f0b2a-ad5b-11e8-123f-65d77653426b" + +[[deps.LLVMExtra_jll]] +deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl", "TOML"] +git-tree-sha1 = "98eaee04d96d973e79c25d49167668c5c8fb50e2" +uuid = "dad2f222-ce93-54a1-a47d-0025e8a3acab" +version = "0.0.27+1" + +[[deps.LaTeXStrings]] +git-tree-sha1 = "50901ebc375ed41dbf8058da26f9de442febbbec" +uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" +version = "1.3.1" + +[[deps.LazyArtifacts]] +deps = ["Artifacts", "Pkg"] +uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3" + +[[deps.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.6.4" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" +version = "8.4.0+0" + +[[deps.LibGit2]] +deps = ["Base64", "LibGit2_jll", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" + +[[deps.LibGit2_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll"] +uuid = "e37daf67-58a4-590a-8e99-b0245dd2ffc5" +version = "1.6.4+0" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +version = "1.11.0+1" + +[[deps.Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" + +[[deps.LinearAlgebra]] +deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + +[[deps.LogExpFunctions]] +deps = ["DocStringExtensions", "IrrationalConstants", "LinearAlgebra"] +git-tree-sha1 = "7d6dd4e9212aebaeed356de34ccf262a3cd415aa" +uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" +version = "0.3.26" + + [deps.LogExpFunctions.extensions] + LogExpFunctionsChainRulesCoreExt = "ChainRulesCore" + LogExpFunctionsChangesOfVariablesExt = "ChangesOfVariables" + LogExpFunctionsInverseFunctionsExt = "InverseFunctions" + + [deps.LogExpFunctions.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + ChangesOfVariables = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" + InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" + +[[deps.Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" + +[[deps.MLStyle]] +git-tree-sha1 = "bc38dff0548128765760c79eb7388a4b37fae2c8" +uuid = "d8e11817-5142-5d16-987a-aa16d5891078" +version = "0.4.17" + +[[deps.MLUtils]] +deps = ["ChainRulesCore", "Compat", "DataAPI", "DelimitedFiles", "FLoops", "NNlib", "Random", "ShowCases", "SimpleTraits", "Statistics", "StatsBase", "Tables", "Transducers"] +git-tree-sha1 = "b45738c2e3d0d402dffa32b2c1654759a2ac35a4" +uuid = "f1d291b0-491e-4a28-83b9-f70985020b54" +version = "0.4.4" + +[[deps.MacroTools]] +deps = ["Markdown", "Random"] +git-tree-sha1 = "2fa9ee3e63fd3a4f7a9a4f4744a52f4856de82df" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.13" + +[[deps.Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.2+1" + +[[deps.MicroCollections]] +deps = ["BangBang", "InitialValues", "Setfield"] +git-tree-sha1 = "629afd7d10dbc6935ec59b32daeb33bc4460a42e" +uuid = "128add7d-3638-4c79-886c-908ea0c25c34" +version = "0.1.4" + +[[deps.Mill]] +deps = ["Accessors", "ChainRulesCore", "Combinatorics", "DataFrames", "DataStructures", "FiniteDifferences", "Flux", "HierarchicalUtils", "LinearAlgebra", "MLUtils", "MacroTools", "OneHotArrays", "PooledArrays", "Preferences", "SparseArrays", "Statistics", "Test"] +path = "../../../.." +uuid = "1d0525e4-8992-11e8-313c-e310e1f6ddea" +version = "2.10.1" + +[[deps.Missings]] +deps = ["DataAPI"] +git-tree-sha1 = "f66bdc5de519e8f8ae43bdc598782d35a25b1272" +uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" +version = "1.1.0" + +[[deps.Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" + +[[deps.MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +version = "2023.1.10" + +[[deps.NNlib]] +deps = ["Adapt", "Atomix", "ChainRulesCore", "GPUArraysCore", "KernelAbstractions", "LinearAlgebra", "Pkg", "Random", "Requires", "Statistics"] +git-tree-sha1 = "d2811b435d2f571bdfdfa644bb806a66b458e186" +uuid = "872c559c-99b0-510c-b3b7-b6c96a88d5cd" +version = "0.9.11" + + [deps.NNlib.extensions] + NNlibAMDGPUExt = "AMDGPU" + NNlibCUDACUDNNExt = ["CUDA", "cuDNN"] + NNlibCUDAExt = "CUDA" + NNlibEnzymeCoreExt = "EnzymeCore" + + [deps.NNlib.weakdeps] + AMDGPU = "21141c5a-9bdb-4563-92ae-f87d6854732e" + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" + cuDNN = "02a925ec-e4fe-4b08-9a7e-0d78e3d38ccd" + +[[deps.NaNMath]] +deps = ["OpenLibm_jll"] +git-tree-sha1 = "0877504529a3e5c3343c6f8b4c0381e57e4387e4" +uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" +version = "1.0.2" + +[[deps.NameResolution]] +deps = ["PrettyPrint"] +git-tree-sha1 = "1a0fa0e9613f46c9b8c11eee38ebb4f590013c5e" +uuid = "71a1bf82-56d0-4bbc-8a3c-48b961074391" +version = "0.1.5" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +version = "1.2.0" + +[[deps.OneHotArrays]] +deps = ["Adapt", "ChainRulesCore", "Compat", "GPUArraysCore", "LinearAlgebra", "NNlib"] +git-tree-sha1 = "963a3f28a2e65bb87a68033ea4a616002406037d" +uuid = "0b1bfda6-eb8a-41d2-88d8-f5af5cad476f" +version = "0.2.5" + +[[deps.OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.23+2" + +[[deps.OpenLibm_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "05823500-19ac-5b8b-9628-191a04bc5112" +version = "0.8.1+2" + +[[deps.OpenSpecFun_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "13652491f6856acfd2db29360e1bbcd4565d04f1" +uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" +version = "0.5.5+0" + +[[deps.Optimisers]] +deps = ["ChainRulesCore", "Functors", "LinearAlgebra", "Random", "Statistics"] +git-tree-sha1 = "34205b1204cc83c43cd9cfe53ffbd3b310f6e8c5" +uuid = "3bd65402-5787-11e9-1adc-39752487f4e2" +version = "0.3.1" + +[[deps.OrderedCollections]] +git-tree-sha1 = "dfdf5519f235516220579f949664f1bf44e741c5" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.6.3" + +[[deps.Parsers]] +deps = ["Dates", "PrecompileTools", "UUIDs"] +git-tree-sha1 = "8489905bcdbcfac64d1daa51ca07c0d8f0283821" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.8.1" + +[[deps.Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +version = "1.10.0" + +[[deps.PooledArrays]] +deps = ["DataAPI", "Future"] +git-tree-sha1 = "36d8b4b899628fb92c2749eb488d884a926614d3" +uuid = "2dfb63ee-cc39-5dd5-95bd-886bf059d720" +version = "1.4.3" + +[[deps.PrecompileTools]] +deps = ["Preferences"] +git-tree-sha1 = "03b4c25b43cb84cee5c90aa9b5ea0a78fd848d2f" +uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" +version = "1.2.0" + +[[deps.Preferences]] +deps = ["TOML"] +git-tree-sha1 = "00805cd429dcb4870060ff49ef443486c262e38e" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.4.1" + +[[deps.PrettyPrint]] +git-tree-sha1 = "632eb4abab3449ab30c5e1afaa874f0b98b586e4" +uuid = "8162dcfd-2161-5ef2-ae6c-7681170c5f98" +version = "0.2.0" + +[[deps.PrettyTables]] +deps = ["Crayons", "LaTeXStrings", "Markdown", "PrecompileTools", "Printf", "Reexport", "StringManipulation", "Tables"] +git-tree-sha1 = "88b895d13d53b5577fd53379d913b9ab9ac82660" +uuid = "08abe8d2-0d0c-5749-adfa-8a2ac140af0d" +version = "2.3.1" + +[[deps.Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" + +[[deps.ProgressLogging]] +deps = ["Logging", "SHA", "UUIDs"] +git-tree-sha1 = "80d919dee55b9c50e8d9e2da5eeafff3fe58b539" +uuid = "33c8b6b6-d38a-422a-b730-caa89a2f386c" +version = "0.1.4" + +[[deps.REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[[deps.Random]] +deps = ["SHA"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + +[[deps.RealDot]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "9f0a1b71baaf7650f4fa8a1d168c7fb6ee41f0c9" +uuid = "c1ae055f-0cd5-4b69-90a6-9a35b1a98df9" +version = "0.1.0" + +[[deps.Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[deps.Requires]] +deps = ["UUIDs"] +git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7" +uuid = "ae029012-a4dd-5104-9daa-d747884805df" +version = "1.3.0" + +[[deps.Richardson]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "48f038bfd83344065434089c2a79417f38715c41" +uuid = "708f8203-808e-40c0-ba2d-98a6953ed40d" +version = "1.4.2" + +[[deps.SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" +version = "0.7.0" + +[[deps.SentinelArrays]] +deps = ["Dates", "Random"] +git-tree-sha1 = "0e7508ff27ba32f26cd459474ca2ede1bc10991f" +uuid = "91c51154-3ec4-41a3-a24f-3f23e20d615c" +version = "1.4.1" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" + +[[deps.Setfield]] +deps = ["ConstructionBase", "Future", "MacroTools", "StaticArraysCore"] +git-tree-sha1 = "e2cc6d8c88613c05e1defb55170bf5ff211fbeac" +uuid = "efcf1570-3423-57d1-acb7-fd33fddbac46" +version = "1.1.1" + +[[deps.ShowCases]] +git-tree-sha1 = "7f534ad62ab2bd48591bdeac81994ea8c445e4a5" +uuid = "605ecd9f-84a6-4c9e-81e2-4798472b76a3" +version = "0.1.0" + +[[deps.SimpleTraits]] +deps = ["InteractiveUtils", "MacroTools"] +git-tree-sha1 = "5d7e3f4e11935503d3ecaf7186eac40602e7d231" +uuid = "699a6c99-e7fa-54fc-8d76-47d257e15c1d" +version = "0.9.4" + +[[deps.Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" + +[[deps.SortingAlgorithms]] +deps = ["DataStructures"] +git-tree-sha1 = "66e0a8e672a0bdfca2c3f5937efb8538b9ddc085" +uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" +version = "1.2.1" + +[[deps.SparseArrays]] +deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" +version = "1.10.0" + +[[deps.SparseInverseSubset]] +deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] +git-tree-sha1 = "52962839426b75b3021296f7df242e40ecfc0852" +uuid = "dc90abb0-5640-4711-901d-7e5b23a2fada" +version = "0.1.2" + +[[deps.SpecialFunctions]] +deps = ["IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] +git-tree-sha1 = "e2cfc4012a19088254b3950b85c3c1d8882d864d" +uuid = "276daf66-3868-5448-9aa4-cd146d93841b" +version = "2.3.1" +weakdeps = ["ChainRulesCore"] + + [deps.SpecialFunctions.extensions] + SpecialFunctionsChainRulesCoreExt = "ChainRulesCore" + +[[deps.SplittablesBase]] +deps = ["Setfield", "Test"] +git-tree-sha1 = "e08a62abc517eb79667d0a29dc08a3b589516bb5" +uuid = "171d559e-b47b-412a-8079-5efa626c420e" +version = "0.1.15" + +[[deps.StaticArrays]] +deps = ["LinearAlgebra", "PrecompileTools", "Random", "StaticArraysCore"] +git-tree-sha1 = "7b0e9c14c624e435076d19aea1e5cbdec2b9ca37" +uuid = "90137ffa-7385-5640-81b9-e52037218182" +version = "1.9.2" +weakdeps = ["ChainRulesCore", "Statistics"] + + [deps.StaticArrays.extensions] + StaticArraysChainRulesCoreExt = "ChainRulesCore" + StaticArraysStatisticsExt = "Statistics" + +[[deps.StaticArraysCore]] +git-tree-sha1 = "36b3d696ce6366023a0ea192b4cd442268995a0d" +uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" +version = "1.4.2" + +[[deps.Statistics]] +deps = ["LinearAlgebra", "SparseArrays"] +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" +version = "1.10.0" + +[[deps.StatsAPI]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "1ff449ad350c9c4cbc756624d6f8a8c3ef56d3ed" +uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" +version = "1.7.0" + +[[deps.StatsBase]] +deps = ["DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] +git-tree-sha1 = "1d77abd07f617c4868c33d4f5b9e1dbb2643c9cf" +uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" +version = "0.34.2" + +[[deps.StringManipulation]] +deps = ["PrecompileTools"] +git-tree-sha1 = "a04cabe79c5f01f4d723cc6704070ada0b9d46d5" +uuid = "892a3eda-7b42-436c-8928-eab12a02cf0e" +version = "0.3.4" + +[[deps.StructArrays]] +deps = ["Adapt", "ConstructionBase", "DataAPI", "GPUArraysCore", "StaticArraysCore", "Tables"] +git-tree-sha1 = "1b0b1205a56dc288b71b1961d48e351520702e24" +uuid = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" +version = "0.6.17" + +[[deps.SuiteSparse]] +deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"] +uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" + +[[deps.SuiteSparse_jll]] +deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] +uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" +version = "7.2.1+1" + +[[deps.TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +version = "1.0.3" + +[[deps.TableTraits]] +deps = ["IteratorInterfaceExtensions"] +git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39" +uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c" +version = "1.0.1" + +[[deps.Tables]] +deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "LinearAlgebra", "OrderedCollections", "TableTraits"] +git-tree-sha1 = "cb76cf677714c095e535e3501ac7954732aeea2d" +uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" +version = "1.11.1" + +[[deps.Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" +version = "1.10.0" + +[[deps.Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.TranscodingStreams]] +git-tree-sha1 = "54194d92959d8ebaa8e26227dbe3cdefcdcd594f" +uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" +version = "0.10.3" +weakdeps = ["Random", "Test"] + + [deps.TranscodingStreams.extensions] + TestExt = ["Test", "Random"] + +[[deps.Transducers]] +deps = ["Adapt", "ArgCheck", "BangBang", "Baselet", "CompositionsBase", "ConstructionBase", "DefineSingletons", "Distributed", "InitialValues", "Logging", "Markdown", "MicroCollections", "Requires", "Setfield", "SplittablesBase", "Tables"] +git-tree-sha1 = "3064e780dbb8a9296ebb3af8f440f787bb5332af" +uuid = "28d57a85-8fef-5791-bfe6-a80928e7c999" +version = "0.4.80" + + [deps.Transducers.extensions] + TransducersBlockArraysExt = "BlockArrays" + TransducersDataFramesExt = "DataFrames" + TransducersLazyArraysExt = "LazyArrays" + TransducersOnlineStatsBaseExt = "OnlineStatsBase" + TransducersReferenceablesExt = "Referenceables" + + [deps.Transducers.weakdeps] + BlockArrays = "8e7c35d0-a365-5155-bbbb-fb81a777f24e" + DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" + LazyArrays = "5078a376-72f3-5289-bfd5-ec5146d43c02" + OnlineStatsBase = "925886fa-5bf2-5e8e-b522-a9147a512338" + Referenceables = "42d2dcc6-99eb-4e98-b66c-637b7d73030e" + +[[deps.UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" + +[[deps.Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" + +[[deps.UnsafeAtomics]] +git-tree-sha1 = "6331ac3440856ea1988316b46045303bef658278" +uuid = "013be700-e6cd-48c3-b4a1-df204f14c38f" +version = "0.2.1" + +[[deps.UnsafeAtomicsLLVM]] +deps = ["LLVM", "UnsafeAtomics"] +git-tree-sha1 = "323e3d0acf5e78a56dfae7bd8928c989b4f3083e" +uuid = "d80eeb9a-aca5-4d75-85e5-170c8b632249" +version = "0.1.3" + +[[deps.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.2.13+1" + +[[deps.Zygote]] +deps = ["AbstractFFTs", "ChainRules", "ChainRulesCore", "DiffRules", "Distributed", "FillArrays", "ForwardDiff", "GPUArrays", "GPUArraysCore", "IRTools", "InteractiveUtils", "LinearAlgebra", "LogExpFunctions", "MacroTools", "NaNMath", "PrecompileTools", "Random", "Requires", "SparseArrays", "SpecialFunctions", "Statistics", "ZygoteRules"] +git-tree-sha1 = "4ddb4470e47b0094c93055a3bcae799165cc68f1" +uuid = "e88e6eb3-aa80-5325-afca-941959d7151f" +version = "0.6.69" + + [deps.Zygote.extensions] + ZygoteColorsExt = "Colors" + ZygoteDistancesExt = "Distances" + ZygoteTrackerExt = "Tracker" + + [deps.Zygote.weakdeps] + Colors = "5ae59095-9a9b-59fe-a467-6f913c188581" + Distances = "b4f34e82-e78d-54a5-968a-f98e89d6e8f7" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + +[[deps.ZygoteRules]] +deps = ["ChainRulesCore", "MacroTools"] +git-tree-sha1 = "27798139afc0a2afa7b1824c206d5e87ea587a00" +uuid = "700de1a5-db45-46bc-99cf-38207098b444" +version = "0.2.5" + +[[deps.libblastrampoline_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.8.0+1" + +[[deps.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" +version = "1.52.0+1" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.4.0+2" diff --git a/v2.10.1/examples/musk/Project.toml b/v2.10.1/examples/musk/Project.toml new file mode 100644 index 00000000..96921474 --- /dev/null +++ b/v2.10.1/examples/musk/Project.toml @@ -0,0 +1,8 @@ +[deps] +FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" +Flux = "587475ba-b771-5e3f-ad9e-33799f191a9c" +JLD2 = "033835bb-8acc-5ee8-8aae-3f567f8a3819" +Mill = "1d0525e4-8992-11e8-313c-e310e1f6ddea" +OneHotArrays = "0b1bfda6-eb8a-41d2-88d8-f5af5cad476f" +Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" +Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" diff --git a/v2.10.1/examples/musk/musk.ipynb b/v2.10.1/examples/musk/musk.ipynb new file mode 100644 index 00000000..bed150ed --- /dev/null +++ b/v2.10.1/examples/musk/musk.ipynb @@ -0,0 +1,429 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "source": [ + "# Musk" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "[`Musk dataset`](https://archive.ics.uci.edu/ml/datasets/Musk+\\(Version+2\\)) is a classic MIL problem of the field, introduced in [Thomas G. Dietterich, Richard H. Lathrop, Tomás Lozano-Pérez (1997)](http://www.sciencedirect.com/science/article/pii/S0004370296000343). Below we demonstrate how to solve this problem using [`Mill.jl`](https://github.com/CTUAvastLab/Mill.jl).\n", + "The full environment and the script is accessible [here](https://github.com/CTUAvastLab/Mill.jl/tree/master/docs/src/examples/musk)." + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "We start by activating the environment and installing required packages" + ], + "metadata": {} + }, + { + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Activating project at `~/work/Mill.jl/Mill.jl/docs/src/examples/musk`\n", + "Status `~/work/Mill.jl/Mill.jl/docs/src/examples/musk/Project.toml`\n", + " [5789e2e9] FileIO v1.16.2\n", + " [587475ba] Flux v0.14.11\n", + " [033835bb] JLD2 v0.4.45\n", + " [1d0525e4] Mill v2.10.1 `../../../..`\n", + " [0b1bfda6] OneHotArrays v0.2.5\n", + " [e88e6eb3] Zygote v0.6.69\n", + " [10745b16] Statistics v1.10.0\n" + ] + } + ], + "cell_type": "code", + "source": [ + "using Pkg\n", + "Pkg.activate(pwd())\n", + "Pkg.instantiate()\n", + "Pkg.status()" + ], + "metadata": {}, + "execution_count": 1 + }, + { + "cell_type": "markdown", + "source": [ + "We load all dependencies and fix the seed:" + ], + "metadata": {} + }, + { + "outputs": [], + "cell_type": "code", + "source": [ + "using FileIO, JLD2, Statistics, Mill, Flux, OneHotArrays\n", + "\n", + "using Random; Random.seed!(42);" + ], + "metadata": {}, + "execution_count": 2 + }, + { + "cell_type": "markdown", + "source": [ + "### Loading the data" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Now we load the dataset and transform it into a `Mill` structure. The `musk.jld2` file contains...\n", + "* a matrix with features, each column is one instance:" + ], + "metadata": {} + }, + { + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": "166×476 Matrix{Float32}:\n 42.0 42.0 42.0 42.0 42.0 … 38.0 43.0 39.0 52.0\n -198.0 -191.0 -191.0 -198.0 -198.0 -123.0 -102.0 -58.0 -121.0\n -109.0 -142.0 -142.0 -110.0 -102.0 -139.0 -20.0 27.0 -24.0\n -75.0 -65.0 -75.0 -65.0 -75.0 30.0 -101.0 31.0 -104.0\n -117.0 -117.0 -117.0 -117.0 -117.0 -117.0 -116.0 -117.0 -116.0\n 11.0 55.0 11.0 55.0 10.0 … -88.0 200.0 -92.0 195.0\n 23.0 49.0 49.0 23.0 24.0 214.0 -166.0 85.0 -162.0\n -88.0 -170.0 -161.0 -95.0 -87.0 -13.0 66.0 21.0 76.0\n -28.0 -45.0 -45.0 -28.0 -28.0 -74.0 -222.0 -73.0 -226.0\n -27.0 5.0 -28.0 5.0 -28.0 -129.0 -49.0 -68.0 -56.0\n ⋮ ⋱ ⋮\n -74.0 -302.0 -73.0 -302.0 -73.0 -226.0 32.0 -232.0 34.0\n -129.0 60.0 -127.0 60.0 -127.0 -210.0 136.0 -206.0 133.0\n -120.0 -120.0 -120.0 -120.0 51.0 20.0 -15.0 13.0 -20.0\n -38.0 -39.0 -38.0 -39.0 128.0 … 55.0 143.0 45.0 -46.0\n 30.0 31.0 30.0 30.0 144.0 119.0 121.0 116.0 95.0\n 48.0 48.0 48.0 48.0 43.0 79.0 55.0 79.0 98.0\n -37.0 -37.0 -37.0 -37.0 -30.0 -28.0 -37.0 -28.0 -14.0\n 6.0 5.0 5.0 6.0 14.0 4.0 -19.0 3.0 12.0\n 30.0 30.0 31.0 30.0 26.0 … 74.0 -36.0 74.0 96.0" + }, + "metadata": {}, + "execution_count": 3 + } + ], + "cell_type": "code", + "source": [ + "fMat = load(\"musk.jld2\", \"fMat\")" + ], + "metadata": {}, + "execution_count": 3 + }, + { + "cell_type": "markdown", + "source": [ + "* the ids of samples (*bags* in MIL terminology) specifying to which each instance (column in `fMat`) belongs to:" + ], + "metadata": {} + }, + { + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": "476-element Vector{Int64}:\n 1\n 1\n 1\n 1\n 2\n 2\n 2\n 2\n 3\n 3\n ⋮\n 91\n 92\n 92\n 92\n 92\n 92\n 92\n 92\n 92" + }, + "metadata": {}, + "execution_count": 4 + } + ], + "cell_type": "code", + "source": [ + "bagids = load(\"musk.jld2\", \"bagids\")" + ], + "metadata": {}, + "execution_count": 4 + }, + { + "cell_type": "markdown", + "source": [ + "* and labels defined on the level of instances:" + ], + "metadata": {} + }, + { + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": "476-element Vector{Int64}:\n 1\n 1\n 1\n 1\n 1\n 1\n 1\n 1\n 1\n 1\n ⋮\n 0\n 0\n 0\n 0\n 0\n 0\n 0\n 0\n 0" + }, + "metadata": {}, + "execution_count": 5 + } + ], + "cell_type": "code", + "source": [ + "y = load(\"musk.jld2\", \"y\")" + ], + "metadata": {}, + "execution_count": 5 + }, + { + "cell_type": "markdown", + "source": [ + "We create a `BagNode` structure which holds:\n", + "1. feature matrix and\n", + "2. ranges identifying which columns in the feature matrix each bag spans." + ], + "metadata": {} + }, + { + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": "\u001b[34mBagNode\u001b[39m\u001b[90m # 92 obs, 1.500 KiB\u001b[39m\n\u001b[34m ╰── \u001b[39m\u001b[39mArrayNode(166×476 Array with Float32 elements)\u001b[90m # 476 obs, 308.703 KiB\u001b[39m" + }, + "metadata": {}, + "execution_count": 6 + } + ], + "cell_type": "code", + "source": [ + "ds = BagNode(ArrayNode(fMat), bagids)" + ], + "metadata": {}, + "execution_count": 6 + }, + { + "cell_type": "markdown", + "source": [ + "This representation ensures that feed-forward networks do not need to deal with bag boundaries and always process full continuous matrices:" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "We also compute labels on the level of bags. In the `Musk` problem, bag label is defined as a maximum of instance labels (i.e. a bag is positive if at least one of its instances is positive):" + ], + "metadata": {} + }, + { + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": "2×92 OneHotMatrix(::Vector{UInt32}) with eltype Bool:\n ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ … 1 1 1 1 1 1 1 1 1 1 1 1\n 1 1 1 1 1 1 1 1 1 1 1 1 1 ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅" + }, + "metadata": {}, + "execution_count": 7 + } + ], + "cell_type": "code", + "source": [ + "y = map(i -> maximum(y[i]) + 1, ds.bags)\n", + "y_oh = onehotbatch(y, 1:2)" + ], + "metadata": {}, + "execution_count": 7 + }, + { + "cell_type": "markdown", + "source": [ + "### Model construction" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Once the data are in `Mill` internal format, we will manually create a model. `BagModel` is designed to implement a basic multi-instance learning model utilizing two feed-forward networks with an aggregaton operator in between:" + ], + "metadata": {} + }, + { + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": "\u001b[34mBagModel ↦ [SegmentedMean(50); SegmentedMax(50)] ↦ Chain(Dense(100 => 50, tanh \u001b[39m\u001b[90m⋯\u001b[39m\n\u001b[34m ╰── \u001b[39m\u001b[39mArrayModel(Dense(166 => 50, tanh))\u001b[90m # 2 arrays, 8_350 params, 32.695 KiB\u001b[39m" + }, + "metadata": {}, + "execution_count": 8 + } + ], + "cell_type": "code", + "source": [ + "model = BagModel(\n", + " Dense(166, 50, Flux.tanh),\n", + " SegmentedMeanMax(50),\n", + " Chain(Dense(100, 50, Flux.tanh), Dense(50, 2)))" + ], + "metadata": {}, + "execution_count": 8 + }, + { + "cell_type": "markdown", + "source": [ + "Instances are first passed through a single layer with 50 neurons (input dimension is 166) with `tanh` non-linearity, then we use `mean` and `max` aggregation functions simultaneously (for some problems, max is better then mean, therefore we use both), and then we use one layer with 50 neurons and `tanh` nonlinearity followed by linear layer with 2 neurons (output dimension). We check that forward pass works" + ], + "metadata": {} + }, + { + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": "2×92 Matrix{Float32}:\n 0.890284 1.01132 0.88188 0.917716 … 1.46193 -0.254 -1.00311\n -0.864341 0.303749 -0.324059 0.144588 -0.71427 0.569847 -0.302701" + }, + "metadata": {}, + "execution_count": 9 + } + ], + "cell_type": "code", + "source": [ + "model(ds)" + ], + "metadata": {}, + "execution_count": 9 + }, + { + "cell_type": "markdown", + "source": [ + "### Training" + ], + "metadata": {} + }, + { + "cell_type": "markdown", + "source": [ + "Since `Mill` is entirely compatible with [`Flux.jl`](https://fluxml.ai), we can use its `Adam` optimizer:" + ], + "metadata": {} + }, + { + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": "(im = (m = (weight = \u001b[32mLeaf(Adam(0.001, (0.9, 0.999), 1.0e-8), \u001b[39m(Float32[0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0], Float32[0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0], (0.9, 0.999))\u001b[32m)\u001b[39m, bias = \u001b[32mLeaf(Adam(0.001, (0.9, 0.999), 1.0e-8), \u001b[39m(Float32[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 … 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], Float32[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 … 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], (0.9, 0.999))\u001b[32m)\u001b[39m, σ = ()),), a = (fs = ((ψ = \u001b[32mLeaf(Adam(0.001, (0.9, 0.999), 1.0e-8), \u001b[39m(Float32[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 … 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], Float32[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 … 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], (0.9, 0.999))\u001b[32m)\u001b[39m,), (ψ = \u001b[32mLeaf(Adam(0.001, (0.9, 0.999), 1.0e-8), \u001b[39m(Float32[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 … 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], Float32[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 … 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], (0.9, 0.999))\u001b[32m)\u001b[39m,)),), bm = (layers = ((weight = \u001b[32mLeaf(Adam(0.001, (0.9, 0.999), 1.0e-8), \u001b[39m(Float32[0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0], Float32[0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0], (0.9, 0.999))\u001b[32m)\u001b[39m, bias = \u001b[32mLeaf(Adam(0.001, (0.9, 0.999), 1.0e-8), \u001b[39m(Float32[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 … 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], Float32[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 … 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], (0.9, 0.999))\u001b[32m)\u001b[39m, σ = ()), (weight = \u001b[32mLeaf(Adam(0.001, (0.9, 0.999), 1.0e-8), \u001b[39m(Float32[0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0], Float32[0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0], (0.9, 0.999))\u001b[32m)\u001b[39m, bias = \u001b[32mLeaf(Adam(0.001, (0.9, 0.999), 1.0e-8), \u001b[39m(Float32[0.0, 0.0], Float32[0.0, 0.0], (0.9, 0.999))\u001b[32m)\u001b[39m, σ = ())),))" + }, + "metadata": {}, + "execution_count": 10 + } + ], + "cell_type": "code", + "source": [ + "opt_state = Flux.setup(Adam(), model)" + ], + "metadata": {}, + "execution_count": 10 + }, + { + "cell_type": "markdown", + "source": [ + "...define a loss function as `Flux.logitcrossentropy`:" + ], + "metadata": {} + }, + { + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": "loss (generic function with 1 method)" + }, + "metadata": {}, + "execution_count": 11 + } + ], + "cell_type": "code", + "source": [ + "loss(m, x, y) = Flux.logitcrossentropy(m(x), y)" + ], + "metadata": {}, + "execution_count": 11 + }, + { + "cell_type": "markdown", + "source": [ + "...and run a simple training procedure using the `Flux.train!` procedure:" + ], + "metadata": {} + }, + { + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "┌ Info: Epoch 1\n", + "└ training_loss = 0.79128903f0\n", + "┌ Info: Epoch 11\n", + "└ training_loss = 0.3943807f0\n", + "┌ Info: Epoch 21\n", + "└ training_loss = 0.26313362f0\n", + "┌ Info: Epoch 31\n", + "└ training_loss = 0.1771421f0\n", + "┌ Info: Epoch 41\n", + "└ training_loss = 0.12149703f0\n", + "┌ Info: Epoch 51\n", + "└ training_loss = 0.08492497f0\n", + "┌ Info: Epoch 61\n", + "└ training_loss = 0.058849733f0\n", + "┌ Info: Epoch 71\n", + "└ training_loss = 0.043363024f0\n", + "┌ Info: Epoch 81\n", + "└ training_loss = 0.030421462f0\n", + "┌ Info: Epoch 91\n", + "└ training_loss = 0.023233365f0\n" + ] + } + ], + "cell_type": "code", + "source": [ + "for e in 1:100\n", + " if e % 10 == 1\n", + " @info \"Epoch $e\" training_loss=loss(model, ds, y_oh)\n", + " end\n", + " Flux.train!(loss, model, [(ds, y_oh)], opt_state)\n", + "end" + ], + "metadata": {}, + "execution_count": 12 + }, + { + "cell_type": "markdown", + "source": [ + "Finally, we calculate the (training) accuracy:" + ], + "metadata": {} + }, + { + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": "1.0" + }, + "metadata": {}, + "execution_count": 13 + } + ], + "cell_type": "code", + "source": [ + "mean(Flux.onecold(model(ds), 1:2) .== y)" + ], + "metadata": {}, + "execution_count": 13 + }, + { + "cell_type": "markdown", + "source": [ + "---\n", + "\n", + "*This notebook was generated using [Literate.jl](https://github.com/fredrikekre/Literate.jl).*" + ], + "metadata": {} + } + ], + "nbformat_minor": 3, + "metadata": { + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.10.0" + }, + "kernelspec": { + "name": "julia-1.10", + "display_name": "Julia 1.10.0", + "language": "julia" + } + }, + "nbformat": 4 +} diff --git a/v2.10.1/examples/musk/musk.jl b/v2.10.1/examples/musk/musk.jl new file mode 100644 index 00000000..ad06df86 --- /dev/null +++ b/v2.10.1/examples/musk/musk.jl @@ -0,0 +1,34 @@ +using FileIO, JLD2, Statistics, Mill, Flux, OneHotArrays + +using Random; Random.seed!(42); + +fMat = load("musk.jld2", "fMat") + +bagids = load("musk.jld2", "bagids") + +y = load("musk.jld2", "y") + +ds = BagNode(ArrayNode(fMat), bagids) + +y = map(i -> maximum(y[i]) + 1, ds.bags) +y_oh = onehotbatch(y, 1:2) + +model = BagModel( + Dense(166, 50, Flux.tanh), + SegmentedMeanMax(50), + Chain(Dense(100, 50, Flux.tanh), Dense(50, 2))) + +model(ds) + +opt_state = Flux.setup(Adam(), model) + +loss(m, x, y) = Flux.logitcrossentropy(m(x), y) + +for e in 1:100 + if e % 10 == 1 + @info "Epoch $e" training_loss=loss(model, ds, y_oh) + end + Flux.train!(loss, model, [(ds, y_oh)], opt_state) +end + +mean(Flux.onecold(model(ds), 1:2) .== y) diff --git a/v2.10.1/examples/musk/musk.jld b/v2.10.1/examples/musk/musk.jld new file mode 100644 index 0000000000000000000000000000000000000000..dabbd44b7cfea17acda073c2fc2f8b548efa6904 GIT binary patch literal 200275 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�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 JY}ph0{}-or9qj-B literal 0 HcmV?d00001 diff --git a/v2.10.1/examples/musk/musk.jld2 b/v2.10.1/examples/musk/musk.jld2 new file mode 100644 index 0000000000000000000000000000000000000000..8cdd397b80b7005e4085efb4b118a13b75676c09 GIT binary patch literal 336068 zcmeFae{9@mmH+!`>ZWe%w$s)H17VAi{^sW9&gSNuYei9HMNwr{QSWp%imWKAtSE}C$f`zB6j@bN zSydESRn&W5uX#MgKzI53N;lG5=Q-y&&#!ad&v`zRl-UuVMYjgD0f1us`a1=G&@vBX*@`ccU>PvHR z6m=$1^vu6U(dB9s?FX-b+>R((1PiolFGkS{7{g}}?85fze~*eF+7Cw29T(H?+3YXj z-;eF(B#Kr+iMh1Bfo+NQ6gJnn3VJ~X+ue*^Mt%^vm;MKldypSO9>Zsy@&A?fEcgY` zKZor;uxm;gm=Eg%9}`bLuwZ)04E!$L+sk8^Z7HNb}tbHrT&hmJ^>!$u<3L*!z)1Tk!k*o6o0qTBHwyF} zq|bS7f;Z!(yeZ%#FWZ6pGzYD;%gnuw-ihAe<$mn)C5OEa`@0z5jV{mrh4wYt)8L

    jnd`0BedMPh^f#;K#=EHg!v9|^oKryz~sMX%sz=Z1A!r`H$ScqMbNHDH#9Y4_FTa7GG0x+&2l>Z%c^#hyFNYW-FXi2v@zT7#vDq&- z*4e{WUb=62`3!qlrGF3e~;oGiyt(Kp*WYCe2R<)yX}baPOD$C0~$XXr;- zFZU+lebg4=KZX4aHrJ7tJs^&Mw_Z9%Ud|$Y$B*M9=YFjX{7)c{bJ*@hnj8Hi{LD`? z?F)?E`i@7eQ32=hN$EHDm+{$JFH6|WTLHQGju-z4-Mdg>T;m=8F1qjdJ)J@XyUGNuInvwGP~f5bT7@%_jzAl=)yk-pc)*!#YQUy-%w|Lr?&zFL6iUSN#z zcxTF9X;(O_F+Q3^(QfcEFvksEuHZX|Z3Wv_UQVNX-#!D(SvNk{uw`ktBA0;U4uWy; zpS|NZ@qII1TF(lMmACC+o&7d=Sz+Jm4PKt7e?Ran#?`Z(pe-+j_fuZFZ}|a=|B4(% zmzUo2r@$`SCH(u5=G}Odm`j_y+*&W?zjM3ZosLESAW~lHy9X&R&m-YwJsZQ3c z4qpRLg7S;(6@O#g1|oFN)8J)|H4Z1CUd|$~;?o0a_%tKm!yFOzTeQu$yxgAt?)Rnq zU!%Xs+}2C^`cqKE)&e5neH=|fz4UCAIOMX7tx+#8;kN?x&0rq@F~0KBvwO$QZ-bYf zOodky&`)@amA*N;;60=j6gv&IPf zSO%Twjd$GpCoknoA26TY=oQX*n6@#!2;hd_myx_5O2W6;682u;+%+I4KA8rNnJ?!n zB87W&oe`wIG4nSu*G}}ukdBpat>{_gOGxMS`;z-nJc?YXhFWwPX}#Qsw5Aq-V=pr1 zG`3SnYedW%H6SnFfo|>^^>P#+d3l&Vb1(q>Ht{=aAJ_pZ*t(H&xr8(h>Wz223H@3U zI4!T;k8iIzXw=JD`mgeR{y(tS@M)zl0^U{kw4Z)sepedmkX&U>fE#e_MI^N&Ftr zpKL0$y=K!capXIMBrY~`irH0MR;c0cm6!Wwepv$Xdj zjbS&a;gdr?fqg44t)F+NQS=W;--h4(9xtukz87-SKc1m}4%YP?#@n;Hro6PSJ(`B^ zOJh|58GQB019L4eOUSLf9L9DEU%9gzxs{i3eEWCLR$h+bHwy-nz)NE(FRy?lY;sm! zmXNOl=iUJFGKaMGjIfV2(24$Oe9u?^@cYud!pW!-hc|l=zl+$cmyK_q5%hh)n%j%q z1xk$RM}Cs^%!Oy3!)Bg~*w0{-mm|m(>@nwTyyMo(5_WxOk@a&U*>nB3mcPILC%7Br z80)vBdD;4oYrDu8`JF|+4?Sj$8aP+I{f?W%ZS;*I<)v@g2K~ln^Bphl#Qrl-!ESwQ zMSchAJ1#HHSA@SgXw=IrdgC46S}*q`^&I^{y^OHmV!ZY8i_Ez_t=G$AFk40 zWG(yO>>XcV%{=|@Ov9ZkbJpvOIl`RA@nvA{{#d=7#>aQOA9%KI#;sw?(#{~yf;nsl zK>=*#Wix#jfHB{NG?rW6aqH%r)yoWfmWSlH9((Vpb3Dl&te1Io_fV^Z`u2WoIrNu! zd&;!s(oc}T2FAvEIl_2zfKQ~qb1#F4xU|uiv!A{^au#WwTA=M*6{NoIp@=?(e1bV* z##+bRtG_>1k$v0+_dvZU%F7egaQ|vZ=d#wjb_|;6Ur$24Ttwc5?%l|MIsD4VB5O?3 z=UK;*^6~(E`t~5-irnDbzd=63n*WGw)JxBQ86R`veXB56lVj76zXJ2mpj-QD^qI$} zX}cG>FJG3Cok-tP^WZyvkp72|_oX4m2UvF>dgC3xfxma;mtYJ;%w7Dyk^Grs4r442 zn>XbKHqR!{PiU)B-}QSjjGM>ShE256wiXxzYs4rxNqZ3cZsZJOT9BJ{D(bG{2A6&=tcn^)~ z+Z>yQcidR?($|OVLpnZ#{6Fy7ORlV$j-3G3wN>P2kj=;#-_yuP)9|fn-pqA23Hfqd z8+wFZ% zM(FcNc*o`6#ZA8qWBxP^Z@uG7*v)eRSxLh8yYcl~^ebQiyZo7;ZS2j39O%%WHDWND zgm_2H=eowVjP0#y$bB2_`n^N80`qTd&7b$&-0`;5--sF7-nnAT-jHSFI@0^UGr^Z} z_RGuj*j@wr$(LpNwFZpKRE%y)6y*raK95Q3jiLwG-WUZVF$|DPP>L zG4ee$zBTq_t@=A~0gi6+vi^I#hTq4q_kezU??5gy?;_|;;VyHTr)K0^=yOkJXuFQ* zX$LX$yH*81zb8kM@Qv4w%+uciYRtzTitw`jj-SC+0Ilfey1Xp1{u**E33JE? z_i_!CKvR1A?=P_=Yy1n6sQ zJpUqN%>AFF%!BTq7~7GAxj_wB|g&T+P$ES{u=8Tn-26B z&?kU%$(I85b^90}Gfw{gJ?#N7P5*yG?g7Sag+BLXJ@I@4v|VcoX`WU=g|$4xh_)T! zzPZkM&;v5qwlmiAd=NR91pgS>N&gsFe&)bBJ_)`Ce8*d`jU)dOm=igfWlRmbaaA|2 zG3^|P(T^s9m-25-8>r!9Jf2_nB@ISKJ2M)kk%Xw=I*KJcX;i=V<9WAL}2i!l}E zH$QT1l=0p*b3Or#`61+6(r`EArEj!xYQ>%h^3mTtMWno(!N)y~fCc>A{|s^zdlNSA z{7%Q>U&d|>&eLZ;_3uQMW4M7_2Q^^rG|&3E?}JF^8bU^3gSq;WP%mqYjc9j+Pvf&v z4Qn~SXRY8{p}ovn&S#9i4!ozn>3m<-zkLSiI{^M1o8PIkv`dWfjue=~`R9%^gV>M7Q2?b{729YT*DX`3w3i7;qRMuR~q&d zqx-#R4D36={GUZ1!MB9&*_V+yq?|G@_tQUzpLL(U`rmi(hS&e?!Wh)>b^On0H|nMD zTMJmjUS^Jd#vcKmwH$}PpBY2HJB1teRYTnBd#>PztqofSc;;=+P22a=yC5HX@VSP~ zIJF=v;2<{nUI6m)95&Ctj=$|L?CnVX7jIZF%_=C|1I|ewjY` zVvdXKw;A2v7p_0TIuW{OY4Ea>zG@QoVLmGO7+Yfn59>UZzpnj$e7O(xe;?<~tN;C_ zZ&{(Zxn{qAXDo+F?c6oC6Wj%=@nyTh*P|0(gVK)bP&<947Q2SbF8~Y5nh3yLXA^yYItyN9v^3!k35^e9O zvD-y^7ObOBRKsr?@3QN~;5zLHIJfWi6xhS}(IF++4;JwAe))!f0^9-gH{Ms1@Eu;l z#~4NQtzQaxc<-{2Mvi2X^CQEIgleas}!A&LBP4 zQRG|G5X+btZoEjG68gb$`d&azA>mm4dtek@UOHB;#Ecn7n#Xrz{|)ea@}r=_m>Hz+ zoV?tHPZ^u%Xade@y|R5lo!?#Mggcg!dvG0FA6Q^dQ`r5@UZ6dTt;o82k!Shc!#yba zJ{+X~^I#6Ub53BhCj2cZp?3oJWGxv>;0>t%iD`p_=*D6j7^sHto0qW}k0D^}Kh9h$ z$PCER-Uv@njOt>09Gj z-T=Me2w2Del_aX4A*#R;+Q)#u1E%QT2b{lzUzv5U(l)1X;Fw{!n7%&z`jE!Km~8z$UPbpV zwJ_%@lA2cc$urk!^hcS?d^diNcO>C%$mh4>>wb!yF+=-leC1^kTPJ=s?BnSu#~m}D@?K%D#{l0P;|j>* z_!qHr2Y>r}`~>zk05AXO@9_+Co8LL+D>Ik8ybEM$TMK)U^3u4P8}sK|aW|40^9R4j z*qSjN5w`2+l?kXJy=oPUvq`1d5_ z0-Lc|0sZJPz7K+C+F!+Q7^(e9Y`H3X;5Uaga*g(3z}``f3+obDlF z&AycJ^taJBfZT~RR-Q{nX#_bhHl>6vvXQIeh!X;7W!wvHELBB2A{X1-$J)8^?|Q~r$7Z> z^2XMG+x8%>DP{KCjPKqg)Jpm7e%yP8w(H8vB7P z`e)=keeTaY^B&O780U}igKzb{nI~(Rxsor#$U$HY>PE+}{&(8{EBaAt=Mm@WQ6Pk`D*yy@T}|1FE2-FoA=Z7HG^5; z8{)W~thX20;HBSm2ha;Zp049-zMr5iFBfSqfko`R0rmfe!*%6l2U1?zSHP!?UWthp zZF%Xv>_e_0<)Z8SZ>;}ckR95q;WwAxP(KD6=;wgvuP|>OL@7B-$UAT^=5af=eMsYM zY>aCgdJiZQ>t*bYx6khtcvJs3sk7DK<9%HLo-qp|e6x(rF^{}-57&XUbOCfGzst+F z;4^{E_w+|V?zpDwKa!G1&`!Ip%G~~mLrp)AUI15seDN)ANy0ux7$3n!)) zHvC?!^S*-3^T^|vc8xJp$UD;8aedfqJy&!Dw2*RlI{jskgT?Bs;^!JK%vDqscs81RqZHUqQ=!6K-{!S`ko&N+&0X4A*ND=b|yPy9-R<+lWvvWYZFyNh?gTm7HP-?u{j2ESjZe~M zO#K~qo_o>HV0X{^kTL$#$o@3kSL3&ipYMb6P_kJs@zdA5nwulo&672(37JLr+y{|O zRrW)heH5u7^%(bKn+NANr9K;sT|rteN0BFy)~!}`(1Y#I(3@#TU>*MvTrANSV?VBr%wh9> z9NYA}g8VqT*a2MkIAbE3OAX^s&?Uj}Jx+mUUIAHn81 zd}n?GT(1XPYa0IDwVk%U?#Dkd`V#sWI0&47C+JE-EQ*zoOSx!19|gwvQ}E+|Aj{0} zJ$!_A7HOzP3>tz<7v)H}Y>NWQ2+840Z7-J0@MLtO1Y1-DPbI1v7#>Kw3&^LyZm&^1Quvgfx z{4IeGV7Dgw{r)jzg??+gcHcMu#Bn&s!6e*^X5;{Uv%p+UqwD`V@-=khB_EBIxwjta zn@z%<$fV&LWb+=@|C=_yZ`$x_MSc!E407mEC7i#Tw%qJUL%rO?T%Khoatt(qmNZ{0~+;mk$z*=$=vckPoICBM}BO_b|08zobS;Lc5`x`zBRCdo<)}9@C|)~ zb`5w=&o1Yzm*eOWK8`PAyF%Xypzb|BN?ZQL_Jfe$NMo}|`xWE}QeMkH&s;{b!vMW{{G0e_42QQYdiJ|aG%ql!nzBrmjQj~t>9g0;NjsUtl^$of#+SKUk>>@ z$(lEh-Fs%e$)L-*S^7QqyMgZUFbJ ztR~oz-@|_w(!KX#y9FLhsg=m}7sI~fd=~u~e6zqjzXCi%3-$@xa%mpjIbQ&a!26Zw zo71|rLEk}a&jas)?IL50+gsD{d$@p4FS@xp1YStOIzz}d^fmh5K+d4cftWp8N6fo1 zJCA*Uwz;uh$Qk!(JkEf5)|*3?kTIyzzL|u2;yL7AJ2vmiIi$RlJ1^1a8#RWMf2;J} z0I!4hqnjV+`V(X~(s~)i#0GgB-CAhwVr-tz`C{g6LdrAuZw{`Z%S+Ft z9Qzqy9L@q`I|AhNNWxr5?_mpV?oB=C3$%T!eIty&GDbFGm-C*{y*@$PIVWhlZ@DP{ z2%7P0OT#_vq1{y_E{w~7Hgw-;>y)+6J)8!e*s~y_EeA)yDCh_FAEaLHV@yjD zxPJ)SQQ+Ro%)5*B1kl&B6+wZvXYqT_bygG3fc&oWAWP`hsahO-mYK)5>>~D^^v{AD zz~4kyk=Z2F{tL86@HG~4V+OnX+ylmG%M16EMSA98Y&m2vdJ$Pbw_cvZ|1RVu~EmG#=Ir&*^^n-mlmDQ?xzvEby#X(5HcCbBt%NRYJ}6 z{MWI0wr1@5_9H!GiLvIc4}B3i2C~3C*XWzufe+Zq%d7O=1g={F)^K^*jcp?dbq!wD z|K2Ol+Vk`cV!sX!0_Tl6V~KVi+^B}{qWwtuGEcv6SlY-UB&(8oT*vO2hA?>)2xUl1E+z zPvK`Ct)s^G9{k+<0yqo0f$xTIpz)JG1@Kk$A@DRPF#blue?y;!zdP|h%e%eU`oS1D zTn)cJW@+nx9JvddcP2~Q`r&W7>)1wsd+I`uXd7F{o3DFm8~-OjgO}H^cYzt;H?#ZJ z_hrxz){;;geoEg7^<%=f>wO$g^G!dzE$@aBXYt@7K#t`rOkh7zQJZ89-hFbDQ-t zlZ5*1x#qF=BIlTYH*ymFG>Bq=tw?)oy}Xv}Yx7JJV zYaZ0=B{g6l?I;Onwe}R*?@{y_<}$Cw@j5=E!1%kqxqktl8ou7QBKB_jp9AgKt(VP6 zznL2K(lr;sc5Ke;*^A&Jm;&V_tZi)lez=P56d1>D{A27j^l9+>_0l)Q`y+SEscTW$# z5Y!kG6Q2_8F0fn;c`GBWml1vMW^8v7em|W-&S1X@_Rv0w^qg|vzh5>+?zJ@`=Z*uP z2iY`yTkB&zvVIt6=W`w7E0~|L%;DepK{SVH;&Eyok7ZLWAr?_^>QDwzCZfbv1gE;rwPdO6{Ktv)AG-8c^bV{`)F zFVKE3@Eg`Ucov)MTm&1;D_^W3a?Co_1{SbyLk{B80b<~~8~9wJZCqTVg1(IJQ?#E3 z30Oy8!q=F*3*A`H(Uvpkkawe-_e1#jc4m>rxRX9(>w3ng6@5r0P?tmJtC*x z4fpIjK8M{n_^tN>(m4+x7qNeuc7c6eMR))5-?Oa)=dIA^Ui7!d=FmHnQ173|_EGwb zZH~5e*}V>;%S+FlM~|?-I}JQF9=_xIl2Chwkj7h1nfnYliOoI8%eft)&pX_WZHB%T ze5~KD)sH-m+yM8{ehcUT4PIWy-VP?f{n%%aH^3?w1;%j!{D?kz1b^yzl3P*2djgti z=dss73wjM*UYhJm zeRJg02KELoub{6B#v02rK+gR>FRx-ZK9gWN2^{fmYda5$Kn}&gyBMSAIo|_m_}@A? zr}0@zLM^(0v`!nh5`LcVD7KwQd0ApVa<+>85-0$9`2lQQw7;PQ?*I*68rKFdjYs?D zxEAa)v~L3WFbami0}_C;v5(U?i0vXU zPsZB#Ok;0NLatAv8)w%qGUhlkLTdMX?&AvW4AQsLb>zqbedFj&v|EzEOJnu`HuvY- zY3yDH<3Rqp_F3TBv%nmdfOFKC?~`e$AEW5UlW@1K5g%u)xigR6J@YYwK7o%hzJ$N? zJC{7Qe%ZbbmVvpB;}B0{F_?t6)_qQ)FEN+zXM}wXy$g8vJ@03MYgZWWyk+d&^dAQ? zHoq_DlE5kZyz{$(=Ntoa#n@Vh&1-?VCXn9M0(g}1#^2m+F#bToJ}RN+Ok-ODbHMu( zWA`k^!S^J_9n0t3MQGUGjag+BA+p7w*I;5^7Aq0UA0N9@J> z)Pvn`nID4x1^9hwjO2##8(~Ziy~fW`9|1duYo`f75u@Gr&6icj(Quo07mwznAriuvw3$kVP;> ze=E2~Tg(G_xQvuj&b0`3CLxA1*hXo4=gQcfGlw)E-jg@u*a(>D%lZ(6?z@M;-^} zC1#&zkv&PMp@X#Zpba#G5_^~d*2`sd$6f~!y6c(?*D-d!l{xy1J2j~OfAi^!wAZk$ z;U_PLliR#BeuJP7ANRLTzh_$n6WHr1+ZSn{2JUwR%rNEv z(mJPo1KqhB_3~wGuH$^}{}j@(?&tl?*+N?mIp%}NDRlQ@Y|aDgz%p_MxSshc0ngZk zv|bD#?K_cd)+hRW$F}m)H@seV@UdPxr+ji=`6VwGnadiq8_3Ht`6|%1eoZBzUD;f3 zfijx>wgfm=H7Oy^QX8mVje#f%@-cqIEP;|`ZD9H^!u%pMaoNK z=YBds1~~6o;MvTtwfkovNBaaAP6FSot=0+WbgUdPzcuvdk+0+TX>0}7zly#FT7!995gwOL<339{JcusxWDah}<;pGm^sU0y;u z)^Er%exCI(wj$DZ!+T<%@iE`+U6zSvdGfwH#|^Lw z#=rgM~YuJy10brc) zt^ao$^0Eir`?QjT{maX*gT6HI@~>!{t9Gy(Kl$!D7l3=KRNw%83+(6p$gR8_#K*Xp z$79IjK>o?g7(|SJDY?x{^B<#k0QccJjGvq=FvmH@Z%1FD{Q^GLv@BAePWp^Z7PNpS zU@oUXPZD?_FZDYOy0G=5%geWe2;DV4Mce+zk>2$;us3+={aFQ`XBes9R$d-JH!tJJ zi=Ya21JCkpP^Qm4?F61*UOoeQl5p<((%=2va~}In@G@{d@1(Kt9vs3pi%njZm{(q& zL7xU~poWjXdpz&oAiW3f(6^tf~L3i)ITaTyk z9oy$=zYq9({CWJ&U~?Vg6oF>+M!l3D4PI*VJe{Bk7_X~f8+Lj5O|ZxritN|-UcUNP z)MDQIg!AF+Ii3KH^^d$XH_MDWhR;K^v&aT7U8e(NfbH|(EI170kGwRe*0G&Q*n_mSG{mwau^t=sTUPWIQte;1^#|AGS#s46>yj(^;2VCFScF||8IY!%jje)PA ze+_u%Nn*pu(e*g|9NcICwXc7Jzt|< zUdP@JCcq!7m#6S)Ndhm;e?+?%G}D%so_`SCbIBQFC12!D7xu>38u}2(0%N%d%+r5k zOluOpMGv4K0gkcux<7Fm7&E_93bZq<@gU<|=M2#IJLvAIDGB_I;^5<5@s1Yh+YM%b z_u+N$GRP&I30VUXW0vt>2h-RGu$90h?F@62v0J}#NV&VbBm6x|0eu1=W4w(2T}bP= zTy6z@v|WD$c;EapNP7;%34P2{j6)6=n9IMLGL9ScPXc572)3=?mv3O7!`_cv0GT9w z<7AQg&C{31J`5`0D3F)sN{EARi+ie}cOZL#cftLi0%Hla0_ZP?joUe}58MLg!W_s) z<5@rB=69rH&C$$@p;q^z%ZCDJ13kbPTel0K!OL~*=0s_}&1?NT79a0y4!dz52mb^b zzsJ|`vpxT%6Vi97Jyd$CFS$ z%-?6gJ5%D0&3gG>;5%-esbX`Tiy#6S^hUk(zBcORHrhk zee&1)wF5NM{}Q&#$VR<1CmZ;hpSw55mGO}?S){yl9naALS~lA=$n&6-+^(04#Agv( z%zUGabIR3LpF=KU|1@pyz*Y1bSjR7qTm$ai8tgqVmU1~JKkj)6w1Fq- zn*dAnt)e@&Q7`?@Zc2zHbG$qK-FoT1d%!T*S})Dx32dHsYrX7YuAA6K!0*?~BiPK_ zfA)?~(ErEkUj zdutM6XFc+aqo73FI8V{mH^;oj%{L%J+qcto%=ZF*KR|bEOA`27!{*;#wxRnz@1*Y* zC;<8ExGIn{{Yl{ILE0_AePpniH+ixEd>`kq`*({YNbjxr_3xeY=o9$JOZRHM^bEcq z@}xxDeY@sI(W5xT^BDSM5`GUaGgl7XJl5+Lx_4qb{>IqzS_fUL%=m|C%L~WM1M7;v z2@fZMzxJKPJ`2u)Vc>bq!G7SpeaJkR0JgmY`aK8c8NWXX^VZO(f&BK4c-Q5;XE6@m z+ZcP1eO*U7|4ZO7i0Jdr8tqyf=8Ty;0%HmH8EL&-rr)t8AV0d3Q0F4X=xa^t!JZ<2 z2z~(?^>X>eP%lRqlf$P{p{~$w1J)UHXFc)!r-3na{x`r1`Xq=LV{DB1EW9i+=3)}| z(}6Ts)?~-*24m>XwHugYbG?<9EBJKK=U!WoCG_{xb`IYebLRcMgnfoKYu4X>^E!mB z8{IRUN6s;(HN_7(hpiu5226nu;V)m`jm#nk>CYkMWdT`0H$U!o1IR<~qSEu80Ornm zAEn`YrLqG(33uQCavzvsF7MF`cM3e2hWg(_`-}K( zNAIQW+9$yc(4B0&0a8zO%#Cl;Tksm%RoQx+7;w9kl(vNKH&`P(>=MzJHP;T z<5)uugCcO;D40*eT5{ts?dQNc(#KHF}+2*f=}Ze??&Ii-}^hp@1B3b z=SyG_eH8nv;2@|uhWM0dcY*WOP*3FDE41Bf2k5151X;sgWXuA6=E6ILPyPRf&LI66 z^dmry$(e32O#iNwID>Da8>4pt&+Z*^oeQAEycyu{*@x1QSKnxB&l~i|!0!t4>l&v) z6Yw6nPL@7>uVSrSLhSTud$9){8-&!(;^pCYkE}lV;8E0-&{5^wyp3%R1nWcX( z{f?Jo<|YrkuX6Tf+F}UoK(`L}gF92s#(%R=MCvC$#LJFXpViB~%-ab(hcP{Y zlrP5K+GgMPk>1@wum;S}N#K}Y(f2iA{h4R{3h-W81LVNXgl~zIbJLdh#^5Tp!@zYe z0LLvOJyWAzdKZ_mzk%KO+BQa`;3{yOK7OZI-;9|&vOapJpGpJH;3wbe_W@fGKVy0a zHtXPI67Gv}@a|{nlSdh3w22bZm>&Tj!RKe7#yorMkHfcdC$`to&F3R&*n|F0VsB3v zhb^UTy>#y_w4J{X``c)L6qrZ(I*WY|V~!)e6BRHD%>OR1MB6#Ec?Zm|GL!PoC;Xc( z(mG@Oy$gSiZXN#yi0QXpdT-A#z6p3XYnQnsJ<3E>#+~kqFu%8BH+A+8Z%w2|Yt}_B6#*Cpi(LPE4 zduTV)mOH(h`Xth`PGMgLu5awJjIDun^pPa+?B0|;u!iw*&zI%^)* zX&2%0L$rNcuQ0ZZ-w1Zs`%oI*%_Zz-u^#}dpcBY(@7OGD_tF85B;j}LX{2{!65Aqp z8U0b_avt})3piiQ+P9FoWb@zS81p#j#b&&mw}-wW`x&Ht7kw*8Io^%E#-7KK^1!`D z;9>gC;bUEQo`WEhgnJgTUWBjzc4)laqkm6S0Df!e*Osyla9z)7?Bzro`Z&7x-5M@m zT;tRD=8|xJ@2C5`3|w33`g@uC8qzsS$m1Xb?qh73J?*4@8muSbdtevRciej6I;-gJ z#Twg!+=uRW)I4o}kB^{xKQAJukh_6nZy~*}3(QsF49n4&+G?0q@y1#!b`q9gmTDP!Y`AOuzXtrtWbJ*$j-qdJ?`h zjf=UPMEBfHKwdiMSx^L{N#K_?uLoSk=GmIDuOj8q_@?dc^dF+_-cQhPJhQ<4IQJoJ zem_`eUj-$`wqQF4^l7}~Ir=uR)##^Q*8jVWFEGyfF@XIQP_~~jG4a_?yALGz$a`aG zE*8L-(xAK7*FZ0DUH5hY90R{$%nGs$x|6`wUZnSE23f>@8dPjE_9!xoyq|HdGYp~^ z!++yxjIEc}?lZKlmt}nA=_K}j*rq@Q)PQ-ky@Jn8WHv#kePE?Xy5$6^Z)|`eOEWh5naOW2388*9(#{y&c0m>7pkz&?3ljLOIz z^u2^_5!^(7Pa3#ytfs+PP+{#2WOows?VPWo$H4hkfbXbvze?Nsd>rXrn@U1X7m=;l zo?!lE+Q!Mb4}e`j9!CjlF-OFD5&N?qG-2yS{s857h?;I%YZ!o@@|oK z8OWCk^SP%k`o4uUzZvYVtKUJS=W`EVr@seT26=EDm_PH-P5aq2)I<5@ci!QIZy0Q+ z>1#&1wtsFQ=ji(&KGs6_awl>e`yh7TPS1ZB%+Y?7KJT%7*7p?BoQjAEHkwXFIUDPA9S*c;*H4QDg~N8~iqMPy0Y$5^ApB9-jLR^pB;1 z_ukzPV=rU70`faTjgbe|i6{-e__uaUxA+G|t=GpZ5CUD;KU;?}wJ>7(N zeh;?yrs3br&B338zeoQHcsnp(xAfb@1K8%-i*>UdTT}_((Vn*hxF=)RL|Yzw4!FmA zfjN2tct-aqZ@R!V@U1($X+18-eTl)^eurrdY1j1rQHhNg|GS9 zmWKI#CyLnRt$F$Y`f!!G81n+sIJuV@?9EAdU%j`j*h=U{#+d6#^wVGiJwlg*l^8$9 zouTbsjmwYF<=PQ+d8xl=%b_ZX)-AA>euCMihtrt?vjivR>D~(S-Lp z4Ry!Ei`w{vdXIzZk-!|sE1k95@-f20ulfJKkeYExINpAmlC!fatXc~B7&3*)! z5A#*U&vn{>F=<1$?;UBVTUW8mx$DS1^yPPi`HSdlz&PnY3e16TkG1S+kbn}lON^`G z=be)?v$XwFLE7(qFc$9X2-0^v(uej6^LciCs@N`oL*OI$On@@|#=nq+J;*tETt;7~ z&o|XItu@BR^Y$UFlg@Po#2}xt7V@L`<&fUj`6TfDJi2Qv1MjJ8nA7LbSAloM+E6!) z@0xv$dby5mX-By8_hG+?E??YhdjdyUFNYkb&%4z|JHmEX8h)o0^}%lJyOFKv)+FP4 z2R`z}Z|pAY&SOlRdlbYwI3vfxrWsJ{*$Qm}ea1Q%SHK2mL8{0Lcv0P@nF>oK&K=1bq?Otqc zV4SwK*L&!@*PDi#VP344o@Wvt>xP`MURsZQn~m!LFpm0}vxvQ^TVHw-bl1e@-mM$% z-@dE(i~#p#y>|Q=+TIuUpTQ@_X1z3T*2@gieQZkuj|b_04wz@}U6uAEaGyItISFgK zhnW6r*cLzm`z**}cOMnxVPp-8q#jr5LMBc20t z!aL^umX~iyLk)5L*Flc{0&t!t{Bzoo#=^JJclOJmNZe}7v4Y*&*r=DDs|y?l5k4oY zftSX~Ix~v2CUqb^qr5vvTRvQYm%pLUdfA2Ux!Zwvz8m=6nWXGLfuFSf_VL7FqVth*O0RbIc4v@OV+GY;ALRFG^e#nh=XIELAO?PCgFY=o$v5_$AX5#o??v{ZTQ}sn zah5OguNQk3-Tm!V2gZCEyg}Ri?q%F)65f<~>=W3gL5X%@N4VRbArFkTb311<<7^jz z`}JG6mG)v1cv+6aH{%}k$LJeJx@Y%w9LPc2&ja^$6u3wC;2+2JqdUgDxZVtXO~?Y$ zd^ThM0h|Q?O5ZTBz7)~jyK(W`#_v4WoJ+#LNxTpJonR;Z#@&0_O#f@h zg&pC|)Ym#~EnHwOf6o|;QS6h*E8r{`!S36*L0e9^cXQT{&D!C7_ov}q^X+!+HGGQ1 z$QbTQLj0DM^f|x0%+j}xpVBk8fjQuw<)`m}^>P&b2#8t7@1HJk89kE*?s<0C@%tf% zd@Tw0@lN`$ql+SY8Bzl4)e`f2?qlfp;5U!lhQ5ZJ1%4kq4*XLekIlV1*7XJwa>;%k zOT+i3_3~4ojQuD$4cznV$laiq_A#V$dl#~_tr3&xgTV6}SNSg229d5CA-yN>0PhFZ z&-2({0Uf|td2aJ`6TA%i!7EAN#{_+!0mj@q64U42&VUj0><+j=yA4=J9tOtE`8Plx zcJH10zl%P{_W;+u1YQ6o>^(`SVYQgM#=H~Q%Sid+*_MDg?MT90F@F9XgZ4FSCH%gN z?wG^q#=iw=eXtgI{`2VGgDFr27l5%Sf;q<7wsv|itRd4$*spiU*xy2GH^v`NL%;Pi zMenC?5+8XvOxv@%j&;vBWC*y|gTVXdJ_l&$kcA|yS>#N;*d9s4zm0e=_Mu+{ZOQE% zF44XSoHvJ0H`2E%gUy)iLf(UHVxDRG+`nskKDloUoc9dy?AGpO=2--OCz;phu;-I- zZr{IkboX3F%Dp`x!fuW5d*co4EA%&Ef0gzra09G@Zm=&2Z&?fNDIf=GoHvsYd*-oT z-j{~^bCABnpq;)Vb7p9_(C$NeA0qI#_)h}A|BB3`?PYKr)N2QvJ50L^90e78_EiHf z7to(z+#vD?NOMr7?;{nfyu_{!HW0^hI&e0_6$EB_31;Nuz-NNbGe z8vxEz!8U@N2Q_Th(2pSHWi#z2+RMxrBaQn-Y$t$c^f%ZqfO|WFZd``Yp9DA1s|n`^ za?ShT-P()YIy#7SP3JoU`oI^kmx=o)@G}N-)4fiEm(aa`)&TGId+GZt;Qd<1HVOQ$ z_!6)#wkDzeydw=Y%$Pp}obL>{7rXg%t^(3CE@= zg9!P2@l!3IB%SoY#OpepktJ_qdK;0FR>kjr=s| zNkS|hOT%v=?`JnSfPEfRzyR2eZ31cTk0Ey=d$G+SPk;$90y1D%65@UX={tS}o9~J5 zYdf&^G~RLdYK*MCo^J)b4m?jE*bU^5bhhppAa-O%HMu-S~DOz1#BT zC~f25{>PE>Vj25Ia2z;)1^AAC1LSG9fEYfQb9w37#(i%B-)Z+F??%eule8n&yodg^ zYKZ$S-ZSc z2U6n2+&gS;bqctq=g-nNg0xQQdkoA2zx%xJje6;R zmy!^J9P$#n`;?dR^%Ay99R9uRpBNXT7qR!yZ(UdgS@a@4w%fE-L(OqrdD)8X3C8Y3 zS})DRRqXO&94r9$_8a=X4&?0wdJVaR?7{X7XidZ4D|y$f`JU1Ix_{R(<`FP{-opi? zHRkQWm~2B1(%%7GSB@-$&tsRnuhGsiW&vOK^l5C?OZjZQT*oHg~r1M!8M?t@$=07@mv$&A#}ePTrW-lb6PKrf%Ve&{UG+E z;01888qV%MdT1ZRHjUJ`$k=<4&N~D$zp7ONUjXK#3{Hbt z`i4PFTkiVC_zfm6jpOIjP_nDnPX<7MROF zjvGLCj9f7n?n$2KkSS7Lnztf)0Uvpp!~ZUA+%IF_3fAfOOyUqPGjtw=bee^FUO&l&SQ6vC%_DCYvuDvxK|74?qw8Q1NYHqu8+{(4XR)QL>1=4 zcNzHIv}dzV`~HNS1Nkxo&I4m)?%ba_mTTJb+Su1?$mhW!a1opZZAplE>BUg@hOuR_ zO@R^C^$l_E8^C+lf-KY5$VH8Ltx2B8-v!?TJ-fsWHzmWArJrclSL6cHrZi zFhg74BC-#7H+#^HuW|1JyTB!IhTr4=6?;z-_)=zl_cB4B9EezJg!VyTZaWh4Li;tO z^~!Z#0tNcMh2BiNl|J7M<%39L{v>iIea3MLn3HqBv6Ent@y5me8QSJ#GU3fj!#z1p zTdu7l&0Pj5FPE6x`xvwDDQxmGUk$#_E5GFB5N+2i1K$Dfk>|)E3kfkomYJg$+c>&D zi_Coz-8fytR>MbL<{d-d26oTZf%HtC*Ef0>(%j9_w;Q{$^lUExYtwP$J|JHl=N&Pp zu9uAIE8rS7^Jk41-5e94x6p0|J3)m$ z&+Pp3=)U6xq}=wru6+R<2W3F4>i@g5zox$*y$Kj6Yl`1X@~QET`?k;0FCRHZ504`^&{y!YhR-B{?_;#*fVsAY`c04ro~eSb_078LJ09WV8be6y&_UY0 zpiG?Pv~#=GDz-KBPNckSq3t~><2Qt@hFrmR6u5r&yW6Dc5}uTr)=chW`@elMqL9v4OoGy&2yT+D)`ufp>fiTMihr zc5Lor68Tq1^H9TH2JUeI9EF#^rq6iI(Oc6q(7kK3Nar-)1Hk<~4E(c>UI50)Z_B4aoB+l> zmWKQ3H;VP?Aoio60+y?+i7jF+_a$d{A?2lGts9f*BOn7x*v!Y(B-FPn*zQ7q3F)`+ zR$kt~CQpjU17HSh0D0LC`oSo$&egw%63&T#90wle&|TAgEPxjDX;7x!iTxGOiv9%S zwfnoK3ELXj2gbnyI0i5G(kE{hnSTnKxj&0E&T{9GG{ogEXqT|R0o-?kmyT%$71rK{ z&mz)V=o#JfEu?#pcLmz3;5-<_N1p4KWsLnNXv<46g6;k^J#{7k@9SB67pnjjn_3W0er_jvwvPimp>1n%Rj$M`Vu(Kobpnezlq%A zA?)+u1>k+C0MFRqrDv0u)&%RN^A3Slu#TT=7HRwLzJl~Sz+AlpY~`hUnn=Psb(!`I z*Z}gf$lP)yMtZM3?_?5qT*GcGV)SNw&D}Z}LT`Lu$^qA&Lgs0DD-V2~eyU3pRB>dY+8ghP|w%l7qb|E9Ad6bvdnuvXRUU@lK4SRDP z>%=3QwhHdmw9B7z76aP$Q*J8cwRYa z{H<}Gdl&WsFh2s%>5pGjE_8% zmy_VD;2Ji$;rlR_1fL3f%h2uv-me?@__nyGW1t6n8J~9AuGa-#!e*_`(>6Zxav0k% z?bnclNV#F|W|+%!ECKs>C*huFvC9+JDS!yyr_oz!FXCgY%ACh>ve(g^Ni8wI%AH|F5>ex z`kzPltvQEuy>TG_?!)F8%)?#~B@AbLo^d&_47_ur^i_dc zn|CwD`8k-y$@*J z+jZyrOQPH;iISY8N}^=c&Pk)(s;!cqHfl$0HSN#)D6P^e$!V*0)Q;ZFnKx>xv}$_V zsvW(K-f+gFQS~$$ {#J!8zl7$b}^!Wbir@%(%cMi^nl#Ta4C31}7H8Gc6?%R`OhEI7&7{|1KOr$HZB0``ngfL|*{ zU)or2K2rx7&qDltuaogZz#(JK zw$A1<=L5c`7bxL@@jM_;k{R{=?~sJ>vP<93;X2`x_!_GP6E$<3u>*}gGa&B5dHfeG=)5k?AbZC3Euz} zWa}$~_pCmTt#`WJFI_uDU(I3->wg$%Z@de@8ad6J0d!a4&ADfq0@tguU(aqEnDbnS z_3OIb%(JE*p({ZD9db9+J8lgblY8_0tkZ|cXBb}u)`HJRp}ZB2-#MW*)=9uQc=tO4 zF2UP-9eZ7$&@ptz8II*yWY5<*ABLJ+-y4shDHsUv-#5={7TqDbDPWzX>~#U&+OPz65e1-m^KV?+za=#xtji(z0{-1+ z!gv?74sG{K&vPAI109U*V(VX)##%o@w}E|yHUA3u9A8JCLH{;551P!WW4{VN06b%B z$(qyuGP-`|x$i%QYCnhG9J;qna36e^vEK*kjXA|<7qb2GA-b;?dA5akR;_-7ejNQK zI@fXCI`jO_@O{VkAkR>^=6j5ff^GOiFc0s%9pGL19&oP(Ukbu^A7T9sPXl}dnR4b4j{b@+{-HP3}*F(pA^}g`aJS`+`N3C$okB; zuU$m8MrWZPLGL@QF+4#25WM>-qPMPp5qTHc9Gqs{b1}bHz?)!$vDTepyb9k$Hx2f{ zFQK!ijR$%M$QR=`r!j~#=q>>F>i9>{m7xXv)S&Le`rLpTo6q(`sJZqG+?zHD^Z)Z7}sv6`Q&;7=Lr2CE_NKjyKk^YUo^5oK&+S>N90GWuDDe-(NIYEG=nA;!+Z>(_p1Pf=$stQVh+-Vt+fh;9lPe>IJ3-av0H+NX@s zv#B%oVRXL%cG0haCVKCp&ujOb1NOT)sP*ff<{Po!8}BYK4|V7n;N3}B*E)A!=E*+m z{xilWLwrtbqJM^*0MDU-?41~6+`YLUW7$GB9_NiB_d(5_^|1!;xu)=~b4C8A`lWSw z1>6Sac8xhDXp=a7m&#InK>q~%@4)Axb@qi~tQ}(-Y{WZQU~UEZUtqI{ZXB4~ljuCd zL*{)Sx{KWsde^Lh4M471|92C7hxHzmv1zil&t32T6Lf>ccrQGEbKo7DKz}R5KIHSt zym_`q&I@G46E^ojLIx$g?v> zYj`TeUicQ&J3S4xE`1Mq7v8?GhCUCjgNI-p_7h7ZF|E7#?6cO?lK_Htv=#;%z-9$=0LwMzzKBj zZ#+;_;7i50wrB8b;2gS(-~dz`F_v|C{M3$heoN%!PsIB7EariAZZB>y_5rAMkfOf? zd|v$&aP1xBeNZ~4#%27{H$k5?#G3nS?Cr^m$lfjQ=?45Gki)+}j5VeNaiL&bRS zmarW`9>r!38|!im-rnZ<<)JU3BcM0LcWTdilX;FmM>ho$ih()j-7b2nqI>o0})e_zv_dB(2&Mu`7Sh37X4K2nVDv%dweoxN)wx{aOd z+y`C2-1ac`MeIF8`;)mgPwT+ER_1tIeylI=wR^6z zj|O)3J#*^4{HQ$Cy7XBl-^8|tT|bxu=fG}=z2x6v*N1!q45IUSunfjanO>^*CJuVL#Qda6EzkG^ z*jO*GG0&X)j;QTK`#D1A!W4~NOK4`>#*#}(*UFaS|&EaKm3Hcgy7HTic;qM&$5IS>v z7vA&qu1kNh7|*5R z5;h5I4WR!7yzzPt-i>YeU0_WYn4?eor8&^%7Gq6x9mRN-75HWFS;p+67vO8a+V`HO zP}lZe4=_H(*e#IUiQjUaA?DokaBd%R4LHX=SXb7gXWD_@J1;&H16e1^p`=acO3Ty*HGu* zbR*W~S>&H!-X!$*pjjIGlV?zeZ$PcfhrsvC4(LhX8Lt5QnfK{ei!l%O80*Y)>Sz3R zi0kCx-G_VjIb^@I$2>-FjqO91ur>cBZQwHMKUvKVV{6JKv2OUIyN=)Etk_fcfuZ!U(Ivo7R$@C2L(_9bI16Nh=xuY0jy z4*_#%efJjQf0wFH*LQE8udz)6^Id^jo8~s-JbxLxdL!m`6gmioK{t4vv1ib6Xg9bA ze+!s@*ET2jkq^NhK376~23Z>~z+=#XF2}mPQ0uY}-2!|8-A9YDKPl(X8=q@?hMu4K zb?#HBXEubsNzQta*FhfaqO+!*cb4y-|IWNAbmPd+prcUN@_w2lYt?;}fjKbtD*D%$ z=Qt$$ku&Hb)LO1HcOE{^I>vk# zz7roE$8-#x&%OlN=jJV_=jEBZ*E8@5K0c1@U2?y(=-i{v#gsAEcE8hL1l}`t{TuN5 zNiyu;LFfD^L&5HVe9j03iy0*$?tz4Rlymmzcq(2RMP&|L=l^Sj;p+F;CF>D&GKu2jYL3c4|D-v!<9 zuJ4-Wumax&eF$}5=D>QgKCUBsAKc$AewxVK!B$S((|-icwFb9C{O?pY+yTD(PNJ8ZnaV_mxDEMvxV2wq1XYp^c31~Oo7|10`K=G(`&KmyF8cV!(q2R6U~@+NlH zfW6q9J%#@?)V%q=;h+04|9yFRdnBku0Ss{wglX#`?w8;!5Z*gvjjEQ z#ySg(e++sB*q8NXud+V0dkmhU%VFnTFt5J?{u%K8Jzy+>zlEK7SO>2m=NWqee-Rju z>u1a#3)FQQpLN#4GvFL+p(Dh5<=jDd-(wfi7opz={{egpcy1-Ig3VWp#0LLG^vWgn z@C|r-db=(?j~>RlK?k<3I|00hDR>IFQ`J@Ml7JuNRZs`URVN;0=WKw4_$%lznyoW=GJwr*Y}`Lz!i{yUC;#UtYMDb*AOrlV^Hsz zd9}yBgWRr5pP5b8>O|+cKE}qn+=u#p?Ytp)^DzdsF8wfdV-K+| z?Vsc5cCoP*tT&&x_6GAf4>cd&8P~Ti9k=J7LLOnv`Sz#Jqx&k5KMAZ$=~-Z&UE6mt z^RNzPLVVWM$c1(3I`*w+=*_uz%lqyA-RmB94;b?qe+{{v1NWFmzYQ&e3D6Jnz`7}e zpJR^eJ_Cn99~=0y-xr_*A?9+9v36Z9VDoKYU3#v|*tF}?d!lTejKF&a=Er)u2b~4_ zwf}fV=E(RqfOpqe{uaH@*!%G2tP_}nCFZO{D?odFWY`_RUk>m8dyn;b8~NWrJ(B_W zCUD=@-!3}etGAI4f&M68DyzhB?Q2V2Etjkek@8UzK zb<_v%{qsytLI0_K>HDQ;+QGPI)~+q%oI_PfFfcNZkA@*A9QoUzsotDshR!7i! z_I|${Wvqs7ov|gb4LrLH3 zUwT)U&^vY$c(xC~W$@aut@U#W7|$v&-m!rH^!>WDZnQBkogvm`4Vq$OzZ^wxUH&=v zYhW+b?>Vp>VqJE_TbB#SHTKZ%mmSFMy6k}$o`H2Y0X+X<@C-z6+dKB4-Yx6$O~$OtCs6OA^W3j=4ElAby|E5|52WEA_sc3e z-?^+m&vYEQ9~*6bj+-m%(mcAp_U}MFNBgBYuwR}=9%0N_8^CV_-(fR&b7;R@fLf#0 zNd@?h>b<%IX2SdZau2!x7!CC9Id_LOq4wZ?#um{#W?f!GHV5j>YaZP;vP{{sQWxZXMHRM_E(JG|DI75xr*<0U0R3Mi@h@k-vv66 zjcXDtVLJqU3)DfoF3-Uag;=ZZ!}^$kPNQ$t4oBjpQnc;8*rn;+}N=a}mz z@YdxXW1floYuBawJq<=ct1ju6>+t4h7*tu$9(o>r0sT+vhnVy;j=asdJ<7VYUad>} z#3c4r=$Fv9>(Y6im+_~JO@OHkIWA1Mk zXlEZA1!sWwxePUz=6eG8-cf)W*E(zHBf+od(^0bJ+YSd>x^D`rE>AIT&&~m3^V=>Zdo#vt@IFou6%j_c2c_zXXX zu7JF8CqDa(WdkJa!+M#3p9P+a>-gQX8MymUbJz!OzLGSaX$Lme(mkl_dnWG!YiA#N z$XcCH<6FbOHITrsh8W*6y!rDiR^UAYtbNmpydyH8h1>kV-V%$&r zIX;W-5o2Az`+OPd9rMoj2l9j8edLqCdYFN}3C_?j*O1dR&RIj}8e72HJOwqc?kUA4 zk00aA;5{ezpq)ASKC*YV5@P;K=*Qt5o5s#wvsR6+dz0u`xg85cj{y*jeOm0i$I^IXtb{80v`$*V>_uvGuCk~-ox)c3hg!k?{Zynu0z%Q6Z z?gYlXfxbzsL+Gu`2k0Jy4xlgRX_K;!XKX&*(+2#X^WC$|oZkTzbn{>qoC0Zs{4>wG zn*l$GO*cC0avSO%Jge3pcD{=&pxXisa24F7F8>a_dA@~gj{1Q)sAln;%z=5YFC3M!6zZ*26b0OAc4`XHc1dPKQ^GoO)cmnK2ljwTk=YhGs2(`vsOZzG0 zQE&_1Gsw{UK9xY7Yuuh?3E90`mxI_J!Z*?Nz>k4Ccnr3Hwbdkk&*mDK3vtipdQZ*|Y=uYh~N`2Q6BV2E|OgPa57U=2U!ZwXkJyZBj0XKpiMmAcLZIAHAG zBU=j-A^vwa?x~M4Yk3LXCU_fp8aVed)U%oeCE)#D2Cmck9fx@{$fv-1;Os%hnBSi{ zXqoX6u+B=zHO8&W6#IMdo`<>7ri#w{} zumjw~5x7Oa{BQW~3+x}+99{%c9t0bA;XfduVOn4okaFL ztn;fN1IDxjwwbpDy#z||%`EP58rfLShWMRjo~*qBbQoQFBEDZar-t0eSO@lbWcS$v zCV{zf%`;%=c>WB$^NcHHy(V!Eq3Z%Z*E-R=w)3n@zqkC(_Kcd?K1QEHhoKvw6k_d6 zKx@d(Ux3a5ZOygke;IlfIOinD<8S-er@ytQcVb+#A3g`Fn@o zl=?Sz&q&+WIP`7M4bF!+mWQu`DUjf|2Yoj%u3dDVr}=Zv65|>El9Y3V??+b-@%iU7 z_PfC6xcj^hX223K4(AQR&w@4NRd9$8{cnT$fZGh;@b1ewonV)Fui%W?Fc zw`Xw*cxKjN1zukz;5t5kn#AgS*BJr&^Y;Vmau6GzN80oEjJ}d+a7-_JJJK?>FByeBUf1n-lBO-n$N8&*GjYnSY3G4eI^} zozJ{m@a}OU#QSP(45QQ5-#x8)bLD%jb?N%w1lEaXy3Uw?dw1eK)Gwj)jQXHs&=gt$ z){4I;_)cvtdQMltJZSwf*S+|DY5wgg)}8faeVAv@?+svG9)T))eSC>ID^O!!zZ2KG z4&TZpbO3B(Ywpa6{tI9vME|>tS(o~L$1&}IYq#q%k4+b2tLSpj?_&RNz;{5#*cJ4H zpbFfxIZ5E>Kn7g9U6=P6KaFk|T@Uez&i0=VKzixo{4Ks zqjTMD_y#afZzDV2ja*~iS6Qoqeg)aObZ@ue>%@4(xH)y+MRfCx7+b=a`FMnG9HfjF zpgo`opU02B*Bpay!uvg6X3TeAqhPXW8mLn=Xw7I7(uQ9YiI%Je~)=x@UtKT z_KGHct(Od#SMxLme+UX-30wjXz&`N(^-PHQ%ZS06oI-EzYrwPI2Ikh-D)3G0TEFGO z_bM~ycaJv4?Y*xsH_w={PJ>PG5P1&lg3BNQqaef9b?g)7uW20UrjdI?d|$i|wIBH0 zN}cb ze(Aq&TSxvi)A)^GjV6rQxAM>ebQk-JU<7O+uYe{ffs?Pmz0LyPPu*)B+(XXYAuec= z#rHP2*4eG1Gk;e=9e6(8e}5zRI2c4%Wv*+PH_!Ga=mJe_w;3~Uc`$&^{ay#dKtI;y z3*fn_n*-)2P2=7Y8Y+WAWw*qyKo#@S_=Xo8u z5A2}pgjz#uP``V8hE(C-WULq3WXwPNzj}SC^G+lwJn(z;Df$97uIul+o^=@;pX2)M zfHx;A*jf7{&z+Z)@2vEUjYfcICng! zdMBQLnYpfg5^6nohO^K`Fado3@Z0$@yl2%NSTl=zE#M=?XY1XWv0X6F_)TrV6Xet2 zKBxiXP13l|7xB4*oPrX5UOHbl%?;ump@_mwA2g#^8CI( zCG5__A3zs@_x=I68sb2cNN1buh;5Xo}!<%R8-~5lED>HTiIYq7^TbCW! zeXJOB;hB`cMbHH6!1vKKi+0-fhG>(pubMLOozh-B2tO2JU490gzZo^L6RrLUt+MtN z>?+vxLua7o-u-Vu>);V^f4&R)K44Dof@zQgT_DAme(ay#(UlPE(wv)T>(X;u1!dqK zypw*z`x{^ZooDnMx(1FwyC#-Gd^g->Pv*`z^Y8=cM}T#y@5jI#cR~lzzuGTTbneN1 z<9E;h0mgyzt@%^Hb%qr)RZ;G8U)q=KwK@1Ew#J`8UC&(3hd6f_s$781K<9yb zw$`m7b7meq<4%yrUkWO~-=fUBJ^CDDmq8aeL|z5n=NcFS+S$XsXU~uaf&0?-JgC9H z1@+u~R$Tz{&Krl{I1y`a3f{WB--x~95F7JhZeOiS*BrpsIR6U!li>G33EeDMKE`k( z_RD_c3UKfGJY?Pg{0?ZsxAuizd(Xo2+68aI-=;1X@oir8lcJjey`c5mHhEXx2Kr7z zjH`*hgL&<`Y%=EWm-;Sa<8$2eDS#5btBv^1l`*~re+GEYYmDdM&BG|D0oOHuS3<1I z19;EKIp*mBw3)@+nj`D1g1&~0b*a7m(pcO_2@Ha9V4S~*O~!nE?SY{{Z9rXj;@IXj zY?|!Rvk>Ode(AF-2QMC@Pq5iw?k)Igi0h3(t*Zg(0MtD_2S?0Vf|js17INPj%kYsg z<{4O*-oLxxbfCV$1UNum1#f^AFbWdpdFHP(N9x(>`vvq6s*U^2z)FZY>_KNk%9Q-aA0oTwCLfxnR^6&6nN4J3d;UcvJ_1qHtRG90zY=aJ9-)R3%5%~zx{e?eV_s!g?JV{&|Q4kFR#N-F}4IY;ok)7 zjQuF$1NQbD^IS<2k7Hkz;%s>KW+YvwVtf1ZXE62i=YMecB6e z{(c;L_x;bINgC0FK5oGCXFXqqPq7(<8tXaWo+pr9^AtD$&%g>W2gXxoP6ccL|NJ+D z+8t!Z>uG%UO5Z_V1+IA+oB=uJyoCBJ-+{VzmAUrFIiTMg&;+lI0ld%so?+JVkXz#m* zcTqp~%lwI0cg8jWZh;Ep7aFnFTHgWi?!5;pmVtLoT{XnIyoBy9{2oxhiQLR$EVUEy zTSUJrj9Zt7@ELp_YTZ_`Eik7aY@qXZC39bAtQVd6+khX0T0i#CLueD-8am^Y|AO7H_dU2ED-Vfj7{(zIz)$ zR{@*MPuO1`o$qkwXc+wAalb4vuYkM^P99^V5p&puJO>)UbE`v*tqffSIdsOh0*u$Z z*TGxxpt^+bl@R-41zj0*gC_A*fqS?LO2Byiedq{k?p&t_m=F6(6FS1!*WlMr#2gsI zJh%>y7~gEfSgu3IfqiQRD4ztLn=z+>dt8k7WC#8(u&?enh!xrmtUJ%8PMoKZt;-GO zX7K9FrFk|lg$6wg_?t+=*gE_H`cjB>ItX>#`svjt^X!*CyI)8dOR-OxTV-q!Imx1b z?X8o3bbA5c!1(ny4-UXBZ~@E!_iSG<*UsAo#_63|MW>y)S_!PhUD!bO-TwyiH2g(S z#$MZJU=mcZw+@@|mq7)X(+*I__K>kr_$lC-PKMaqjnm&RAE5gX)N>m}XRVE(DQ_0fs`8t6wi2KC?9Yw+4Nkk{b-tETZc z)hfC}{N|un!8llH5ErmkHo)una1HyN`8N;lH^pZS`boykeZ#RpUO*H7o~N;10EgH* z?%wyHzF)Yn0Z?G>2asKN99#iabQeSH9eLy_U<~GW6wCp?dp=T(?+ZQ1o>!K!26N57 zYxbcV0sVk}*?J~^8>+kt=7Bjd&L;B?m}C6w$lft+rr}RQJ3)o8p`#$j_*^4C zGp<6-$$jtwEQEO0^)$XCd3Sv7w%*wo`;lV27xpmw%RbbaF?aemUf(bC(9_7)P5S#{nC*>Hc!f!(LGYX#)gJ(I0>>cy{YYN$%9ipp2{Y^hXUjwb*Q4y_i z=byx;8|v9@Knu_XsOxM4-v?6g4*VL}1dHm^SbKGRde{ByMSnKL`p!emv%mLc@DuQ< z$l|-U_pAd{h{N198M_Q#L-z#gxmjlyfOE#s<-i8(4WXL`*5xj`2f&)@gBs5WvF{-2pM0mjkIfn~4)jBO8l_df%CpYK7}S&Y9YRN%dHd2BX-XJU@dgHGW4 zp>?tb_3oJ`YiJ634YVV12Eaqm3+%7f{d4#sFdX7p^*~pVzk+Z7jm`PWYhaKuze!p(jox^g=&Quj1N9p} zkKP)1lQDDM3mt^cfoI?o*qCqcf@gCNoC3pO7hRIY-#6_o*U=qn7g!7WHnP5~x7`yl zCmHrT$lew0-COGqc^%#!dLLvdd%?&30MFc3&7eP}3?_he`Ke;8V{7*S`*Y~)Q1^Gp zJmV~=gZ~Tc|10=cU=-bXumYBWb{X@`*);H5L!JHeDb!x?9OKWyo5vxrg>D2YYV^zh z!Mq-H7m$yj9nb{7=GYj=khg(;>>(5I%{2a|;X2loxim)UY>59o(Gb*iQ*4cE5_u8o znK^b3dIXliMdZ8C5oj47dEj2B(3Qa&yua0Xzgjf|P0^K3B(2{Bol`@$b`$J9hhAt8 zm{bN+A+GQHV#@dmx@YLdK|+j8V7@vV*kjWP@7foE-{U>#MuGL(#P$vJDKv#%1Emo6 zra$Y=`Lj?l1D*i;@D=D97zpGCUsYher1<&_-kk05;x{DmK=IbMnvzw9dFOoB@6-*dMhS0R3PE zXye*fLtNXqci?@$+eCj4If2?k>L=d+{c;f->#~6UBD{N?fiDAdH38HOVq-lB*Xj$z zO8?Z?7&hj>cOIW1=E1!;;oEgtflt6bdgp1g34esH3cVF#uEwFpz6zd!VdR(44eUpt zSAb*s@|ja7U*_}{IvxC;x(4lmR`F>*#zNfd zAiT11y5>pr8&K=gd*)noB$gO6-w8hQ*yI>nL)QW2_sdq@{5I72m(dS_d0-s7%rhUe z$mfvV=K-?yau>{nc>fakIv4;AbmqPcU!!0CcYKedn?!yIHD|q`jLkZ}D)64oIMClm zv2PNq?*Xne3XEeI*}5FU#$0KmAK#PAQ3maUdL9M%2Go0DZmq#h=rB}Yb>`OKr_uF; zH{gAL@Jv4l%|Ts%?L=JHSk0q#*@QPw_WBZYCxLNIpqqei*X0fPXXqxu7<`7WQFv{? zgr5R(C;Im9m;Sr!H$fS_wPZg1^G@nZ{WA1^h%t{rU2h)D0rU0_v@>P==yzGuTzm(Zw=3xNSp_NMo?!w%3yj5k z)5Okw+yV`n2RmQ^ct7t#eXg4q{V#_2onS2Py8|EfH1^^OI{RJ^dh62u z@3~r+Wyb8KC!u+$ahBk%jWu9hu4AvR1f2>^mx-sCl#0LJZ!5d=@yU(NZzc*w^$83_hzj6*aiM}dIP!&GEfBxzC2sc(0Ay(8V15$hA!w6%U&Q`bz>#tmpL?ExYZzY>Xj=>Mu5`h>rZrG!erJer`ps;9tmO;9 zedhu-4)p82wAWat-i5yae+_;QnCpw!o1=d0JK%S*uQRXC8vgtJOLPTv){C_;6k-m0 zkr%-T@C^0;A;ud#$NwHWfnAv~YhoI@3^w2^Ct|>@oei;{b)##*`|f40_6$B(jP>Z* z+ds{P=Ve_E!<#Gf;y19*|3iE(p*IiKoPS&J74+r6JoskHy3i}Y-k4;uM%|}(%lfu1 zQ|t}{`N7WnGzV|3m$7l)b!5N!J<9=X%;y34G`f$2i}1$czUP7KnCErylZ<R zHSqs{w~$W(_kRmnKaafR7*#q2B_Y^Dw$HynFu~^IXTgn!7(l_O7PD zx-`$$rwtmASb}}D&P#z)?VBXZ+wq{=V{Hg`(>Rt-a+3N zV!w1xP5k?8uc7nVwT5ggGvEw(5BvmrYi<>EhM1!d6p0gj0T^q6wLFUf#yuvOkwA^aT$9G*5N0h z)(H7({qH=FqO%69!w$!g&B=$6TRA{yeCDbQpC<-$@&tYfyrmx5yEX=IU3yonOJjWX z`Q;fNpxc9*YwzMy=4{JDGjIT0f1nY2$`yF`-$b@2ez6$u?HY5vkH)MY$7bQRoq_t_ zczD+C+cg)V_BQLX3U6H+@7tgZR>9>)eBa8$UxI%OmYC}^v)wQE8GDMpjGvS6*1G$& zE|-x#3*~lQ*08lN7~c)3b=ni+UHM><-$sGY0P~f@=XJ&h7{3Utch@=vUVu$>J_ja_ zscXN5zQjE9Zy!2>Ce*|&^kcvn)!l|3o`~n0GTx0`LT>lVgGTJV7oY{k8lVqe8|yL; zZ@>I=;B)+U!Mo^=K<(J?;T@I+p0hRJbKGZ6M~M5#X$$`hB#gVKNnqX^AOqA!>wi~j zDnxxAJDB)>(V-S z6S#NJ(Y%?zRt`gapSM?bfpKhnHZH+Wz)wTX=VL|wJrQi9_x|62X3VcM)(yp|WDz2G9cJoGByUbO!2dFaoxGwxmdpM>9l z8uK)K2D}fRku_CdtP}rF;FrKY`d>#jwlR3?@(6qD(sTOf(CgUgYYmu_Yfxbh-wiS6 zo9Mfc-NQUO^CP_h>_x8Uw_Q&$-rF_otbq>nIe7a~N{FlK)`39ruty|Fcr{TA_TD%i||I`GW( zJqE1R?hx;ucccPb!*?T}mEQds#z#SdU+10z&w=-#-7g;_e}y^g(2_ntlErVA1ipdZ ze5d$$3+f(?YdXYtyEUkCyDkr~NwKxJt~2IZed@4j_eW3B1erJD`S*{tlVz zo|e&N__7bYC(pR|%Q~J7@wt$PUO?v>yYNlsSwrr11-nUf=IagUD0B{b9elDF&+;z1 z1iwq@T(1Xwka_OI{a-=1pPa8T&f2XSV_0 zL^lQQ0rz$WbT{JfmqW+Ac}&@hHRrdT^|Q^`8g_$H3U z?>^U|&g~Ad7rhJh8UACy`%qzQ3*_);%mwfSc@s!)A{&GE<_fa!7YooKFv?hh?A{mP ztJqlM?&U1>In+EYLydPBT7tIg(i~TqYra+)dkVZKGf=%C~GJh9e)}`}jz%($<96Dq0J@0WN*7HSZ37tNzOV4xw`3BUvm%(ernAdaY zdch{T7f|nj_tSX2w;k}-rFpCppLIEj?g#7gknvN@8E4FInv|S)UQKk?W9DWbxeB&{YmY)R=q0FYx<(y%W!{0KI)Yb{_hiu_p6Y zpw4%X1!%i2&9QUMmuueu$`xQ;eh8TNX)prpnMcf7W86A_NBcBsz1Ka1ucOnhLm)qG zurJUJpRxB|c=uqoU*$3fN;zn*`t96KzJ2ts(u?(dXb(cQg!hZ}Ob=G&? zade)2FM8iE&0`rq)@2^vx*Wj9XPoua4R4-Z-}`ffO$~k@-6Uw@x5_?@D{VwSyZCc| zu5V1fN3`EBbBx_b@A{hpz8~s-`=IvK8a6}doiFVG8S9LO*x!1fIsCeR&(u5`zjoKa zBIBzdW6m>V>&hCdU|WD1!vpBgF=s>hPK@94O_{R*P1J$&@SgbuNWl?vyU+>aXxF9t z-2$%X-vMLIjQnD6U2fpZ{8hl;fZqk?`V#gv#`>{0{$1>yS50Go^|_UzJ7CP(7{P7; zTm*gSE`memXW$|H4KR=0Sco~ELN@km$mZk-RFE@}fGOl&sC)Ge?88^VKKegEwvIhp z*Y^45IrSo&Z*%Rvx(Pi8e8%5`4u@Db#+NdF7dZoKpdZ~h*noclJp|Un=ZjoP=2uyx z^}UBKfp?ubcyr}k-`9MO55kWC^J+cY|IAwlI`iXu!w|F&Tt;V)%6ZG4`Xhs)Ru zgN!`(BAWx(+-07*c@KVz=lI_-uN-1MZla$-zXg*X3uA@=e?sJ+4GR|RTa-hlrlsCg+gVl6&_>gVIYeJ%t2%>vh{G1qe&V0;Ok zebKwK8W;!8_nh5>wPHL~=3PbBr)O)vQpb+>R!8>$Y=a#7D^Sn00xg3cbhDs@uXbI& zKwrTo2R+BwJ{Sd4pr3W_HsZfy{1N=`gI#3b=lnC?Dt4Zqz6ZfNzI_k%y}AS0y8J-# z{Ww!(>&QHhfGT(dsEO9^m-=vzo{e=o2k#zo$kt2)93l6Im}}3)?-L zV;(wz&)hmbeE-^M#N3$ME#Ug<7J$!f>nj7^d3~M<#FNH*av9$K+)<3arm^$e!u^-v z*QBgtT}~ofm-A462e2;H>EF7yX6)A|LqxrV3hoQ!4 zY}Q3aUH%XBg%E2dBi0T4%`zs<;nx~5hlj|<+7F*%*Xl#?-V<~8@A0$8_z>_pZe4x~ zYJc%O_OQJIsz87DkFfyt4%~&_I_9gaxe($R8OtSj>$1+eKDRzojD4>Mz58x5zsfp3 z$0xD3E&E``p7nC}GN<|!28`>?saj%;0?4Dp@7y3C_Lhx`J4 zKh*xX3f~2_F6W>{sQY$r6`&9IYd_Sd_T;{mi-dJEZ0n%)9(E_@X(GgZH_<=Cb`9JD z)^Hy*WuE=n_n3E(>shR!oe=BN_?ln{)X?=pyMTEa1{w1^!#}Re1N0ZbHIQTMG05;+ zhFX^yvH8yO=fK)*zh4?#jj;jjI^g$+(Ld|Q_})dg&zOCzg53~&GmSAVqZ@`i4l-_CrszCp z?~lFSJ>|jABio}I@MZMn5bv7vjpMaq>_Z9j&6oGVcR+o*$7)Ip%(>2(xpaT_U~}~a zsCDYuSw97ArnLk1Lf+D}6kIWXj^4`26-Ixpqm9H*7e(I2i@C1KV8ssj8#F6@f2!ZdKUJ9 z?}6`w?|>t8&hs9g!L9>d9}CcC`u_iZ&o1Mh`D@I{huGs1v-uMsk=iMzMHyLyNQD6;O8}FeXg1YB1cw@INkC1;8 z>K@FqYu*C-^1f#9=HUUD2j>DlxhI7?guwV?bl1TQ`bAJiuWkc0fomIs_3RnAf6u!g zj520i_7wBJ3-A3KM(?_w{Q~@T(1C31!n(AdAA)Bq1L7T>;p4k0eltRZttY;46b8-)Eny?P;+4Z51IQ(Xg6}fu||CM%|hLa=W-V;gOLz>{WL$D26|2D%GJeLhH zA7Y(&H&Wyh_*Ld8o2$3M68^1A`(+NjaR2>*SizUz?Qhnl@mjw%Y_2fZ{kiTu*aG9= zEU^E}m%$tu1Fxf#UIiP>KNAR)JvWipz$Qr0j~vrM>^*nys&{iTkXKM=d>32-A7IQg zdIq23>vV{DY{E~$>(9E}X~aHLgSyTjW33*IUwgT~ty=Fs3w(~xgWm?`+VyIT^)aUd zKEuAwn(o2)J`Fnb$5=m@gEwB!&G)iNbUyoC*V^=s{9ovk5POm9=g=)9dlv4qf~>uD zW-oAmKUkNY*!?MfUad>(+qyKKc3mE!)1S4o2kwDw{3gKsO@z3wCVLu!w=QRab!mNN zY3vW4=MSsPyNsEud8p@QJ=-gt<9e^wrTeLdn7>{4i|{3E>{|!OZ^FBWf2uD14XPje zP4H@6o=5({y4=Fg9I!q|fpzKr<<|rIXD#>a*-xOeF1;6L8MBu*k=MW`$e~YKo{e>3zkIbW{}Xb% zE`9I#r|PnaZ{zddRgB5H^gibC+YLIA-vAT9b9P_W#`#yC6hSt*n4|LBiNRv?sj(%yDnl=>b?k zKfw4YVE(*w^6v31(Us@ z$QfhyN9)Z!-VSjOgHUDtx(~lYI-vGdYheWa1n^lp2lU&-*GYKKrwUDgcSiVI-yYPs zW&-&K){^(*8h8u1wri&N|0wqMFY{=wMj3k#nnE2npEr?5kT;>zK)WGej%)Z4?Ygvf z4}j-WV*D_$59m15y0nIlpX06n-pBXL|J8HcdbTd@4_(Drmj!(Ej!H;o*M$KP$}eJ7kiHwW+f?dSLfWaA%zUI%^f-B6$7 z=5h>bJR^-*Z#SUcC!ZTz@bkbJtI*mpDp32hwby!1gqQ>C!@Zmao`d%#4{Z{!G5OAM zgq*`}GVlxp&bMC7=RIHz+=aTA6!d@`Si+Za{+#QE_$+*e-rBC}3(0>x* zGbTee-WgD3&IRZk*Z_yfJ_GdaJ+dy%;WBuNJcDeHEx}ut-ROM=n#Z4Y4EZI{xBbk! zXDo}L41A8)pzh1HJo8T%31}VPzW4jrOk-WTC;b~&`#G*(<95Av zUAl(0)e!gS-X@XXL$*GSke?uT!M|3Fzh7IIDeJtz#&|M(tib!*Q~Uk$Eb=!UWB%1f zjAIKr4Yq-GaTeGwN1#(+1yq2~apjA^c-8_N%VG~XfH$VwP-B{gx|bsGIbI?ba zSmS4~>wvd*7N9wFzlM$P`PQob*RkmbeL&kL7zg?p1CIguX?>4(g_u9%T?Y+N!}k)@ zy0nH<;!n|e-i2^nbMSTcXRf}*+5=G6{Ae+0{aL%NZNKaU&NVOcFQHF>>oxJ~-F~DD zZ+_ z!4Uhj`!9iBkOS^T*e}h+A$Sgae_3MPry;%@OhE0ITa5iOly8aF|IV}LYhO-S(>kwW zx6Qm9bQo;n+kR=B9mr1`U?S8oizYpBI&!Ggr#^+g_46#1! zPbK70U=K1UO?cy4!lsFAzicwsI<*J%q2C1iz(4EKSnQYDSRc#a7FYxi!3d}W-x0>3 z<6sGx7vIZgpw2U%bAf&E-D9nKC)a`ZU=q0o^;uya>}7T2GUJcH7UQmU4w#E9i@$|j zM6LqYOVendFt1&gPtczQ_ND$1@0&jJz`C?onZLgT{{@Tz_i+h(>sY%Ecw;FbZ$iJp zxVh>o#(F6*uH67g;Ei(%q}ZB|N8pTLPDhA)(AG7iYxrG++P^l@CG4Y_9oH|`rwV_)qYuJ{zxOvzX|;WHrCJ<{2Xw<3*c;swdXnd-SZ~8D_|D= zGRUKEB70{&hXefPp-tj7zs`9ZIfvb3i0_vN@IB}}W7iu(Z>_B{cLn|i=s@=FSl`y= zTj-vldkS8HGCuavB~blZmmBc^f8H;v#Av^?R@!y>9=_e%Nni{=#hB+}ecS>WFmB%y zdP9u6!n*dWDfBg{HMt0HUUMgi5xYZpefo~$9tzqaTbE1x3<2Uz9U>(0_0y*dJG4eFLd%FiMGiE;+)Ccgn zFu>S2W7cR5?0`D(nVh8Y`P78!v%-A&Dfk?GyI&qQVr<4az}QP*ZawdQ{OqCkdG$SD z&$M6azlksZPGjfUdFJNTera9WQ@V<=Ud-_vWBP4^SAV~>&aQ*|Jja)qW4)O_{d7T> zk?mEJ(1Ln!hlWKqvMN3s{*@0Xp7d6pgMe24HpybCJeHc;Lc_{{76TL`V48_n?ireYIbH4tW6mb?_x^s1xh*JhJs`JXad=-fcnMhp~-;v%oVR z1?wT!hIQ=ocoLoSwwZsHF=I6j_h6mxp&x+O$%T9I+`kNxJJf54{nEWSK8Kyp**d-t z;q4*Lw>DG8wf}#(Iv<$2v+K_PW`=Q?2}#~eNJ1LYyiCZ1WJvOokc3G{^YibK2}x-3 zlG2p4bo<(+DM@KcTXst;y8D)8S;~6dSC_ifYkA*#kr!E(g)C$t3weKjLI_#NLY8GA z%d(y<%R(b-ge=QKmNnYXhs#rDgY@0==bn4+x#ymHe!t)IbW?*`mz(hRnR$?ccI3N2 zzk^Wgas}Q#Fbe(y_#rUY$FVOn=9~t2V>cfae1D7aR#2}?dqx{}O$WBOvF`&V&;zUu z`o;c#=cdgBIEC&EFsJoiIf85*yN>l@eoIOCZvfqgb#FiWL)Pnn=79auduac*FL|$h zZckx94XnY3(EGr>So7w79%`NLfHCy;OYh4Nymb+yx7O|;+b>iea2X1@DD6^w!o^u9;U!XJV+mwQ)&T>;+va0}`=k0hZ#SWBLrIdE?qP~Ql?K0KFs{8T`_U)IlLk8yMTBnh=#g8EK$ z6TRO(!{9%G-vs8UMh?6`N3pYRGSFe*`PBQRwQ9XAq8|rE>}tS%>E3IMTW7|515BZB zOz;bDoDI;jGIRQ&6UZyT{OvHl3*Uj>n%jYQ|EtKqhn$19gBSC`kI%XY*?!pwo>s&2 z)pNQE*1-~f3*ZTSF$wc(_;ha_=v@Ciy#47U)H<{-J&z*sdUGUs{(- z%sB$w>maxcjN>@)jJv^N63)*(x8t*jZW*Nboo6gUe;Zjp?r9mF`>vq(UD@ZV{rVXC z9uOH1kd9z)zbs+<7QD4kLGSrSF|rhSzh5%0%}KBZvI);dpw9tdFIVq-gU`mFff2zd*XKrbkORX~19|8g*ABq3&W3t$O< z75q=a7lC!`y8aEo*OIVb*HP~pKfq54HJ%2L#^D)goaS$%8vJ=C4}j;o19cDf%Qg5c zbOl84C(xJh;dzX~TjPF@dj{SSYrO^i3C1hX!r@St)`0!;2DJX&W6ZOl2UyQh8v5WO za%aMP)`>t1ayR%aHrC}Hyt$f9!t<~GJ?{N|5t}Ufi{LIW7W-v0RJ#&3t~Ug%$CKa- z=*`zKyfGeydM~x>2cG#IsByXHGALnx54i%r2x|B>ChO}x*!zC-7}=Nx8Q%uIz`Iw* z_bOvCvS&B~GN2387}JOI>iyF5r~&(C%DQ_=sNHs`xzwNe`%CcO!1sZ5Z@e>%wPDu) zug@ZK2I_O%@9}r`%Pe-nbG`-K`zW@(&~0F@=9trzg!9$!8FXFH3Vx@dW5_EYidhHU z1bi+DHRnDm#D5vtci;}Fdw3y_x%TL+A?wn9IaLkM@f7+txDV!lG2euGrt{dFlS%k? zbXj1&t>aVBEVKsIr+e}JU=?`_-hO$#8qWMSv|g9p@UG)|`rYH1DK{k40*F{MCf)`3 zuIewp$L$40WNXZNulLI>?0kN8LQ}>bLtB7#89~1Xbq_t&kn>fjb?Ey|3h#Zt0Vcr7 zggG%eB?kMnb$J1dpq~K+^y-d)5?Ds(zRkPuzMlgR(9fZdL5i;>=0xbsMHO@cU=$y3CZWa$p!V`L^zZ!r(q2*Tml5%lu-jl>25Mec@NK`; zt^rx!_RBH&Bf#4D3}Zv+x4{Zn1;%3CHzuKvb>-%$xf=3Eu?FYXP10vk1Kani;oW znwMT|>^&{$7vU?=0`Xaw?#&t)fcpG!-Z6ONHU@v^&~FBQ8B8RhPP`j2vc3;vqipRw z1fJy%a=l-AzP>-Spd7rI@{jD9)tI&RM3LL`57ze=^a9z*Hapx^D ze?B4BIP^>Jq`B~{ouhwym+!2vfC_Sv@mt_D zl2C`{!h14_?6cQ%v{o-;Qvv45{V01D*3Kf>#m4=34vw{g%kcKaUU>KBbHdv3zWKfx zIVWbH@O_Lw56z&npIDbW@H6O*yAwIW{|0;+eK84rIc2{7PXgy?GXQViyP$q|c@Cw+ z;QxkLy$j~VcZwXmb-9G>-Dze{4vYc!>ik2%nlWb=KuO@sxuf6{j1M1-MZ|L~3GcwS z(X9jN(iP?~roFLx_a>nez`NvHYhVf709(L2brD)&?g(@cG$f%etS_*;OwrswE6na>P5&(1rPgD){=z8``PAU_0l zz*Xw<2zDJw$g?#(LmZB8LsRzO5AU9o_gKrA*MMj4I_|?*euCVIJeq{MG%o8h1NB++ z0yxF^6j%k;+y*!T%(ZKzU<*DA^i#J#0dK9jp0($h`pnbLcd{ZhC057A7}K^4^_g!@ zy5ZTY@6-D|#+W^uk~9hL4xWLznFGeVc=(qwX0X$bb-9f`M!t<*%$lBs?+Xo3@7@s9 zvr8GXUPi$-xCT7iWvFXNOCZLsj8E(1ZFOn*ov1$vcXJ7S4gGas&yTRLu)b$*emlV( z^yW}~4&GdP-qvUV%p~FLTj6IxKk#oC-=m;jm*&?Ry9{dR{cF}17`ywh&i(>emp=m5 zrE8r8$CKdi2-JA8P<@So7O(>blCZ94WggQwivAb8?}6^)82`rk-@!bxHMfcG-@tc6 z`#=rd1oWTs;d{8ke9vO1DeeJ;C0Or&@?ErK8S$u3j{q8Zgk3)Ta z)viP(YveD1by-E%2O8kdLXUtVKF%iLz37=d=Z)?MQ1|BEjn(|vlRWz!!JGnm>vEQ{ zL(nnk2cf>t{2aUveh2tY<{EzwwGNfD$gO$eMLw2lvGe z74$`Dg)?ks-2eXaH<;&I=3x?A2LA~D6Zj(VoP9t0TktdBGs-{jL5kl3c#5x^!1IgH zySL}z%g}}D!TVYq*6c**Ic+g7LiZd#N3rp2-hiKimXgpTeI^Vbw}2)5ehi;;jC}#S ztLPqpAz*$z|5m8?P5NnU`k_70Ur;ynw0%GJaP#k3n4@-N*YW(jkiU(ccd3B94K-GC zvj$%wUhAAX+<$NV3n)3;e}3guf0( z(YGT{!#6_h(eBr}bbs!9o-ysbx^#a>7}LH8_4kMhI(tG1`Z5%s`@QK0@YaUUohIi0Tc|m+F3n?vz5Ti&Puy2R z9_`5;*gAF+|JG%ZF>~SGx1e3n4RjIX?_u0$+4rH0?f?I=!}F+QZJM_lV+H2?J7n*L z_wy8b^O}N1#(J??0Oq(BhjoUK-<1!&!Tat0oD-+aVXOt6dveb{J67S}4fQ={2D@%- z%x4xp3%v&1j~E5@x_pQ}0$ZRBz4h3r%sijto$%(}T*mMz>+M3V#U1#;B>0bryBWS- zmvXKfi?fnU;vv*;F{K@_aaV0pRVCA2meYw+@od2 zjOPNn9eDR>UAhnJvH@z}nuopwwO)L7&NKD~^f>4AU!mR+&(WGX1T|)Rwz+#bAAYNN zz+C&6vD9lWVr_jHt8vUSRgj<94N5nI(|G4 z`;sxd0@a^&#@){}v;eKwCC~8vXN2F)FM*f!6ENea(UM)$n~{U7GU>vimDDFCusKy3C+2G5Q$!1fWkEOh@2(N80@=6=5ZC-f4szHWj=d@Mn&3Fi#JM@e|LUx#{c zD#YYkoAB3wYn*4ydKiLQN8RXmfOg*h2f$wO8e_Mi)@6w?&&)b;eb2XouPl5mrk0_~ zd)S>yLR{YQZ((mgyvz7yP{YRcHh{5ynDJ%kd!dc_@IB-?`df*2;`87G!29wB@UCU> z;rY6k4*Zz+U3}aD?rj*{0H?uQz1pT6U? zqj#UJAXg3b67gr=W{_LK1o$JyUE?w6hqqVooY}wk^XT03CYS?0C!F(U5}s`-F*G5U zKsUN2U|se@J--&H?}?L8{T5l<9JOO(4O~ON2>+Y##Jc~Cvu>_}H6U+3EBNw$o`(Nq z{vcOLIL{7f7C7f4`0*^w-}~T)pw{IoV~@Z+;JLgF^{(3!%+HrVB@H#ApCiC^Ju`DR zm;_&2__n^(?ZTJQe;0WgdKaB}wf8hY_3IhOHU3!mSf&0%1#cCWs-`rPomdXZa zq=fx0Fem2x1h6ix=}vg#dI;WGmlu)$oWAm}*tm8-cpI3XHmH8A%X+``8RPx#M*k)_ zhRrzWf_HB*`}i8;50J;fH{rhr{sqk7r@kL+*7!=ynS_2e&wtYd^b;kameQDSBy_Gb zg02awf9Fmh`@E_#-~F{Ce+GITT100KsLTC#E^|Bptj9%QO=UncI1LK@H;Ya=CAd)y{tMKB6#`011<#uQ%ML~h1z z6n-=x>heeu`eo^0P8-y{$IP=X&oCZCpU2+&XuZ4v-1j+bo4{-E-p>z$K4kN34CZH# zwLX%^2eh07-+zPrU-NvwL2qHV4szIbGk#PXY`>1LGSr+~OCN{2=DUE;v*)45(a!>7 zE@EqaSj*a(3(s=~Tm<^o);n*0cfdw+5bJ?o`~LvCJ@B49`IBd@0zP-aAhPj{R6~E% ze-?c+`Z9bYur~h)8}IHkeeekM9}nuo9Ge?^h|gT*i1}U6TS@rc%zdQzaDOShdwRh5 zJp37G2I{?t(OZ}1G=qK?+6p}ijac{ZS@XX!{ujWUW$}5Back7~oJHgU=s)g8kTlD`O z+3%lmbSSZl>3F?cP9M%6 z0`?d0LkU=y{Rw#i&)`F!r5GD{>wk;-n1eTOKF8gg{qrniT_6TC`1ZH8ujfOJ=|i8^ zr8QiIH)d@YKn4H%-+)PYZ?cD2kH*jfU4?p={x|b~0saqIL2qvs*4H_x>sYJi_j(fE z?XN=pUhuCHb8oSE0l9pboH6Der=ZrQYo38O{yz9Y;4}9JU=`keS&PH|H<9ge9nc!S znxJ%Rj~bpTQWi&#NV9C$KI% ztH{i6gl`6)z|OjOHXrJ;0ltLZSX}3`$VKM7hw)3$lVCISuc!&TU2J}Xu{QMj%OM|w zjv}vuNFW<$8e@aMb@=<}jLlkePYcNQOa0kD_2t=bLOmD#rD@n}6<)g!zj3a*%K85%0xQ^cykD7K;6v)M>A=Qkbwq6TDEDuFel8#GnYDTW zlz_4If{HTsr7Pqv3D3etsPCdh#C;G5t(pnFjLj_MQq2t>?p zKzAFQ13Szy7pLL-fbs3;3jK05_zGt!23`E zg(QsiqI0fwnX;~DKa4Jc?jmXV4_k6z#YVZ|cUvl5i=fnENB*bR@``vRMxtX~=z&cZ(!L|{7 zJF@#91qCn-27r0;UB>$`mIRpdJ3wFF<5B!Ph4v@mJM$aZKS16@_W3pnoj|?_%>60o z1Ujj)oIIfHYCnISj9Hgk=pTXz{zc$=qs$*<+ZF#n1)o}LacwL}x0K4!{pj*sa z!hb5rgLh>Kz0W1j)_ysT&bqXAtjiU~&58X|pVp-|_Dgf9k40>)RiB|TeqAS*gflw} z-D3PAbh#ROu=Qttyz4dW-HUa(jo!NS*%YOrE?1csW8gjVM;Z6*&8zhi!GDZ-CFoC~znc$t^b})FU=DCz`|p=OVZ0ytG%!!^NA~=F z48D`c7M(WTP~Q(`vAY4^3>q1C&k=Dvg)XA|3^vwL2eP^9MQ2^KV|xMJ8SvYT`+WZv za1TFb>^Ay0ki`&la=@B?g1!yj=k~j>TSp#7j-Z#I-fwekU7B}ua1^-!mY8FGS*OR5 z?MdUH2YCs2Z@z85qxVx zJz!_9Yru0hx7zqzF|IA-31Gkb9&pcJ%7^zlpEqAd_I=rN-@twX+yY(9ar^@O5|{_m z=)9i|@Hy>~)wKa@#5yp?e*o3*=fE0c-dS^2ugm-BTjeBZRN36e@Wa4) zUqbfZ!;iqnNr>yKd3bz(0J@AmhfTzoy=D~IT-2ZA=C1J)* zTMfBhfoktF%Un(a^EL*4E6;rgF9Dwcp3^1Zo@YUPCFG_V-5Rj}Jcaf%=JU~S?uW>m z$n}0{|8GNg6}X=JJONd&-^XANzh!)Rmi4;S&wb$8?dyk&&S?)o$*aL8vK2N@g8LFa~_n@cLUcNsfK5UXOhPF zma=Xab{Y72e0ukGtLzKRGuDBeGWKogBDyDF37EGwP_N4!biKg6?SUJ>TD=X-<95PX z;qR}Qv!Kjc-f{1#aoh$G;~C^z@Wx}W6r1qYNi8K0@a>=lSPMm;<8m&gmqK6_*A{ciAnxbLgztX`H^E+xCeg@m;;jPm)#_KgSsKHfuD2E$2srn|Qq@*&2@(QP3gh5Bb*eFNAJ zO6Vi>*Wgb>yP)!yf%{yBUVx5(CtweIYq$tJAM>^gTwj0IR|nK*VGQ2`?>yJA&rO2@ zh-2pA<2L&9U>n9+bTNOxdAdjpC4lE*YcrnnM?1{ThIltgm2^aOq_Qg zxF4VYKA#KBGe7nX&nISlGYPh>$e!s@bQN?d)Lvp<7m?o&e+v3ZXi82N;A^bse$8zb z+ydspHO4@N@pI^EIQ){(lvt=PMt7#}YpHv#Wk z4P8HD*0W=-{n>mt>l$+AaQN?VJ(o6Yd_Kk4G{e^zdl_n7?!h~Mfie5SgCy`J^!7{l z|2p(4w1AEIX#&Q72%LiVeD&kreK#|oTi`Xu2N|mZ@0Yo20OolbY=Q{8r_jzMyocI* z%E;!*xzXxkB#Z&~XC6PuJo9xMT@E^moPnB4>(c!B?6n@fyEmW@7`M*1 z!6q=40%%PF^*ka_VQ%h9$o04Ls2Fd+hc)Awk3##=xqs_Zc@){YG)8YC z)qUtQ==HCy{o@!|1Oo~E6}nA~C*a%QQ+V|SsCDUi)cblT{87fXh{eA&4tIJFo%2Sp z_xDA6{XFs@`dv@~+svt8e;mF8T&;$)aDDf265Xem*AI2RIoyIbCvQU6p>rSwzIQi4 zOY&d}cz*VZ!+FjsiT3~dZttdOW!%2tI_An67(@14GT3{r{sv@Ue#&?cF!#p40&m{$ z!&}=o;O!gc%5%!269vY%K?46O@R`$y+zZyKBnx@#aPZ^vXAZr6&ht0_joJYB^?W{@ zOOADXANX@%{#>si3HQb4^-<)<$ma76P~QivYwwVEvIA5=Ee_v3 zf53PrGVzpVSi`z9&-RBOBHIJqn|;u{+o#T>TW5}a!Tt1uM_@h)d2YeZT6_*Vj(!xq zdtQKdZQq@=`6lqJefB&>--m3Dv)GX^Du4%nkQ{I1T(7V`zJOO@<@lNC~0sWeX4e$bb>*6u| z3}}Flp)vGT?AqY1ZTD*(w1XAav7bip{@zf4UIXujw~u&F>vdT}-vPWsK7ZGs?$x?< zpAVAoJo#&Wzx)TryO1mR&oO4+)`7L*b5^+(STDW<{pxePM4ZOA3%Wr=KICWwejXfS zPDc`Y!;cwjL|2PL%`c)io^@cIG$QxNvu-oizeA+(e#Z zd>Ul%bpyHuWVFEI&vE_#4C)#q=ud(funOGg zzhTTfd;#8iFh9>Cdw$0H*?icSXSLstpo8cyC1IT#@D=7o#Nx9%gS~e|7~|WF_X5{f zo`By0Yru2(IWRY!$lhar1Mpt|L!SPbgm_;?_L*ai7x3X+`>^MEADbu0_Vjwcbk9xb z8i3Tgxe4ZhXJAg}@#C7EN%;2lIbK4xAExZZp1pwlRj7G8gx;R!`;dF~o!N8Gqt8KK zM|O|q;27h^vk5&5Y9M9I^Y|-JhQEVOzZ<}3xP7aTgzuGXKD1Uys<{)ei8YPnKO_a zJa>?LfN|UZm%uo@@wwh;5_&-9a9Hb2ba&9TLx=FAO&R$$_)%;!&=}d+Zb0>EEmg4d z_va<3YeZ1jECJ7K8_Xpk7UNlke+sph%uyCPh%N{9JzxfEY}VyC5a;2L59c~&yb-zqKgVXa%WwZ(RVWLovy)KllBZ_ zwO_VEU3(dP3AqThuGL=!b0E4B=ECjQ!UJ@d)hFRyEDJTyGr)U035FA5NJGv0tatr> zkU?LA?%~tCdNxOq$Dw`D4$utrRUnRB5~z1|6WuOoa|}!*AwT{uk;XyyL>=?2nIpjW zO!w1|-nu*qYOGtq-kR+I`mLbrgt`yc^m#e}{avX2_cr<}Xh$~<)#mRR>jy>V=Ft64 zK0I^0|KA25L_UGtZ^8Qv{RAjsw}H-ewtzX%fBn1XquAIly$^3Q-UGZ3O$m1JF|a>< z0O-T>wI^)D+b><$xi93ybICrVzcRWSdtSrNy4Yf#x%Y0H2kSD+*e?1eXakV;gA-sk z3G4nTcGkv4@UuMmK(^q^>>=yA^o7RHy zq@V-d8sBBicY!_R*O+5$HyD2voqgE#x{%GqM;Y%!_RjqV@VpnmI*7p`bVE>U;4E~i z8v48SX>6XYaF6EEz4gNDa~Wz3_At-M9#XH%C+OXiw&wIIRNWmg1ZKcFFwB@|GLujX z_^N?=uK=_zy#O?uD=AV*DP3v zZvy7o8YltBi{Jvh?-pqse2<~~GI9%gYsK7;vd;dyCu8=@L8$k{+SkV|Pyybz8SLGM zbU5KYfFWQW`l{i%+66xc{{VO&tf}vUEbFAi;qL)$*jxhEp?5)>qsTGT`kh5@tQ%kr z7+(t2ulu$4J(nk!z;B%w7&jNzS1t+fmyOW3ki8?9L5;P$p()ho^ZCc?O2*UZNPq`ZWfwLg5J8U;r}>#pP8QZ z7`!>Pe-C4KA6|dv(0ydETSWgoq(@-BHj9FK= z!8y<@r- z7BRj@-L3_|?m%_WJPVgn;JREwDHBn^T zy){DHq1w5Z2zd%vk2UOF)A43>*2NV3F#Ig^DKv|&1%4HN2^<4G$kX5fcsG8YLI=PJ zFbRf%u^6j+w%<0Ry9gH1TN|TLdwoCX20Q3ZL$#k!2CidGYy$VV23CRh+&Xa$*P4ef zKwH(LJCbncpkHKNpI?uF>lV+-$%u-*~Ij6Vy^`zY}HI%OZ8ZOS^m3FiRK9S(UJL+`s& zGy2Q$XMpRRh58)thA(5gjvT`q`%`ES@Z7tgJJoP^i%{3R3!Vb|(h77QOoI_n!dFT> zIp#h>uED$JL=t+nHE~ZpUb&bW8bm!J`GbR?nPWB4|7*0^*G``-thpvG8B!aV~Y%ZD0!5BecwYySe& zzmG6xy%_rubR~Rk0rTAsI)FOgNvPlbe;?0bH;8@@eHJlM9phf! zLUx@LyVK~ci5UF=ymzFGzKiibEEZ=l;iXDpuiRd5`P0_$@b)Ufd^W)pmX7~KYR z1{jz1wF934`|+`sceV?;UYE6)as0&Sn!pPDcs2AJ&meO+?8&?gGH$LLpyubh`S3e% zgggoCm!5SKw3Tt~jsRmZ#u@0l7;}G)UqZJ8j)Gp~DPW!&v9V5y@ZL@J!ysawvASpb zWfQvdz-PhP1U+;cc>vr7yXd@A5%wjhy(xxTPuCc8jWy&|;JGcK&*H-zm*M-MEuezV z_|0LxUp_w2_o5#LZJ@xMCg=b#Z==vZW({ldJ0K;FC=Taizsyy`H;6};i{O=K<@wY9oABo5 zYI5*z_;IKYW3hJ{oAtenjrBVMwGPeeIxsHl(R`hSdLFKu1M^AnQA9TbZ@)Bd`@^Ap z=$9SneZMp}=CEFuzuGTbnYRVTLA_sE8^+X=gx=%X>Hk~!eifh1=)F4&z&qcJ&VJbm zUjd$dH*^LcFQYft?!)mN#*BXmItpsw5%4!EbLraCz{5*6b`DMR! zzH@F#(Z3HrMeJSYHTa9rE#!-gZGv;iyWnjwk6vGAKojx|C`g@uIH2AyJx}X<0_uCM zIdxAFv<;p2Tl$x*`G?>~phmncj8B4h_RA6EBDh@*J=^-^fi3|RbkF8PU$Ndk0V4dR=*^XT*@ZuygqU65 z{bupee1Jx11E_$b!1cZ7zW@X9-i0U*ad^Hp<$UN1?)L)n7AUjMwIsy01aIH)S>>6# zuWn$j+^;>)yBDXSUY@`|0@k444%SqOF>A0Nc)xvDI}AD!=HdIbe7J94L+9`6m(iDi zXX)C`9aD!N$A*x1S=&8%rlY{PvS1tiXY~yqL(Rh-V4w9jEzk6wb(vvIe~uTKTZy?d ztf_7hEP=mftQTa_N61B}{oVTSMQ#A4EA%~d_u=hzyYO$q&n4mC|N5bSgpUY%7yUY@ zfMvj1`~SOA`@e58*ENjGXO?-+f{r}*FA3kM?!n)@%*{4B*KvJwVr_1KRrJ=8b-9G> zd#w4=Z_RP&Tfm(7Tebbq_?^3p{yWI7-3mXHgtPlNvhRHEL6ot7%DD0FB0F~)TCd9n z^v-w9Mo(ZE7z$mZ=ip+Jt1^l{h z7I_K!CyWh)i6rFFu~HoFh-YF>ea58B+e6+#_S~$O72v!SzvgWgxep8jWA(nTQ4ZSRTw%5`$++o9h^Zh{`i#@;iE-gU>3-KX^-eCCK9 za34&`W9M031qJwsI4&jO?wQ9M@aEC}^aR;8A4BzTKXI)QY^+Q3l0}X{JA6$Zs&8d` zka^yMFEdt5!oBf1W1KVSyfg0Ie7z0KkM9xIk9$vv&tB@BF{r%uD_0mx!X0RUcAzz;zQooo9$ z(E@XJk<*y{!4ClMmG3|iy!GNa8)pd{^K%m9KnhmCP2j!rp0*{yK2C#QbGL+l_fdj3 z-^v}>$!E|Tzw4|5fNOfb zof)R^Ztlr?$-EQ2|) zjlKbzvcC0H0NEtmmow02piLY4UN8l$p920p!*-xg=SA2(hI(ewbHMc{lY{eRP7AVg z%s~VC8oGL2K0!YZP6O99-{vEOjk(RC_x)xF_>BENxQ}iRJL|l_oK9rp@Ln|{8;3Qs z1+`v0OXFLB`Yg&}=QHLaI`uw37NGwVdKbC`j)4;S@%(OsYap8s&+!d-^K0+-Y%U~W zoqO7Ve&AWTPwUVct6*1!dUnQZ?yX7B=UYHuF9Yk^Js$_Iu?dbOq1LX#8>i3NUUb&I zI%{5j6WtDS2h`lP!+VY$&{oi-EM;sO`a0BHJ`X(uE#braxeVU}Qs$b2qwwy*Gb)4k zan?3Yhet`fK@Poy}CWt+r@tcG$i30(sjHujmXX52D0PsQ(r^q3eXhYTTstx z3c3bdHw8CAA8XiCT+_Q^pE5?*-2}g#r%sd5uZ+oe&OYcZbgtw1>@dgv<5`yvhZ=f> z-nFf@UeF4R!L_Za4XF3T8a)Xg1J6{S_ksQ9OcLrPhwS+j(G~D<71>(yTy9|FS!AKs zWgBCz)dCto1gtszN7h+F|`k z_;FypxL3KB&G{&Lb8fEOb88av-<%KUSwQDHTj{xCgFV{(Sc@-$8oCis!^Zt~gSUbE>IB9$3vPgVzqFQ{z##D499MS>6hQ|# z3w*zHPGb`GqCa!diR^rPp#8E1c@ue_7_>2tBVYiSs~u=RaIJNqZ|#lKd*<`sxaUAS zsMqCH_&Z7HjZfh(0l$l+@FKDrk-WZQXKlEKN+kxuK^L9_>a~+s>b5pNN#~Xn6!MJ9@9&o?zs|}n1f5aMhpo{o6$1%LQ=t$Tn zymh$*V&pfl^$uF6#ytc^(6@mO_#*IGb{1L%3&1)$2^x}6bJleZeFQwWQK)lk@F{-V z;U5Fnb=-A?=k0Gp#@LgD{~k97b-gk=-+hl_HxGRGv%dXKa&Cd~7;J%6Wa~-)4-@i^ z&Kwos{U$FWUq;@B=8?)hNgA-lJB?7e3h=#R8x%o_O+@LWA}`t1ez4|fe0Jx8?f}J@UOF|rR8hWR> zb)VkbMtINrG*Dl{XBYelkOQ9U3h)?fx&Mz$WjA3m?mmG4xW=v{jpYy;yl&Jhr??hgL0!@E`m*_^n)v*=DI z;Vd0HiL8DST@Lvkav3^`Y+as0wl2$1-{HJR*4r*{ZVuf$zk3GJc~-7zeZ?{1K;8Qk z^bFXA_e^{atS9UXInoc*x$B@Cz55)2J`eRboi+5X`4+H_UPf;m?sFN;fo=2+(3JH( zmjcKp)D~C(8K6yDHS}}Wn?)B9r)Ss>9)bbTkc2ZS!MpEs!1X7SgS-)ME3$JU*3;g4 zs@J78bR2j#EsX7-HKy*j7u^$d*76YhsDJmQ#L&X)pdA=bLLOY>Eb#qd9y@Df4cT6A zPVZpn9X|rKE?XIEfzLo253mmPT{a8tgt`ys>vsho*4QQZUa*#gnluMXz~|@`^bz_u z;A8Bq2jlb%dh^5t^*)#fYik~iC83s$RUb8|cfvkx-}2e!8nfULaG&na8u)Y`U&z*n z?>sXJw!oaXgZ*9)t#JMo=(%e6{p$?03hMEhXLG)Yt{vfr>v9Wv7c_w) z(2rxrrtJtg4K9Gc!rr?!pKxaQe|J8d!vJy%`XzJ`vqVEIE@Wa6U z^g_*@etqBhA7C^I>zShtpx+s=3kt~Q-}PMQ2{e0{{GoH5i^}l!rafqiO&h#D&GRlI zTZ^60Ic&{A3F`CU2-G+`!4`8p2iI}EY7)+`h`bK(^SFe56?p}kAV=uS$gb}?)}{A- z4!#j;|MJ^)3*LQe`!(bevE4qMKPI95RaUFPoBaUAZWdu+&u zeOXVgcPR<=YYll9+`D(soY(0!_(kA;?cEV`eLi^R#y^8R3KkOb2z7tv*1Gl2I?pk7 z9oqr04m>yacov)i`ribu)s%$2^}|PC23RLE=*!T0UD{&`z_`X4GtY6%9Bk|hIcN+W zJ$R1y!!M!xa6WvKbuq^{Jf~V3>P4UK%{8r;{v^D6r0A?c&)u;Na0Hm|Ti_4y?Y&ZW z43x3cm*?hwf5MuTguKA70^hmZ-)(fm&_>2x&vmppf&MjYcH!NZJ_ms@ZzE5``+jr- z`p)n19^}hFU-v;KVL#wJd^`9QbN2Is5BE@JY#06-)N>ky*8626<1HWqn!pOU2aMmI z^#JO+UGf;iKjK0K~O~SiJb><+3R=~5^xfgx7 zAJ59O^%>EMY`+|W>iZGUra8d}=h@8ME#zKc@3?{fJc!WGpz|)c{|$W3L9HY2TMK*% z-Z^)n!@!t!pytDU&VdeKT+`qNsMqB~_+~H)w5x*0z&deXcN50&_ow*xJ-v1~obecA z6~-Z4SNb^nlaqkk7#z*FPWlcl^aXw$Lfy`kt9* zwFY*OCzDXKS@aFebDbEy`?Oy-L62i&T{_=&OUTCE2+WOfnZMgm^W|E5$cxYne)Z>f z#YJ?z==ANm_$(+h_BOIM?zaH-o65C@v9T`q;4{E|JJ-E7Kz9!_59<50J;*+CKM8$y z5Z)f;yNLDbw{ivE^`8RgT1Vdj?mZ>%-j{j!5vcqky!S9oLT($N&Yu8Bf%Wa3HW$;N zkc4N5a~45~c>Q)v;k}>fVcxm0X$1F?opTk;0%K|fOCZY}{rAZyp@!6(qZHZ-%&W8v ztr2@m0)?N1sl4#^PB-*z}_-BQHY#4Ex^)KLRCm?$f_B%-KawK>=S9AiHLHRg^ZyWa`$6?FE5@8@|oB;mgo zvS;~z>9gl8bgr`sBIb^=o@ZKux~}JtBKz)V&IW+_DMHOboQC(&75Eadm9TYvpA(0{ z4z`;~=o|JKe@CogH-p~wycgcV4Q$M1Gt|1wRzv+aL(Q+qCE;9+=S$dl-;HSoRPcEd z>RmbxeKR3${Cdwk-$%f`*(cvXSAmZYFnT5Is|6c>GuOZG*mKBH8tTouGfx-57Z~$d z?w>W_eqFZx&q*J_ql& zlRIh zcQfu@e5Uj=ehlm&o9Ah;35wVr!p?DJd%!%@JPv{T!2OOV=&Ja{GNz4tC?Yqa z_q^(L=`$z`20#TH=SKMO?9Hd^Oo5-X=C{BPfoGCpvxJQ?bum7Q&V88A9c1?qG3Gv2 zK@onGu|@Q*HwRil8F>LpO_lx;-yI3L1Qqngq#u2k4+nV-T>}`vW(t}`A2H8$V(j$Y zhipxlgAVvo8e(fk9zq|161EG_Bf$48V{QWOMNES%HW9d-uutShP=)vTJ+B^`fx5P~ z_7nXMV`E*Kdvme`jB5+p0__7E@Lkw=ws9Qx+na=*;+}HY6tQtFbLt%L%Pzdnj&B3) zYRp|jzX)&LSx0S2xC5u4732nJ8`Ro1R^|FLWC+=NF$D_v$bb?){VttE=N@~K@Gg^q z-bFSyn_vb!1r5OYKF6I?0If-|O;cjL68w55IrL4?ZFJqx82HTVM8Cw^^}2k3KE=j- z4KlU@Z;vv*9&|IvC!y5k{{J3xfwj$-dD5=JoL%G^dzpi;F;AbK#WuWou!em0H9~&| zHI5X06`0EGy&H*1s($5&He82tgV3(wvW(%2id;zg?y;ZPIMnfwuhCltHt3gpF`ea z&YMYCX9j9rX0eZev>CXrdln_oiOo1L=bqw~NhfXbs#0=E;40@4&}f=mvpj<=yf}5^warp zf4+>)_vf?dOW+O|uZG`8&1DUr=h4Y`DYNDVbPuc_=)8+Q$IZnZU>w@oo4qIX=lC^r z4?rt$4ev;dt#wnt?o*3*Sq9pe+hh1|OTxPC$OW*1oB@6p8l&fvvTmcx^|qb)O}u=h}+i`{O$G z=Xi|XI;nvc_!L_26YkHm&K?eNxb`qUZi7a!0OrwoFZHc2d!aSvIr;30885}*T{MH< zyes-<-Zj7tvKgF`-uj{W^aVtOM8d zPPU^zg6utTPA}*JuH&A^p&P(6$tB_3Zb7@i8IZ-M30lUVcko&@^b2#<0lb1Eqc^u~G*d-J>nZ@p;$D)YLr{e7r8c7JQYe5K$9 z_|J^}7AQLxIPYD^p11Gthw{XmgxEie>^(_i-V@NdP6@sPYD}Jsd$%um7meq6=m6u| z^Z|4G1o&<0`8NV%ZbkP1*gswSD|vDbhS9kX@3k=&vGtj88~rRemLQ{_gxW9L(M2E& zJd*}sE-!*1;O|5uV2?TGS%1Da`tETPc{w3h?8*05b7T&@Tc^<*TMphi*BM*75_*RF zv)-)-_k9vM#bzFAkBZP4do$F0cyD}Wbb=2cTkpouo`jnDd_Mg5WX2GKdGzLW0=Q@M zm;(`UUPylVEV2&T&@TXEFb7+#<=*7&{VmX=pb6gZ9-mFtk%pBm9`>X|M?jtYa>E81o(J^I#2q z7Z?Qgo*FjZInHLg5Ew8$IO9mLpKkMV}v#P z!H$ez<8{08IhV+@^r%UFIFYOGD@kAMn(R-k>#j17V<=8hmY z0`p?evbVgE58vtjZe&05j`^&%c3tNju>Oo|>45sKq@DYE2I@Y?fwgV_xC*Q-ZS-NT zUH>%v8|Xa$6?8L6$hE!IXIu;N7Wz01&$1YP72POvjj7%*-9syoHUQ7Ud}e_A`YSLB zUlHWOzU{m77IHBOYx}-v9y|;8X8jmjALGVbKZA(*uBE+oX-_SZcIF`Swy!0yx*hDE28tvcC~?zz}Y06^(Zzw z=siR4iFMh;m}gyqT9;GM0cZ^y^XEOPV0Q`H3taEVj9Xg+@Y~ROUD{hdl@IUM=IvGB zH_Z&bZYBpcg}t%qUuvEFYF(Nm_nW5phkB3gH6Oy4IVv%?1G)&_KzA6V(aPf)4KB+ zYL0e*b=i^+&v9n#=erv_@0n|uPtQDs+7nNp+hvY1oCMb9Ag~7fy=w)#J!I?md1UJ{ z1{w4*@w_`9e*d?g{3bHjw?Q*{&&#{s4t0$g^jTmncm~#`YYl)Fu!T?eY+gJ=@4{_R zuS@ssI@i$c0_ThzjF*^ONkcw{(PfdXOY5aEAzolkT{|M~^gwnW%kVwGd-b#$o;lX# zIWU1Z!IqYV%-1V)h(jyW9$aB03C;32Jg*>J7`{`!{LsW;j{4O({)CH zy}@&FPnVK|?;hebf5u>s7=d;$ehL`xDs%~Sfo9|sIt5(?eglj`d(pK5b=F~-m_64b z)N?d9?%Vvi2Wz*0T|c}rnR~xi%v~8>kumR@cfz&rp&J65!0~yYFMD$gpQ(nv?0LV0 z?z{SekJ+31h*{$Sc8l=d75o1gIf#A&^n!=Ln!N~}2gdICJ%N5GPfo$-7}tIc zWbik~SSK*g(_j;r`zO$@Bz!~p?;Nwp1uz8efC#_S2{|P`*Xx0wg1!Y^V*V_28>)U3 zYTaIC+#DB}TLbfqZ9)A@>l!RO#hkhN|^?QKpnu}kD zS}WSyFYjV^4!kX`hWVbWxh{e(bl!<9ytQa;RzMEen|&YiZhjV8KcwHEBN9;Cq12K7D()_v;egIGaE- z{5EI-=aKbuCcyta@clYB_vX?w9fB`IOZXat-vFt65@K{+_vJcMAj0;0$Qk%c*jU$% zP-}7->a%|cYJDC9`Z^C?0(0O|5_*Jl%%AIy!1pmW3Du`{USiC1H#YaHz4c%&ityH@ z&(>l18a|#@Lk#ZUel`R3JvoX)k9m-UJsDSlaea7>pVtpP)xDoar?2;;vtRDON6fbm zX|v1tDfkMyCdN0AttF}Rg*9>;EQ5Y92aMesw2rc@xdQL^vd^-V@d?HYAjYqGo(5Mz z1=;6NE(v;jg?a1&`rZQG!3eumsQHfYy$y|_Q4*d@N1!Kxd#m@$2iT;{s}X~BV*l|^ zoqbtbe^31x_~8NUmmkiD``yKyj%qlM40HRC_kF?-pm!hM#Wv=apaW2Q?IJ#U8LL1y zp(lXn{QIC2egrgu8DPKg&h+L(?Q3HWJ_=eHx39SGM#guc#!>H=_BZRuGqwlnw}|}$ zI0L@|GQ{vf#&+Q6vAfBbc0M0`MjLkxSVx}#t{ox2k`L!I3*S%;HV>gg$n}0{ZD-LL zXA78Tt#N3C{>%9JYcPszuB_TmpHE>_!z(6 zz-|j_KF^{vFUH`y_M8-$Q(>-dBhP^gz_@+C@L68M?}wq^L3Z!f!COhFlV{MM#{Ma? z`@aXuAZ3nyFRP62!D@KUNK<6*StGpn>JYFeya=^lx^LevH__b#ZJ-3+gKiCKZta)< zkGJ=MjXN#xeP?%_tasPDJG&S#tji9&W-(yE6axla`1v>9#k;sLfB_d=It8~i2LnSf zt=qasb9`La%?YWS`lLQ-Ztk31-_$23imWJ#tSHKzj4aEFqG%LZkri3dD2gI0iXtnD zA}fkk_w$+8b6L3Cb9=6?uBES@KkxJYd!FZg-uE}z(q3>Yrj7Cbl(sDL5b^@DZKvT& zAct&hi||dr@4zI`&-!fvjG^~TPeUIdXTULdl>l_kgZYP(Gl`0 zC=^3owr`3#{AO{UjX31=A0yj$7TNdxA~p@sdSusj1?rqrz&3qQ010AyFAjH0BlHru z4~_%(I}A?2*D;27i212+`q1eE?>}h{+4yR|3)&Agr)v8)cGKw0iwySW%Vvxn*aCSl z2WDt9AKKvel*oHQU++op+-39$*6g_EX+6|j*@8DGXX6la^LrG%{+a{#fcMA}v|7(% z=A@6g=DpnvJg3?7!KRh=1z@RLou( zcLl0V0VEi=1?nDZ_3~zkHGzGgm$ou}{3}M`{B5H%c0Xgze-FM5JoCfo?|~y=ojyhE z^`$<%P+~rGDd;WW+I^GtL%#!c|5wnjfJ8BTCmy72S{q=jyJ$O(&i= zsMgwan8Q5RHe%ho(3P-DAeZS^p`STB3pFpBXAmHJ6O7b^Q9=_t8thd33ncisBJvur*m z=+g(y(&jl!1Lyk$`Ud*>9rU}%&S$;UH;(7}d%$Dpvd{<=z<4RV$xlJAf;~HMkLIJ_ z1{wGaRNr}rJptYate58HMf9%CyQT-a8{O)T?izFmjDllem^R-}Q*o#X`s_aZ5NM>` zST{kNk)6Z!dTz~^lRNqfK1sr#01+^sjMW@{C!oKiPeh*_uuXpzBF+Wv!u_m(BI6X% z8}}r(-to?JEoN^}&yH)FLH-DQ9$LRMw)b&0L&Nm38b-;NtG3$kIfVvNT zUk2W5uh1_^+ZixP`vFj7F85%cGB9RCG4`z29Mrcbq5U9H@(7#B)mo@JqdbiK%aKX#`>jo**X zJh28BuyZZ?&Kha%Y$D%9o`Jf)X7~hr1GFAU7r_-U1B}5hzzl2YMK&+3Bi59?$kxRd zf$zn6WWR}rp?trUJSq=05kM6Hd*+)(0+Ban?t@mMv-0LAkYU}&?NfD z>1Tdj0IownHp17%;a)66;rHrUWNY~}Z7pCPG^4u+JpqmaZI+f0ZcIxDML&`=5aC0MD~)+rmyC4brC_*?C-d26(oN zneEyx0N1t!^vzvhZXE&_!C9~Y{4H-dW-NI9lVA;F@aBg;8;5sq=Cb?H7b*0<(Vb@v zX!}#-Bz!Usd(h_Dov~Y>`)Jz&qu>g-0G!jE4I1&(QAryaV0< z&K2P!@AXCWDQw)w61=tY1or;^YR(qXn@85LcJKgLA05~A7?(PbXUrn@=3NADY`hER zW7ZFDBToa{-HZD(Z=L5g;2X6EeS$v5WDnQ^bKnTb#$nDJ?fR|-oogRJ?>@~-b7B)D zKm_*2Aus*it;l{`cjnOVKL&pR`hk5`8B-rQPaATcwKc%I_S#)BjNY})psU6S>NiV~ zv5jLNZLWU>s?U5Ud>1ssn~$AfN{Y_7_N2pDe*o{=UIZPq7vnIGzH%?FMSr%W=H)TagT7b{Ytr|fpoDG! zng@sZcS!H?Hgw04A4%hD_MzVvKq3ljS)omzH((dRC%Z$=I!_ra(q`VerusPKZ!^?- znZx$uQ1|FLm;&zMBGfvfe0E13gw8Nl5*&c~}#Yp(&{KvI}0H?SXy+kuT|xLCqp!1G|fSuZoRN7&v# zZw|FXkAP$x?vOF4YqMUCq8|qC-PoERN1^&55i=*XXa+mS&jM?*d-L4ti=&{3{togq zC zwO&T(-J5y&Gw@At3tbtz>K^E$KlEokym{&S(zCF|JldWD9q4<2{W_56!8*M175L*| zf<6Orh+77E5VQbeXD*JxuYg7{5{EoZc8A{?oM#o7!{((n?#DAYhfNaNj%>b6(`L+< zpvKW!ssFdp)j{3Q1TgnD!M-@;rE59^|0Z+}z448p`o}Z*MX0{cVdFfm*Su_o`qnTn zJK=kQe)fHtf>!Wd1=Zd&G+JZI#_pHC|HyH7{$NuJ}{z!tG$gaaNwVgm`oV52nuuhxnSpxdwBq&oa^Rx{D_n5(^ zz#4ofd53JE`|Wf%Z{Bks27bdi$Jsc{V}2)re)1e!XS~B5!}X}sUZ1#rW3vga18dNa zK$$*W$ol1VWbe8!r^D|O&pRT_h%ieO9vlVht46p=TYcx^k0I{(NAA{&uuY(54^hCJ#KCm(CK&Q zJPxFFz&ZX56tUL_!$9iUGQaxcL?QyIG!)qwc#oUw1#lBwErq=o7$Xm6(2bz;9xpJb zzf1bwyoYWS7OvL#t7=UI*jfiaE;qgbHrS^1n-<@<8VJ6hPrNJvH`}Bm)Mi{pm+E`0@r;L{T`st z?}FA+c%$_|lgO^`74T#__^pD@x-|p+E_4_>-=9aJOTfLK1GDJ91@u)Ha-Ka{Z#`q? zP9DAwSZ8{Gb?{nDOwio`?ladN{&(6-=-&kHL3_`xHKGe>KMGdBMeuEO))w=-$X?Bv zRrKBy=2{Bgc?O~8ooD(X@}tmCro(r*_l3E+7kw|VUK(fjZ2fTVcL2}+o>HQEw%yZD zKr6C7NHVu$zYMmJ-k3P6wUm%l(+YUjq>~bEPnr ze$t1&Z;X+(+PNk{N?YK%&mxb5lfe0nfo;Rc_37Z-(Kyt_NvLlj&$0P&6O`tyw5@1$J4t15nyS)T8-p*kj=4mq)d7z*C2DYzf z_-XiEU>~yeQuzYNz@uJ`(7%;5zst`jcbT|33?R zkoD~}m<5jQJJ>iBSknSJ{cXM&m#fHP3pj6U9QI`$HP??r_0d)I?@WihE1XOF8pWOte3k%glz`h7;wL?YYW{$sB!YF zm;)Pe=zA0WJaA3cxDxs|fj;;Yvh~t&YV|UY?LJTj#>%mLJ9-}0ko$r4%==E?Tmui$ z8Lv-(2gv5~C)2;Gm%bPFq3;FeWvyO*4!%||-SZ+C2Cj1y%);05@;1C@!M(ni4s%&s zte4iC#W=**T*<<(fgAM6u>gC61b3ex3ctzL@U}N0fujc_D<|m*t$i~C`>;VaM z_WL;KKt2IpgRj-g1?0EZ%NgdKjKjC!UE0=wIXMCD0{gqaYv8T*Qn?uv*{5@PkLc@K zUYa+a!*2lNmy1K5x@YU9e%h&*iN8WNuTG z2i{xwJpaGqmm~1=v>%7=L;feI{{LtAzlU1C{t@VtzXY3%Yaaec9s6+~Ey%OL+&0Ja z=nKrZ4e$HIJ)0|sz~LQQp}sZo4*eJAIYj&a4$L{`tj21Kw*L*CZ@n*rH)-=u{ZH`b zUWRdcKr6UFn|t;|Al$}7l5xl zpVj{z3C=}cAOAVf=6m3Gf%RyJzBhsMz6?AsN09Z!lVGJ3&RBI`^wl*o=jX6nh1N4R zdrSN`a14xLqi;??t#NyI*5H^4^yTv*FUzHncUkoMtruj_-2zvE>ngB5+jESwAKfOX zFov;6pzj3aSygr|O~}?w<1~t`W6h#_Fa7@n{1AAy@lWEv0@jc>FI=PkNdo=%56~&v zq@M@It1BI1{BwBsc7w5d!3wHHkStBM?n(U7hhJ-hWTI)8awi? z`hSy2|LU2sCVd4w3vSTom(VEUOt60US^z7ha2DvFxC8DZdmgNp&Q-*I540Ja1D?Nm z+VpQ5^rwJxScUar415fjm)0BOSp7zTwIdt?7IXytCYVNk2Ys`^{7&#~Vy!eEoc{#WHIk3j z+I(n7&h7a86Ucu7zL*YUyOw79nd<}43yg1GHh?Y=v3KP%Ye-?UKMuZ}gdPS7+UsfO z3|H%i^~yv4$Mvbo48HCJd0jL6hka zPtQanxj%>gzX8|xN$4*CcSkiZ$(8DVOGte3=H(;laK6*<`qVQrNxug4r=aHL4SZzm z8)#oR&)NZgtJceW6k=+v_>YXKU%jXF^%tP~q2Gg=8|JO`@()0@UeYJYSTCo;yyp6c zzzOt6z&+rZTmlKOi0vG@oA95-E(QNMV>%yxPW*RZUbh0{VIEiqtUKnjF{v;{EiX4q z;oZ5Hw(ahaOLx(Eo_o*{qw3lFIsMHWV_OHz*Cp-Y%Zz6Zbi&v2vNo3EPor<7@4qE4 zy}SRlyo}Pn%F7hvnwS01x8`MpoM+8%mzNW)Y)>QwcP{3qxjcGkE{wEYC?Z!hM3gpa4tc~3P#UGpBOcV-fu^PEHH z-BU-u3FL9)kHbgwO+s6dpM!2txBiycy9V#gqu?a=`@uEVXU&|0xBj;S{F}H>Uvpsz zYM$o0!}robbmnM*Ih?bCf6ZI#rES`FKz&y{U~Jzny@2_vzkhIss{j6a6&ve}^{&8J z^~jH|_6ltoY+i*w9arl>bsy{4v|*D2W%w6pKSaCxeJWl3{|Q@t!~SRX zZC!jB+{czWS$(??Llcbcze)Iak+zSZ)4%nM`o6?x)$cj@ zs;@qUE)Q>xJ}ZsGx87xB&xLOT>+&>u^Ku0w8Qb}qXnTm>yzGNUwDm)KpjBVvL-Mk^ z259yB^~+H1wd!vXu5An3Gk|=m{_fC%PJccFZHdF(sSn?SoIsAEkpJFS=B4Md6~2gm zxD?i4J{$(VPO#~)|Tr3ec$J?^SI_x{3=EN}Y40WM9QL4te`eyh3^E{f<{pj`Kb*S$%-wl)Wn?X0Qqq_jT z3+B+d@6~Sl?&w@w4@l5910A9N1auRm(7h*3A7CCfqSLMjBIGY(YrWKO=F4GpeZU;i zheP<{2)t)vAN&lES}(KMdDhoy`(vmzt2%BJ=6@#rt9rQ)njU`4>>v@R#6UfVnUYT+^Q;&q3E2!@brcSK{z{-C3yTe;s-Rn*=mQ z-eisiY+cI$I`eXt_F4E&sON;URsBAF1AZEO8Wf75#uz7aB~Sk%d#y)47l+?)@{DZ^ zte0EpjFV$*L5oos(|H@xAs!XhQzU;)&DY49dE1d7aK%{6A1pk2WHuCSIA{6(N2&D}o%N8yL!@Vlz(Z9?9H8lO(| z);7yhWN$hUBT82v5$Uh2hhD7k43t=2rwb@ewTxa&uy^H7#m<4-k7*=^I{T| zkv%8Q=RO}okD>Q0jKdFsgUGJc9Ks*@|4tkAqnel2JkCqChFrnM``tOuf}6no>N8_( zJW|jmuu5AV+5j!$H_u}h*}OC_meAjXuAUG1*}}g6nYQl$YolZ9SI>uQeFfz4`6r>~ zW`Z$$p<{7q_giNkz8-jAxyB4gGQQM&+Xr>OD{;6hAHk0A9`n-gkm@%kF|EF*{OUyg8<{#4D4o1;=HarK` z%Lm8@gI#qm=DM-mWDM6-%S-E}?~ygy+?!*6EgkOh!5BXx8-pXDA6cL3U(SB@-+9bm z@3mhbTN9lBA-30nzKoc6hz6|4&IuVU9_3YqtGUh16kJOKHP)r{vG)Lz#P`= zW!fEc95f?;19)fjW4F!zj9V=)@1ZNJ1AE||dkbuU0w{u~==&p(-_f^Y`&gQOai~?z z=o7%0HK5y;V!r|J9-Xrf{$uFckY8Y(<|6a>=CM{*|63*Rm?7+5gsx%t18wMA1Q9X+ z?Q}Rp&Nqmi^?0c}oRbRtJ#@y;+AxiL64^P6^fi~;k(1CfarN7#T05vy)w8^a{a&yM zYJROSRtmWPXVW2f&oV{=Ig9=#wh?qcI``EG)aQ`R%UNX4lWp&YQj4m;)sR!w-wHd> z<%{92aQ)s5-fu%Z(7JT^ z?lJ$(%}MYw*v9@ZpnnaFZz2lgNl(-EI=UCrq4ph(15Gf#ca{4b!R7?|Jo0z2ZAUhq z1?V=q%TV)E9}I)z@WyQlnx}sfYP^!zcA?Ke&C5&Z?}9!s3P$2EpK)KnzB)cS?>)yo z3|<4~N}jcsX;@_1MWA0d>FazQP}|&-{(T`GzU7=(Kaum*-!|OqDsm&TdF4J> zU-f(Zuh_4-VXbh#e+T`2@G0Op`pEOql@76V+;-$nFd2t?&w6Prk8s8c@J0H33ww1% z#$p%{lWxpF8&B>G1DJ z`ZLwd8G&9Xg*knjSz}wl5|}~no#mYN&ojO`sV}{Ip8-?YnUizqKY{F6w}EmB+D=;! zHuGQ@cxG0?I&j^_F^a-oAH?CmLn=Z$Xx9%tpbgnPs4$ji<`%jfat``+`fovrclCX_ z7x^r)nh$wd{mr?;TC8_s5E#3Q^l`nt>EQQk$OZQ2Th4kp6Nh=6dycjYW0=by!~Ub# z452><8o?-tXxj$=!n_B7dHFanH%GvkQkdU6?GAVZ-L7<~32n&U({;doCK<>1n$cJH z48Mlnyj<)K_loQ41>~o9X!SRMS{^=uY`&PA)=%ri3Gj3HIr@|tV;1=m{Fl&Wko(}5 z(M>=L%(nusuYWJidZ34Q=NY9G;OWOydkQ;JLHh9 z8;)1YOY=rQmq3v|wyk5+1oe*a{8T`WF*tM8w^T2-Js`(C?@x!AcyDacPrdu~-ZV~* ze;jxw^r35xXnPHmY4;p`7?2ayc&+dBso$|5gVy{p$vEar0$4*HqhAX89MpO8AW6;> z`)Un66^H$o&xhP5TeaH>Kd>ltM|E!OWZ*59qmj~|0y)OX$>6q@-{rwia zKE+qn?{W2c*2dYYj&qAXN3cuK?>*>_Bfkz^hPv0^0iOfbuLbNHK@PZg<2@hKm+|t& z@NeNm=&Vf<^UTtQZ>!%OQ|MMe9@{se9dWp$zC{eZe>&0igNwlZ6d3PO^t-_lW7x+z z+Tt*$c{Bl^ht}@#+t};}CE)l)`X!hzfsMX&@9w8oFEjA^&F=uuLnnM&i81Ntx|@)F z)9J%ny)>7a(TfK7EN$klzUhLxPS#V+j|4Wuz%`u&bBt;1_ri|>$BI~A4qYBT*&V*? zjN8?iGf$qGm(H^v`6KZ9#&c4K&icECz7P5$FsD7s) zKTo@D#G!g-2GK>x?!|TGkj={#>~}%0L9GwwqItFm{SdVJzWhJfFLDt$b`lz~KjZ4& z^|yYsh7ADY;ryMT7*}ga)o;eMjdp$3ir&1epfewLr^9^4#oqwTjTE%VJm!nO8KU1H z*aJpDFS@JHQ(!a>ce!z>AWwl+Fag|qr5Nh%x9Q_Or?2YKyYE%jut-1mV(j|RpM$!W z9?%T*`3!bNU|yEd-3I#0_1V7&tQiSxI?!*&;T`?fyj-Ad0R3%n7&vak9?b)N>v-;c z4r;zM0dwFO^heMJXaPJ4zYIMH)`9oQ?*V1=+H+c0u``a1P<^gnR-y7|Krb- z(r2~2+{C60Oo6A-uRx9M25|kGame*QrEM13oHWK=@JqD0_6%}6`VxE-@UGO)Z>^WD z=v%-xw%?33*k!R>L0UbrJE>8?1bbH|cE%h?OzE&^2 zJFmpS_pid&Gw*+e-efGt^UNB5*Xq2U4d>PutzZz|+|vi&g0@2k(7B%9te2Ouw_X~T zx7N#fWY0_WJBPJ>6yAOJ0_V%4I|^@&v0f(N@0CJLduzQshrSqv_fNh%tnVat&FHO{ z_A?gNOXvSMFvoj<`XaWj?;$h?4r8BSZuj&Cdh6XOkV8K$(7Tr@unH!DdrzSEefoCw zGE3Vk&}YlocVX|mo~tqVlb{ZH8rhmz%gfv7JadoG&o~sp+to|w^}9zuEz;lk+y;k0 zg+3Acv0k)+i>2UG*KrH9pnHja#^Mjb7WVpoSUbkr4`m(I@4|1=-iv$)^aJ~QR`pY7 znlm5&>Wyyg(q|E; z5`7XI&tn3r|NEfM>mBQP&%sZC zF<@?+LlyW+G2AsV@)6{(K^LHprAaw>$0{Q?#bNw3`c-88W0c-O6LN(;-igD1Ph<`B4YGlJ8axC&;Bj<=Q0v1aGzGLfQ3~_SLo=Wm zY_cZLpz-|y^!LFt;0d7rTY!0aiS~P-4(KatM|EG@@Ec$dOo5|dn6?GRt^S)U^qF*6 zb2bisHt=Jg))P33rF=ySkauOJ%-^M3*i#^{P61`+lT(N%LvJ$!=k+Ua)zehFma zFkc>hFT8ceaXn-1tyVAZltLXb@00LFY~HS3{+RZ^2iD64`u8*5ZEy%w=o2xI_0qVR z@768XVN9FQc@~GD=C`pgV((qR_xzJ0!!=Ix2S=ghNZ zUgWX6iq3gF`_Ak7U!cu;Xt!#f!?qD<>ppz@ zCb2292V?48W4$b5(*QpUH7{FeGpF=xVh7G^P28ftF|b}brsp_8+b^K4U<}OAH$}e~ zeje&xPC*|{hq`7g%gFU{sFywHZFil)qg+uKCd- zf3046hU-8Ec#c+}+h79>f@!b-en^|XSz`Vi<6AGy%Pi3E1$2$jCS>cSHK%4^`afI)sZyWF&y@NjPSD&V!1L$0j`KE7j$gjY!VQ;;xK+QFMZOrDO zAB0*j6RgcxHN>HQJrLpH2M`}{k6(` zwR$;A`)TyToUqTQu(8%$hWD&*f|rrgJ8<4g^sDz}tzK@#zy7}5jr|}x>%$~81#0!u zdFDX|G=o~bbpJn~pY^HszWmL4={eM2+FCn22isr+3#P^6fJA};#pvHU~>;oy}H=%ohYjuy+_a*NJ=P>v4aoD5l%p#uy-n-k# zoAAbP1M2qYY4%D-l0Qz|a7=LTlC|G1ZV))D)@0%qcHrp&dk0QYhj zyOZc^d3h6g1JvHJci~;%dx2~59k4qc&cQL-^j8z`9{D*i&%^-uCbIr_-~Gr**7g2$ zs571+^{y!e`hfnp4BD|X-%g;*BAb`ia`V!DTj(6mTC6``+ktU6KlDQ*cnP?6eRLam zrd*TbO(NIw(wedyhj)^BIfrbW>P7buJe&SiUgpr(^3wBDK-SmJTaT^ZC4R61JrB)sxGVL~N%XDAGmPQ;uZV137zcgz zG&TjOxzzwQj(dRl-c$JGiGsumtqaICK&eK@N{o&>UbGo-adxTygvhP&L|H-^ER*fqtvNHMRoZ?hi|$zhi#}xeI-Qahj2*K@X_VrwEL5 zk$U-$&;jfQX|om$L-zo4Bi9|i58RtRo{U2-c?Na?=gFaSOxLI{CXkIwA_`~4GxQ|# zC1_nK_*TE!_ZTov5jeC1*XCPoE)MZXqF;uuXAJK_eRdJ}U8RrQx9^oI;F@1EA7zHi;*Y#e-W65S?!TAOG(`JN@H{%}`aJv;I19#rd(G3=ocb{BlRIs$@j%S{!2Y+vBea`q z7eMlS_+7|7&mijub4*`5_EE3~w5^YW->o$x$i}h}-6+V=$2&y3yC9EE5_*U>*YW^V zz$LH}hnW2kd+!|Imp$knfMlBeLiM%#SqH7iz6)GqX9<4+_oF-o9e^g#xxZO33iPW! z+E1J91;)!EZ$jOd^*#no>2Mal2Je02+d#j%##_)V)IR2jF`Piw##ouZ=7D$iCG^hg z9?Rex=&UcUN#86n#xZznhI=tjth?G<_dL^nUl*g0m-h92b2$z*aR_R??9q-szNw6} zcjk9Z^a=mJ!dzNH$VluCaC+e4w%ov ze!J4)t^SZU<6%C02>o-wzb$0@Sk#|MX)H zIRoAVwfChlGM;5%US^T=@a?6LFD>ZI%Ms{zp=H{y(smT+qeWm|?xXD*w04&2;V%Py z@&;Tp^ADk01FpmGk}Ucy zcw@0Z`&oGX;=I?5e-W*FbKIc6pf zZ~D8)H$f+O37cntdvo78U>B&9RHn{k^aCZ9BHtKz%y&$Etd-tMiOlchAD#DDi%P zI$jni`)+cr^YHtCc|8JrZ+M40hxswL(-xsW5Cs_0j9weaI9NU*ZKqI{3GC< zdK&#DaG18+V1fRN;0AmKSbrSX7`cyi`gg$>qYztjU7y$TQa>;6e2*K`KIAgvjY5s# zTl4ZLat4@Nx1svx0n~ZikG}0>{$})-z|-lFmye;FLH7M;j-{|IfD@n$7Qhnd0q$=P z(0At4cuamUP9wTicynwTx(m7=T^i~h&4rWbjfZ*JMw_yKe(QK|8q+-bPEgCsMR@Zv zi)|9VmY2?HURu*4^yZ~`a2Ng!_-*FQ1NUGI--G>G+UL;K@={-zQ_hzKH^7_Vt$DeM zJOa!=>v{#4m$T@af%DJB;l5czegK~WGuU~~bMWSzzC8e4My@cH`cufWU=0*OYaGsk zXFi8K1RP5r|7KoB*woQ}gf?T*19dI>*8K3j@qI7|oZI!kI~~4x#<1<8Z#{6XB=T)| zWAG5(e5pVk(?9)VTzjGRn*y%+EP444=)2#fn&gC91L(c%ugMOHaL+u|%cLIJB z`e-`bAD@GIK3$uBcdl`u@A{F=UHz}$tg~783*Zp&ed3wUz?)a2ahSirUfkPr>G1Y4 zSN0;W0oOhZ64+dV3di-Yy%cJ-Yw+7>8d_%?!pyF zp4l$+dHQsr(~qu4=&KE|0)C0UBM!NjkHT6;&@Vb4@*upiug({TyU;qMKW?Gl1RWrY z>>XR~4!Ki@Z4x<$Y&@(l$H6%8oG*imz}PsKbC{RrOp!I`;_&X(ejeUjGv7Z9%rWbw zbNM#&{T^XsUJlWw?G!Wx^*6v?c;`C^d~Z01x(GTPhg?Xo*9e{Ku%<3Dw(BVa?Tl|;^~Yh~ z=Bqw-&c|rqfbQN|M-%jOU<=*n)nWT2)c)$sg)T4?hZ=0|P6GFyXWsglHu`*mKKj%- zj)Emn7YBct-xc87Itz7gIq*}^5ALFKT+dHW9PYOwV=K2Ie+e7oV!rFMd2}x!XQ4lY z8iR}I%itI|0`&V{+P(|Stu1T{#qfKKZwLGLrNh2H4*zA)42L*#hlDz}(QcejB|2jJ4;n$e8wj9aP_{*c^*PUGw|RGu?q)V9)NO7W=E{ z+;1;byB=U(nk(k9HEf;s+WhWoOdazXgCtb{nlr|-$T-cwy82aMob~C`>9E!;_BWCB zqvygHNBGP-VD5^q0o&ZCIei5*0OuG0)(Ynu1N!wV!0(pEIQXF{9rEo{=w1U0=+A-2 z(d%#bXFQEpKl&6peVk!V*XvzoU2X;X!!de+Z&7o|7?{t#J6eHxsZTe7{{I&6U3duD zbvoxqkTcL%q2}e!l;e<>jp%E6>G*kKq})n-jy0P5&S{)Zp))@Qp~KK6+Vsz5P!9@V zEapu|n{zu}5?n|3L3GANpS_+AZ+m@ufVK)Y75r+>IFIACfKFfzynwy)x`zboOUC$> zxht&Ce#TgznU~gyFF;+}Fm~44H-J9T=gu*T?P1Uip9R*B67qH6ey^c(O^2YK%X;WO zum?DPb1B#_Kv&S2-#-TC-e%tK`oO*DNBd^Mx6mih z=__Nfj4p-T6Nj<&br;yC&3A?Q`xt$4=vuHb_nhDRPCv|G_g>oF-&LSr=D|hKfZlP> zmBPDa5nI>l9?i==&^fRU+;0j@$MD$Qf_hGS(CPnL9nfdyqYc=II-?FDzh2(r3Cuor0S-mU?2KNp95 z)}M(eoMZRm`J2M#BG^Qpz^(+}2=#s})Bb2WelfAUcMpJx08_&m0rd*>Vm`Z!w(ekjoP9P*Pu zf0n^fV7?`3TLSK}GY)mdy-(8K1*+!?xlft)3j9O(W_jTLtTle09of+pv9VT~*Y5K^ zbOm|{xZfmDFP{O%U<4#UbUyfC4c@%8pT3=s!~Sn0dyY;)&!D>jT(@WXRq#=84q3kq zLHCq`zxG29f)RAinWbHyrQls}7QH&p>P2+UW1KsoGqm-B31I9hCEB5$OY7WEfxdK2 zt6-kCEuh~$FPrcQpx@p1RrqQSLOVdQ7;52h+FVZ=ooBZPUZ4Gvv4_$1!{36se(Re4 zF)t>NFM>hf`kW&LwYJqmA5DkfiQ17Hkf-C3w>ng`>^ z%TUjoxl*C;7`*elX7ln<#@9#Y*{h6y%yw+edG|B|%*$kHCodVpbE^Fob~)PJgYSxn zwqx-6c?d-CDduv2t?;j4lPFSO;Qbb<&~_ibjrMDxJ{@x0yqw+9S-YFCJ&Sz36ut-b z}|})VwS* z#sIVlc^Iniil7NzUmI7?qiyXV51hM}m)kow&UKWw4loU-K)Dq1!`%NqbM^t}c1@Q+ z0UP~k{LIT6@cqEEV;nBSyN_-9_rY(09P%bGE_=WlI0vo)YjQ6B^?Esu-tjYxF%7>D zxK{UJzY_F$`Z>=PkY~Tv%X;)>kW3S6`kId;$S>2DLf%3i1@_UW#;6NaXv;$Np*ggO zT#V?)ILSEVrF+{8Z+)D{&iCayc3sfp=m$U_7^ZCrs&8DQa2|bk6nMtXhqtSj6SSw& z;lE$XGWHO1N6g-VdG!V`e~hI$7%|RoVPB-Zh^|&It?90Hx%BJx@*eU!$bdC40usP+ z%JjbsKLfAq-pq|Au!;U5v<dnX3o&#u9|8-?yI{d&F3q3b|r-yCD7;LWc= z^y+Hw%iHL!SrK#}ZTistM~wRlb2OrNzCQ*dz%#Bd-<1wI>)iHj0MqDOk+aZzcR26n zOCvhJ1BRf3&3f zdt66XU`%uRI+&r~RrF6_Ux0o9S`XEylVE{%*Omi^foIk`?>nFwc?qI3t92=rq=0R0$k8P@08lGyaeq5c=ya{^sG@b2FY9;44V zvbpG(ew(=G9{Lp6-}`8P4B4|VhVCFZ0nUP6;JU}5j;VeO>RGUUxX)=Y0nDSlaX5pw zpvLeFI^WT&thFAh&uZ_>ZQ4#_=f0=F2J!586Wp@4R}^vhkvuk8=wvtt3y!F+FfW9bOPJ}eaP-5#hhKx zD_|OAkv-GaB=>R;-3q9WgI`;qw~;ro(|6~PH-T$eK=vDZ9$G{$GR`2>dE0@$9fz7P zoly6d1l4)5Z9{KO_-)3xh~9O#fqpO+hy0m_8oLTQbKAHM@!u2eq0g7W8T4!55N)@? z0&^~b8}J!mP4}&J8Q#3~9&qg)ztDo1+bMX_2y$_# z4fZQbE5>ijLVnPbkYZ}q1+dlp*D%U<{~ki%vRjK|>~ zA3}Eq{!OUamPxQWdJsQ36bdSmH2BF19NA;wR@^_@e008Ih!9_yX4IEwyd_yV+qTp!sl_m|fA>Um0s@9Qya-CF~&ZxZ<~yfJtP zZ@yfI_5#OjL%s+4fah%pIs*<X z--FL|hu_F%usMV5z1R$W2C5%D)9U9+_z0|`Gp=QzkIdyYXg_qCF^c&2IQ%-uqL;r7 zeU$a-pU*-Mp>s`(=#%i{z`X21wqA}wo!7h2eK*lQ1@(PWq@VfXK88R7xxikG-#gOb zjZy3l-xI|WXAJ!aFn3++MR2b~KmOXGIb_%1?_`ruzi$$ZlcQ|}%mVE_6Xy8=u+I3# zM*nOAsqY{CevtNoIPBY;HHUXG-WIwJ;JNdhTi3l0^i4BxO!?s*zObX8i&+nR2k>tO z*>l$jEkM1;Uu687wA*I^G}(5ZJ<#qN^yfCZ2Jmz2{~G)rFb2kJ1$_x9C&3c@FmR7a zXj3VS?;4GvzW#k^7Tayw=7GM{KSOc&-&&r7_blkg+vwJyp7~dSZ@h!(`ryZ)#(A9f zi|`rXomR~;=6e(Uadal^w3#co>gBh@d>^+_VeaN20!{}Z?_T708 z`T2CH^}g>t!#B}219RAzxZm5z`qKR^vM$H|2=<=K3j6}PhjBRXBgjKLu(nyleP62U z!^XQi0{U8iRHE>{H0QK+&Lcp-o(8E>h>3h7{0ZnZ)OaP}i}Y8{ffkUB$&Di8LVaHr z(HSS-1%fILj5SIh-_wK08O9l+Z5rM=+L05i;Tn7o zsKf3|Ddd6U9|!a3Q~0O}J`c1j(ys%Wpzj!TFa5I6{!(~%c0jEqj-R3LxO$LLABTG4 znARlcv0nn)?<4Cc{qpe! zT#SO>t!KW6{q|2_AE9?|iDGz1xex2tv*?VSZ!gpAF;;7zEdWK6RY^U>-Ebp=K|h5A}N( zT_p;?L(MUsxwDM!6eytAH?47~Rm@oRgE4GC=N|tUWP#rl>YCEwo5Fpzm4aVWjM0Z| z3>>c+st>faUUosh2W>~EFUO&yz%`uZ9{(qFw$~%;^CV-~=K1sACcN8Ep#LKLhd?tZ zu=Xd=7qPQ`Y(ZUz^UlTO4|orDOX!So4*d{1=XRYZfpc0bJiG5q2Ok`Se;u8*V=@l4 z>lnJ1ke&M^I^%Ky-4uKs^xf$&kK>z{DRkCRsb~U+fpaT=3Y#%74IhEc7#rj^U~HaA z2S1qa&ST7y&<6Aob6e}&=T(r$4};LB&}m<0UdM9H`p5jR|81yy_Dr+`?>2L$Jq~qO zKkMIqWY2?ls=rsb)-Ql-=$FAdm@kF5<{tPF_;b)XsJ=_VCs@-MdKSVSM|b z51_8!``=i)Z}0Jo=x%@(FafNk%g|L|z3c_IV*JKsArI z4LEKA-6+&~N6>wcvCGhJLyN3;9sMwv1ZM#I@&6}9^_^f{cdlH}SM$=``eHiVBc65F zTCFA6x<=KmgO-uhM#b-o6$0Q5`58d|Z*0rO%Sq~ee}*56~u z_mNwGciUm)Vfb;Vxfi1=F!p8SBf$LcMsF^8j?GK=y^prJIJB4G-J||CC#{M4;tKNC z4mEE+4~qC9$5_qj5YJc8Jp-=CRAkzyvrB?!_TDpH8!0?32*D=!QTe?F;CnZOE6P z=0_50zF42FF*j-ZJ~V}H4QMCt93&RYS_;rQA%#9_?G;r+%lC+?$rZ#v|Z=S%wp z{oaLc8S42kFF%TGO)@V(0Bxpi3%zsI0qG2I-hN;Xn3v|z5#%LoUqd!8ts%S8;kO^p zMuGN16n>jXqc<;Su-A|7!MuvmSD@BB$E@Y$fjG=*T<-&YWLpYk;2on8_-*z&(BGMu zJr={heREnvt(jj=hgxYZ=mPp_5UP)UOq=;>UN4ryxaOUE(-+3Tz4gG`Zw_jHJOTgK zyfg>(kv{GN^|Y@*w}E*%45q+wFhbinv?JzBFur-Y1)l{?=-q1)+Jt-uYJ98}&TIb@ z=nMFD0Dc`fr}nN{zh=P@=#PmNRG%2fNzl&NS;or1yJpXTV_%N(Ewq8ToM!{M9qPTT zpUsaC!56T37HTcIjs6PyLs0iO4_x~(XfLpSa7L=%V)FX=NF3T)Y=<9%PSa-Ym!huI(853Vahf zYs)fnginptGb@J%uS4DM8qmK(U@8vzl4a~cWY^)mBj^{I*S)Qv zD}Whn)`9ykL;Wj8A&0iHUqb&n_OF3&0M|Z*{w^p0`xdbGT&6&!6xNl1zXh+aoY#4_ zL5}{N=v-$j`peK6@OO;eg**;#4mCktpW|nc)w^c>zYvFb)a;yR16>NbhKwlDD)`OV=V{kRd*Ks|H34V@gIa7eQrj_F0cXQR4 z^rCk^i}0OL?NrmnLu`4l!7Op8|8hH4es% z$2$9cf9tBkE* ziV=Q+e}G=U{1Nv1O5t~t1>`LHEnqHgVpqU^4}1^UE`{^24{Lepyh&h=9fj(X1W@Oi ztx@}#!+pA!y})&*pvK-@Q-2P)7uUK3wbtB#I!^?&_3mwgKNW|1vyM##*?lh2J^?)h z`q7zxzPV3A3&3+zh(jGQSK2{8axZP#ufx|v%`^R=jlOiPzMXQ&`o_F;Z$01&NTJV{ z!hSlS5jyLOu{@;=v~@rB+k@;JS>z7n>pMDqnxx+wAb~Csg>x;vhJ2(Ha(5ki2DuMf zhGrS7O&%11@1PZV^c&Ct;99mAzrtA4(EaFEfq8x~X0CMb`6N2?HGy4%aaw6BV&h$0 zIUnZKUpK%!Fc!x^3XH~dgSLYtm;t$%oCgKQsO9B7^!L$uwmjd}ykxopbMB?B5xr|0 zVou*yUjgcxu=O0a!?)5Nu^!L2zV&@m2d(Ah0_{`C3C47d6Ci`V>vE62&(!7VKM)5W zc{aw-%>i?1hBfElT}wMC#yjs*^uATh%M3_h>z&;Qe+nDd{7gE0YkVGh8~r$X$2tH` zfDB_Chq}%rD1t>$W~_)dW73P<4A$VUL(Q2BJJk1AJ$m14IrLe0bKUQA{cXKWU~8_m z1MAZicqcabDC{>yzrmQk=!@ujpfl)pW1}D4kMHRU{8Lc#avMH@Z3AuoU5`UvT8moI zy@_n@UxGFvJBH^kd7gU-x)v^nV}y#?a}D2+YT<4ZVJz0vADq?VHfH zIQZ@z^qE1{R~b+N3t$nff>UwW<2=0oE-(UZ1J=tDZFS(SdFlGihnH!uki^!!d>nMZx1!ImS978n**$Hd({ERyr+{|mnz=WNtbco<4e0Yx^&7hS zzXNj{S$`yGuZJE1j_vu)!molpFdc_CTN3>)=F?wS(X~KFkd4DWWY@if%?0Em$eU2> zmodme>y*I?y#AX*e+aq+3ar&w9H*@ZxfLwK`(3KtMP&0SgU(o+pXRIMS}$kd&3(sk z-s_-?Hut|5>hCY+KpxpW8iPIX?dXQ3=saWomgD@-!<(bV;B&xO=J8!MAJDgBW8M|v z&3W7JB3nOB!k+?t;08MN&NYslf_8y2^SNjJ^)mf4=*|K6q`z0u-%u?`gblw|hp##te+YR*YOW&LVtiSsIr`>kz zV|CByt!KWajLCsC>xvm0oi)<;Rtx-Tbk3u%%$Hnus9n!uZ+zYZHqk$%y$3jc1lv)(xT8<6etN%~nw{KlHYeht00uDKg~_piU! zp|$VvIqY4_2B?4;(1wlQ7#Zvw!x)+io)vR`raO$^nGU(751#^iAJ z%mw{c`yRgnKL~n&^BaSYW8VvJ?98>(@K3+C6?X4*mQ_Yog6_V$OXa&D_Yw`5tr~{eEa3IDbA0wQm&O z`Hh|X&cnOcV{urEKHdxOclgYXT?Fk#=YGC`-aezq{^sPn$Xf2b(of$m;68i72rw44 zzY6_^;&3kV#jv&vy6Tzg4sS^NnCIq`u`gjCMIoonQGKTG{!hBz2R6>Ey!W4Fy}M>H z%K!!p7#P3}W-%}=1`IXj^*dfL)D%NqFyLOMKit-U3j>(q7Wdw%@pWC}h9S7Y&2@99 zxxTsnMOI`*(aMUV=-rWJS&ljkWUZ{oilWGhqSf#7nPZnNzgtURJ%7$~ z&Uw!BJm)#Dz00CM4ban2|1My^Y(#DYXFvyfb21C^z?d43D*JlBQc(SO&P6aC6DLq+ zuU%!Z1?(xkahSIR?|oW@de$`hTTu5I0p6=u;m1xK><5v}uWKDaUqaso4*TU@^fSn_ z&~wnO7l_G0zcjb|=vMJH$DR$qzhfyE(BB8%5o21$XV>lnFIU1{n1b5JmeB1(^U&`y zKZUJ#U>TkFr3}u}FaHJIpMeP3c$xD@Q15mlRlW^5JPZN_?#d!a|sT?NO$F7mVJ+u?n8E+db_r=d5Y z=3*FXztj)o*$Nehe$BueTl>;~1rhv`+vg?_v9(eun3`J-|j+iBU$3XXx z6A%&8c6q4x!+jrzo=2zs6{!7i3(Nxh;x~c0ei7ODtpR(uwk!COu*ch(YcIKq&Ul;e z^T54V(A|Td1lB+wv=g1*)-CY4!;5V7|*iS8oY7z>}7P5(3gPccpq~e|4aAA z)^nP}vtS9FqVE2Iv9E(htqVP@bK8O4E!oQtyd%E@E znT^{c^gSSf_iXH0JEw2BwfiZMiNl@p&9d(rEBzPNwCj043&?3;F3rDv#@aP*)~|NW z@O$VRpmjj1&z^Y&A3Vp8f$y2?SO@-IY2Wc~-;OyR@V@Bl82lvEbJ-{6-4ppVFuyVS zBJubHW5&*Nml!)9huXLXe*-x7UdEmS{@g^@4*Wj(EU;(w#tg*#H`sHbcbWt5_$qqu z%j?kV+mq<>&;n~VLE9?7dB+d;^Smv<99VbV@OxkaB*1svJo~m;w-t2bAO+0jQ|LCJ zyFg!u!4z=a5yt)=w8Wg9^^MIQygoHD?wv|QyOGVWZ=G+B>n(vSddIBsdFU28YtP@y zF2gTVm;cBdbL*b&Jp!MBma#LI`nn3-$1#1j$M}6`T^2zKyG~?%x)6uI6IGMY8}-3& zj3MYSn68BHy^m{;Y@E#RGQ4|PC(1L(J;?oF75)))8hsRnSadPJ9=-KoevHYx;hp1N z`eG0CpPkOZcY+Lh>&88dHz0b&8HZ|<@2=Wl_pfiHu7bWJ(#3ecxE=9-TzXhwbl8+(fTSTFjfow1vRmXM3AzW}X5J?BZ_ zo3;{%dtiQCProP7m5>YY8^ApGqpO1&n`=<_sl9tp?X)Sy;my4UHGam|-*1&mtlf{! zJEvdkP~%s{pE>9jSdED<>!+cP9Rp|KccIQV$9>QNbP@CcvUx5b+b?^NjYR~t1|LHE zx+3k^Wqivy2j7N)3&sY3 zKGgh8LOq#-kAUO3@a^C`XV3SoE@Eqbyo1L79_#F}pEYsRA{W#;s+S)7P%OLy-;CYOp zci{~3tFc>!?j6AR>)$&;LX17DzP$(8cRU6IF+Q``$8&rNBI}pGTg;=M1gF4Uh5Cig z0Ov15i%|2Gf!E)Y$kU)1SQ8&&%vc?PE<#@huYqp{=G3|@VdpvY)A*Vfb9Eo+YY#9V z-Xr5@4D@#ixf}ih{2It3dxi>p6YzV@ZwBx7awWv36a6%@{yoN+^E<#4xDGty&(L3w zgMA9y_AQOlA?(2Tm|2DcT^e>Pbq23c~$Zv%@Xc=42uif*E8^blQ z1vcW)qwJm5zy(l-PXXg?EDB%=-ugBs#@Krip^Kn7ISc)03poLs=r&#m_1w$YY2e=0z!ca5M?rT?Zm{!w{?2A@ zJx?0_Hq`reAIMjUWi}2yq7Hc+v;$+Vy?Y<_%N_Kd+4D3z#vcA8QRv6}=vJ^FX1||+ zuK@iXLw_HG}3hTIUAJqCw=R#kwZ|tCdguWZBz>h#h0ycns&a?Y{ z<@k%}jI(?1Bj1ce{*EBKULHAxt>-Wo#?(7?2iZ8-kDB3KuO3qqEQQSjM2@iuI%orO5qU57so=9yPw zybqd6Ld}e#zXz-f`?K{HvDPuxd=A;)8N~DGZ-8ge_dva)d8je7<~*x+<~(#8Gy-$1 zf9AmW^}w6E7U(pvhrI(F_RCFl4?qfNd-!{gcfx)-1jd1J{5JE9p?eot-`L!T9|G=e z9W_CFk@uhpatfG-Gw6K(jzasPnXb^APBXR$>>c`d7FhRf&^$1cBkfv-jj% zIqq{D-p@_OcR?$7Eqc%WI8@y-C^9z>bzSRX3+lNYGcIk=bHExo7IS~0_VhmNw&9Nh z-%I~SV4lmYXP%pKp&mbq?hnBEIK16<}CFRnp%fOXjeUW&s#?qke4Na3$F*v;4~V-?{3)>;DJ z49u}{HJ|I15RZ2BCFByez3B9*3UBT0!Y|P;OU$`~-BIKb;Qkrle%htu(A(&7?XMdSw18{>Ny`|>l5 z?Ecn@XBm`wA$ccfWb)%gENHK1_ltu)iLUgMAj>yCN;J z-v;Y=CgWtCEu(LU!#kdV?jq~k7OzSgw%wY;FWhR%QuUi09ykfA>{DiK?_oFa zUfrosOW5r|%OFDUPa58O9frF9G2lH;z)|Ln#^Eg1`4W5)y>Tiax5BRiW2~>v)z0_o zC3xdxF6}{$@E7CochgSj4*DMG?=UtDwSSIOLQUxF2`~W6ODPV&tCkadM{Y;%W~>A* z!Q0ac%wIw_#$Cwu=ZG-u|cb`Iz@>=&Va^K3w8kgb6WKt8P=+5lbzbHEsRPpYij z6Nh}Rs7H3KMqsR5XA2}z_=d^G;jVmvHGL1s#q<57Tl?R4z&C+8cfNJ`1n6K+TP5Tp&D?I}=dd~a z-EN1m1<-@uJXu?-%D}zap;d4m9A}WeFO8XOXH;v z{{`6?ug2lK_IGk2#(T(~dl)*(_#9XScfc?(?;FgYgo}l3zJ^CCpLLP#*F5i#~{r?WK{#^xG;9hy)TU?Do4(6G+7^CkBI{kBR>&vxwkv;D= zF|k<-ZPjG6i4cf{g9=eT!_eGU1&paor-i0s~X7`N{{2Hun7e2n$LpFr<<{dtH^ z-fi)J>S~OpwEMsfw3^(*_bib@5qIJ zHX0r1=h07q3g`j81Ln28623u;&`xycp~f@C8lLwi*ukd{G1iCvPoQ_8#>;QncYqH7 z>#`5KUB>pI-3K-s(1+kA7y_f<3>e1#onR^sF@1fG-VHwl8X30^o1opu_ODHNze}ta z=P#kxH*;isTsvWoxC>tfbIco#!*~Y0=g=>C?}}$$2c4id4t1C5`pxgsu9?F2i>#wh ztJruSyf4;HBeMAzg<7YVuvq|4Xal_n^m7KPk7aBU=2}}l$jx9a4*F@ve7meK>!2Qe z?fxR?;jPOm`~ZBhEBp=S5%!+nwWJ@#rpWr6@Eh2EG{+o$jl(-wLT7JuzW1#Ftpa0lmn3$O(KJ>N$*`cYT(z zerN}}72w%=zz8r#YanLae2&BWEnw}KcYBC+oyxHX{IkG2=9&K%o$>RXxCea;)S8)( zLwxiN))b*{047_ob3fDaWtdU;eckvHEgv~m#{c;!DhHf8fzdsR&8gw6XW)JxSdi{JH zs^8|nNWP4P_51tS>7VB|zrLNu(U>G)A|^M?ufmrT>J4hVZv*Smzh4f-?7^DN%rz&z z(e~G`AYW$eRnXJeKZKtF=H|QT3hb-@8D#6h{f>hMU`^OBjg>iEhdu;P!`m+o`{gD& z>&7@ufY%<_>c3~TW?qW<24FqcnML-#E+I$o7a3avdE^ZG3Vb)Pj`onXb$$ImhJF_4 zpK-{58PEn^23Pny(a)LJ5eL0F%A+@r_L2g!cY6c59kj;b-n*}UyU!3vVRP6opU1{K z{El3>3m<^m%SX|VVOs*X!SmoeI10+-;zg)BYoNsXoy_Y+&Vuzg)J%~vzYj`K-?)18 z=FM2-;q901I|%xO5f0Bqhg-sn}-k)!SuY)gxdUS{VvK_v)621w1gY@w-a+!6Sq1KDN#`-8Sb_%%- z*w?&U-Oyoh=HTBa`U-aX?A$ctBXRhal)nOh7U;u!4v@mn`drwD+Wz;q*ZXI`IgY)3 z!x%qe-2GPI2cR?HHux;#zH6yC^sFl5TV2dY_b!lye^V~prz6PPE@7KSzs7vO1-Ie- z<~Fz9LF>{pSV#5HI?w>za|qP(flUu+LAEYZ*tW!>A8)|h=k}oX>;=Yszg_2P^uFU| z#;zh?2DO?({~BO!w_gZ%6yYw#C=wdfff^Zhq2x3d(w`k*Tzb)4_ttj?-K*h!`>gBQJwksU zc&2XXljt{~=GT5X1d3o8cwa`K@6UyLN<;6X8v^zK>(JOXAt%rsU`(ZF!KpZ$vj9H` zug|XA4_1Nk{TcfY$E*b(F?Rue6u!vX%6;(XK_1zC9)S#c>*po(H;}VXe@D|7>%;dx zih_-`vyJ{5dV7lJ@lJ07?{EbA&@aXz4k_eSPtU5skNf71!Uvj ziQNdb__ZPJZn361U$QURGJ6%U>Z4LeiX9@u+Ke$o;$!c@-(nU zra(R>U!2eQdB1&+`ry;(UDtEm1ING#puKw)*~9p>fQ0$p9b@fVu#V1}@jI@JKaGrS zLH$XhP&51J^m7Dzzc2fNaT-Lw2g<;^P{#f^d@tCqFbAFY(t2@EzsvOLJJ33GgTVX_ zgHlW!y2Agy=bMaoqtlNJ`}jTb31A+2bKEK5cZl`&Hb6{@MRcCU_#1;V^X^0EW6q6@ z{nGe94jn^ZK%a#UL7Txtc>6~u*k*1Uvfn(t;Nzgo*|xBY(A%foyAydFTt+tuZGir9 zF37{k)@25r_0|Fv&A>bj#vwL-@B9?ZB6pxC2DRT)J>M?!J@opj-Bo03d=fgD3;FT; zQoEV<9;i=Rq+=3m`#$gzVb8@b2p!b)Tca7+c#7 z@E7AymmN^&X>08B$iv9SG5G z$V2efrDqs}cQ1brGA5o^xgS_>+MEXS%v+4vvkTi?cvs!S-uNlxd2HO@d*eO(JdpRt z`049?=Fh=5LG3%%l;6H<$i3)?z!vblA40zXodTCYD{#M6)-*oG@9F`)0sVc}vL89u zIah!`zS(Vz?<0GjO=u_R1{JUZO5g$TU08@i%=EDt-3(Y_UGLZwI^Xfj=yueDMUZFQ zxt_5cg;<(@|Nij<@OR*=U=Q6}bKGCh9*4T_W1jazA3ggLav5s9ETcQZyfNt4p#HR= z_iU%YAkg;?;5Y09v>j}*hP}YME$o*|aq!3f`!0}1z6spNp5mSH9Nxb)_U768siJ?x zcn|Q5{ZQYP`2*Qp@4=U`PZ&3^J;1zXkd3GLu>ZRD0P+U5Yv}C5)`)#%9r+kzFGHJw zu`Hc>Y5F?a0lj@=b61<_MjNO zZ__8SGj?x<8rS3K%)h=Z1O2-VwfEcSypxU_Pk;CB2A(a?8jZQoKYt&c*ki7H?1KnA zi7pTIUNu8Kr@2{y&Vwy*9;AUe$TAkeo6j-mb>LZj5A7L;-QfVX>#z~pgzOzkfmdN;y|`{4`Vzc0-m7ncZRQw@48WgS zzjVD3Z0f-g^zvow`ntj!W^Apki8$P;VifXQLAQghgxxgroO24~bs4)bwf4|pxqyc%!sjCE@6-jEC5Y(@NcE#sDs!+HId(3fj*s(2he z!<;NOzQKNLdKWJ+Zhx!Gg<7%ZJe%*H`!6x}9%ur!=8NoO@3P*%f$TeQfw2VrLQE~9 z-$mBfGPD)lQIJMIfbG}74?&gjI`n(ktbuuO4O|A+hq2znCJ!A2o@pEuSjTtVyP)6R z-B##4V@3EhyzBNrA3{^W@5?gyV-Vq|KHfyX4D`c$cM84*cpr<{^i@J#wj-OT=aF3} zN|*z0US^@6g-${L8S2^0ojK@5_idMy$+r8*3s=iJ;NAS!8hZc z!QT3N8J#{#N8@mZ^6=IbxvKs5v)>B;Q(*n9V%raO-1l-HTi=HN2LE=Du!ePL{=E+c z_=NKs59gnTdfrCHQrP4fZ$X!Wo`Co(% zV)F>zbMCSBi_i^l91LRL1~qmAP`?36F@As!WczwM=Pg3*eLn~K^c=JS{3Wm+dqF*O zBG!L*jyxiplP1I;4k?1LM?d*FUqsP*I>oQ}htz5{(8=u2}Y)KEWk2-)+P2lsyo z_>S1ym*I`~7XF#!I7w`_Lh%`xe>fJaP%S2PD{gPrd|BqyHH6r=SJc%dBtn7b@^%dUjpyPXP{MV z{~GEUt;QKehj_h@T-FYu^Iv zG7mL}_)`1tn%l2l5C1H%Uv46sN6&l}w1RD9Yx5?sUmKf*eEt~w{|P#fjbDf3@b-ud zauJ&w@ZG>VvtRjrXWSCTtq1$0evdGwpJVXGS{SE!(23nD`b<}-fpPdH*GHa!UkCfh zEpf<0!oE$++d+R0q_F!(;EGl1%3^-7%u|fZQu9H@U?w; z2egr&LU$%6=E(Z@r_i_LLQT1cdGEny5F7KT@5kVs_fF*30c++>pc5DabL8(J)>8>P z^P7r7&bxBqZ?!9|y@LK0n2tjZy)!%L?Oi4Ki21L^{@w6R=#0q(RG-d6y#vO=IFAAM zu2c^G*%j2j8?kSRHOs&l_=cQE-yerN?tZ(-L*N8xNB;;q0R0iR-vE=q@iy={{AuW8 zQ14nE{%9O}#0vfz?^aM`U+<6m9@eG%EP%71nK5gq8QxgDm$j z6a^oA&SLM|Hw_k8V+1(=HhSxlx1)AXe4`88S9{U_g8m!SnplQE3bkL_C;tbS1%Czp z865VNan`c-{v4fmrXKnl;2n5hF5KI0zPDzOPhsb~Z!TJ5>JE6H^zCW%_KGvWJ(qyB z_ABsHe4$4d7vasl-x$6#*I3Vb_g*it#O}_Oy94)Bi5yRT>z}lck75^1@C(X&-n|p3_rbdS5~#$S1-yr`UjcJk1ViZDdkOn`sB0wPBaFQn{1@PR{BuBl zih_96YJfT{T7x~{U*N4>VpWUh$Dn@)rdjJeP(Krg``iGZ2KutizP;2XbyfTOg1%dq zeh;)_e-?PA=doe^f4>*jp!dnxPN4q>sJZ?OFh@@V>azCFN$vUO=2>*+Efs}*=b7Ju zY+rOA>v9&#UbVl|q@W4l9#}`Uf0y-lvH2mqcf)*s3Rvs!LuV{5Rl?sVy5Y^|m!bAG z??&c@kO%6rR_j^DtxMPVkmH=Qif?J`9)$DS1N?8A)XwoqY)XK<*8Y9(QRpPH?}+vP zH$Y$PSAPV35~Nwv{j1vU ze&)csv~I>KAG_(sr#{1Rj5upb4!S$p6JW4-7%90S(wRq}3J_L#3)yyJ85-t(i-GmK4x%U}dt1f5_W7`HyC^Yyg= z^uHIn47~5IRc77m$o*glRMEW-JMXIX)Ct}Wj-%fK!@zy6f+g@IW7!u%d>4`R$NdxL z_r|Ofg*QX{UErK6pe_#iG(Ih$m38zX2mKzPHfwLY{d5x8vp$pyeYTmgY2+ejcn;ni zy@@g7c@cdRNP{}$E#SKQz}V9q9C{%vt83O<)D2@V|&oACAQ#U+(h+ z^H-6*-`*w9a1R(ybLaezLf4^VU>2x<2)zxK!J&WN%O&>ky{w&!o;!uk_*q};P|y5K zj{1RiAX_(EP~U6w>Kb*>J5YLH?eG5`@Xqgr{vOm`z5s8%L^1wD)ma-|x$u5km*#W; z-5G2)pw^}PoI*Aq1JDWR186;HV%&PN_mz;l88hY;@FsL^Ac3C*)}?djfpKuI9 z14iQTJ>a*~HnP6=f$QjvpYg4Sy5=qP=HxOs0nQ;CgWFJZnL(%jc`yiCK?{iRwGSAR ztH^i39(Wb<3i}#^sW^OV8q0RZjQjV%&ww>&98Q55>^_+LORBOdKx}~YC9PdS7-GW1%ySx=LAJg<*A((;c=LJzYK=dY3-Qs$I=uo- z0qgQgCFEoVde|>LTPJYOTE8Txb?|jDcLjK_J=;lm`=vd|J9Y;fdz0rgudnQvo;#0z z9KCgEomiL0;q8|t=rUvau>}g?dC(24#cQA+SV#W7<Ric@aA2>Cc>FtZSaM&4VgB zeNylDlHUez0q(m6MuB%D14b*MZ=_lK9()N}LO+X5iurxeV)UE3+{MNk^Q`GOyKcR#qIYd$-+-I|&t-hF2l67+ewm6x zeoi7U0ME3-8IHl%ffe96B6LIWN8|8a;y(7v=aKCZ)@26%K1fBOE}ehaFP(cFybSyv zx(#(sJ+uN2d*vSclwxwg8s^pby&n4t)EvAfhs)45WP8RI)VuY{y1Y>d-!AsacK8yA zfW0B&EIsh&L1&E5>}PE_Ze5xKb8Fw|N4Jd4CiL^j?o&qILmq@qLLWdIfOY9T)b1Fv z>lt(BN}ok`8@Ue*fSc&O@8-ie>Z^4-hkg@G zfGqHg&P^(zzg&bCKnLgsbs&$gMexdgxr^R)tzmOB761SH7NbjC1#ZaWj5tY!2(vxg~H3c=p@CI<*G$FCB+{v+Q#e-W)cg?}fK6*P(BN zK9dV|*@3JdThPP0+^%q5be``B)HkFZ-hF$3Ij{zerTcY)0{i)6zwF9|`mw%TrysjB z=r^FRe8=x251^lbzOpVo%i%j7X#=daCt2%*paSolEieTe7DcJ8R87!2T5Yztv@dwY#zLcjQ;T<0EmnNA=9J=k`Fafo0(NId9Rwk<`T@ zPTr9nP-M*SnlyA2oCC!u^n#b*r{WMBdB2m+BYzd@IojYK0r#xkYk1$A4P@=dfIY4P z6*Hhe4sWJ+!gwX@-Hgt2%|VyIfA)^Qm9;h*Pk|PA<8Qvkq25#brTKpd9BW7R&gkD6 zP>6#M343)T$GPzLPT$d+$olO0^#7Ib_^VkbkKTRuq1K80avuJ((4$b}JPWRZ0x*s} zz`I!c4uBeu2`~Ws?r4WPZ;Aa&ajMq$t|Rw@Jg{H-j=P_AZjUuK$I)K_MNqDU@0s(^ z#~Dk#5b7;qj`dTH(1C#i{*`q(UkQ0J{^oNW+5+s$`gr(`|2eYXP}ZgKePvzxd)PE{ z?18r#TVa3KGnTH^3)QDbP-}JudIj7Ep562Q1A6o58Rmg~()euy&u1JPV|;`rz&)#+ zDUF@`xZY?Seotu9E~38->cMM~Z=oLpd-!CYT7h)-fH&5I zU=1ABr9NcABsd1TW6Bp4SVLRK^wGc7+0VS=#?jau#qI;SkSo8nl#5-V4_Z?hWcMG1 znzLc3J#7_!2yB9OV9dtBamMT=$AR`|K?(Q9mp?CraC$kx02xZVV^zfZJ6 z#cOk+7W8L>ao4B^Bf#F^evR1c|319ux&SqwyTCrx8xxbRaHmco{|>fAbSL1whrTrl zbOw0?z2`oxOZUoxIC?q1J{qaT;6%4e>!Qf!8jNeG%$D`sBSyvrh(nH@xq3 z3K-L~aoGP3)I3_3#@YBCMb`v1*6wv5xVN+u=)*V|0G{~{I1dt#jl-O2c)wq)%j^Lj zF=kzsqY!&-?twg-&vM$?l;mqFU5_65!b?mK!I>y}JGnYVr9AapUU0c6ge+!K9j{k}^ z9>ULo5?BGV;6-o_41#nV>~F)r8~ZZ*_)|q*02dioZ+*4G+e_?G`s02*!1#=SQQ&^w z={JM>@ZQG+dIIbM>oSVjvnzau8jB;?+6Rxqx97s|O_SKnAXgLChd->#I&_{l$~@5*^4_p?zQ*xZg6cE`KK%-l`Vl0$2yVF?W=8SJ>Y<#&Z#To4Wit zbNsu7b(w$}Y@cO~4CCJAF=X?nZ!3)ZJAr2(0lgrLP9Lp=bmn*>Y7Gl=N-gmqa-n#VnjWOtO1s!}9x{6H(x&Y?mu%~&v z46IS>(!ZIE!taB6Fa(U1XFd!1K~o&w;X!!caqF@gh1#rV%(|?ymvPJk-yLJKz}Oz} z&Um*+z#e*I-3oSr`Dg>@fpgb@b$Jb{T^39N?^atJ>M{k@mpZTvzK{JlIP906dj^{i z(4B76kG&l zY^?w1;j2;jZa2T`jL|n(&)DdXf9p+QGXS4qyaX+R;Y#Ss_JCb@ZLRBia0P4v-^dK> zOvWK@P3Sy_J|yU^W9!hhtzCbI&7-%zyc@mHhhP;Lk8Nx`uY2}GtxLZH7U7qH_S4Wb zx&f%Zd;lBwJOw(CtBg560{WK)x6l_kqj_J0kK)jK`xxthPlI0c=KdP+_Z+`^J*R*W85aXOe_FX3sXicc3fy(-4zW z(1@%*Eg*%h@iRWIaUI=Va4W`Nu!r9M6Gg#J+jjI@(C=dZQ}9L5gKh=PfN9WPL1vyY z7zN9q9$1Igi+A)Sa)eC@_`U7))KriTN)BbLn1_*jSh5paK%sXonWDDOQ57p2NBo zfxjbHS;M+?JOeN6{r-4I&ZDnF+pst0r-Ad!mC$=OpfjKXjMWL~>zMDkC&3`tL;oIh zZSbyV9v9+pjw6{n~lf(Vc_wEvV~Uii3~dRre`@S&&4b-xpZt z_n3cJmwU*iIMko(6|sxZ)uStbW-x;NPe31tkmtY<7z0s-xy;jl*Y3jRjo>Z0kb~#3 zX$Quw8{2)L@6H$Qx4NJMP)knMZ5Nm_+dF-~{mZapT<&UxW_EcFLg5I-z9}ED$7xvK^*BR{my{8f0cYF%jwY}qy(7ll{{YlVw0BbFS zYz*`<1y)`Nxx0MujvIp^^wx(|->r{4>&`umt237V;i1~>aUn63IE`fiFH8!BeyCE0qGK+i_ z`3lq+T9@6()}{INo7%eEVa+M@8Bpt&__hXbJr2epXI1v+ILp{!UEV`)zK!{D z#+_&W(!jc`#RtmoJ+=R4zrP>sW9we-Z(TOQza9Mqa*_F;fj2L2X3Tn7MLz<~u#Y(y zV$8nf+8xm60KZQae+_+zZUy)w-w&*lR21@Q42|s_;GX($_>TLYJ&!yE-NBDm_Rt0C3s`p4*Ywt_rkqf!G|4>!{6_p%7uH|f?Vsx zQ0v9>>z8$DjXVpiOKr^U$D!7x_2D=0H2cn>?}K{YUJ&QPzuPu{VDERrN*sJX?3X8z zr_m2WC$M_}bsf($0{tSigzk5tzO~lrw}5dt$GAE6TsJ_G7?(L`75X{!_FVIP60`v8 zS-XBP2yVooE{jR{cKRyge+#VPO)v#6RKnjmJfrz>uHSK^&^eF?+u$g0pToMm3-9k` z#_L6R>#`XCreD_L!`S!0N$?r4kDY5+6Ccclerb(Z&jsddRD z2cB75V|iGYe}-(1*sJ#MKblA5ZavGJPisGWux}swEV8*aR+r-N@2l76ep8p`-F|sk zmk+SDF7@rOF3p?YrJnO6z?wI9C2Wl8BQOo@$<}2zw217R<^C)2f2_+g^1m{chiYeC zZa}>Y4ba27{4(;Fz!$)G0ezr$PS0wc+{E@0SO)u?*>9mw1LfK`71VrLBmKZw-i$+C zMoIX06u&|&OW4ezHx6UKJKhhR>$j&dab4qi_$CgaYXsh_SJtID^Zpta>vAFvb?I8Y z=yK5SvFBl3y7qB!SeI#dW9$8B1oNN;G=STc@CLQRr{D#?*8Ux9*PR2u1jo?*3v`c| zEMoH{{I|g@d>Ws6pab$TYw% zbQ}9B7*UVTG5eY^{XEDZ_W;*#%7xmkN1sJbus;W_2cF6E>%X{9I=z7t4?uM9otfkNPA@#;h-nVc9z4^^zQ-ZfHd!S{|0gRV- z?}zBw+y8B#|2u|SuQ0w(!+!^CSI8-H7FeUMmx52>OCxJ!88_zE#vmv$?p?K(l&#Au z^obm`4Q&CPz;n}!YX1(5Z`)`k^aShD-e}$RvDOy)gtf+?W%f+R;d|AyM%Z{~RxXI>&!!kvA3Vu-y4yQv$pTdQ6rUue-?sV1^(V+kC|q!^-@CD35;PA zvhQjqa1Z;@W7y+g?eCX)>;@Stqc1?G4|(Q}!mojTU~j$yt%p9z{M+!pL+i*NK(_W= zt09Na#PD_Kjv{*(+_#|;-l#KB=SnYt2rPnmu!@~O$Kp`)=4%b!JLuik?^ox-d$NtZ z!}tZL`&yUA#r~B_LO<~x+hol>`guJo-<*g|{cWZkDkjV9dN{ViA4@5c^vFTl3cP2Jp`4r(^!OzOi=x zEI0u+kUih4a-ojj0Dla98T}nF2aKuvTm$PM9fxn$;tSy(44`X9HwL^*ez#plcMs&T zF;6EMTLC>_0kmRc53;{mm)``tmC$GF7`HaQm>#}xca72Y3cH!wdP z$WJmBL5>3;ZCU~XID&_7)J5jyv21SMp@4_<;= zljgJm-nuNa#s{Gp=AXm12r6I;Y#zw=$Sd&fV?Qxho^u%#&`Hh3ldSzAs5$hm&Z9T} z1?WDoE(egc9f$f2XI-i@KMSA(+5LLqvry-nuQF%vMCbk0W|ckk_Zm1GQ^UZzG>>I$ z_t7t)a~*3U4c^T7B-GrEL8mGqmY&nRTX$!nb3lKLg?D6|HCMpv8P}Kd=-uxOsG`4( zya#_1>;Ug(5A$Th<+aGw}U?JfCZqB z&2jiUL;;#$a|D|z=eFj40Dc1g1Z-jJoi1W$U7Ekz_c?MuIIK&1iS^P9BJ{;1`0+Sv zw4=*{aquEo1HLgGap+xT_BCe(^wKJ_xzlb3+7ySiis;Sv9rShJIQsub8Tw2v#J?Wi zy0nj2ml5+luX`t80~ibAw8EHqS_NhJGCq&RA(mt4PQzPkRrWQv@5-?rbP>Jh-eAsc zc3APi^cOmO%AG~K+0DjYZwr+TR8j0}%8nJeS?vuIDQ>{z$dld}Eq2{bh&vOcS z5B&*fFZ9Fc8{pppEkdo!ap)9d#_|eq|7Xz~gE>$E#v;YO-m@}jV7%{za3A{PaBgdM z7dzu{2E2&gTy{gPOW(-{=$nymfQvxC_3tJy=f`5=02Ri?vnTAU&-QBjVgo z57LaC0s2*dT9?+c-x&qqH<@*L9or&ndG0UdLO(mam-o==-##{X;jK%1XD57>IZepN zK|3&qTi_AAvH2x-LviSf*2gHiX;6YMbcNWRNA3qRakx|Gp-(dJ7COf^kzJ9syE;h!~Gp6C6 z#^xMjo~;dP?b~;J$L&|2fDS_28Owv)z;%qrY4};N4n~1*gSof<{6;^Dt`E5Xd>m?L z2ibb8VtWZ{3?4u)pl^XUx90UGy1Ve6Z2?>Z<~S1*SLif01?b>`ZVY{%eGmKP1N7e2 zI%t`(6_7g z*P%PuSJCUQzO8^oP-1KV_-?EBz21QOmVFj9=0acaZg@Z64JH`3R*aW^T!JQD;l3Y5 z@B8WZh-+>#W`2*MAAxQI)r?E5kDQxx6ShPd8 zq4kV;hpfv%be?H+z!(rVg94amc4V!S}lpxfq4I^jpsS-$1uh z3H4=Nj>A{cc~|yzIZ_L@HQEtL>6^XK{R1Mhen*u%zq-3V`dv|R-Dc71(iUEV=I3tEA; zkD&T#UG{=^=R!<=#Ml^cZ*x2jh)?mCjK2!~--9%|1Yi9gb)77-_2QlAgfBB@Opbzf zu!W!2z{~J!{ND3R?DBDlrFwH`eV5_$UE!SA)nYw~oi)$|Twgwg-8XWf&*h-4*nEhw zh<&Zo8DwkIzgg5{zYLbZ4R9J<06kz490&T4N{CO)S&-eU0&gxR;8W1M$ljYesP*8x zpWv&p?7-#;b*%APsQt_QIky$GJBGdc7SMZk_ee26g37-G8+|YrhrQUo)&u;${B|y! z!*4SCr}GL>`_J=nsHuec`acBjfTtMq-kpM<0SOod?&BKPnRjpcV9Z*dix~&E(X9g4 zsUYivKlc0gFlQEOzRHXlpNq&R!8Nb}((yqr!lrQ=7`bB6fHm+w6{|oS!z@B0qrlJtjDdwy)zZu#CjDh#c*m)l7au;+k7BObrtiyJ7 zU=&orI(7L^%xRCqH+7Nqz4IfCxqcOS0R9p%x1KKxpY96ZTki8F{bI~Mu*UcR$mh^O z{hqS6tyA|~0!83@Yrt4c0^g1VYCPquN%+0T*p7o!ai}%V@_yFpM9x9Aji8Q4?DMl+ zxL4Mt`Sm_nmp$<7!2Wjldru#HAM=M}>H?aI!kcj#{YRLy!g{OlSAhQb&0#N>FEHlW zJ>wF*wO9|d8HMUw2EAu10N*I5s$jb-vd-*cms^ zVC)}3)%#}H*Y6@X<>)6d{SW#)@*cPiB5*Vgy{QR)3K)-wee2>-Fq(12;f& z@OPqY9PU$suS@JP%Ge4t#k&3Q6|jfg6ouJw8}i+ zV&6&o+@qNJIeHq@y1Wmnpc9nhP?u@=i344k`Ss}a^ROSoLn4f@`;VZxO zj@u(g&`$wtCEpclcnx^~Ovd3YX@d71|AQQ1W&an^e-?QKdwsJGBldmeJN^{9dgd*I zC2;eA{%7y_(KvhyHDXtRx0lSrr=UN|h3~RD^uFU6e6=>MOV4PmygR@Bj<+y&_>OxA z^32P#hUZB!KZ2S^zk5^6?}gXza&*vlT^GCCakw)b&;~G63HRca?|3aQ=pDNQ^xt=U z5q<_FU=+BIwej2UI3xez9k&R-ixjAJ0|>*T4p_#*Di;^`7KG z6S`5*$KKXufpzbrFJfc;E-SXP6XSKcaE`Y??aA)z9%X2O{jAG1><_NjT= z+La4F?y;WzUft<9^sU-E9@XU9zqina{yew?Jh%O8ntA5y(4UXOe-U&8d$o1q?;FbI zYY=%7NQaQW3~K(wp&s^#g*iKpya*aWC$j7R1lwcuPLttI{ePqAPU{?>XFDc|I zv3ibi`%^blnSEU+#c!4`H; zGJY%$_B-gR31>(C2lTzrEObKQJ`%) z4mJ3NT=?%Z`|jLB?{`&|F>QO`tvmLs{d4aQ^yc;f)OcB!XW%~vP1wUb=)31U@5mBs zcs_aGdhL6WC&2))cUZ5-;rm$EINKjyL^ihiT7l*nE3*DLw$|}K0&ROhi81ZXqj%Rh zntx;Bx^uvqaQ%rmoX5H}_j}+3u!pq9;am}P476gif!^PHz775rd>r_GB@zDcd(8}X zE9_Md9Rwplz6JO`?f~;!*PCD*^iB zSzZmbhTi~QLT`?(h5vq_8;B3SFOkjlEMoM@IHP&Cj^7Mi-*ZoB&)N;}`rzHmFjfaO1`XgSV|Rf0XaVk_j|qM}K%NHP zm*+qX^k)h@58O-pG`6m>3m!xEu2ex0zn?_z1-`@jyM?W}Im!4W@QlX5db5 zp8Ft;{BCeqmv_;fi-|9=?yn$gXI=`Nt%SY`HGcN9FM$@c2% znoG}NEnAn?+gG61(6xdrXao9iSeM@ChsXtN9V>zlp__;1K?00jkv*&<&+fOI`6&{g zi%@%!V}o(1OZ#IQevq*ObQX-l9|fLw9W=xtF7CU9JOF;5dFF1Ou`06rco#a5+n}{O zguYDN{%>`uZVB5VFbu4nX6%=M`&*ZzKtJs1`ev@(vmWYM?K9?Zow3hAx6w60t^dQi z^lsQA($H7drFWo@c`1-*YzUYWbK%+k9vnx$2Bv`VF;>>$`+&Z#g3rNw-Yh)qU(LH2ytfxhfRt;+|{2<%~Z7wUVK0k5pfRqQrFiuKKtb8diq z7i-3$&aBH}@MU0KYX8c*^cx|APHZ#YUJ1FhUX1^Hz!YPD2DRS2Zx^8_z$vhH@ca1J z(A!I_*)smvpPcVoGl|YPd7s}4-T^$jcg=kk+g#t);O%oI&}8c4(M_mzFYLcymp~?&7Xl1vge-! zqrkQOoy>ElkoEl!;oE_|p^AJPJOWoh9Xj6&>&u>c9$Kr*DAc9%jq^6x!awVv6aGo4 z@zGE3kKZOoz+qkPqJJLfllOEMx)1a}0!bWV_C3bF4Xn#WbWi8VH^{)dwtb-trjgB4 z5$wWSFUH$`GzI-CbQqn!oP{odWq=R0f8O)Q=*#%uiq5y`Hq<(>M@_@0fOV>DE!~L2 zcXSnf1IY7xz!dsp=qJEk;CVBQdGn-AAM39L)|+9Ldu(Dq9Bu6_dk7`%7X9`s$HZ%ZH|m*&>o8Mo~? zd{bEy*3TZejIP99-c5adcyQi?x#pptao3oE_q$^V+J~1g@*8s@?#B2IvOURqwjVg(oTNbl^rHY8fHh_=^X%z*eaP#; z?-u)u`it$-NKJesQEvv%egq@%XnKi ztH}1OP3R~n1MhxoCHT++y?|~Os*n0AtV`?GeQzOq9_zt6oR8T9JO;0wF};OsJR_(! zOZZj?KMCB^x_k!chyA*v63(23dLN6R1N{$ye3g9*ap)`WL}&jT$b~oAvs%kBbP=08 zur3>*RiMAU&=hnZYA?4Q+_xX9k3-NrFz42QF)V`P$Tz?wFdw_X_s71~1MmFj;H@Wn ztZ_E3#>74D0MG9GbPwKp-V$?Gplul#Yh&CE^sT_zuERHj6?pHpz8Xi*dIi08c@(q* z>-ApDeFR%znmL2eJt%cqyAO@Xo!~e~gY#gx63*QOZw&PRbzr9}_;#A{40`+h5WHvc zdu$x4kM6gJtpCn;y(;&A4>|_)y?8Lb?ilhw9Q^XmY@;&43kV#Zjnh|W1X z$fp@=hT3DMp`UQ}-`E!UwO zbnx#Cp!05h9as<6wee`m@s5E*pUg)DT*H310dI`V)fsg5tOo4u51Fp;JM#&~R)OEZ zoWJ(Jv&qAcfnDa9`@e&?ub9(6%7uGsj{OGPW3G8!#&!cv8&MA z&|#=`nSrFF~KlkuU1( zaj1R87)InPf~J!2-kL}I{|dU-V7CSJ`;=VP{{K+uy|wQqX4L+P;X)c#p^FF+_X1=q~9(4My-%;}K|2xUr8?%ayZ_Pe*54&;{V)QgR zdtw`~FMAjIfi*h~e0SENyTDrSm5+%9>x?mW60{(fky{z7z^{WoWbe-ZN7(y-#(kan z-jhUeltf7;t(q#S+D;QSRZ}H9yVbU8sy09UMoHCFZKti;)poVJv-hfZ)vmUk-s5&*D95gw7)G)h{;o?-JBrxPg8e^k8!y zY`+)!We&bTto*LsfL}phL$+UbBOe9Jaj1D?GK?HS`_W0wX91c={v`Yu0rO?3v9|3Ctn41NV3B9J+hTUE!Ve?Dos&S*rtFj2XkfBz9Bi(~P@zGkWjh z1oR1LeTI0zN7$MR-w4lEg>MEI!DWy@SHs3}<7Ur2hrTzaj{?`Yi989efN?Mw<3ouY zG0)msV{RY%Bzn&`56q3R9Rf3Ps4LGni0u9)<~E>TWbQ$~+(CaB%z}2ttb6~}qOkt1 zI_y8oo_=3h&r|M={(W#9)R*9q>c=I;l?K^j&1#lq_`}h{SZxR2D>2uhdAHQ4l@gd``Q-be> zy07u~ca**5_uyO{Z2iXS0rp1odI&^}*$e7HiZ#4n7g^^~Wcizn%NqyJYs`1i*F)<- z12_dK3A`J*IP_`zrSd~$4P6Xo@|oDfhXKuATZe-p-pt_M8RQ@-4_C>(@1? z@3A#c-uAv9rpx?C{%x6%g{f&0`$kRw;7Aj6_AeuV`|Sg_vM(eXz%|ne6NNQ zj2koS*L!)EasQ6vy)x&X*WYRvurX%q(DR^48k55kab~Xj?tS~JW2}JgBzz5e7kLuc zQ;bnI4)%Y;dVfI<$Duvw8_{n-PlGIQ&$FO24reh24Zw4Hr$^9xcK5x6ZVNcx4-Uuw z>-XgVx?OaO*ypi734RKct&4j=e>dO5|A@T8w}H#$P^bER3!FgrCFb3LH+R}k!B_U_ z82lVbXlnP$NARg3FIF^=b)a;coZ3{BA*9)KBG^v z#=q^C#&ZpuJXi-wulsnvv@Xr#Jz#FNwO>~Dbz9IuPyoxo`)9ok z#Gxk`n-AazK_mJ_*3hS3pyTNl@%?(6#g?J@~(4eM_y&ZD35s!87PCLO%dEKo2lB#@{}19k~

    >J)s>njQV2N=d?6dQX;iCA~Q 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 +Musk · Mill.jl

    Musk

    Musk dataset is a classic MIL problem of the field, introduced in [5]. Below we demonstrate how to solve this problem using Mill.jl.

    Jupyter notebook

    This example is also available as a Jupyter notebook and the environment is accessible here.

    We load all dependencies and fix the seed:

    using FileIO, JLD2, Statistics, Mill, Flux, OneHotArrays
    +
    +using Random; Random.seed!(42);

    Loading the data

    Now we load the dataset and transform it into a Mill structure. The musk.jld2 file contains...

    • a matrix with features, each column is one instance:
    fMat = load("musk.jld2", "fMat")
    166×476 Matrix{Float32}:
    +   42.0    42.0    42.0    42.0    42.0    42.0    42.0    42.0  …    43.0    52.0    49.0    38.0    43.0    39.0    52.0
    + -198.0  -191.0  -191.0  -198.0  -198.0  -191.0  -190.0  -199.0     -104.0  -123.0  -199.0  -123.0  -102.0   -58.0  -121.0
    + -109.0  -142.0  -142.0  -110.0  -102.0  -142.0  -142.0  -102.0      -20.0   -24.0  -161.0  -139.0   -20.0    27.0   -24.0
    +  -75.0   -65.0   -75.0   -65.0   -75.0   -65.0   -75.0   -65.0       23.0   -43.0    29.0    30.0  -101.0    31.0  -104.0
    + -117.0  -117.0  -117.0  -117.0  -117.0  -117.0  -117.0  -117.0     -117.0  -117.0   -95.0  -117.0  -116.0  -117.0  -116.0
    +   11.0    55.0    11.0    55.0    10.0    55.0    12.0    55.0  …   -76.0   -82.0   -86.0   -88.0   200.0   -92.0   195.0
    +   23.0    49.0    49.0    23.0    24.0    49.0    49.0    23.0     -167.0  -163.0   -48.0   214.0  -166.0    85.0  -162.0
    +  -88.0  -170.0  -161.0   -95.0   -87.0  -170.0  -161.0   -94.0       48.0    60.0     2.0   -13.0    66.0    21.0    76.0
    +  -28.0   -45.0   -45.0   -28.0   -28.0   -45.0   -45.0   -29.0     -229.0  -234.0   112.0   -74.0  -222.0   -73.0  -226.0
    +  -27.0     5.0   -28.0     5.0   -28.0     6.0   -29.0     6.0        6.0   -13.0   -79.0  -129.0   -49.0   -68.0   -56.0
    +    ⋮                                       ⋮                    ⋱             ⋮                                       ⋮
    + -238.0  -238.0  -238.0  -238.0  -238.0  -238.0  -238.0  -238.0     -236.0  -247.0  -220.0  -236.0   114.0  -228.0    99.0
    +  -74.0  -302.0   -73.0  -302.0   -73.0  -300.0   -72.0  -300.0     -260.0  -285.0  -246.0  -226.0    32.0  -232.0    34.0
    + -129.0    60.0  -127.0    60.0  -127.0    61.0  -125.0    61.0     -204.0  -212.0  -209.0  -210.0   136.0  -206.0   133.0
    + -120.0  -120.0  -120.0  -120.0    51.0    51.0    51.0    51.0      -16.0   -20.0    33.0    20.0   -15.0    13.0   -20.0
    +  -38.0   -39.0   -38.0   -39.0   128.0   127.0   124.0   127.0  …   143.0   -44.0   152.0    55.0   143.0    45.0   -46.0
    +   30.0    31.0    30.0    30.0   144.0   143.0   143.0   144.0      120.0    96.0   134.0   119.0   121.0   116.0    95.0
    +   48.0    48.0    48.0    48.0    43.0    42.0    44.0    42.0       55.0    99.0    47.0    79.0    55.0    79.0    98.0
    +  -37.0   -37.0   -37.0   -37.0   -30.0   -31.0   -30.0   -30.0      -37.0   -13.0   -43.0   -28.0   -37.0   -28.0   -14.0
    +    6.0     5.0     5.0     6.0    14.0    14.0    14.0    14.0      -19.0    11.0   -15.0     4.0   -19.0     3.0    12.0
    +   30.0    30.0    31.0    30.0    26.0    26.0    29.0    25.0  …   -36.0    97.0   -10.0    74.0   -36.0    74.0    96.0
    • the ids of samples (bags in MIL terminology) specifying to which each instance (column in fMat) belongs to:
    bagids = load("musk.jld2", "bagids")
    476-element Vector{Int64}:
    +  1
    +  1
    +  1
    +  1
    +  2
    +  2
    +  2
    +  2
    +  3
    +  3
    +  ⋮
    + 91
    + 91
    + 92
    + 92
    + 92
    + 92
    + 92
    + 92
    + 92
    + 92
    • and labels defined on the level of instances:
    y = load("musk.jld2", "y")
    476-element Vector{Int64}:
    + 1
    + 1
    + 1
    + 1
    + 1
    + 1
    + 1
    + 1
    + 1
    + 1
    + ⋮
    + 0
    + 0
    + 0
    + 0
    + 0
    + 0
    + 0
    + 0
    + 0
    + 0

    We create a BagNode structure which holds:

    1. feature matrix and
    2. ranges identifying which columns in the feature matrix each bag spans.
    ds = BagNode(ArrayNode(fMat), bagids)
    BagNode  # 92 obs, 1.500 KiB
    +  ╰── ArrayNode(166×476 Array with Float32 elements)  # 476 obs, 308.703 KiB

    This representation ensures that feed-forward networks do not need to deal with bag boundaries and always process full continuous matrices:

    We also compute labels on the level of bags. In the Musk problem, bag label is defined as a maximum of instance labels (i.e. a bag is positive if at least one of its instances is positive):

    y = map(i -> maximum(y[i]) + 1, ds.bags)
    +y_oh = onehotbatch(y, 1:2)
    2×92 OneHotMatrix(::Vector{UInt32}) with eltype Bool:
    + ⋅  ⋅  ⋅  ⋅  ⋅  ⋅  ⋅  ⋅  ⋅  ⋅  ⋅  ⋅  ⋅  ⋅  ⋅  ⋅  ⋅  ⋅  ⋅  ⋅  …  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1
    + 1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1     ⋅  ⋅  ⋅  ⋅  ⋅  ⋅  ⋅  ⋅  ⋅  ⋅  ⋅  ⋅  ⋅  ⋅  ⋅  ⋅  ⋅  ⋅  ⋅  ⋅

    Model construction

    Once the data are in Mill internal format, we will manually create a model. BagModel is designed to implement a basic multi-instance learning model utilizing two feed-forward networks with an aggregaton operator in between:

    model = BagModel(
    +    Dense(166, 50, Flux.tanh),
    +    SegmentedMeanMax(50),
    +    Chain(Dense(100, 50, Flux.tanh), Dense(50, 2)))
    BagModel ↦ [SegmentedMean(50); SegmentedMax(50)] ↦ Chain(Dense(100 => 50, tanh), Dense(50 => 2))  # 6 arrays, 5_252 params, ⋯
    +  ╰── ArrayModel(Dense(166 => 50, tanh))  # 2 arrays, 8_350 params, 32.695 KiB

    Instances are first passed through a single layer with 50 neurons (input dimension is 166) with tanh non-linearity, then we use mean and max aggregation functions simultaneously (for some problems, max is better then mean, therefore we use both), and then we use one layer with 50 neurons and tanh nonlinearity followed by linear layer with 2 neurons (output dimension). We check that forward pass works

    model(ds)
    2×92 Matrix{Float32}:
    +  0.890284  1.01132    0.88188   0.917716  1.20012    0.548941  …   0.238126    1.30782   1.46193  -0.254     -1.00311
    + -0.864341  0.303749  -0.324059  0.144588  0.107678  -1.17662      -0.0126107  -0.97219  -0.71427   0.569847  -0.302701
    Easier model construction

    Note that the model can be obtained in a more straightforward way using Model reflection.

    Training

    Since Mill is entirely compatible with Flux.jl, we can use its Adam optimizer:

    opt_state = Flux.setup(Adam(), model)
    (im = (m = (weight = Leaf(Adam(0.001, (0.9, 0.999), 1.0e-8), (Float32[0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0], Float32[0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0], (0.9, 0.999))), bias = Leaf(Adam(0.001, (0.9, 0.999), 1.0e-8), (Float32[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], Float32[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], (0.9, 0.999))), σ = ()),), a = (fs = ((ψ = Leaf(Adam(0.001, (0.9, 0.999), 1.0e-8), (Float32[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], Float32[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], (0.9, 0.999))),), (ψ = Leaf(Adam(0.001, (0.9, 0.999), 1.0e-8), (Float32[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], Float32[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], (0.9, 0.999))),)),), bm = (layers = ((weight = Leaf(Adam(0.001, (0.9, 0.999), 1.0e-8), (Float32[0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0], Float32[0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0], (0.9, 0.999))), bias = Leaf(Adam(0.001, (0.9, 0.999), 1.0e-8), (Float32[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], Float32[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], (0.9, 0.999))), σ = ()), (weight = Leaf(Adam(0.001, (0.9, 0.999), 1.0e-8), (Float32[0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0], Float32[0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0], (0.9, 0.999))), bias = Leaf(Adam(0.001, (0.9, 0.999), 1.0e-8), (Float32[0.0, 0.0], Float32[0.0, 0.0], (0.9, 0.999))), σ = ())),))

    ...define a loss function as Flux.logitcrossentropy:

    loss(m, x, y) = Flux.logitcrossentropy(m(x), y)
    loss (generic function with 1 method)

    ...and run a simple training procedure using the Flux.train! procedure:

    for e in 1:100
    +    if e % 10 == 1
    +        @info "Epoch $e" training_loss=loss(model, ds, y_oh)
    +    end
    +    Flux.train!(loss, model, [(ds, y_oh)], opt_state)
    +end
    ┌ Info: Epoch 1
    +└   training_loss = 0.79128903f0
    +┌ Info: Epoch 11
    +└   training_loss = 0.3943807f0
    +┌ Info: Epoch 21
    +└   training_loss = 0.26313362f0
    +┌ Info: Epoch 31
    +└   training_loss = 0.1771421f0
    +┌ Info: Epoch 41
    +└   training_loss = 0.12149703f0
    +┌ Info: Epoch 51
    +└   training_loss = 0.08492497f0
    +┌ Info: Epoch 61
    +└   training_loss = 0.058849733f0
    +┌ Info: Epoch 71
    +└   training_loss = 0.043363024f0
    +┌ Info: Epoch 81
    +└   training_loss = 0.030421462f0
    +┌ Info: Epoch 91
    +└   training_loss = 0.023233365f0

    Finally, we calculate the (training) accuracy:

    mean(Flux.onecold(model(ds), 1:2) .== y)
    1.0
    diff --git a/v2.10.1/examples/musk/musk_literate.jl b/v2.10.1/examples/musk/musk_literate.jl new file mode 100644 index 00000000..b0298b8a --- /dev/null +++ b/v2.10.1/examples/musk/musk_literate.jl @@ -0,0 +1,78 @@ +# # Musk + +#md # [`Musk dataset`](https://archive.ics.uci.edu/ml/datasets/Musk+(Version+2)) is a classic MIL problem of the field, introduced in [Dietterich1997](@cite). Below we demonstrate how to solve this problem using [`Mill.jl`](https://github.com/CTUAvastLab/Mill.jl). +#md # !!! ukn "Jupyter notebook" +#md # This example is also available as a [Jupyter notebook](@__NBVIEWER_ROOT_URL__/examples/musk/musk.ipynb) +#md # and the environment is accessible [here](https://github.com/CTUAvastLab/Mill.jl/tree/master/docs/src/examples/musk). + +#nb # [`Musk dataset`](https://archive.ics.uci.edu/ml/datasets/Musk+\(Version+2\)) is a classic MIL problem of the field, introduced in [Thomas G. Dietterich, Richard H. Lathrop, Tomás Lozano-Pérez (1997)](http://www.sciencedirect.com/science/article/pii/S0004370296000343). Below we demonstrate how to solve this problem using [`Mill.jl`](https://github.com/CTUAvastLab/Mill.jl). +#nb # The full environment and the script is accessible [here](https://github.com/CTUAvastLab/Mill.jl/tree/master/docs/src/examples/musk). + +#nb # We start by activating the environment and installing required packages +#nb using Pkg +#nb Pkg.activate(pwd()) +#nb Pkg.instantiate() +#nb Pkg.status() + +# We load all dependencies and fix the seed: +using FileIO, JLD2, Statistics, Mill, Flux, OneHotArrays + +using Random; Random.seed!(42); + +# ### Loading the data + +# Now we load the dataset and transform it into a `Mill` structure. The `musk.jld2` file contains... +# * a matrix with features, each column is one instance: +fMat = load("musk.jld2", "fMat") +# * the ids of samples (*bags* in MIL terminology) specifying to which each instance (column in `fMat`) belongs to: +bagids = load("musk.jld2", "bagids") +# * and labels defined on the level of instances: +y = load("musk.jld2", "y") + +# We create a [`BagNode`](@ref) structure which holds: +# 1. feature matrix and +# 2. ranges identifying which columns in the feature matrix each bag spans. +ds = BagNode(ArrayNode(fMat), bagids) + +# This representation ensures that feed-forward networks do not need to deal with bag boundaries and always process full continuous matrices: + +# We also compute labels on the level of bags. In the `Musk` problem, bag label is defined as a maximum of instance labels (i.e. a bag is positive if at least one of its instances is positive): +y = map(i -> maximum(y[i]) + 1, ds.bags) +y_oh = onehotbatch(y, 1:2) + +# ### Model construction + +# Once the data are in `Mill` internal format, we will manually create a model. [`BagModel`](@ref) is designed to implement a basic multi-instance learning model utilizing two feed-forward networks with an aggregaton operator in between: +model = BagModel( + Dense(166, 50, Flux.tanh), + SegmentedMeanMax(50), + Chain(Dense(100, 50, Flux.tanh), Dense(50, 2))) + +# Instances are first passed through a single layer with 50 neurons (input dimension is 166) with `tanh` non-linearity, then we use `mean` and `max` aggregation functions simultaneously (for some problems, max is better then mean, therefore we use both), and then we use one layer with 50 neurons and `tanh` nonlinearity followed by linear layer with 2 neurons (output dimension). We check that forward pass works +model(ds) + +#md # !!! ukn "Easier model construction" +#md # Note that the model can be obtained in a more straightforward way using [Model reflection](@ref). + +# ### Training + +# Since `Mill` is entirely compatible with [`Flux.jl`](https://fluxml.ai), we can use its `Adam` optimizer: + +opt_state = Flux.setup(Adam(), model) + +# ...define a loss function as `Flux.logitcrossentropy`: + +loss(m, x, y) = Flux.logitcrossentropy(m(x), y) + +# ...and run a simple training procedure using the `Flux.train!` procedure: + +for e in 1:100 + if e % 10 == 1 + @info "Epoch $e" training_loss=loss(model, ds, y_oh) + end + Flux.train!(loss, model, [(ds, y_oh)], opt_state) +end + +# Finally, we calculate the (training) accuracy: + +mean(Flux.onecold(model(ds), 1:2) .== y) diff --git a/v2.10.1/index.html b/v2.10.1/index.html new file mode 100644 index 00000000..34d42a6f --- /dev/null +++ b/v2.10.1/index.html @@ -0,0 +1,3 @@ + +Home · Mill.jl
    Mill.jl logo +Mill.jl logo

    Mill.jl (Multiple Instance Learning Library) is a library built on top of Flux.jl aimed to flexibly prototype hierarchical multiple instance learning models as described in [1], [2] and [3]. It is developed to be:

    • flexible and versatile
    • as general as possible
    • fast
    • and dependent on only handful of other packages

    Watch our introductory talk from JuliaCon 2021.

    Installation

    Run the following in REPL:

    ] add Mill

    Julia v1.9 or later is required.

    Getting started

    For the quickest start, see the Musk example.

    diff --git a/v2.10.1/manual/aggregation/index.html b/v2.10.1/manual/aggregation/index.html new file mode 100644 index 00000000..d50836cc --- /dev/null +++ b/v2.10.1/manual/aggregation/index.html @@ -0,0 +1,47 @@ + +Bag aggregation · Mill.jl

    Bag aggregation

    Aggregation operators in Mill.jl are all subtypes of AbstractAggregation. These structures are responsible for mapping of vector representations of multiple instances into a single vector. They all operate element-wise and independently of dimension and thus the output has the same size as representations on the input, unless the Concatenation of multiple operators is used.

    Some setup:

    julia> d = 22
    julia> X = Float32.([1 2 3 4; 8 7 6 5])2×4 Matrix{Float32}: + 1.0 2.0 3.0 4.0 + 8.0 7.0 6.0 5.0
    julia> bags = AlignedBags([1:1, 2:3, 4:4])AlignedBags{Int64}(UnitRange{Int64}[1:1, 2:3, 4:4])

    Different choice of operator, or their combinations, are suitable for different problems. Nevertheless, because the input is interpreted as an unordered bag of instances, every operator is invariant to permutation and also does not scale when increasing size of the bag.

    Non-parametric aggregation

    Max aggregation

    SegmentedMax implements a simple max and is the most straightforward operator defined in one dimension as follows:

    \[a_{\max}(\{x_1, \ldots, x_k\}) = \max_{i = 1, \ldots, k} x_i\]

    where $\{x_1, \ldots, x_k\}$ are all instances of the given bag. In Mill, the operator is constructed this way:

    julia> a_max = SegmentedMax(d)SegmentedMax(ψ = Float32[0.0, 0.0])

    The application is straightforward:

    julia> a_max(X, bags)2×3 Matrix{Float32}:
    + 1.0  3.0  4.0
    + 8.0  7.0  5.0

    Since we have three bags, we have three columns in the output, each storing the maximal element over all instances of the given bag.

    Mean aggregation

    SegmentedMean implements mean function, defined as:

    \[a_{\operatorname{mean}}(\{x_1, \ldots, x_k\}) = \frac{1}{k} \sum_{i = 1}^{k} x_i\]

    and used the same way:

    julia> a_mean = SegmentedMean(d)SegmentedMean(ψ = Float32[0.0, 0.0])
    julia> a_mean(X, bags)2×3 Matrix{Float32}: + 1.0 2.5 4.0 + 8.0 6.5 5.0
    Sufficiency of the mean operator

    In theory, mean aggregation is sufficient for approximation as proven in [6], but in practice, a combination of multiple operators performes better.

    The max aggregation is suitable for cases when one instance in the bag may give evidence strong enough to predict the label. On the other side of the spectrum lies the mean aggregation function, which detects well trends identifiable globally over the whole bag.

    Sum aggregation

    The last non-parametric operator is SegmentedSum, defined as:

    \[a_{\operatorname{mean}}(\{x_1, \ldots, x_k\}) = \sum_{i = 1}^{k} x_i\]

    and used the same way:

    julia> a_sum = SegmentedSum(d)SegmentedSum(ψ = Float32[0.0, 0.0])
    julia> a_sum(X, bags)2×3 Matrix{Float32}: + 1.0 5.0 4.0 + 8.0 13.0 5.0

    Parametric aggregation

    Whereas non-parametric aggregations do not use any parameter, parametric aggregations represent an entire class of functions parametrized by one or more real vectors of parameters, which can be even learned during training.

    Log-sum-exp (LSE) aggregation

    SegmentedLSE (log-sum-exp) aggregation ([8]) is parametrized by a vector of positive numbers $\bm{r} \in (\mathbb{R}^+)^d$ m that specifies one real parameter for computation in each output dimension:

    \[a_{\operatorname{lse}}(\{x_1, \ldots, x_k\}; r) = \frac{1}{r}\log \left(\frac{1}{k} \sum_{i = 1}^{k} \exp({r\cdot x_i})\right)\]

    With different values of $r$, LSE behaves differently and in fact both max and mean operators are limiting cases of LSE. If $r$ is very small, the output approaches simple mean, and on the other hand, if $r$ is a large number, LSE becomes a smooth approximation of the max function. Naively implementing the definition above may lead to numerical instabilities, however, the Mill implementation is numerically stable.

    julia> a_lse = SegmentedLSE(d)SegmentedLSE(ψ = Float32[0.0, 0.0], ρ = Float32[0.249335, -0.0607043])
    julia> a_lse(X, bags)2×3 Matrix{Float32}: + 1.0 2.60039 4.0 + 8.0 6.58143 5.0

    $p$-norm aggregation

    (Normalized) $p$-norm operator ([9]) is parametrized by a vector of real numbers $\bm{p} \in (\mathbb{R}^+)^d$, where $\forall i \in \{1, \ldots ,m \} \colon p_i \geq 1$, and another vector $\bm{c} \in (\mathbb{R}^+)^d$. It is computed with formula:

    \[a_{\operatorname{pnorm}}(\{x_1, \ldots, x_k\}; p, c) = \left(\frac{1}{k} \sum_{i = 1}^{k} \vert x_i - c \vert ^ {p} \right)^{\frac{1}{p}}\]

    Again, the Mill implementation is stable.

    julia> a_pnorm = SegmentedPNorm(d)SegmentedPNorm(ψ = Float32[0.0, 0.0], ρ = Float32[0.937752, -1.37727], c = Float32[0.0, 0.0])
    julia> a_pnorm(X, bags)2×3 Matrix{Float32}: + 1.0 2.56238 4.0 + 8.0 6.50433 5.0

    Because all parameter constraints are included implicitly (field ρ in both types is a real number that undergoes appropriate transformation before being used), both parametric operators are easy to use and do not require any special treatment. Replacing the definition of aggregation operators while constructing a model (either manually or with reflectinmodel) is enough.

    Concatenation

    To use a concatenation of two or more operators, one can use the AggregationStack constructor:

    julia> a = AggregationStack(a_mean, a_max)AggregationStack:
    + SegmentedMean(ψ = Float32[0.0, 0.0])
    + SegmentedMax(ψ = Float32[0.0, 0.0])
    julia> a(X, bags)4×3 Matrix{Float32}: + 1.0 2.5 4.0 + 8.0 6.5 5.0 + 1.0 3.0 4.0 + 8.0 7.0 5.0

    For the most common combinations, Mill provides some convenience definitions:

    julia> SegmentedMeanMax(d)AggregationStack:
    + SegmentedMean(ψ = Float32[0.0, 0.0])
    + SegmentedMax(ψ = Float32[0.0, 0.0])
    julia> SegmentedPNormLSE(d)AggregationStack: + SegmentedPNorm(ψ = Float32[0.0, 0.0], ρ = Float32[-2.59288, -0.492026], c = Float32[0.0, 0.0]) + SegmentedLSE(ψ = Float32[0.0, 0.0], ρ = Float32[1.66734, 1.67681])

    Weighted aggregation

    Sometimes, different instances in the bag are not equally important and contribute to output to a different extent. For instance, this may come in handy when performing importance sampling over very large bags. SegmentedMean and SegmentedPNorm have definitions taking weights into account:

    \[a_{\operatorname{mean}}(\{(x_i, w_i)\}_{i=1}^k) = \frac{1}{\sum_{i=1}^k w_i} \sum_{i = 1}^{k} w_i \cdot x_i\]

    \[a_{\operatorname{pnorm}}(\{x_i, w_i\}_{i=1}^k; p, c) = \left(\frac{1}{\sum_{i=1}^k w_i} \sum_{i = 1}^{k} w_i\cdot\vert x_i - c \vert ^ {p} \right)^{\frac{1}{p}}\]

    This is done in Mill by passing an additional parameter:

    julia> w = Float32.([1.0, 0.2, 0.8, 0.5])4-element Vector{Float32}:
    + 1.0
    + 0.2
    + 0.8
    + 0.5
    julia> a_mean(X, bags, w)2×3 Matrix{Float32}: + 1.0 2.8 4.0 + 8.0 6.2 5.0
    julia> a_pnorm(X, bags, w)2×3 Matrix{Float32}: + 1.0 2.83521 4.0 + 8.0 6.20283 5.0

    For SegmentedMax and SegmentedLSE it is possible to pass in weights, but they are ignored during computation:

    julia> a_max(X, bags, w) == a_max(X, bags)true

    Weighted nodes

    WeightedBagNode is used to store instance weights into a dataset. It accepts weights in the constructor:

    julia> wbn = WeightedBagNode(X, bags, w)WeightedBagNode  # 3 obs, 176 bytes
    +  ╰── ArrayNode(2×4 Array with Float32 elements)  # 4 obs, 80 bytes

    and passes them to aggregation operators:

    julia> m = reflectinmodel(wbn, d -> Dense(d, 3))BagModel ↦ BagCount([SegmentedMean(3); SegmentedMax(3)]) ↦ Dense(7 => 3)  # 4 arrays, 30 params, 280 bytes
    +  ╰── ArrayModel(Dense(2 => 3))  # 2 arrays, 9 params, 116 bytes
    julia> m(wbn)3×3 Matrix{Float32}: + 3.76052 3.6409 3.24472 + 0.712644 0.87318 0.36645 + 4.20341 3.50676 3.27765

    Otherwise, WeightedBagNode behaves exactly like the standard BagNode.

    Bag count

    For some problems, it may be beneficial to use the size of the bag directly and feed it to subsequent layers. To do this, wrap an instance of AbstractAggregation or AggregationStack in the BagCount type.

    In the aggregation phase, bag count appends one more element which stores the bag size to the output after all operators are applied. Furthermore, Mill, performs a mapping $x \mapsto \log(x) + 1$ on top of that:

    julia> a_mean_bc = BagCount(a_mean)BagCount(SegmentedMean(ψ = Float32[0.0, 0.0]))
    julia> a_mean_bc(X, bags)3×3 Matrix{Float32}: + 1.0 2.5 4.0 + 8.0 6.5 5.0 + 0.693147 1.09861 0.693147

    The matrix now has three rows, the last one storing the size of the bag.

    Model reflection adds BagCount after each aggregation operator by default.

    julia> bn = BagNode(X, bags)BagNode  # 3 obs, 112 bytes
    +  ╰── ArrayNode(2×4 Array with Float32 elements)  # 4 obs, 80 bytes
    julia> bm = reflectinmodel(bn, d -> Dense(d, 3))BagModel ↦ BagCount([SegmentedMean(3); SegmentedMax(3)]) ↦ Dense(7 => 3) # 4 arrays, 30 params, 280 bytes + ╰── ArrayModel(Dense(2 => 3)) # 2 arrays, 9 params, 116 bytes

    Note that the bm (sub)model field of the BagNode has size of (7, 3), 3 for each of two aggregation outputs and 1 for sizes of bags.

    julia> bm(bn)3×3 Matrix{Float32}:
    + -3.99267   -3.3032    -4.15971
    + -0.604963  -3.69212   -4.94037
    +  0.849309  -0.414772  -1.12406

    Default aggregation values

    When all aggregation operators are printed, one may notice that all of them store one additional vector ψ. This is a vector of default parameters, initialized to all zeros, that are used for empty bags:

    julia> bags = AlignedBags([1:1, 0:-1, 2:3, 0:-1, 4:4])AlignedBags{Int64}(UnitRange{Int64}[1:1, 0:-1, 2:3, 0:-1, 4:4])
    julia> a_mean(X, bags)2×5 Matrix{Float32}: + 1.0 0.0 2.5 0.0 4.0 + 8.0 0.0 6.5 0.0 5.0

    That's why the dimension of input is required in the constructor. See Missing data page for more information.

    diff --git a/v2.10.1/manual/custom/index.html b/v2.10.1/manual/custom/index.html new file mode 100644 index 00000000..b22c1f0e --- /dev/null +++ b/v2.10.1/manual/custom/index.html @@ -0,0 +1,60 @@ + +Custom nodes · Mill.jl

    Custom nodes

    Mill.jl data nodes are lightweight wrappers around data, such as Array, DataFrame, and others. It is of course possible to define a custom data (and model) nodes. A useful abstraction for implementing custom data nodes suitable for most cases is LazyNode, which you can easily use to extend the functionality of Mill.

    Unix path example

    Let's define a custom node type for representing path names in Unix and one custom model type for processing it. LazyNode serves as a bolierplate for simple extension of Mill ecosystem. We start by by defining an example of such node:

    julia> ds = LazyNode{:Path}(["/var/lib/blob_files/myfile.blob"])LazyNode{:Path, Vector{String}, Nothing}:
    + "/var/lib/blob_files/myfile.blob"

    Entirely new type is not needed, because we can dispatch on the first type parameter. Specifically, :Path "tag" in this case defines a special kind of LazyNode. Consequently, we can define multiple variations of custom LazyNode without any conflicts in dispatch.

    As a next step, we extend the Mill.unpack2mill function, which always takes one LazyNode and produces an arbitrary Mill structure. We will represent individual file and directory names (as obtained by splitpath) using an NGramMatrix representation and, for simplicity, the whole path as a bag of individual names:

    function Mill.unpack2mill(ds::LazyNode{:Path})
    +    ss = splitpath.(ds.data)
    +    x = NGramMatrix(reduce(vcat, ss), 3)
    +    BagNode(ArrayNode(x), Mill.length2bags(length.(ss)))
    +end
    julia> Mill.unpack2mill(ds)BagNode  # 1 obs, 104 bytes
    +  ╰── ArrayNode(2053×5 NGramMatrix with Int64 elements)  # 5 obs, 212 bytes

    Also, note that the node keeps an array of strings instead of just one string. This is because we want our node to be able to hold multiple observations than one. Methods such as catobs work as expected:

    ds1 = LazyNode{:Path}(["/var/lib/blob_files/myfile.blob"])
    +ds2 = LazyNode{:Path}(["/var/lib/python"])
    julia> ds = catobs(ds1, ds2)LazyNode{:Path, Vector{String}, Nothing}:
    + "/var/lib/blob_files/myfile.blob"
    + "/var/lib/python"

    The Mill.unpack2mill function is called lazily during the inference by a LazyModel counterpart.

    Model reflection works too:

    julia> pm = reflectinmodel(ds, d -> Dense(d, 3))LazyModel{Path}
    +  ╰── BagModel ↦ BagCount([SegmentedMean(3); SegmentedMax(3)]) ↦ Dense(7 => 3)  # 4 arrays, 30 params, 280 bytes
    +        ╰── ArrayModel(Dense(2053 => 3))  # 2 arrays, 6_162 params, 24.148 KiB

    We can use the obtained model to perform inference as we would do with any other model.

    julia> pm(ds)3×2 Matrix{Float32}:
    + -1.09527   -0.984371
    +  1.29677    1.15081
    +  0.464608   0.439383

    Adding custom nodes without LazyNode

    The solution using LazyNode is sufficient in most scenarios. For other cases, it is recommended to equip custom nodes with the following functionality:

    • allow nesting (if needed)
    • implement Mill.subset and optionally Base.getindex to obtain subsets of observations. Mill already defines Mill.subset for common datatypes, which can be used.
    • allow concatenation of nodes with catobs. Optionally, implement reduce(catobs, ...) as well to avoid excessive compilations if a number of arguments will vary a lot
    • define a specialized method for MLUtils.numobs, which we can however import directly from Mill.
    • register the custom node with HierarchicalUtils.jl to obtain pretty printing, iterators and other functionality

    Here is an example of a custom node with the same functionality as in the Unix path example section:

    using Mill
    +
    +import Base: getindex, show
    +import Mill: catobs, numobs, data, metadata, VecOrRange, AbstractMillNode, reflectinmodel
    +import Flux
    +import HierarchicalUtils: NodeType, LeafNode
    +
    +struct PathNode{S <: AbstractString, C} <: AbstractMillNode
    +    data::Vector{S}
    +    metadata::C
    +end
    +
    +PathNode(data::Vector{S}) where {S <: AbstractString} = PathNode(data, nothing)
    +Base.show(io::IO, n::PathNode) = print(io, "PathNode ($(numobs(n)) obs)")
    +
    +Base.ndims(n::PathNode) = Colon()
    +numobs(n::PathNode) = length(n.data)
    +catobs(ns::PathNode) = PathNode(vcat(data.(ns)...), catobs(metadata.(as)...))
    +Base.getindex(n::PathNode, i::VecOrRange{<:Int}) = PathNode(subset(data(x), i),
    +                                                            subset(metadata(x), i))
    +NodeType(::Type{<:PathNode}) = LeafNode()

    We also have to define a corresponding model node type which will be a counterpart processing the data:

    The solution using LazyNode is sufficient in most scenarios. For other cases, it is recommended to equip custom nodes with the following functionality:

    struct PathModel{T, F} <: AbstractMillModel
    +    m::T
    +    path2mill::F
    +end
    +
    +Flux.@functor PathModel
    +show(io::IO, n::PathModel) = print(io, "PathModel")
    +NodeType(::Type{<:PathModel}) = LeafNode()
    +
    +path2mill(ds::PathNode) = path2mill(ds.data)
    +path2mill(ss::Vector{<:AbstractString}) = reduce(catobs, map(path2mill, ss))
    +function path2mill(s::String)
    +    ss = splitpath(s)
    +    BagNode(ArrayNode(NGramMatrix(ss, 3)), AlignedBags([1:length(ss)]))
    +end
    +
    +(m::PathModel)(x::PathNode) = m.m(m.path2mill(x))
    +
    +function reflectinmodel(ds::PathNode, args...)
    +    pm = reflectinmodel(path2mill(ds), args...)
    +    PathModel(pm, path2mill)
    +end

    Example of usage:

    julia> ds = PathNode(["/etc/passwd", "/home/tonda/.bashrc"])PathNode (2 obs)  # 2 obs, 110 bytes
    julia> pm = reflectinmodel(ds, d -> Dense(d, 3))PathModel # 6 arrays, 6_192 params, 24.422 KiB
    julia> pm(ds)3×2 Matrix{Float32}: + 0.258106 0.307619 + 0.298125 0.404265 + 0.669369 0.869995
    diff --git a/v2.10.1/manual/leaf_data/index.html b/v2.10.1/manual/leaf_data/index.html new file mode 100644 index 00000000..08e55428 --- /dev/null +++ b/v2.10.1/manual/leaf_data/index.html @@ -0,0 +1,111 @@ + +Data in leaves · Mill.jl

    Data in leaves

    In Mill.jl tree-like data representations, there are always some raw data on the leaf level, whereas on higher levels instances are grouped into bags (BagNodes), and different sets are joined together with Cartesion products (ProductNodes) and thus more abstract concepts are created. In this section we look into several examples how the lowest-level data can be represented.

    For this purpose, let's assume that we would like to identify infected clients in a network from their HTTP traffic. Since one client can make an arbitrary number of connections during the observation period, modelling the client as a bag of connections seems like the most natural approach:

    julia> connections = AlignedBags([1:2, 3:3, 4:6])AlignedBags{Int64}(UnitRange{Int64}[1:2, 3:3, 4:6])

    Thus, each of the six connections becomes an instance in one of the three bags representing clients. How to represent such connections instances? Each HTTP flow has properties that can be expressed as standard numerical features, categorical features or strings of characters.

    Numerical features

    We have already shown how to represent standard numerical features in previous parts of this manual. It is as simple as wrapping a type that behaves like a matrix into an ArrayNode:

    julia> content_lengths = [4446, 1957, 4310,
    +                          11604, 17019, 13947]6-element Vector{Int64}:
    +  4446
    +  1957
    +  4310
    + 11604
    + 17019
    + 13947
    julia> dates = [1435420950, 1376190532, 1316869962, + 1302775198, 1555598383, 1562237892]6-element Vector{Int64}: + 1435420950 + 1376190532 + 1316869962 + 1302775198 + 1555598383 + 1562237892
    julia> numerical_node = ArrayNode([content_lengths'; dates'])2×6 ArrayNode{Matrix{Int64}, Nothing}: + 4446 1957 4310 11604 17019 13947 + 1435420950 1376190532 1316869962 1302775198 1555598383 1562237892

    We use Content-Length and Date request headers, the latter converted to Unix timestamp.

    Categorical features

    For categorical variables, we proceed in the same way, but we use one-hot encoding implemented in Flux.jl. This way, we can encode for example a verb of the request:

    julia> ALL_VERBS = ["GET", "HEAD", "POST", "PUT", "DELETE"] # etc...5-element Vector{String}:
    + "GET"
    + "HEAD"
    + "POST"
    + "PUT"
    + "DELETE"
    julia> verbs = ["GET", "GET", "POST", "HEAD", "HEAD", "PUT"]6-element Vector{String}: + "GET" + "GET" + "POST" + "HEAD" + "HEAD" + "PUT"
    julia> verb_node = ArrayNode(Flux.onehotbatch(verbs, ALL_VERBS))5×6 ArrayNode{OneHotArrays.OneHotMatrix{UInt32, Vector{UInt32}}, Nothing}: + 1 1 ⋅ ⋅ ⋅ ⋅ + ⋅ ⋅ ⋅ 1 1 ⋅ + ⋅ ⋅ 1 ⋅ ⋅ ⋅ + ⋅ ⋅ ⋅ ⋅ ⋅ 1 + ⋅ ⋅ ⋅ ⋅ ⋅ ⋅

    or Content-Encoding header:

    julia> ALL_ENCODINGS = ["bzip2", "gzip", "xz", "identity"] # etc...4-element Vector{String}:
    + "bzip2"
    + "gzip"
    + "xz"
    + "identity"
    julia> encodings = ["xz", "gzip", "bzip2", "xz", "identity", "bzip2"]6-element Vector{String}: + "xz" + "gzip" + "bzip2" + "xz" + "identity" + "bzip2"
    julia> encoding_node = ArrayNode(Flux.onehotbatch(encodings, ALL_ENCODINGS))4×6 ArrayNode{OneHotArrays.OneHotMatrix{UInt32, Vector{UInt32}}, Nothing}: + ⋅ ⋅ 1 ⋅ ⋅ 1 + ⋅ 1 ⋅ ⋅ ⋅ ⋅ + 1 ⋅ ⋅ 1 ⋅ ⋅ + ⋅ ⋅ ⋅ ⋅ 1 ⋅

    Because Flux.OneHotMatrix supports multiplication it is possible to wrap it into an ArrayNode.

    Strings

    The last example we will consider are string features. This could for example be the Host header:

    julia> hosts = [
    +           "www.foo.com", "www.foo.com", "www.baz.com",
    +           "www.foo.com", "www.baz.com", "www.foo.com"
    +       ]6-element Vector{String}:
    + "www.foo.com"
    + "www.foo.com"
    + "www.baz.com"
    + "www.foo.com"
    + "www.baz.com"
    + "www.foo.com"

    Mill offers ngram histogram-based representation for strings. To get started, we pass the vector of strings into the constructor of NGramMatrix:

    julia> hosts_ngrams = NGramMatrix(hosts, 3, 256, 7)7×6 NGramMatrix{String, Vector{String}, Int64}:
    + "www.foo.com"
    + "www.foo.com"
    + "www.baz.com"
    + "www.foo.com"
    + "www.baz.com"
    + "www.foo.com"

    Each string gets processed into ngrams (trigram in this case as specified in the first parameter). Then, each character is transformed into an integer via the codeunits function and the whole trigram is interpreted as a three digit number using a base b specified in the second parameter. Here, we use a base of 256, which is the most reasonable choice for ascii URLs. For example, for foo trigram, we obtain:

    julia> c = codeunits("foo")3-element Base.CodeUnits{UInt8, String}:
    + 0x66
    + 0x6f
    + 0x6f
    julia> c[1] * 256^2 + c[2] * 256 + c[3]6713199

    The last step is taking the modulo of this result with respect to some prime modulo m, in this case 7 (last parameter in the constructor), leaving us with 3 as a result. Therefore, for this trigram foo, we would add 1 to the third row[1]. We can convert this NGramMatrix into a sparse array and then to the standard array:

    using SparseArrays
    julia> hosts_dense = hosts_ngrams |> SparseMatrixCSC |> Matrix7×6 Matrix{Int64}:
    + 1  1  3  1  3  1
    + 1  1  0  1  0  1
    + 3  3  4  3  4  3
    + 2  2  1  2  1  2
    + 3  3  3  3  3  3
    + 2  2  1  2  1  2
    + 1  1  1  1  1  1

    Again, we get one column for each string, and the matrix has the same number of rows as modulo m. For each string s, we get length(s) + n - 1 ngrams:

    julia> sum(hosts_dense; dims=1)1×6 Matrix{Int64}:
    + 13  13  13  13  13  13

    This is because we use special abstract characters (or tokens) for the start and the end of the string. If we denote these ^ and $, respectively, from string "foo", we get trigrams ^^f, ^fo, foo, oo$, o$$. Note that these special characters are purely abstract whereas ^ and $ used only for illustration purposes here are characters like any other. Both string start and string end special characters have a unique mapping to integers, which can be obtained as well as set:

    julia> Mill.string_start_code()0x02
    julia> Mill.string_end_code()0x03
    julia> Mill.string_start_code!(42)
    julia> Mill.string_start_code()0x2a

    NGramMatrix behaves like a matrix, implements an efficient left-multiplication and thus can be used in ArrayNode:

    julia> hosts_ngrams::AbstractMatrix{Int64}7×6 NGramMatrix{String, Vector{String}, Int64}:
    + "www.foo.com"
    + "www.foo.com"
    + "www.baz.com"
    + "www.foo.com"
    + "www.baz.com"
    + "www.foo.com"
    julia> host_node = ArrayNode(hosts_ngrams)7×6 ArrayNode{NGramMatrix{String, Vector{String}, Int64}, Nothing}: + "www.foo.com" + "www.foo.com" + "www.baz.com" + "www.foo.com" + "www.baz.com" + "www.foo.com"

    Custom nodes section shows one more slightly more complex way of processing strings, specifically Unix paths.

    Putting it all together

    Now, we can finally put wrap all features of all six connections into one ProductNode and construct a BagNode representing a bag of all connections (corresponding to three different clients):

    julia> ds = BagNode(ProductNode(
    +           numerical=numerical_node,
    +           verb=verb_node,
    +           encoding=encoding_node,
    +           hosts=host_node
    +       ), connections)BagNode  # 3 obs, 176 bytes
    +  ╰── ProductNode  # 6 obs, 72 bytes
    +        ├── numerical: ArrayNode(2×6 Array with Int64 elements)  # 6 obs, 144 bytes
    +        ├─────── verb: ArrayNode(5×6 OneHotArray with Bool elements)  # 6 obs, 96 bytes
    +        ├─── encoding: ArrayNode(4×6 OneHotArray with Bool elements)  # 6 obs, 96 bytes
    +        ╰────── hosts: ArrayNode(7×6 NGramMatrix with Int64 elements)  # 6 obs, 266 bytes

    create a model for training and run one forward pass:

    julia> m = reflectinmodel(ds)BagModel ↦ BagCount([SegmentedMean(10); SegmentedMax(10)]) ↦ Dense(21 => 10)  # 4 arrays, 240 params, 1.094 KiB
    +  ╰── ProductModel ↦ Dense(40 => 10)  # 2 arrays, 410 params, 1.680 KiB
    +        ├── numerical: ArrayModel(Dense(2 => 10))  # 2 arrays, 30 params, 200 bytes
    +        ├─────── verb: ArrayModel(Dense(5 => 10))  # 2 arrays, 60 params, 320 bytes
    +        ├─── encoding: ArrayModel(Dense(4 => 10))  # 2 arrays, 50 params, 280 bytes
    +        ╰────── hosts: ArrayModel(Dense(7 => 10))  # 2 arrays, 80 params, 400 bytes
    julia> m(ds)10×3 Matrix{Float32}: + 1.28439f8 1.23432f8 1.17321f8 + -5.59327f7 -4.71452f7 -8.44016f7 + -7.23352f8 -6.77337f8 -7.52425f8 + 3.82563f8 3.63774f8 3.74053f8 + -3.25157f8 -3.05034f8 -3.36274f8 + -1.77164f8 -1.68485f8 -1.74555f8 + -4.77705f8 -4.48281f8 -4.97372f8 + 4.16182f7 3.67129f7 4.93028f7 + 4.13563f7 4.18648f7 3.00047f7 + 3.72453f7 3.75997f7 2.38858f7

    We now obtain a matrix with three columns, each corresponding to one of the clients. Now we can for example calculate gradients with respect to the model parameters:

    julia> gradient(m -> sum(m(ds)), m)((im = (ms = (numerical = (m = (weight = Float32[3543.7795 3.467772f8; 12015.21 2.9824387f9; … ; -10205.47 -2.5080468f9; -22158.354 -4.05619f9], bias = Float32[0.12283072, 2.3017697, -6.108818, -0.07409614, -2.9991698, 2.245645, -2.9834032, 0.46019074, -1.9266042, -2.8137956], σ = nothing),), verb = (m = (weight = Float32[-0.6740063 -0.70653045 … 0.03252409 0.0; 0.799402 0.48524243 … 0.31415942 0.0; … ; 0.37385964 0.10423415 … 0.26962546 0.0; 1.1983932 0.8594307 … 0.3389626 0.0], bias = Float32[-2.022019, 2.3982058, -1.1765642, -0.78065914, 0.99973947, -2.0380163, 1.3930469, 4.333061, 1.1215789, 3.5951798], σ = nothing),), encoding = (m = (weight = Float32[-0.06326684 0.74241585 0.37819934 -0.15449953; -1.5059438 -0.29936808 -0.8562048 -0.18580464; … ; -1.4919614 -0.3994601 -0.92160493 -0.09642328; 1.679817 -0.015670985 0.7583598 0.2948524], bias = Float32[0.90284884, -2.847321, 4.356851, 0.28094852, -2.0077217, -5.3011537, 3.5605748, -1.0072757, -2.9094498, 2.717358], σ = nothing),), hosts = (m = (weight = Float32[-18.11323 -2.8004198 … -2.8004198 -4.7428136; -5.9066224 -0.88825744 … -0.88825744 -1.5366275; … ; 3.351283 0.6230595 … 0.6230595 0.9194803; -8.199025 -1.2190037 … -1.2190037 -2.1274068], bias = Float32[-4.7428136, -1.5366275, -2.2574577, -0.43867037, 2.0060303, 0.528619, -1.6092172, -0.7405628, 0.9194803, -2.1274068], σ = nothing),)), m = (weight = Float32[-4.019252f8 6.513404f8 … -1.2286562 0.8835508; 5.433767f8 -8.805694f8 … 1.4225271 -1.0247681; … ; 6.43344f8 -1.0425715f9 … 1.6505618 -1.1893108; -3.5949668f7 5.8265244f7 … -0.5622243 0.39958024], bias = Float32[1.9439511, -2.6168752, -7.0138664, 8.038992, -3.5198772, 3.923693, 0.69940704, -0.5939465, -3.09123, -0.07146776], σ = nothing)), a = (a = (fs = ((ψ = Float32[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],), (ψ = Float32[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],)),),), bm = (weight = Float32[-1.05757606f9 4.0311667f8 … -1.6887172f9 3.1780539; -1.05757606f9 4.0311667f8 … -1.6887172f9 3.1780539; … ; -1.05757606f9 4.0311667f8 … -1.6887172f9 3.1780539; -1.05757606f9 4.0311667f8 … -1.6887172f9 3.1780539], bias = Fill(3.0f0, 10), σ = nothing)),)
    Numerical features

    To put all numerical features into one ArrayNode is a design choice. We could as well introduce more keys in the final ProductNode. The model treats these two cases slightly differently (see Nodes section).

    This dummy example illustrates the versatility of Mill. With little to no preprocessing we are able to process complex hierarchical structures and avoid manually designing feature extraction procedures. For a more involved study on processing Internet traffic with Mill, see for example [10].

    • 1One appropriate value for modulo m for real problems is 2053
    diff --git a/v2.10.1/manual/missing/index.html b/v2.10.1/manual/missing/index.html new file mode 100644 index 00000000..736062e2 --- /dev/null +++ b/v2.10.1/manual/missing/index.html @@ -0,0 +1,73 @@ + +Missing data · Mill.jl

    Missing data

    One detail that was left out so far is how Mill.jl handles incomplete or missing data. This phenomenon is nowadays ubiquitous in many data sources and occurs due to:

    • a high price of obtaining a (part of) observation
    • information being unreachable due to privacy reasons
    • a gradual change in the definition of data being gathered
    • a faulty collection process

    and many other possible reasons. At the same time, it is wasteful to throw away the incomplete observations altogether. Thanks to the hierarchical structure of both samples and models, we can still process samples with missing information fragments at various levels of abstraction. Problems of this type can be categorized into 3 not necessarily separate types:

    1. Missing parts of raw-data in a leaf ArrayNode
    2. Empty bags with no instances in a BagNode
    3. And entire key missing in a ProductNode

    At the moment, Mill is capable of handling the first two cases. The solution always involves an additional vector of parameters (denoted always by ψ) that are used during the model evaluation to substitute the missing values. Parameters ψ can be either fixed or learned during training. Everything is done automatically.

    Empty bags

    It may happen that some bags in the datasets are empty by definition or no associated instances were obtained during data collection. Recall, that an empty bag is specified as empty range 0:-1 in case of AlignedBags and as an empty vector Int[] when ScatteredBags are used:

    julia> empty_bags_1 = AlignedBags([1:2, 0:-1, 3:5, 0:-1])AlignedBags{Int64}(UnitRange{Int64}[1:2, 0:-1, 3:5, 0:-1])
    julia> empty_bags_2 = ScatteredBags([[1, 2], Int[], [3, 4, 5], Int[]])ScatteredBags{Int64}([[1, 2], Int64[], [3, 4, 5], Int64[]])

    To obtain the vector representation for a bag, be it for dircetly predicting some value or using it to represent some higher-level structures, we need to deal with these empty bags. This is done in Bag aggregation. Each AbstractAggregation operator carries a vector of parameters ψ, initialized to zeros upon creation:

    julia> a = SegmentedSumMax(2)AggregationStack:
    + SegmentedSum(ψ = Float32[0.0, 0.0])
    + SegmentedMax(ψ = Float32[0.0, 0.0])

    When we evaluate any BagModel, these values are used to compute output for empty bags instead of the aggregation itself. See the demo below:

    julia> an = ArrayNode(randn(Float32, 2, 5))2×5 ArrayNode{Matrix{Float32}, Nothing}:
    +  0.6467423  0.31947362  -0.92877233  1.0960424    1.049499
    + -1.0114008  1.3934115    0.38794893  0.62901175  -2.0970821
    julia> ds = BagNode(an, empty_bags_2)BagNode # 4 obs, 296 bytes + ╰── ArrayNode(2×5 Array with Float32 elements) # 5 obs, 88 bytes
    julia> m = BagModel(identity, a, identity)BagModel ↦ [SegmentedSum(2); SegmentedMax(2)] ↦ identity # 2 arrays, 4 params (all zero), 96 bytes + ╰── ArrayModel(identity)
    julia> m(ds)4×4 Matrix{Float32}: + 0.966216 0.0 1.21677 0.0 + 0.382011 0.0 -1.08012 0.0 + 0.646742 0.0 1.09604 0.0 + 1.39341 0.0 0.629012 0.0

    Vector ψ is learnable and therefore after training will contain a suitable representation of an empty bag for the given problem.

    When a BagNode is entirely empty, it can be constructed with missing instead of a matrix wrapped in an ArrayNode:

    julia> bn1 = BagNode(ArrayNode(rand(3, 4)), [1:4])BagNode  # 1 obs, 80 bytes
    +  ╰── ArrayNode(3×4 Array with Float64 elements)  # 4 obs, 144 bytes
    julia> bn2 = BagNode(missing, [0:-1])BagNode # 1 obs, 72 bytes + ╰──

    and everything will work as expected. For example, we can concatenate these two:

    julia> x = catobs(bn1, bn2)BagNode  # 2 obs, 96 bytes
    +  ╰── ArrayNode(3×4 Array with Float64 elements)  # 4 obs, 144 bytes

    Notice, that the resulting ArrayNode has still the same dimension as ArrayNode inside bn1. The emptiness of bn2 is stored in bags:

    julia> x.bagsAlignedBags{Int64}(UnitRange{Int64}[1:4, 0:-1])

    The second element BagNode can be obtained again by indexing:

    julia> bn1 == x[2]false

    Even though this approach of using missing for data field in BagNodes is the most accurate from the semantic point of view, it may cause excessive compilation, as the types will be different. Therefore, if this happens in multiple places in the sample tree, it may be better to instead use an empty matrix for type consistency:

    julia> BagNode(ArrayNode(zeros(3, 0)), [0:-1])BagNode  # 1 obs, 80 bytes
    +  ╰── ArrayNode(3×0 Array with Float64 elements)  # 0 obs, 48 bytes

    How indexing behaves with respect to this issue depends on a global switch (off by default) and can be changed with the Mill.emptyismissing! function:

    julia> a = BagNode(ArrayNode(rand(3, 2)), [1:2, 0:-1, 0:-1])BagNode  # 3 obs, 112 bytes
    +  ╰── ArrayNode(3×2 Array with Float64 elements)  # 2 obs, 96 bytes
    julia> a[2:3] |> Mill.data3×0 ArrayNode{Matrix{Float64}, Nothing}
    julia> Mill.emptyismissing!(true)
    julia> a[2:3] |> Mill.datamissing
    julia> missingmissing

    Post imputing

    Storing missing strings in NGramMatrix is straightforward:

    julia> missing_ngrams = NGramMatrix(["foo", missing, "bar"], 3, 256, 5)5×3 NGramMatrix{Union{Missing, String}, Vector{Union{Missing, String}}, Union{Missing, Int64}}:
    + "foo"
    + missing
    + "bar"

    When some values of categorical variables are missing, Mill defines a new type for representation:

    julia> missing_categorical = maybehotbatch([missing, 2, missing], 1:5)5×3 MaybeHotMatrix with eltype Union{Missing, Bool}:
    + missing    ⋅    missing
    + missing   true  missing
    + missing    ⋅    missing
    + missing    ⋅    missing
    + missing    ⋅    missing

    MaybeHotMatrix behaves similarly as OneHotMatrix from Flux.jl, but it supports possibly missing values. In case when no values are missing it looks exactly like OneHotMatrix:

    julia> maybehotbatch([5, 2, 1], 1:5)5×3 MaybeHotMatrix with eltype Bool:
    + ⋅  ⋅  1
    + ⋅  1  ⋅
    + ⋅  ⋅  ⋅
    + ⋅  ⋅  ⋅
    + 1  ⋅  ⋅

    MaybeHotMatrix behaves like AbstractMatrix and supports left multiplication again:

    julia> missing_categorical::AbstractMatrix{Union{Bool, Missing}}5×3 MaybeHotMatrix with eltype Union{Missing, Bool}:
    + missing    ⋅    missing
    + missing   true  missing
    + missing    ⋅    missing
    + missing    ⋅    missing
    + missing    ⋅    missing

    However, multiplying these matrices with missing data leads into missing data in the output.

    julia> W = rand(2, 5)2×5 Matrix{Float64}:
    + 0.880801  0.52829   0.567866  0.657427  0.839293
    + 0.45467   0.255719  0.657579  0.617     0.533037
    julia> W * missing_ngrams2×3 Matrix{Union{Missing, Float64}}: + 3.69705 missing 3.69512 + 2.35568 missing 2.8359
    julia> W * missing_categorical2×3 Matrix{Union{Missing, Float64}}: + missing 0.52829 missing + missing 0.255719 missing

    Consequently, gradient can't be computed and any model can't be trained.

    Model debugging

    Flux gradient call returns an error like Output should be scalar; gradients are not defined for output missing when attempted on missing result. In a similar fashion as having NaNs in a model, this signifies that some missing input is not treated anywhere in the model and it propagates up. Generally speaking, it is recommended to deal with missing values as soon as possible (on the leaf level) so that they do not propagate and cause type instabilities.

    PostImputingMatrix is a solution for this. It can be constructed as follows:

    julia> A = PostImputingMatrix(W)2×5 PostImputingMatrix{Float64, Matrix{Float64}, Vector{Float64}}:
    +W:
    + 0.880801  0.52829   0.567866  0.657427  0.839293
    + 0.45467   0.255719  0.657579  0.617     0.533037
    +
    +ψ:
    + 0.0
    + 0.0

    Matrix W is stored inside and A creates one vector of parameters ψ of length size(W, 1) on top of that. Suddenly, multiplication automagically works:

    julia> A * missing_ngrams2×3 Matrix{Float64}:
    + 3.69705  0.0  3.69512
    + 2.35568  0.0  2.8359
    julia> A * missing_categorical2×3 Matrix{Float64}: + 0.0 0.52829 0.0 + 0.0 0.255719 0.0

    What happens under the hood is that whenever A encounters a missing column in the matrix, it fills in values from ψ after the multiplication is performed (effectively replacing all missing values in the result of multiplying with W, but implemented more efficiently). Vector ψ can be learned during training as well and everything works out of the box.

    Pre imputing

    If we have to deal with inputs where some elements of input matrix are missing:

    julia> X = [missing 1 2; 3 missing missing]2×3 Matrix{Union{Missing, Int64}}:
    +  missing  1         2
    + 3          missing   missing

    we can make use of PreImputingMatrix:

    julia> W = rand(1:2, 3, 2)3×2 Matrix{Int64}:
    + 1  1
    + 1  2
    + 2  2
    julia> A = PreImputingMatrix(W)3×2 PreImputingMatrix{Int64, Matrix{Int64}, Vector{Int64}}: +W: + 1 1 + 1 2 + 2 2 + +ψ: + 0 0

    As opposed to PostImputingMatrix, A now stores a vector of values ψ with length size(W, 2). When we use it for multiplication:

    julia> A * X3×3 Matrix{Int64}:
    + 3  1  2
    + 6  1  2
    + 6  2  4

    what happens is that when we perform a dot product of a row of A and a column of X, we first fill in values from ψ into the column before the multiplication is performed. Again, it is possible to compute gradients with respect to all three of W, ψ and X and therefore learn the appropriate default values in ψ from the data:

    julia> gradient((A, X) -> sum(A * X), A, X)((W = [3 3; 3 3; 3 3], ψ = [4, 10]), Real[0 4.0 4.0; 5.0 0 0])

    Model reflection with missing values

    Model reflection takes missing values and types into account and creates appropriate (sub)models to handle them:

    julia> ds = ProductNode((missing_ngrams, missing_categorical, X))ProductNode  # 3 obs, 56 bytes
    +  ├── ArrayNode(5×3 NGramMatrix with Union{Missing, Int64} elements)  # 3 obs, 150 bytes
    +  ├── ArrayNode(5×3 MaybeHotMatrix with Union{Missing, Bool} elements)  # 3 obs, 87 bytes
    +  ╰── ArrayNode(2×3 Array with Union{Missing, Int64} elements)  # 3 obs, 102 bytes
    julia> m = reflectinmodel(ds)ProductModel ↦ Dense(30 => 10) # 2 arrays, 310 params, 1.289 KiB + ├── ArrayModel([postimputing]Dense(5 => 10)) # 3 arrays, 70 params, 400 bytes + ├── ArrayModel([postimputing]Dense(5 => 10)) # 3 arrays, 70 params, 400 bytes + ╰── ArrayModel([preimputing]Dense(2 => 10)) # 3 arrays, 32 params, 248 bytes

    Here, [pre_imputing]Dense and [post_imputing]Dense are standard dense layers with a special matrix inside:

    julia> dense = m.ms[1].m; typeof(dense.weight)PostImputingMatrix{Float32, Matrix{Float32}, Vector{Float32}}

    Inside Mill we add a special definition Base.show for these types for compact printing.

    The reflectinmodel method use types to determine whether imputing is needed or not. Compare the following:

    julia> reflectinmodel(ArrayNode(randn(Float32, 2, 3)))ArrayModel(Dense(2 => 10))  # 2 arrays, 30 params, 200 bytes
    julia> reflectinmodel(ArrayNode([1.0f0 2.0f0 missing; 4.0f0 missing missing]))ArrayModel([preimputing]Dense(2 => 10)) # 3 arrays, 32 params, 248 bytes
    julia> reflectinmodel(ArrayNode(Matrix{Union{Missing, Float32}}(randn(2, 3))))ArrayModel([preimputing]Dense(2 => 10)) # 3 arrays, 32 params, 248 bytes

    In the last case, the imputing type is returned even though there is no missing element in the matrix. Of course, the same applies to MaybeHotVector, MaybeHotMatrix and NGramMatrix. This way, we can signify that even though there are no missing values in the available sample, we expect them to appear in the future and want our model compatible. If it is hard to determine this in advance a safe bet is to make all leaves in the model. The performance will not suffer because imputing types are as fast as their non-imputing counterparts on data not containing missing values and the only tradeoff is a slight increase in the number of parameters, some of which may never be used.

    diff --git a/v2.10.1/manual/more_on_nodes/index.html b/v2.10.1/manual/more_on_nodes/index.html new file mode 100644 index 00000000..6ab2872d --- /dev/null +++ b/v2.10.1/manual/more_on_nodes/index.html @@ -0,0 +1,86 @@ + +More on nodes · Mill.jl

    More on nodes

    Node nesting

    The main advantage of the Mill.jl library is that it allows to arbitrarily nest and cross-product BagModels, as described in Theorem 5 in [6]. In other words, instances themselves may be represented in much more complex way than in the BagNode and BagModel example.

    Let's start the demonstration by nesting two MIL problems. The outer MIL model contains three samples (outer-level bags), whose instances are (inner-level) bags themselves. The first outer-level bag contains one inner-level bag problem with two inner-level instances, the second outer-level bag contains two inner-level bags with total of three inner-level instances, and finally the third outer-level bag contains two inner bags with four instances:

    julia> ds = BagNode(BagNode(ArrayNode(randn(Float32, 4, 10)),
    +                            [1:2, 3:4, 5:5, 6:7, 8:10]),
    +                    [1:1, 2:3, 4:5])BagNode  # 3 obs, 120 bytes
    +  ╰── BagNode  # 5 obs, 144 bytes
    +        ╰── ArrayNode(4×10 Array with Float32 elements)  # 10 obs, 208 bytes

    Here is one example of a model, which is appropriate for this hierarchy:

    using Flux: Dense, Chain, relu
    julia> m = BagModel(
    +               BagModel(
    +                   ArrayModel(Dense(4, 3, relu)),
    +                   SegmentedMeanMax(3),
    +                   Dense(6, 3, relu)),
    +               SegmentedMeanMax(3),
    +               Chain(Dense(6, 3, relu), Dense(3, 2)))BagModel ↦ [SegmentedMean(3); SegmentedMax(3)] ↦ Chain(Dense(6 => 3, relu), Dense(3 => 2))  # 6 arrays, 35 params, 380 byte ⋯
    +  ╰── BagModel ↦ [SegmentedMean(3); SegmentedMax(3)] ↦ Dense(6 => 3, relu)  # 4 arrays, 27 params, 268 bytes
    +        ╰── ArrayModel(Dense(4 => 3, relu))  # 2 arrays, 15 params, 140 bytes

    and can be directly applied to obtain a result:

    julia> m(ds)2×3 Matrix{Float32}:
    + 0.0  -0.0165677  -0.0404657
    + 0.0   0.013503    0.0329802

    Here we again make use of the property that even if each instance is represented with an arbitrarily complex structure, we always obtain a vector representation after applying instance model im, regardless of the complexity of im and Mill.data(ds):

    julia> m.im(Mill.data(ds))3×5 Matrix{Float32}:
    + 0.0       0.545624  0.0  1.03625  0.018455
    + 0.0       0.708773  0.0  1.16774  0.0
    + 0.403142  0.740321  0.0  1.4657   0.556679

    In one final example we demonstrate a complex model consisting of all types of nodes introduced so far:

    julia> ds = BagNode(ProductNode((BagNode(randn(Float32, 4, 10),
    +                                         [1:2, 3:4, 5:5, 6:7, 8:10]),
    +                                 randn(Float32, 3, 5),
    +                                 BagNode(BagNode(randn(Float32, 2, 30),
    +                                                 [i:i+1 for i in 1:2:30]),
    +                                         [1:3, 4:6, 7:9, 10:12, 13:15]),
    +                                 randn(Float32, 2, 5))),
    +                    [1:1, 2:3, 4:5])BagNode  # 3 obs, 160 bytes
    +  ╰── ProductNode  # 5 obs, 56 bytes
    +        ├── BagNode  # 5 obs, 144 bytes
    +        ╰── ArrayNode(4×10 Array with Float32 elements)  # 10 obs, 208 bytes
    +        ├── ArrayNode(3×5 Array with Float32 elements)  # 5 obs, 108 bytes
    +        ├── BagNode  # 5 obs, 152 bytes
    +        ╰── BagNode  # 15 obs, 304 bytes
    +              ╰── ArrayNode(2×30 Array with Float32 elements)  # 30 obs, 288 bytes
    +        ╰── ArrayNode(2×5 Array with Float32 elements)  # 5 obs, 88 bytes

    When data and model trees become complex, Mill limits the printing. To inspect the whole tree, use printtree:

    julia> printtree(ds)BagNode  # 3 obs, 160 bytes
    +  ╰── ProductNode  # 5 obs, 56 bytes
    +        ├── BagNode  # 5 obs, 144 bytes
    +        │     ╰── ArrayNode(4×10 Array with Float32 elements)  # 10 obs, 208 bytes
    +        ├── ArrayNode(3×5 Array with Float32 elements)  # 5 obs, 108 bytes
    +        ├── BagNode  # 5 obs, 152 bytes
    +        │     ╰── BagNode  # 15 obs, 304 bytes
    +        │           ╰── ArrayNode(2×30 Array with Float32 elements)  # 30 obs, 288 bytes
    +        ╰── ArrayNode(2×5 Array with Float32 elements)  # 5 obs, 88 bytes

    Instead of defining a model manually, we can also make use of Model reflection, another Mill functionality, which simplifies model creation:

    julia> m = reflectinmodel(ds, d -> Dense(d, 2), SegmentedMean)BagModel ↦ SegmentedMean(2) ↦ Dense(2 => 2)  # 3 arrays, 8 params, 152 bytes
    +  ╰── ProductModel ↦ Dense(8 => 2)  # 2 arrays, 18 params, 152 bytes
    +        ├── BagModel ↦ SegmentedMean(2) ↦ Dense(2 => 2)  # 3 arrays, 8 params, 152 bytes
    +        ╰── ArrayModel(Dense(4 => 2))  # 2 arrays, 10 params, 120 bytes
    +        ├── ArrayModel(Dense(3 => 2))  # 2 arrays, 8 params, 112 bytes
    +        ├── BagModel ↦ SegmentedMean(2) ↦ Dense(2 => 2)  # 3 arrays, 8 params, 152 bytes
    +        ╰── BagModel ↦ SegmentedMean(2) ↦ Dense(2 => 2)  # 3 arrays, 8 params, 152 bytes
    +              ╰── ArrayModel(Dense(2 => 2))  # 2 arrays, 6 params, 104 bytes
    +        ╰── ArrayModel(Dense(2 => 2))  # 2 arrays, 6 params, 104 bytes
    julia> m(ds)2×3 Matrix{Float32}: + -0.0760647 0.0462476 -0.0648969 + 0.030561 0.0626038 -0.0322707

    Node conveniences

    To make the handling of data and model hierarchies easier, Mill provides several tools. Let's setup some data:

    julia> AN = ArrayNode(Float32.([1 2 3 4; 5 6 7 8]))2×4 ArrayNode{Matrix{Float32}, Nothing}:
    + 1.0  2.0  3.0  4.0
    + 5.0  6.0  7.0  8.0
    julia> AM = reflectinmodel(AN)ArrayModel(Dense(2 => 10)) # 2 arrays, 30 params, 200 bytes
    julia> BN = BagNode(AN, [1:1, 2:3, 4:4])BagNode # 3 obs, 112 bytes + ╰── ArrayNode(2×4 Array with Float32 elements) # 4 obs, 80 bytes
    julia> BM = reflectinmodel(BN)BagModel ↦ BagCount([SegmentedMean(10); SegmentedMax(10)]) ↦ Dense(21 => 10) # 4 arrays, 240 params, 1.094 KiB + ╰── ArrayModel(Dense(2 => 10)) # 2 arrays, 30 params, 200 bytes
    julia> PN = ProductNode(a=Float32.([1 2 3; 4 5 6]), b=BN)ProductNode # 3 obs, 24 bytes + ├── a: ArrayNode(2×3 Array with Float32 elements) # 3 obs, 72 bytes + ╰── b: BagNode # 3 obs, 112 bytes + ╰── ArrayNode(2×4 Array with Float32 elements) # 4 obs, 80 bytes
    julia> PM = reflectinmodel(PN)ProductModel ↦ Dense(20 => 10) # 2 arrays, 210 params, 920 bytes + ├── a: ArrayModel(Dense(2 => 10)) # 2 arrays, 30 params, 200 bytes + ╰── b: BagModel ↦ BagCount([SegmentedMean(10); SegmentedMax(10)]) ↦ Dense(21 => 10) # 4 arrays, 240 params, 1.094 KiB + ╰── ArrayModel(Dense(2 => 10)) # 2 arrays, 30 params, 200 bytes

    Function: numobs

    numobs function from MLUtils.jl returns a number of samples from the current level point of view. This number usually increases as we go down the tree when BagNodes are involved, as each bag may contain more than one instance.

    julia> numobs(AN)4
    julia> numobs(BN)3
    julia> numobs(PN)3

    Indexing and Slicing

    Indexing in [Mill] operates on the level of observations:

    julia> AN[1]2×1 ArrayNode{Matrix{Float32}, Nothing}:
    + 1.0
    + 5.0
    julia> numobs(ans)1
    julia> BN[2]BagNode # 1 obs, 80 bytes + ╰── ArrayNode(2×2 Array with Float32 elements) # 2 obs, 64 bytes
    julia> numobs(ans)1
    julia> PN[3]ProductNode # 1 obs, 24 bytes + ├── a: ArrayNode(2×1 Array with Float32 elements) # 1 obs, 56 bytes + ╰── b: BagNode # 1 obs, 80 bytes + ╰── ArrayNode(2×1 Array with Float32 elements) # 1 obs, 56 bytes
    julia> numobs(ans)1
    julia> AN[[1, 4]]2×2 ArrayNode{Matrix{Float32}, Nothing}: + 1.0 4.0 + 5.0 8.0
    julia> numobs(ans)2
    julia> BN[1:2]BagNode # 2 obs, 96 bytes + ╰── ArrayNode(2×3 Array with Float32 elements) # 3 obs, 72 bytes
    julia> numobs(ans)2
    julia> PN[[2, 3]]ProductNode # 2 obs, 24 bytes + ├── a: ArrayNode(2×2 Array with Float32 elements) # 2 obs, 64 bytes + ╰── b: BagNode # 2 obs, 96 bytes + ╰── ArrayNode(2×3 Array with Float32 elements) # 3 obs, 72 bytes
    julia> numobs(ans)2
    julia> PN[Int[]]ProductNode # 0 obs, 24 bytes + ├── a: ArrayNode(2×0 Array with Float32 elements) # 0 obs, 48 bytes + ╰── b: BagNode # 0 obs, 64 bytes + ╰── ArrayNode(2×0 Array with Float32 elements) # 0 obs, 48 bytes
    julia> numobs(ans)0

    This may be useful for creating minibatches and their permutations.

    Note that apart from the perhaps apparent recurrent effect, this operation requires other implicit actions, such as properly recomputing bag indices:

    julia> BN.bagsAlignedBags{Int64}(UnitRange{Int64}[1:1, 2:3, 4:4])
    julia> BN[[1, 3]].bagsAlignedBags{Int64}(UnitRange{Int64}[1:1, 2:2])

    Function: catobs

    catobs function concatenates several samples (datasets) together:

    julia> catobs(AN[1], AN[4])2×2 ArrayNode{Matrix{Float32}, Nothing}:
    + 1.0  4.0
    + 5.0  8.0
    julia> catobs(BN[3], BN[[2, 1]])BagNode # 3 obs, 112 bytes + ╰── ArrayNode(2×4 Array with Float32 elements) # 4 obs, 80 bytes
    julia> catobs(PN[[1, 2]], PN[3:3]) == PNtrue

    Again, the effect is recurrent and everything is appropriately recomputed:

    julia> BN.bagsAlignedBags{Int64}(UnitRange{Int64}[1:1, 2:3, 4:4])
    julia> catobs(BN[3], BN[[1]]).bagsAlignedBags{Int64}(UnitRange{Int64}[1:1, 2:2])

    This operation is an analogy to what is usually done in the classical setting. If every observation is represented as a vector of features, each (mini)batch of samples is first concatenated into one matrix and the whole matrix is run through the neural network using fast matrix multiplication procedures. The same reasoning applies here, but instead of Base.cat, catobs is needed.

    Equipped with everything mentioned above there are two different ways to construct minibatches from data. First option, applicable mainly to smaller datasets, is to load all avaiable data into memory, store it as one big data node containing all observations, and use Indexing and Slicing to obtain minibatches. Such approach is demonstrated in the Musk example. The other option is to read all observations into memory separately (or load them on demand) and construct minibatches with catobs.

    More tips

    For more tips for handling datasets and models, see External tools.

    Metadata

    Each AbstractMillNode can also carry arbitrary metadata (defaulting to nothing). Metadata is provided upon construction of the node and accessed metadata by Mill.metadata:

    julia> n1 = ArrayNode(randn(2, 2), ["metadata"])2×2 ArrayNode{Matrix{Float64}, Vector{String}}:
    + -0.22684270643341806   1.3321657770216255
    +  0.015328464950175435  1.059974135058343
    julia> Mill.metadata(n1)1-element Vector{String}: + "metadata"
    julia> n2 = ProductNode(n1, [1 3; 2 4])ProductNode # 2 obs, 96 bytes + ╰── ArrayNode(2×2 Array with Float64 elements) # 2 obs, 152 bytes
    julia> Mill.metadata(n2)2×2 Matrix{Int64}: + 1 3 + 2 4
    diff --git a/v2.10.1/manual/nodes/index.html b/v2.10.1/manual/nodes/index.html new file mode 100644 index 00000000..4b34d22d --- /dev/null +++ b/v2.10.1/manual/nodes/index.html @@ -0,0 +1,61 @@ + +Nodes · Mill.jl
    Tip

    It is recommended to read the Motivation section first to understand the crucial ideas behind hierarchical multiple instance learning.

    Nodes

    Mill.jl enables representation of arbitrarily complex tree-like hierarchies and appropriate models for these hierarchies. It defines two core abstract types:

    1. AbstractMillNode which stores data on any level of abstraction and its subtypes can be further nested
    2. AbstractMillModel which helps to define a corresponding model. For each specific implementation of AbstractMillNode we have one or more specific AbstractMillModels for processing it.

    Below we will introduce ArrayNode, BagNode and ProductNode together with their corresponding models. It is possible to define data and model nodes for more complex behaviors (see Custom nodes), however, these three core types are already sufficient for most tasks. For instance, we can represent any JSON document and use appropriate models to convert it to a vector represention or classify it (see Processing JSONs).

    ArrayNode and ArrayModel

    ArrayNode thinly wraps an array of features (specifically any subtype of AbstractArray):

    julia> X = Float32.([1 2 3 ; 4 5 6])2×3 Matrix{Float32}:
    + 1.0  2.0  3.0
    + 4.0  5.0  6.0
    julia> AN = ArrayNode(X)2×3 ArrayNode{Matrix{Float32}, Nothing}: + 1.0 2.0 3.0 + 4.0 5.0 6.0

    Data carried by any AbstractMillNode can be accessed with the Mill.data function as follows:

    julia> Mill.data(AN)2×3 Matrix{Float32}:
    + 1.0  2.0  3.0
    + 4.0  5.0  6.0

    Similarly, ArrayModel wraps any function performing operation over this array. In example below, we wrap a feature matrix X and a Dense model from Flux.jl:

    using Flux: Dense
    julia> f = Dense(2, 4)Dense(2 => 4)       # 12 parameters
    julia> AM = ArrayModel(f)ArrayModel(Dense(2 => 4)) # 2 arrays, 12 params, 128 bytes

    We can apply the model now with AM(AN) to get another ArrayNode and verify that the feedforward layer f is really applied:

    julia> AM(AN)4×3 Matrix{Float32}:
    + -0.750983   -1.09551   -1.44004
    + -0.0559078   0.113471   0.28285
    + -2.37767    -2.28613   -2.1946
    +  0.272429    0.780232   1.28804
    julia> f(X) == AM(AN)true
    Model outputs

    A convenient property of all Mill AbstractMillModel nodes is that after applying them to a corresponding data node we always obtain an array as output regardless of the type and complexity of the model. This becomes important later.

    The most common interpretation of the data inside ArrayNodes is that each column contains features of one sample and therefore the node AN carries size(Mill.data(AN), 2) samples. In this sense, ArrayNodes wrap the standard machine learning problem, where each sample is represented with a vector, a matrix or a more general tensor of features. Alternatively, one can obtain a number of samples of any AbstractMillNode with numobs function from MLUtils.jl package, which Mill also exports:

    julia> numobs(AN)3

    BagNode

    BagNode represents the standard multiple instance learning problem, that is, each sample is a bag containing an arbitrary number of instances. In the simplest case, each instance is a vector:

    julia> BN = BagNode(AN, [1:2, 0:-1, 3:3])BagNode  # 3 obs, 112 bytes
    +  ╰── ArrayNode(2×3 Array with Float32 elements)  # 3 obs, 72 bytes

    where for simplicity we used AN from the previous example. It is also possible to use data directly, in such case it is wrapped in an ArrayNode automatically.

    Each BagNode carries data and bags fields:

    julia> Mill.data(BN)2×3 ArrayNode{Matrix{Float32}, Nothing}:
    + 1.0  2.0  3.0
    + 4.0  5.0  6.0
    julia> BN.bagsAlignedBags{Int64}(UnitRange{Int64}[1:2, 0:-1, 3:3])

    Here, data can be an arbitrary AbstractMillNode storing representation of instances (ArrayNode in this case) and bags field contains information, which instances belong to which bag. In this specific case bn stores three bags (samples). The first one consists of a two instances {[1.0, 4.0], [2.0, 5.0]} (first two columns of AN), the second one is empty, and the thirs bag contains one instance {[3.0, 6.0]}. We can see that we deal with two top-level samples (bags):

    julia> numobs(BN)3

    whereas they are formed using three instances:

    julia> numobs(AN)3

    In Mill, there are two ways to store indices of the bag's instances:

    • in AlignedBags structure, which accepts a Vector of UnitRanges and requires all bag's instances stored continuously:
    julia> AlignedBags([1:2, 3:3])AlignedBags{Int64}(UnitRange{Int64}[1:2, 3:3])
    • and in ScatteredBags structure, which accepts a Vector of Vectorss storing not necessarily contiguous indices:
    julia> ScatteredBags([[2, 1], [3]])ScatteredBags{Int64}([[2, 1], [3]])

    The two examples above are semantically equivalent, as bags are unordered collections of instances. An empty bag with no instances is in AlignedBags specified as empty range 0:-1 and in ScatteredBags as an empty vector Int[]. The constructor of BagNode accepts directly one of these two structures and tries to automagically decide the better type in other cases.

    BagModel

    Each BagNode is processed by a BagModel, which contains two (sub)models and an aggregation operator:

    julia> im = ArrayModel(Dense(2, 5))ArrayModel(Dense(2 => 5))  # 2 arrays, 15 params, 140 bytes
    julia> a = SegmentedMax(5)SegmentedMax(ψ = Float32[0.0, 0.0, 0.0, 0.0, 0.0])
    julia> bm = Dense(5, 3)Dense(5 => 3) # 18 parameters
    julia> BM = BagModel(im, a, bm)BagModel ↦ SegmentedMax(5) ↦ Dense(5 => 3) # 3 arrays, 23 params, 212 bytes + ╰── ArrayModel(Dense(2 => 5)) # 2 arrays, 15 params, 140 bytes

    The first network submodel (called instance model im) is responsible for converting the instance representation to a vector form:

    julia> y = im(AN)5×3 Matrix{Float32}:
    +  0.062954   0.159188    0.255422
    + -0.733941  -1.19342    -1.65289
    +  0.249682  -0.0169376  -0.283558
    +  0.506802   0.875205    1.24361
    +  2.02213    2.84063     3.65913

    Note that because of the property mentioned above, the output of instance model im will always be a Matrix. We get four columns, one for each instance. This result is then used in SegmentedMax operator a which takes vector representation of all instances and produces a single vector per bag:

    julia> y = a(y, BN.bags)5×3 Matrix{Float32}:
    +  0.159188  0.0   0.255422
    + -0.733941  0.0  -1.65289
    +  0.249682  0.0  -0.283558
    +  0.875205  0.0   1.24361
    +  2.84063   0.0   3.65913
    More about aggregation

    To read more about aggregation operators, see the Bag aggregation section. For an explanation how empty bags are aggregated, see Missing data.

    Finally, y is then passed to a feed forward model (called bag model bm) producing the final output per bag. In our example we therefore get a matrix with three columns:

    julia> y = bm(y)3×3 Matrix{Float32}:
    +  0.655082  0.0   0.179365
    + -2.47276   0.0  -3.63168
    + -0.834547  0.0  -1.11086

    However, the best way to use a bag model node is to simply apply it, which results into the same output:

    julia> BM(BN) == ytrue

    The whole procedure is depicted in the following picture:

    Bag Model +Bag Model

    Three instances of the BagNode are represented by red subtrees are first mapped with instance model im, aggregated (aggregation operator here is a concatenation of two different operators $a_1$ and $a_2$), and the results of aggregation are transformed with bag model bm.

    Musk example

    Another handy feature of Mill models is that they are completely differentiable and therefore fit in the Flux.jl framework. Nodes for processing arrays and bags are sufficient to solve the classical Musk problem.

    ProductNodes and ProductModels

    ProductNode can be thought of as a Cartesian Product or a Dictionary. It holds a Tuple or NamedTuple of nodes (not necessarily of the same type). For example, a ProductNode with the BagNode and the ArrayNode from above and two more nodes as children would look like this:

    julia> PN = tuple(
    +               ArrayNode(randn(Float32, 2, 3)),
    +               BagNode(ArrayNode(zeros(Float32, 4, 4)), [1:1, 2:2, 3:4]),
    +               BN,
    +               AN
    +           ) |> ProductNodeProductNode  # 3 obs, 48 bytes
    +  ├── ArrayNode(2×3 Array with Float32 elements)  # 3 obs, 72 bytes
    +  ├── BagNode  # 3 obs, 112 bytes
    +  ╰── ArrayNode(4×4 Array with Float32 elements)  # 4 obs, 112 bytes
    +  ├── BagNode  # 3 obs, 112 bytes
    +  ╰── ArrayNode(2×3 Array with Float32 elements)  # 3 obs, 72 bytes
    +  ╰── ArrayNode(2×3 Array with Float32 elements)  # 3 obs, 72 bytes

    Analogically, the ProductModel contains a Tuple or NamedTuple of (sub)models processing each of its children (stored in ms field standing for models), as well as one more (sub)model m:

    julia> ms = tuple(
    +               ArrayModel(Dense(2, 2)),
    +               BagModel(ArrayModel(Dense(4, 6)), SegmentedMean(6), Dense(6, 5)),
    +               BM,
    +               AM);
    julia> m = Dense(14, 9);
    julia> PM = ProductModel(ms, m)ProductModel ↦ Dense(14 => 9) # 2 arrays, 135 params, 620 bytes + ├── ArrayModel(Dense(2 => 2)) # 2 arrays, 6 params, 104 bytes + ├── BagModel ↦ SegmentedMean(6) ↦ Dense(6 => 5) # 3 arrays, 41 params, 284 bytes + ╰── ArrayModel(Dense(4 => 6)) # 2 arrays, 30 params, 200 bytes + ├── BagModel ↦ SegmentedMax(5) ↦ Dense(5 => 3) # 3 arrays, 23 params, 212 bytes + ╰── ArrayModel(Dense(2 => 5)) # 2 arrays, 15 params, 140 bytes + ╰── ArrayModel(Dense(2 => 4)) # 2 arrays, 12 params, 128 bytes

    Again, since the library is based on the property that the output of each model is an array, the product model applies models from ms to appropriate children and vertically concatenates the output, which is then processed by model m. An example of model processing the above sample would be:

    julia> y = PM.m(vcat([PM.ms[i](PN.data[i]) for i in 1:4]...))9×3 Matrix{Float32}:
    +  1.30292    1.33766     0.462887
    + -2.32897   -1.89836    -2.76772
    + -0.893491   0.228725   -1.17165
    +  0.179267   0.934965   -0.815158
    + -0.93786   -0.124089   -1.8643
    + -1.03552   -0.567542   -1.90516
    + -0.201476  -0.602289    0.793139
    + -0.501704   0.0751399  -1.98769
    + -0.90056   -0.648128   -2.29961

    which is equivalent to:

    julia> PM(PN) == ytrue

    Application of this product model can be schematically visualized as follows:

    Product Model +Product Model
    diff --git a/v2.10.1/manual/reflectin/index.html b/v2.10.1/manual/reflectin/index.html new file mode 100644 index 00000000..30483552 --- /dev/null +++ b/v2.10.1/manual/reflectin/index.html @@ -0,0 +1,104 @@ + +Model reflection · Mill.jl

    Model reflection

    Since constructions of large models can be a tedious and error-prone process, Mill.jl provides reflectinmodel function that helps to automate it. The simplest definition accepts only one argument, a sample ds, and returns a compatible model:

    julia> ds = BagNode(ProductNode((BagNode(randn(Float32, 4, 10),
    +                                         [1:2, 3:4, 5:5, 6:7, 8:10]),
    +                                 randn(Float32, 3, 5),
    +                                 BagNode(BagNode(randn(Float32, 2, 30),
    +                                                 [i:i+1 for i in 1:2:30]),
    +                                         [1:3, 4:6, 7:9, 10:12, 13:15]),
    +                                 randn(Float32, 2, 5))),
    +                    [1:1, 2:3, 4:5]);
    julia> printtree(ds)BagNode # 3 obs, 160 bytes + ╰── ProductNode # 5 obs, 56 bytes + ├── BagNode # 5 obs, 144 bytes + │ ╰── ArrayNode(4×10 Array with Float32 elements) # 10 obs, 208 bytes + ├── ArrayNode(3×5 Array with Float32 elements) # 5 obs, 108 bytes + ├── BagNode # 5 obs, 152 bytes + │ ╰── BagNode # 15 obs, 304 bytes + │ ╰── ArrayNode(2×30 Array with Float32 elements) # 30 obs, 288 bytes + ╰── ArrayNode(2×5 Array with Float32 elements) # 5 obs, 88 bytes
    julia> m = reflectinmodel(ds, d -> Dense(d, 2));
    julia> printtree(m)BagModel ↦ BagCount([SegmentedMean(2); SegmentedMax(2)]) ↦ Dense(5 => 2) # 4 arrays, 16 params, 224 bytes + ╰── ProductModel ↦ Dense(8 => 2) # 2 arrays, 18 params, 152 bytes + ├── BagModel ↦ BagCount([SegmentedMean(2); SegmentedMax(2)]) ↦ Dense(5 => 2) # 4 arrays, 16 params, 224 bytes + │ ╰── ArrayModel(Dense(4 => 2)) # 2 arrays, 10 params, 120 bytes + ├── ArrayModel(Dense(3 => 2)) # 2 arrays, 8 params, 112 bytes + ├── BagModel ↦ BagCount([SegmentedMean(2); SegmentedMax(2)]) ↦ Dense(5 => 2) # 4 arrays, 16 params, 224 bytes + │ ╰── BagModel ↦ BagCount([SegmentedMean(2); SegmentedMax(2)]) ↦ Dense(5 => 2) # 4 arrays, 16 params, 224 bytes + │ ╰── ArrayModel(Dense(2 => 2)) # 2 arrays, 6 params, 104 bytes + ╰── ArrayModel(Dense(2 => 2)) # 2 arrays, 6 params, 104 bytes
    julia> m(ds)2×3 Matrix{Float32}: + 0.0231536 0.383077 -1.84346 + -1.30441 -0.0164543 -2.67783

    The sample ds serves here as a specimen needed to specify a structure of the problem and calculate dimensions.

    Optional arguments

    To have better control over the topology, reflectinmodel accepts up to two more optional arguments and four keyword arguments:

    • The first optional argument expects a function that returns a layer (or a set of layers) given input dimension d (defaults to d -> Flux.Dense(d, 10)).
    • The second optional argument is a function returning aggregation function for BagModel nodes (defaults to BagCount ∘ SegmentedMeanMax).

    Compare the following example to the previous one:

    julia> m = reflectinmodel(ds, d -> Dense(d, 5, relu), SegmentedMax);
    julia> printtree(m)BagModel ↦ SegmentedMax(5) ↦ Dense(5 => 5, relu) # 3 arrays, 35 params, 260 bytes + ╰── ProductModel ↦ Dense(20 => 5, relu) # 2 arrays, 105 params, 500 bytes + ├── BagModel ↦ SegmentedMax(5) ↦ Dense(5 => 5, relu) # 3 arrays, 35 params, 260 bytes + │ ╰── ArrayModel(Dense(4 => 5, relu)) # 2 arrays, 25 params, 180 bytes + ├── ArrayModel(Dense(3 => 5, relu)) # 2 arrays, 20 params, 160 bytes + ├── BagModel ↦ SegmentedMax(5) ↦ Dense(5 => 5, relu) # 3 arrays, 35 params, 260 bytes + │ ╰── BagModel ↦ SegmentedMax(5) ↦ Dense(5 => 5, relu) # 3 arrays, 35 params, 260 bytes + │ ╰── ArrayModel(Dense(2 => 5, relu)) # 2 arrays, 15 params, 140 bytes + ╰── ArrayModel(Dense(2 => 5, relu)) # 2 arrays, 15 params, 140 bytes
    julia> m(ds)5×3 Matrix{Float32}: + 0.0558981 0.258097 0.0 + 0.220776 0.321497 0.48561 + 0.0 0.0 0.412755 + 0.569792 1.77116 0.0457244 + 0.0 0.0 0.0

    Keyword arguments

    The reflectinmodel allows even further customization. To index into the sample (or model), we can use printtree(ds; trav=true) from HierarchicalUtils.jl that prints the sample together with identifiers of individual nodes:

    using HierarchicalUtils
    julia> printtree(ds; trav=true)BagNode [""]  # 3 obs, 160 bytes
    +  ╰── ProductNode ["U"]  # 5 obs, 56 bytes
    +        ├── BagNode ["Y"]  # 5 obs, 144 bytes
    +        │     ╰── ArrayNode(4×10 Array with Float32 elements) ["a"]  # 10 obs, 208 bytes
    +        ├── ArrayNode(3×5 Array with Float32 elements) ["c"]  # 5 obs, 108 bytes
    +        ├── BagNode ["g"]  # 5 obs, 152 bytes
    +        │     ╰── BagNode ["i"]  # 15 obs, 304 bytes
    +        │           ╰── ArrayNode(2×30 Array with Float32 elements) ["j"]  # 30 obs, 288 bytes
    +        ╰── ArrayNode(2×5 Array with Float32 elements) ["k"]  # 5 obs, 88 bytes

    These identifiers can be used to override the default construction functions. Note that the output, i.e. the last feed-forward network of the whole model is always tagged with an empty string "", which simplifies putting linear layer with an appropriate output dimension on the end. Dictionaries with these overrides can be passed in as keyword arguments:

    • fsm overrides constructions of feed-forward models
    • fsa overrides construction of aggregation functions.

    For example to specify just the last feed forward neural network:

    julia> reflectinmodel(ds, d -> Dense(d, 5, relu), SegmentedMeanMax;
    +           fsm = Dict("" => d -> Chain(Dense(d, 20, relu), Dense(20, 12)))) |> printtreeBagModel ↦ [SegmentedMean(5); SegmentedMax(5)] ↦ Chain(Dense(10 => 20, relu), Dense(20 => 12))  # 6 arrays, 482 params, 2.117 KiB
    +  ╰── ProductModel ↦ Dense(20 => 5, relu)  # 2 arrays, 105 params, 500 bytes
    +        ├── BagModel ↦ [SegmentedMean(5); SegmentedMax(5)] ↦ Dense(10 => 5, relu)  # 4 arrays, 65 params, 420 bytes
    +        │     ╰── ArrayModel(Dense(4 => 5, relu))  # 2 arrays, 25 params, 180 bytes
    +        ├── ArrayModel(Dense(3 => 5, relu))  # 2 arrays, 20 params, 160 bytes
    +        ├── BagModel ↦ [SegmentedMean(5); SegmentedMax(5)] ↦ Dense(10 => 5, relu)  # 4 arrays, 65 params, 420 bytes
    +        │     ╰── BagModel ↦ [SegmentedMean(5); SegmentedMax(5)] ↦ Dense(10 => 5, relu)  # 4 arrays, 65 params, 420 bytes
    +        │           ╰── ArrayModel(Dense(2 => 5, relu))  # 2 arrays, 15 params, 140 bytes
    +        ╰── ArrayModel(Dense(2 => 5, relu))  # 2 arrays, 15 params, 140 bytes

    Both keyword arguments in action:

    julia> reflectinmodel(ds, d -> Dense(d, 5, relu), SegmentedMeanMax;
    +           fsm = Dict("" => d -> Chain(Dense(d, 20, relu), Dense(20, 12))),
    +           fsa = Dict("Y" => SegmentedMean, "g" => SegmentedPNorm)) |> printtreeBagModel ↦ [SegmentedMean(5); SegmentedMax(5)] ↦ Chain(Dense(10 => 20, relu), Dense(20 => 12))  # 6 arrays, 482 params, 2.117 KiB
    +  ╰── ProductModel ↦ Dense(20 => 5, relu)  # 2 arrays, 105 params, 500 bytes
    +        ├── BagModel ↦ SegmentedMean(5) ↦ Dense(5 => 5, relu)  # 3 arrays, 35 params, 260 bytes
    +        │     ╰── ArrayModel(Dense(4 => 5, relu))  # 2 arrays, 25 params, 180 bytes
    +        ├── ArrayModel(Dense(3 => 5, relu))  # 2 arrays, 20 params, 160 bytes
    +        ├── BagModel ↦ SegmentedPNorm(5) ↦ Dense(5 => 5, relu)  # 5 arrays, 45 params, 380 bytes
    +        │     ╰── BagModel ↦ [SegmentedMean(5); SegmentedMax(5)] ↦ Dense(10 => 5, relu)  # 4 arrays, 65 params, 420 bytes
    +        │           ╰── ArrayModel(Dense(2 => 5, relu))  # 2 arrays, 15 params, 140 bytes
    +        ╰── ArrayModel(Dense(2 => 5, relu))  # 2 arrays, 15 params, 140 bytes

    There are even more ways to modify the reflection behavior, see the reflectinmodel api reference.

    Float precision

    Mill.jl is built on top of Flux.jl, which by default uses 32-bit precision for model parameters:

    julia> Dense(2, 2).weight |> eltypeFloat32

    If you attempt to process Float64 data with model using lower precision, you get a warning:

    julia> x = randn(2, 2)2×2 Matrix{Float64}:
    + -1.13853  -0.721216
    + -2.21835   0.0331891
    julia> eltype(x)Float64
    julia> m = Dense(2, 2)Dense(2 => 2) # 6 parameters
    julia> m(x)┌ Warning: Layer with Float32 parameters got Float64 input. +│ The input will be converted, but any earlier layers may be very slow. +│ layer = Dense(2 => 2) # 6 parameters +│ summary(x) = "2×2 Matrix{Float64}" +└ @ Flux ~/.julia/packages/Flux/ljuc2/src/layers/stateless.jl:60 +2×2 Matrix{Float32}: + -2.01866 -0.022319 + 1.11091 -0.0697713

    Unless additional arguments are provided, reflectinmodel also instantiates all Dense layers using 32-bit precision:

    julia> x = randn(Float32, 2, 2) |> ArrayNode2×2 ArrayNode{Matrix{Float32}, Nothing}:
    +  0.7041741  -0.45216417
    + -0.3617286   1.4807765
    julia> eltype(Mill.data(x))Float32
    julia> m = reflectinmodel(x)ArrayModel(Dense(2 => 10)) # 2 arrays, 30 params, 200 bytes
    julia> m.m.weight |> eltypeFloat32

    Because reflectinmodel evaluates (sub)models on parts of the input when building the model, if some Float64 values are passed in, the warning is shown during construction as well as during the evaluation:

    julia> x = randn(2, 2) |> ArrayNode2×2 ArrayNode{Matrix{Float64}, Nothing}:
    + -0.2617165161930634   -1.1169820345030674
    +  0.03973931389554643  -1.9057709581450335
    julia> eltype(Mill.data(x))Float64
    julia> m = reflectinmodel(x)┌ Warning: Layer with Float32 parameters got Float64 input. +│ The input will be converted, but any earlier layers may be very slow. +│ layer = Dense(2 => 10) # 30 parameters +│ summary(x) = "2×2 Matrix{Float64}" +└ @ Flux ~/.julia/packages/Flux/ljuc2/src/layers/stateless.jl:60 +ArrayModel(Dense(2 => 10)) # 2 arrays, 30 params, 200 bytes
    julia> m(x)┌ Warning: Layer with Float32 parameters got Float64 input. +│ The input will be converted, but any earlier layers may be very slow. +│ layer = Dense(2 => 10) # 30 parameters +│ summary(x) = "2×2 Matrix{Float64}" +└ @ Flux ~/.julia/packages/Flux/ljuc2/src/layers/stateless.jl:60 +10×2 Matrix{Float32}: + 0.178307 -0.207178 + -0.174379 -0.190231 + 0.126416 -0.390108 + 0.0908661 -0.823867 + -0.0826094 -0.324438 + 0.0130696 0.325754 + -0.071541 -0.666409 + 0.0525041 0.328029 + 0.0982923 -0.174111 + 0.178692 0.530059

    To prevent this from happening, we recommend making sure that the same precision is used for input data and for reflectinmodel parameters. For example:

    julia> x32 = randn(Float32, 2, 2) |> ArrayNode2×2 ArrayNode{Matrix{Float32}, Nothing}:
    + 1.1421611  0.8822706
    + 2.514736   0.036934458
    julia> m = reflectinmodel(x32)ArrayModel(Dense(2 => 10)) # 2 arrays, 30 params, 200 bytes
    julia> x64 = randn(2, 2) |> ArrayNode2×2 ArrayNode{Matrix{Float64}, Nothing}: + 0.3560285043427309 0.9366766658560893 + 0.6108965887101426 1.560294028451233
    julia> m = reflectinmodel(x64, d -> f64(Dense(d, 5)), d -> f64(SegmentedMean(d)))ArrayModel(Dense(2 => 5)) # 2 arrays, 15 params, 200 bytes

    Functions Flux.f64 and Flux.f32 may come in handy.

    diff --git a/v2.10.1/motivation/index.html b/v2.10.1/motivation/index.html new file mode 100644 index 00000000..36d957e8 --- /dev/null +++ b/v2.10.1/motivation/index.html @@ -0,0 +1,4 @@ + +Motivation · Mill.jl

    Motivation

    In this section, we provide a short introduction into (hierarchical) multi instance learning. A much more detailed overview of this subject can be found in [1] and [4].

    What is a Multiple instance learning problem?

    In Multiple Instance Learning (MIL), also Multi-Instance Learning, the sample $\bm{x}$ is a set of vectors (or matrices) $\{x_1,\ldots,x_l\}$, where $x_i \in \mathbb{R}^d$. As a result, order does not matter, which makes MIL problems different from sequences. In MIL parlance, sample $\bm{x}$ is also called a bag and its elements $x_1, \ldots, x_2$ instances. MIL problems have been introduced in [5], and extended and generalized in a series of works [2], [3], [6]. The most comprehensive introduction known to authors is [4].

    Why are MIL problems relevant? Since the seminal paper from [7], the majority of machine learning problems deals with problems like the one shown below:[1]

    Iris task +Iris task

    where the input sample $\bm{x}$ is a vector (or generally speaking any tensor) of a fixed dimension containing various measurements of the specimen.

    Most of the time, a skilled botanist is able to identify a specimen not by making use of any measuring device, but by visual or tactile inspection of its stem, leaves and blooms. For different species, different parts of the flower may need to be examined for indicators. At the same time, many species may have nearly identical-looking leaves or blooms, therefore, one needs to step back, consider the whole picture, and appropriately combine lower-level observations into high-level conclusions about the given specimen.

    If we want to use such more elaborate description of the Iris flower using fixed size structures, we will have a hard time, because every specimen can have a different amounts of leaves or blooms (or they may be completely missing). This means that to use the usual fixed dimension paradigm, we have to either somehow select a single leaf (blossom) and extract features from them, or design procedures for aggregating such features over whole sets, so that the output has fixed dimension. This is clearly undesirable. Mill.jl a framework that seamlessly deals with these challenges in data representation.

    Hierarchical Multiple Instance Learning

    In Hierarchical Multiple Instance Learning (HMIL) the input may consists of not only sets, but also sets of sets and Cartesian Products of these structures. Returning to the previous Iris flower example, a specimen can be represented like this for HMIL:

    Iris HMIL representation +Iris HMIL representation

    The only stem is represented by vector $\bm{x}_s$ encoding its distinctive properties such as shape, color, structure or texture. Next, we inspect all blooms. Each of the blooms may have distinctive discriminative signs, therefore, we describe all three in vectors $\bm{x}_{b_1}, \bm{x}_{b_2}, \bm{x}_{b_3}$, one vector for each bloom, and group them to a set. Finally, $\bm{x}_u$ represents the only flower which has not blossomed. Likewise, we could describe all leaves of the specimen if any were present. Here we assume that each specimen of the considered species has only one stem, but may have multiple flowers or leaves. Hence, all blooms and buds are represented as unordered sets of vectors as opposed to stem representation, which consists of only one vector.

    How does MIL models cope with variability in numbers of flowers and leaves? Each MIL model consists of two feed-forward neural networks with an element-wise aggregation operator like mean (or maximum) sandwiched between them. Denoting those feed-forward networks (FFNs) as $f_1$ and $f_2$, the output of the model applied to a bag is calculated for example as $f_2 \left(\frac{1}{l}\sum_{i=1}^l f_1(x_i) \right)$ if we use mean as an aggregation function.

    The HMIL model corresponding to the Iris example above would comprise two FFNs and an aggregation to convert set of leafs to a single vector, and another two FFNs and an aggregation to convert set of blossoms to a single vector. These two outputs would be concatenated with a description of a stem, which would be fed to yet another FFN providing the final output. Since the whole scheme is differentiable, we can compute gradients and use any available gradient-based method to optimize the whole model at once using only labels on the level of output[2].

    The Mill.jl library simplifies implementation of machine learning problems using (H)MIL representation. In theory, it can represent any problem that can be represented in JSONs. That is why we have created a separate tool, JsonGrinder.jl, which helps with processing JSON documents for learning.

    In [6], authors have further extended the Universal approximation theorem to MIL problems, their Cartesian products, and nested MIL problems, i.e. a case where instances of one bag are in fact bags again.

    Relation to Graph Neural Networks

    HMIL problems can be seen as a special subset of general graphs. They differ in two important ways:

    • In general graphs, vertices are of a small number of semantic type, whereas in HMIL problems, the number of semantic types of vertices is much higher (it is helpful to think about HMIL problems as about those for which JSON is a natural representation).
    • The computational graph of HMIL is a tree, which introduces assumption that there exist an efficient inference. Contrary, in general graphs (with loops) there is no efficient inference and one has to resort to message passing (Loopy belief propagation).
    • One update message in loopy belief propagation can be viewed as a MIL problem, as it has to produce a vector based on infomation inthe neighborhood, which can contain an arbitrary number of vertices.

    Differences from sequence-based modeling

    The major difference is that instances in bag are not ordered in any way. This means that if a sequence $(a,b,c)$ should be treated as a set, then the output of a function f should be the same for any permutation, i.e. $f(abc) = f(cba) = f(bac) = \ldots$.

    This property has a dramatic implication on the computational complexity. Sequences are typically modeled using Recurrent Neural Networks (RNNs), where the output is calculated roughly as $f(abc) = g(a, g(b, g(c)))$. During optimization, a gradient of $g$ needs to be calculated recursively, giving raise to infamous vanishing / exploding gradient problems. In constrast, (H)MIL models calculate the output as $f(\frac{1}{3}(g(a) + g(b) + g(c)))$ (slightly abusing notation again), which means that the gradient of $g$ can be calculated in parallel and not recurrently.

    • 1Iris flower data set
    • 2Some methods for MIL problems require instance-level labels as well, which are not always available.
    diff --git a/v2.10.1/references/index.html b/v2.10.1/references/index.html new file mode 100644 index 00000000..274a2871 --- /dev/null +++ b/v2.10.1/references/index.html @@ -0,0 +1,2 @@ + +References · Mill.jl

    References

    [1]
    S. Mandlı́k, M. Racinsky, V. Lisý and T. Pevný. JsonGrinder.jl: automated differentiable neural architecture for embedding arbitrary JSON data. J. Mach. Learn. Res. 23, 298:1–298:5 (2022).
    [2]
    T. Pevný and P. Somol. Discriminative models for multi-instance problems with tree-structure. CoRR abs/1703.02868 (2017), arXiv:1703.02868.
    [3]
    T. Pevný and P. Somol. Using Neural Network Formalism to Solve Multiple-Instance Problems. In: Advances in Neural Networks - ISNN 2017 - 14th International Symposium, ISNN 2017, Sapporo, Hakodate, and Muroran, Hokkaido, Japan, June 21-26, 2017, Proceedings, Part I, Vol. 10261 of Lecture Notes in Computer Science, edited by F. Cong, A. Leung and Q. Wei (Springer, 2017); pp. 135–142.
    [4]
    Š. Mandlík and T. Pevný. Mapping the Internet: Modelling Entity Interactions in Complex Heterogeneous Networks. Master's thesis, Czech Technical University (2020), https://dspace.cvut.cz/handle/10467/87851?locale-attribute=en.
    [5]
    T. G. Dietterich, R. H. Lathrop and T. Lozano-Pérez. Solving the Multiple Instance Problem with Axis-Parallel Rectangles. Artif. Intell. 89, 31–71 (1997).
    [6]
    [7]
    R. A. Fisher. The use of multiple measurements in taxonomic problems. Annals of eugenics 7, 179–188 (1936).
    [8]
    O. Z. Kraus, L. J. Ba and B. J. Frey. Classifying and Segmenting Microscopy Images Using Convolutional Multiple Instance Learning. CoRR abs/1511.05286 (2015), arXiv:1511.05286.
    [9]
    Gülçehre, K. Cho, R. Pascanu and Y. Bengio. Learned-Norm Pooling for Deep Feedforward and Recurrent Neural Networks. In: Machine Learning and Knowledge Discovery in Databases - European Conference, ECML PKDD 2014, Nancy, France, September 15-19, 2014. Proceedings, Part I, Vol. 8724 of Lecture Notes in Computer Science, edited by T. Calders, F. Esposito, E. Hüllermeier and R. Meo (Springer, 2014); pp. 530–546.
    [10]
    diff --git a/v2.10.1/search_index.js b/v2.10.1/search_index.js new file mode 100644 index 00000000..4950e8ba --- /dev/null +++ b/v2.10.1/search_index.js @@ -0,0 +1,3 @@ +var documenterSearchIndex = {"docs": +[{"location":"manual/more_on_nodes/","page":"More on nodes","title":"More on nodes","text":"using Mill","category":"page"},{"location":"manual/more_on_nodes/#More-on-nodes","page":"More on nodes","title":"More on nodes","text":"","category":"section"},{"location":"manual/more_on_nodes/#Node-nesting","page":"More on nodes","title":"Node nesting","text":"","category":"section"},{"location":"manual/more_on_nodes/","page":"More on nodes","title":"More on nodes","text":"The main advantage of the Mill.jl library is that it allows to arbitrarily nest and cross-product BagModels, as described in Theorem 5 in [6]. In other words, instances themselves may be represented in much more complex way than in the BagNode and BagModel example.","category":"page"},{"location":"manual/more_on_nodes/","page":"More on nodes","title":"More on nodes","text":"Let's start the demonstration by nesting two MIL problems. The outer MIL model contains three samples (outer-level bags), whose instances are (inner-level) bags themselves. The first outer-level bag contains one inner-level bag problem with two inner-level instances, the second outer-level bag contains two inner-level bags with total of three inner-level instances, and finally the third outer-level bag contains two inner bags with four instances:","category":"page"},{"location":"manual/more_on_nodes/","page":"More on nodes","title":"More on nodes","text":"ds = BagNode(BagNode(ArrayNode(randn(Float32, 4, 10)),\n [1:2, 3:4, 5:5, 6:7, 8:10]),\n [1:1, 2:3, 4:5])","category":"page"},{"location":"manual/more_on_nodes/","page":"More on nodes","title":"More on nodes","text":"Here is one example of a model, which is appropriate for this hierarchy:","category":"page"},{"location":"manual/more_on_nodes/","page":"More on nodes","title":"More on nodes","text":"using Flux: Dense, Chain, relu","category":"page"},{"location":"manual/more_on_nodes/","page":"More on nodes","title":"More on nodes","text":"m = BagModel(\n BagModel(\n ArrayModel(Dense(4, 3, relu)),\n SegmentedMeanMax(3),\n Dense(6, 3, relu)),\n SegmentedMeanMax(3),\n Chain(Dense(6, 3, relu), Dense(3, 2)))","category":"page"},{"location":"manual/more_on_nodes/","page":"More on nodes","title":"More on nodes","text":"and can be directly applied to obtain a result:","category":"page"},{"location":"manual/more_on_nodes/","page":"More on nodes","title":"More on nodes","text":"m(ds)","category":"page"},{"location":"manual/more_on_nodes/","page":"More on nodes","title":"More on nodes","text":"Here we again make use of the property that even if each instance is represented with an arbitrarily complex structure, we always obtain a vector representation after applying instance model im, regardless of the complexity of im and Mill.data(ds):","category":"page"},{"location":"manual/more_on_nodes/","page":"More on nodes","title":"More on nodes","text":"m.im(Mill.data(ds))","category":"page"},{"location":"manual/more_on_nodes/","page":"More on nodes","title":"More on nodes","text":"In one final example we demonstrate a complex model consisting of all types of nodes introduced so far:","category":"page"},{"location":"manual/more_on_nodes/","page":"More on nodes","title":"More on nodes","text":"ds = BagNode(ProductNode((BagNode(randn(Float32, 4, 10),\n [1:2, 3:4, 5:5, 6:7, 8:10]),\n randn(Float32, 3, 5),\n BagNode(BagNode(randn(Float32, 2, 30),\n [i:i+1 for i in 1:2:30]),\n [1:3, 4:6, 7:9, 10:12, 13:15]),\n randn(Float32, 2, 5))),\n [1:1, 2:3, 4:5])","category":"page"},{"location":"manual/more_on_nodes/","page":"More on nodes","title":"More on nodes","text":"When data and model trees become complex, Mill limits the printing. To inspect the whole tree, use printtree:","category":"page"},{"location":"manual/more_on_nodes/","page":"More on nodes","title":"More on nodes","text":"printtree(ds)","category":"page"},{"location":"manual/more_on_nodes/","page":"More on nodes","title":"More on nodes","text":"Instead of defining a model manually, we can also make use of Model reflection, another Mill functionality, which simplifies model creation:","category":"page"},{"location":"manual/more_on_nodes/","page":"More on nodes","title":"More on nodes","text":"m = reflectinmodel(ds, d -> Dense(d, 2), SegmentedMean)\nm(ds)","category":"page"},{"location":"manual/more_on_nodes/#Node-conveniences","page":"More on nodes","title":"Node conveniences","text":"","category":"section"},{"location":"manual/more_on_nodes/","page":"More on nodes","title":"More on nodes","text":"To make the handling of data and model hierarchies easier, Mill provides several tools. Let's setup some data:","category":"page"},{"location":"manual/more_on_nodes/","page":"More on nodes","title":"More on nodes","text":"AN = ArrayNode(Float32.([1 2 3 4; 5 6 7 8]))\nAM = reflectinmodel(AN)\nBN = BagNode(AN, [1:1, 2:3, 4:4])\nBM = reflectinmodel(BN)\nPN = ProductNode(a=Float32.([1 2 3; 4 5 6]), b=BN)\nPM = reflectinmodel(PN)","category":"page"},{"location":"manual/more_on_nodes/#Function:-numobs","page":"More on nodes","title":"Function: numobs","text":"","category":"section"},{"location":"manual/more_on_nodes/","page":"More on nodes","title":"More on nodes","text":"numobs function from MLUtils.jl returns a number of samples from the current level point of view. This number usually increases as we go down the tree when BagNodes are involved, as each bag may contain more than one instance.","category":"page"},{"location":"manual/more_on_nodes/","page":"More on nodes","title":"More on nodes","text":"numobs(AN)\nnumobs(BN)\nnumobs(PN)","category":"page"},{"location":"manual/more_on_nodes/#Indexing-and-Slicing","page":"More on nodes","title":"Indexing and Slicing","text":"","category":"section"},{"location":"manual/more_on_nodes/","page":"More on nodes","title":"More on nodes","text":"Indexing in [Mill] operates on the level of observations:","category":"page"},{"location":"manual/more_on_nodes/","page":"More on nodes","title":"More on nodes","text":"AN[1]\nnumobs(ans)\nBN[2]\nnumobs(ans)\nPN[3]\nnumobs(ans)\nAN[[1, 4]]\nnumobs(ans)\nBN[1:2]\nnumobs(ans)\nPN[[2, 3]]\nnumobs(ans)\nPN[Int[]]\nnumobs(ans)","category":"page"},{"location":"manual/more_on_nodes/","page":"More on nodes","title":"More on nodes","text":"This may be useful for creating minibatches and their permutations.","category":"page"},{"location":"manual/more_on_nodes/","page":"More on nodes","title":"More on nodes","text":"Note that apart from the perhaps apparent recurrent effect, this operation requires other implicit actions, such as properly recomputing bag indices:","category":"page"},{"location":"manual/more_on_nodes/","page":"More on nodes","title":"More on nodes","text":"BN.bags\nBN[[1, 3]].bags","category":"page"},{"location":"manual/more_on_nodes/#Function:-[catobs](@ref)","page":"More on nodes","title":"Function: catobs","text":"","category":"section"},{"location":"manual/more_on_nodes/","page":"More on nodes","title":"More on nodes","text":"catobs function concatenates several samples (datasets) together:","category":"page"},{"location":"manual/more_on_nodes/","page":"More on nodes","title":"More on nodes","text":"catobs(AN[1], AN[4])\ncatobs(BN[3], BN[[2, 1]])\ncatobs(PN[[1, 2]], PN[3:3]) == PN","category":"page"},{"location":"manual/more_on_nodes/","page":"More on nodes","title":"More on nodes","text":"Again, the effect is recurrent and everything is appropriately recomputed:","category":"page"},{"location":"manual/more_on_nodes/","page":"More on nodes","title":"More on nodes","text":"BN.bags\ncatobs(BN[3], BN[[1]]).bags","category":"page"},{"location":"manual/more_on_nodes/","page":"More on nodes","title":"More on nodes","text":"This operation is an analogy to what is usually done in the classical setting. If every observation is represented as a vector of features, each (mini)batch of samples is first concatenated into one matrix and the whole matrix is run through the neural network using fast matrix multiplication procedures. The same reasoning applies here, but instead of Base.cat, catobs is needed.","category":"page"},{"location":"manual/more_on_nodes/","page":"More on nodes","title":"More on nodes","text":"Equipped with everything mentioned above there are two different ways to construct minibatches from data. First option, applicable mainly to smaller datasets, is to load all avaiable data into memory, store it as one big data node containing all observations, and use Indexing and Slicing to obtain minibatches. Such approach is demonstrated in the Musk example. The other option is to read all observations into memory separately (or load them on demand) and construct minibatches with catobs.","category":"page"},{"location":"manual/more_on_nodes/","page":"More on nodes","title":"More on nodes","text":"ukn: More tips\nFor more tips for handling datasets and models, see External tools.","category":"page"},{"location":"manual/more_on_nodes/#Metadata","page":"More on nodes","title":"Metadata","text":"","category":"section"},{"location":"manual/more_on_nodes/","page":"More on nodes","title":"More on nodes","text":"Each AbstractMillNode can also carry arbitrary metadata (defaulting to nothing). Metadata is provided upon construction of the node and accessed metadata by Mill.metadata:","category":"page"},{"location":"manual/more_on_nodes/","page":"More on nodes","title":"More on nodes","text":"n1 = ArrayNode(randn(2, 2), [\"metadata\"])\nMill.metadata(n1)\nn2 = ProductNode(n1, [1 3; 2 4])\nMill.metadata(n2)","category":"page"},{"location":"references/#References","page":"References","title":"References","text":"","category":"section"},{"location":"references/","page":"References","title":"References","text":"S. Mandlı́k, M. Racinsky, V. Lisý and T. Pevný. JsonGrinder.jl: automated differentiable neural architecture for embedding arbitrary JSON data. J. Mach. Learn. Res. 23, 298:1–298:5 (2022).\n\n\n\nT. Pevný and P. Somol. Discriminative models for multi-instance problems with tree-structure. CoRR abs/1703.02868 (2017), arXiv:1703.02868.\n\n\n\nT. Pevný and P. Somol. Using Neural Network Formalism to Solve Multiple-Instance Problems. In: Advances in Neural Networks - ISNN 2017 - 14th International Symposium, ISNN 2017, Sapporo, Hakodate, and Muroran, Hokkaido, Japan, June 21-26, 2017, Proceedings, Part I, Vol. 10261 of Lecture Notes in Computer Science, edited by F. Cong, A. Leung and Q. Wei (Springer, 2017); pp. 135–142.\n\n\n\nŠ. Mandlík and T. Pevný. Mapping the Internet: Modelling Entity Interactions in Complex Heterogeneous Networks. Master's thesis, Czech Technical University (2020), https://dspace.cvut.cz/handle/10467/87851?locale-attribute=en.\n\n\n\nT. G. Dietterich, R. H. Lathrop and T. Lozano-Pérez. Solving the Multiple Instance Problem with Axis-Parallel Rectangles. Artif. Intell. 89, 31–71 (1997).\n\n\n\nT. Pevný and V. Kovarı́k. Approximation capability of neural networks on spaces of probability measures and tree-structured domains. CoRR abs/1906.00764 (2019), arXiv:1906.00764.\n\n\n\nR. A. Fisher. The use of multiple measurements in taxonomic problems. Annals of eugenics 7, 179–188 (1936).\n\n\n\nO. Z. Kraus, L. J. Ba and B. J. Frey. Classifying and Segmenting Microscopy Images Using Convolutional Multiple Instance Learning. CoRR abs/1511.05286 (2015), arXiv:1511.05286.\n\n\n\nGülçehre, K. Cho, R. Pascanu and Y. Bengio. Learned-Norm Pooling for Deep Feedforward and Recurrent Neural Networks. In: Machine Learning and Knowledge Discovery in Databases - European Conference, ECML PKDD 2014, Nancy, France, September 15-19, 2014. Proceedings, Part I, Vol. 8724 of Lecture Notes in Computer Science, edited by T. Calders, F. Esposito, E. Hüllermeier and R. Meo (Springer, 2014); pp. 530–546.\n\n\n\nT. Pevný and M. Dedic. Nested Multiple Instance Learning in Modelling of HTTP network traffic. CoRR abs/2002.04059 (2020), arXiv:2002.04059.\n\n\n\n","category":"page"},{"location":"api/special_arrays/#Special-arrays","page":"Special Arrays","title":"Special arrays","text":"","category":"section"},{"location":"api/special_arrays/#Index","page":"Special Arrays","title":"Index","text":"","category":"section"},{"location":"api/special_arrays/","page":"Special Arrays","title":"Special Arrays","text":"Pages = [\"special_arrays.md\"]","category":"page"},{"location":"api/special_arrays/#API","page":"Special Arrays","title":"API","text":"","category":"section"},{"location":"api/special_arrays/","page":"Special Arrays","title":"Special Arrays","text":"MaybeHotVector\nmaybehot\nMaybeHotMatrix\nmaybehotbatch\nmaybecold\n\nNGramIterator\nNGramIterator(::AbstractString, ::Any, ::Any, ::Any)\nngrams\nngrams!\ncountngrams\ncountngrams!\nNGramMatrix\nNGramMatrix(::Missing)\n\nPostImputingMatrix\nPostImputingMatrix(::AbstractMatrix)\npostimputing_dense\n\nPreImputingMatrix\nPreImputingMatrix(::AbstractMatrix)\npreimputing_dense","category":"page"},{"location":"api/special_arrays/#Mill.MaybeHotVector","page":"Special Arrays","title":"Mill.MaybeHotVector","text":"MaybeHotVector{T, U, V} <: AbstractVector{V}\n\nA vector-like structure for representing one-hot encoded variables. Like Flux.OneHotVector but supports missing values.\n\nConstruct with the maybehot function.\n\nSee also: MaybeHotMatrix, maybehotbatch.\n\n\n\n\n\n","category":"type"},{"location":"api/special_arrays/#Mill.maybehot","page":"Special Arrays","title":"Mill.maybehot","text":"maybehot(l, labels)\n\nReturn a MaybeHotVector where the first occurence of l in labels is set to 1 and all other elements are set to 0.\n\nExamples\n\njulia> maybehot(:b, [:a, :b, :c])\n3-element MaybeHotVector with eltype Bool:\n ⋅\n 1\n ⋅\n\njulia> maybehot(missing, 1:3)\n3-element MaybeHotVector with eltype Missing:\n missing\n missing\n missing\n\nSee also: maybehotbatch, MaybeHotVector, MaybeHotMatrix.\n\n\n\n\n\n","category":"function"},{"location":"api/special_arrays/#Mill.MaybeHotMatrix","page":"Special Arrays","title":"Mill.MaybeHotMatrix","text":"MaybeHotMatrix{T, U, V} <: AbstractMatrix{V}\n\nA matrix-like structure for representing one-hot encoded variables. Like Flux.OneHotMatrix but supports missing values.\n\nConstruct with the maybehotbatch function.\n\nSee also: MaybeHotVector, maybehot.\n\n\n\n\n\n","category":"type"},{"location":"api/special_arrays/#Mill.maybehotbatch","page":"Special Arrays","title":"Mill.maybehotbatch","text":"maybehotbatch(ls, labels)\n\nReturn a MaybeHotMatrix in which each column corresponds to one element of ls containing 1 at its first occurence in labels with all other elements set to 0.\n\nExamples\n\njulia> maybehotbatch([:c, :a], [:a, :b, :c])\n3×2 MaybeHotMatrix with eltype Bool:\n ⋅ 1\n ⋅ ⋅\n 1 ⋅\n\njulia> maybehotbatch([missing, 2], 1:3)\n3×2 MaybeHotMatrix with eltype Union{Missing, Bool}:\n missing ⋅\n missing true\n missing ⋅\n\nSee also: maybehot, MaybeHotMatrix, MaybeHotVector.\n\n\n\n\n\n","category":"function"},{"location":"api/special_arrays/#Mill.maybecold","page":"Special Arrays","title":"Mill.maybecold","text":"maybecold(y, labels=1:size(y,1))\n\nSimilar to Flux.onecold but when y contains missing values, missing is in the result as well.\n\nTherefore, it is roughly the inverse operation of maybehot or maybehotbatch.\n\nExamples\n\njulia> maybehot(:b, [:a, :b, :c])\n3-element MaybeHotVector with eltype Bool:\n ⋅\n 1\n ⋅\n\njulia> maybecold(ans, [:a, :b, :c])\n:b\n\njulia> maybehot(missing, 1:3)\n3-element MaybeHotVector with eltype Missing:\n missing\n missing\n missing\n\njulia> maybecold(ans)\nmissing\n\njulia> maybecold(maybehotbatch([missing, 2], 1:3))\n2-element Vector{Union{Missing, Int64}}:\n missing\n 2\n\nSee also: Flux.onecold, maybehot, maybehotbatch.\n\n\n\n\n\n","category":"function"},{"location":"api/special_arrays/#Mill.NGramIterator","page":"Special Arrays","title":"Mill.NGramIterator","text":"NGramIterator{T}\n\nIterates over ngram codes of collection of integers s using Mill.string_start_code() and Mill.string_end_code() for padding. NGram codes are computed as in positional number systems, where items of s are digits, b is the base, and m is modulo.\n\nIn order to reduce collisions when mixing ngrams of different order one should avoid zeros and negative integers in s and should set base b to the expected number of unique tokens in s.\n\nSee also: NGramMatrix, ngrams, ngrams!, countngrams, countngrams!.\n\n\n\n\n\n","category":"type"},{"location":"api/special_arrays/#Mill.NGramIterator-Tuple{AbstractString, Any, Any, Any}","page":"Special Arrays","title":"Mill.NGramIterator","text":"NGramIterator(s, n=3, b=256, m=typemax(Int))\n\nConstruct an NGramIterator. If s is an AbstractString it is first converted to integers with Base.codeunits.\n\nExamples\n\njulia> NGramIterator(\"deadbeef\", 3, 256, 17) |> collect\n10-element Vector{Int64}:\n 2\n 16\n 9\n 9\n 6\n 10\n 11\n 15\n 2\n 6\n\njulia> NGramIterator(collect(1:9), 3, 10, 1009) |> collect\n11-element Vector{Int64}:\n 221\n 212\n 123\n 234\n 345\n 456\n 567\n 678\n 789\n 893\n 933\n\njulia> Mill.string_start_code()\n0x02\n\njulia> Mill.string_end_code()\n0x03\n\nSee also: NGramMatrix, ngrams, ngrams!, countngrams, countngrams!.\n\n\n\n\n\n","category":"method"},{"location":"api/special_arrays/#Mill.ngrams","page":"Special Arrays","title":"Mill.ngrams","text":"ngrams(o, x, n=3, b=256)\n\nReturn codes of n grams of x using base b.\n\nExamples\n\njulia> ngrams(\"foo\", 3, 256)\n5-element Vector{Int64}:\n 131686\n 157295\n 6713199\n 7302915\n 7275267\n\nSee also: ngrams!, countngrams, countngrams!, NGramMatrix, NGramIterator.\n\n\n\n\n\n","category":"function"},{"location":"api/special_arrays/#Mill.ngrams!","page":"Special Arrays","title":"Mill.ngrams!","text":"ngrams!(o, x, n=3, b=256)\n\nStore codes of n grams of x using base b to o.\n\nExamples\n\njulia> o = zeros(Int, 5)\n5-element Vector{Int64}:\n 0\n 0\n 0\n 0\n 0\n\njulia> ngrams!(o, \"foo\", 3, 256)\n5-element Vector{Int64}:\n 131686\n 157295\n 6713199\n 7302915\n 7275267\n\nSee also: ngrams, countngrams, countngrams!, NGramMatrix, NGramIterator.\n\n\n\n\n\n","category":"function"},{"location":"api/special_arrays/#Mill.countngrams","page":"Special Arrays","title":"Mill.countngrams","text":"countngrams(o, x, n, b, m)\n\nCount the number of of n grams of x using base b and modulo m into a vector of length m in case x is a single sequence or into a matrix with m rows if x is an iterable of sequences.\n\nExamples\n\njulia> countngrams(\"foo\", 3, 256, 5)\n5-element Vector{Int64}:\n 2\n 1\n 1\n 0\n 1\n\njulia> countngrams([\"foo\", \"bar\"], 3, 256, 5)\n5×2 Matrix{Int64}:\n 2 1\n 1 0\n 1 2\n 0 0\n 1 2\n\nSee also: countngrams!, ngrams, ngrams!, NGramMatrix, NGramIterator.\n\n\n\n\n\n","category":"function"},{"location":"api/special_arrays/#Mill.countngrams!","page":"Special Arrays","title":"Mill.countngrams!","text":"countngrams!(o, x, n, b, m=length(o))\n\nCount the number of of n grams of x using base b and modulo m and store the result to o.\n\nExamples\n\njulia> o = zeros(Int, 5)\n5-element Vector{Int64}:\n 0\n 0\n 0\n 0\n 0\n\njulia> countngrams!(o, \"foo\", 3, 256)\n5-element Vector{Int64}:\n 2\n 1\n 1\n 0\n 1\n\nSee also: countngrams, ngrams, ngrams!, NGramMatrix, NGramIterator.\n\n\n\n\n\n","category":"function"},{"location":"api/special_arrays/#Mill.NGramMatrix","page":"Special Arrays","title":"Mill.NGramMatrix","text":"NGramMatrix{T, U, V} <: AbstractMatrix{U}\n\nA matrix-like structure for lazily representing sequences like strings as ngrams of cardinality n using b as a base for calculations and m as the modulo. Therefore, the matrix has m rows and one column for representing each sequence. Missing sequences are supported.\n\nSee also: NGramIterator, ngrams, ngrams!, countngrams, countngrams!.\n\n\n\n\n\n","category":"type"},{"location":"api/special_arrays/#Mill.NGramMatrix-Tuple{Missing}","page":"Special Arrays","title":"Mill.NGramMatrix","text":"NGramMatrix(s, n=3, b=256, m=2053)\n\nConstruct an NGramMatrix. s can either be a single sequence or any AbstractVector.\n\nExamples\n\njulia> NGramMatrix([1,2,3])\n2053×1 NGramMatrix{Vector{Int64}, Vector{Vector{Int64}}, Int64}:\n [1, 2, 3]\n\njulia> NGramMatrix([\"a\", missing, \"c\"], 2, 128)\n2053×3 NGramMatrix{Union{Missing, String}, Vector{Union{Missing, String}}, Union{Missing, Int64}}:\n \"a\"\n missing\n \"c\"\n\nSee also: NGramIterator, ngrams, ngrams!, countngrams, countngrams!.\n\n\n\n\n\n","category":"method"},{"location":"api/special_arrays/#Mill.PostImputingMatrix","page":"Special Arrays","title":"Mill.PostImputingMatrix","text":"PostImputingMatrix{T <: Number, U <: AbstractMatrix{T}, V <: AbstractVector{T}} <: AbstractMatrix{T}\n\nA parametrized matrix that fills in a default vector of parameters whenever a \"missing\" column is encountered during multiplication.\n\nSupports multiplication with NGramMatrix, MaybeHotMatrix and MaybeHotVector. For any other AbstractMatrix it falls back to standard multiplication.\n\nExamples\n\njulia> A = PostImputingMatrix(ones(2, 2), -ones(2))\n2×2 PostImputingMatrix{Float64, Matrix{Float64}, Vector{Float64}}:\nW:\n 1.0 1.0\n 1.0 1.0\n\nψ:\n -1.0\n -1.0\n\njulia> A * maybehotbatch([1, missing], 1:2)\n2×2 Matrix{Float64}:\n 1.0 -1.0\n 1.0 -1.0\n\nSee also: PreImputingMatrix.\n\n\n\n\n\n","category":"type"},{"location":"api/special_arrays/#Mill.PostImputingMatrix-Tuple{AbstractMatrix}","page":"Special Arrays","title":"Mill.PostImputingMatrix","text":"PostImputingMatrix(W::AbstractMatrix{T}, ψ=zeros(T, size(W, 1))) where T\n\nConstruct a PostImputingMatrix with multiplication parameters W and default parameters ψ.\n\nExamples\n\njulia> PostImputingMatrix([1 2; 3 4])\n2×2 PostImputingMatrix{Int64, Matrix{Int64}, Vector{Int64}}:\nW:\n 1 2\n 3 4\n\nψ:\n 0\n 0\n\nSee also: PreImputingMatrix.\n\n\n\n\n\n","category":"method"},{"location":"api/special_arrays/#Mill.postimputing_dense","page":"Special Arrays","title":"Mill.postimputing_dense","text":"postimputing_dense(d_in, d_out, σ)\n\nLike Flux.Dense, but use a PostImputingMatrix instead of a standard matrix.\n\nExamples\n\njulia> d = postimputing_dense(3, 2)\n[postimputing]Dense(3 => 2) # 3 arrays, 10 params, 160 bytes\n\njulia> typeof(d.weight)\nPostImputingMatrix{Float32, Matrix{Float32}, Vector{Float32}}\n\njulia> typeof(d.bias)\nVector{Float32} (alias for Array{Float32, 1})\n\nSee also: PostImputingMatrix, preimputing_dense, PreImputingMatrix.\n\n\n\n\n\n","category":"function"},{"location":"api/special_arrays/#Mill.PreImputingMatrix","page":"Special Arrays","title":"Mill.PreImputingMatrix","text":"PreImputingMatrix{T <: Number, U <: AbstractMatrix{T}, V <: AbstractVector{T}} <: AbstractMatrix{T}\n\nA parametrized matrix that fills in elements from a default vector of parameters whenever a missing element is encountered during multiplication.\n\nExamples\n\njulia> A = PreImputingMatrix(ones(2, 2), -ones(2))\n2×2 PreImputingMatrix{Float64, Matrix{Float64}, Vector{Float64}}:\nW:\n 1.0 1.0\n 1.0 1.0\n\nψ:\n -1.0 -1.0\n\njulia> A * [0 1; missing -1]\n2×2 Matrix{Float64}:\n -1.0 0.0\n -1.0 0.0\n\nSee also: PreImputingMatrix.\n\n\n\n\n\n","category":"type"},{"location":"api/special_arrays/#Mill.PreImputingMatrix-Tuple{AbstractMatrix}","page":"Special Arrays","title":"Mill.PreImputingMatrix","text":"PreImputingMatrix(W::AbstractMatrix{T}, ψ=zeros(T, size(W, 2))) where T\n\nConstruct a PreImputingMatrix with multiplication parameters W and default parameters ψ.\n\nExamples\n\njulia> PreImputingMatrix([1 2; 3 4])\n2×2 PreImputingMatrix{Int64, Matrix{Int64}, Vector{Int64}}:\nW:\n 1 2\n 3 4\n\nψ:\n 0 0\n\nSee also: PostImputingMatrix.\n\n\n\n\n\n","category":"method"},{"location":"api/special_arrays/#Mill.preimputing_dense","page":"Special Arrays","title":"Mill.preimputing_dense","text":"preimputing_dense(in, out, σ)\n\nLike Flux.Dense, but use a PreImputingMatrix instead of a standard matrix.\n\nExamples\n\njulia> d = preimputing_dense(2, 3)\n[preimputing]Dense(2 => 3) # 3 arrays, 11 params, 164 bytes\n\njulia> typeof(d.weight)\nPreImputingMatrix{Float32, Matrix{Float32}, Vector{Float32}}\n\njulia> typeof(d.bias)\nVector{Float32} (alias for Array{Float32, 1})\n\nSee also: PreImputingMatrix, postimputing_dense, PostImputingMatrix.\n\n\n\n\n\n","category":"function"},{"location":"api/aggregation/#Aggregation","page":"Aggregation","title":"Aggregation","text":"","category":"section"},{"location":"api/aggregation/#Index","page":"Aggregation","title":"Index","text":"","category":"section"},{"location":"api/aggregation/","page":"Aggregation","title":"Aggregation","text":"Pages = [\"aggregation.md\"]","category":"page"},{"location":"api/aggregation/#API","page":"Aggregation","title":"API","text":"","category":"section"},{"location":"api/aggregation/","page":"Aggregation","title":"Aggregation","text":"AbstractAggregation\nAggregationStack\n\nSegmentedSum\nSegmentedMax\nSegmentedMean\nSegmentedPNorm\nSegmentedLSE\n\nSegmentedMeanMax\nSegmentedPNormLSE\n\nBagCount","category":"page"},{"location":"api/aggregation/#Mill.AbstractAggregation","page":"Aggregation","title":"Mill.AbstractAggregation","text":"AbstractAggregation\n\nSupertype for any aggregation operator.\n\nSee also: AggregationStack, SegmentedSum, SegmentedMax, SegmentedMean, SegmentedPNorm, SegmentedLSE.\n\n\n\n\n\n","category":"type"},{"location":"api/aggregation/#Mill.AggregationStack","page":"Aggregation","title":"Mill.AggregationStack","text":"AggregationStack{T <: Tuple{Vararg{AbstractAggregation}}} <: AbstractAggregation\n\nA container that implements a concatenation of one or more AbstractAggregations.\n\nConstruct with e.g. AggregationStack(SegmentedMean([t::Type, ]d)) for single operators and with e.g. SegmentedPNormLSE([t::Type, ]d) for concatenations. With these calls all parameters inside operators are initialized randomly as Float32 arrays, unless type t is further specified. Another option is to vcat two operators together.\n\nNested stacks are flattened into a single-level structure upon construction, see examples.\n\nIntended to be used as a functor:\n\n(a::AggregationStack)(x, bags[, w])\n\nwhere x is either AbstractMatrix or missing, bags is AbstractBags structure and optionally w is an AbstractVector of weights.\n\nExamples\n\njulia> a = AggregationStack(SegmentedMean(2), SegmentedMax(2))\nAggregationStack:\n SegmentedMean(ψ = Float32[0.0, 0.0])\n SegmentedMax(ψ = Float32[0.0, 0.0])\n\njulia> a(Float32[0 1 2; 3 4 5], bags([1:1, 2:3]))\n4×2 Matrix{Float32}:\n 0.0 1.5\n 3.0 4.5\n 0.0 2.0\n 3.0 5.0\n\njulia> a = AggregationStack(SegmentedMean(2), AggregationStack(SegmentedMax(2)))\nAggregationStack:\n SegmentedMean(ψ = Float32[0.0, 0.0])\n SegmentedMax(ψ = Float32[0.0, 0.0])\n\njulia> a = SegmentedMeanMax(Float32, 2)\nAggregationStack:\n SegmentedMean(ψ = Float32[0.0, 0.0])\n SegmentedMax(ψ = Float32[0.0, 0.0])\n\njulia> vcat(SegmentedMean(2), SegmentedMax(2))\nAggregationStack:\n SegmentedMean(ψ = Float32[0.0, 0.0])\n SegmentedMax(ψ = Float32[0.0, 0.0])\n\n\nSee also: AbstractAggregation, SegmentedSum, SegmentedMax, SegmentedMean, SegmentedPNorm, SegmentedLSE.\n\n\n\n\n\n","category":"type"},{"location":"api/aggregation/#Mill.SegmentedSum","page":"Aggregation","title":"Mill.SegmentedSum","text":"SegmentedSum{V <: AbstractVector{<:Number}} <: AbstractAggregation\n\nAbstractAggregation implementing segmented sum aggregation:\n\nf(x_1 ldots x_k) = sum_i = 1^k x_i\n\nStores a vector of parameters ψ that are filled into the resulting matrix in case an empty bag is encountered.\n\nSee also: AbstractAggregation, AggregationStack, SegmentedMax, SegmentedMean, SegmentedPNorm, SegmentedLSE.\n\n\n\n\n\n","category":"type"},{"location":"api/aggregation/#Mill.SegmentedMax","page":"Aggregation","title":"Mill.SegmentedMax","text":"SegmentedMax{V <: AbstractVector{<:Number}} <: AbstractAggregation\n\nAbstractAggregation implementing segmented max aggregation:\n\nf(x_1 ldots x_k) = max_i = 1 ldots k x_i\n\nStores a vector of parameters ψ that are filled into the resulting matrix in case an empty bag is encountered.\n\nSee also: AbstractAggregation, AggregationStack, SegmentedMean, SegmentedSum, SegmentedPNorm, SegmentedLSE.\n\n\n\n\n\n","category":"type"},{"location":"api/aggregation/#Mill.SegmentedMean","page":"Aggregation","title":"Mill.SegmentedMean","text":"SegmentedMean{V <: AbstractVector{<:Number}}} <: AbstractAggregation\n\nAbstractAggregation implementing segmented mean aggregation:\n\nf(x_1 ldots x_k) = frac1k sum_i = 1^k x_i\n\nStores a vector of parameters ψ that are filled into the resulting matrix in case an empty bag is encountered.\n\nSee also: AbstractAggregation, AggregationStack, SegmentedMax, SegmentedSum, SegmentedPNorm, SegmentedLSE.\n\n\n\n\n\n","category":"type"},{"location":"api/aggregation/#Mill.SegmentedPNorm","page":"Aggregation","title":"Mill.SegmentedPNorm","text":"SegmentedPNorm{V <: AbstractVector{<:AbstractFloat}} <: AbstractAggregation\n\nAbstractAggregation implementing segmented p-norm aggregation:\n\nf(x_1 ldots x_k p c) = left(frac1k sum_i = 1^k vert x_i - c vert ^ p right)^frac1p\n\nStores a vector of parameters ψ that are filled into the resulting matrix in case an empty bag is encountered, and vectors of parameters p and c used during computation.\n\nSee also: AbstractAggregation, AggregationStack, SegmentedMax, SegmentedMean, SegmentedSum, SegmentedLSE.\n\n\n\n\n\n","category":"type"},{"location":"api/aggregation/#Mill.SegmentedLSE","page":"Aggregation","title":"Mill.SegmentedLSE","text":"SegmentedLSE{V <: AbstractVector{<:AbstractFloat}} <: AbstractAggregation\n\nAbstractAggregation implementing segmented log-sum-exp (LSE) aggregation:\n\nf(x_1 ldots x_k r) = frac1rlog left(frac1k sum_i = 1^k exp(rcdot x_i)right)\n\nStores a vector of parameters ψ that are filled into the resulting matrix in case an empty bag is encountered, and a vector of parameters r used during computation.\n\nSee also: AbstractAggregation, AggregationStack, SegmentedMax, SegmentedMean, SegmentedSum, SegmentedPNorm.\n\n\n\n\n\n","category":"type"},{"location":"api/aggregation/#Mill.SegmentedMeanMax","page":"Aggregation","title":"Mill.SegmentedMeanMax","text":"SegmentedMeanMax([t::Type, ]d::Int)\n\nConstruct AggregationStack consisting of SegmentedMean and SegmentedMax operators.\n\nExamples\n\njulia> SegmentedMeanMax(4)\nAggregationStack:\n SegmentedMean(ψ = Float32[0.0, 0.0, 0.0, 0.0])\n SegmentedMax(ψ = Float32[0.0, 0.0, 0.0, 0.0])\n\njulia> SegmentedMeanMax(Float64, 2)\nAggregationStack:\n SegmentedMean(ψ = [0.0, 0.0])\n SegmentedMax(ψ = [0.0, 0.0])\n\nSee also: AbstractAggregation, AggregationStack, SegmentedSum, SegmentedMax, SegmentedMean, SegmentedPNorm, SegmentedLSE.\n\n\n\n\n\n","category":"function"},{"location":"api/aggregation/#Mill.SegmentedPNormLSE","page":"Aggregation","title":"Mill.SegmentedPNormLSE","text":"SegmentedPNormLSE([t::Type, ]d::Int)\n\nConstruct AggregationStack consisting of SegmentedPNorm and SegmentedLSE operators.\n\nSee also: AbstractAggregation, AggregationStack, SegmentedSum, SegmentedMax, SegmentedMean, SegmentedPNorm, SegmentedLSE.\n\n\n\n\n\n","category":"function"},{"location":"api/aggregation/#Mill.BagCount","page":"Aggregation","title":"Mill.BagCount","text":"BagCount{T <: AbstractAggregation}\n\nA wrapper type that when called applies the AbstractAggregation stored in it, and appends one more element containing bag size after x log(x + 1) transformation to the result.\n\nUsed as a functor:\n\n(bc::BagCount)(x, bags[, w])\n\nwhere x is either AbstractMatrix or missing, bags is AbstractBags structure and optionally w is an AbstractVector of weights.\n\nExamples\n\njulia> x = Float32[0 1 2; 3 4 5]\n2×3 Matrix{Float32}:\n 0.0 1.0 2.0\n 3.0 4.0 5.0\n\njulia> b = bags([1:1, 2:3])\nAlignedBags{Int64}(UnitRange{Int64}[1:1, 2:3])\n\njulia> a = vcat(SegmentedMean(2), SegmentedMax(2))\nAggregationStack:\n SegmentedMean(ψ = Float32[0.0, 0.0])\n SegmentedMax(ψ = Float32[0.0, 0.0])\n\njulia> a(x, b)\n4×2 Matrix{Float32}:\n 0.0 1.5\n 3.0 4.5\n 0.0 2.0\n 3.0 5.0\n\njulia> BagCount(a)(x, b)\n5×2 Matrix{Float32}:\n 0.0 1.5\n 3.0 4.5\n 0.0 2.0\n 3.0 5.0\n 0.693147 1.09861\n\nSee also: AbstractAggregation, AggregationStack, SegmentedSum, SegmentedMax, SegmentedMean, SegmentedPNorm, SegmentedLSE.\n\n\n\n\n\n","category":"type"},{"location":"tools/hierarchical/","page":"HierarchicalUtils.jl","title":"HierarchicalUtils.jl","text":"using Mill","category":"page"},{"location":"tools/hierarchical/#HierarchicalUtils.jl","page":"HierarchicalUtils.jl","title":"HierarchicalUtils.jl","text":"","category":"section"},{"location":"tools/hierarchical/","page":"HierarchicalUtils.jl","title":"HierarchicalUtils.jl","text":"Mill.jl uses HierarchicalUtils.jl which brings a lot of additional features.","category":"page"},{"location":"tools/hierarchical/","page":"HierarchicalUtils.jl","title":"HierarchicalUtils.jl","text":"using HierarchicalUtils","category":"page"},{"location":"tools/hierarchical/#Printing","page":"HierarchicalUtils.jl","title":"Printing","text":"","category":"section"},{"location":"tools/hierarchical/","page":"HierarchicalUtils.jl","title":"HierarchicalUtils.jl","text":"For instance, Base.show with text/plain MIME calls HierarchicalUtils.printtree:","category":"page"},{"location":"tools/hierarchical/","page":"HierarchicalUtils.jl","title":"HierarchicalUtils.jl","text":"ds = BagNode(ProductNode((BagNode(randn(4, 10),\n [1:2, 3:4, 5:5, 6:7, 8:10]),\n randn(3, 5),\n BagNode(BagNode(randn(2, 30),\n [i:i+1 for i in 1:2:30]),\n [1:3, 4:6, 7:9, 10:12, 13:15]),\n randn(2, 5))),\n [1:1, 2:3, 4:5])\nprinttree(ds; htrunc=3)","category":"page"},{"location":"tools/hierarchical/","page":"HierarchicalUtils.jl","title":"HierarchicalUtils.jl","text":"This can be used to print a non-truncated version of a model:","category":"page"},{"location":"tools/hierarchical/","page":"HierarchicalUtils.jl","title":"HierarchicalUtils.jl","text":"printtree(ds)","category":"page"},{"location":"tools/hierarchical/#Traversal-encoding","page":"HierarchicalUtils.jl","title":"Traversal encoding","text":"","category":"section"},{"location":"tools/hierarchical/","page":"HierarchicalUtils.jl","title":"HierarchicalUtils.jl","text":"Callling with trav=true enables convenient traversal functionality with string indexing:","category":"page"},{"location":"tools/hierarchical/","page":"HierarchicalUtils.jl","title":"HierarchicalUtils.jl","text":"m = reflectinmodel(ds)\nprinttree(m; trav=true)","category":"page"},{"location":"tools/hierarchical/","page":"HierarchicalUtils.jl","title":"HierarchicalUtils.jl","text":"This way any node in the model tree is swiftly accessible, which may come in handy when inspecting model parameters or simply deleting/replacing/inserting nodes to tree (for instance when constructing adversarial samples). All tree nodes are accessible by indexing with the traversal code:.","category":"page"},{"location":"tools/hierarchical/","page":"HierarchicalUtils.jl","title":"HierarchicalUtils.jl","text":"m[\"Y\"]","category":"page"},{"location":"tools/hierarchical/","page":"HierarchicalUtils.jl","title":"HierarchicalUtils.jl","text":"The following two approaches give the same result:","category":"page"},{"location":"tools/hierarchical/","page":"HierarchicalUtils.jl","title":"HierarchicalUtils.jl","text":"m[\"Y\"] ≡ m.im.ms[1]","category":"page"},{"location":"tools/hierarchical/#Counting-functions","page":"HierarchicalUtils.jl","title":"Counting functions","text":"","category":"section"},{"location":"tools/hierarchical/","page":"HierarchicalUtils.jl","title":"HierarchicalUtils.jl","text":"Other functions provided by HierarchicalUtils.jl:","category":"page"},{"location":"tools/hierarchical/","page":"HierarchicalUtils.jl","title":"HierarchicalUtils.jl","text":"nnodes(ds)\nnleafs(ds)\nNodeIterator(ds) |> collect\nNodeIterator(ds, m) |> collect\nLeafIterator(ds) |> collect\nTypeIterator(BagModel, m) |> collect\nPredicateIterator(x -> numobs(x) ≥ 10, ds) |> collect","category":"page"},{"location":"tools/hierarchical/","page":"HierarchicalUtils.jl","title":"HierarchicalUtils.jl","text":"For the complete showcase of possibilites, refer to HierarchicalUtils.jl and this notebook.","category":"page"},{"location":"examples/gnn/#GNN-in-16-lines","page":"GNNs in 16 lines","title":"GNN in 16 lines","text":"","category":"section"},{"location":"examples/gnn/","page":"GNNs in 16 lines","title":"GNNs in 16 lines","text":"As has been mentioned in [4], multiple instance learning is an essential piece for implementing message passing inference over graphs, the main concept behind spatial Graph Neural Networks (GNNs). It is straightforward and quick to achieve this with Mill.jl. We begin with some dependencies:","category":"page"},{"location":"examples/gnn/","page":"GNNs in 16 lines","title":"GNNs in 16 lines","text":"using Mill, Flux, Graphs, Statistics","category":"page"},{"location":"examples/gnn/","page":"GNNs in 16 lines","title":"GNNs in 16 lines","text":"Let's assume a graph g, represented as a SimpleGraph from Graphs.jl","category":"page"},{"location":"examples/gnn/","page":"GNNs in 16 lines","title":"GNNs in 16 lines","text":"g = SimpleGraph(10)\nfor e in [(1, 2), (1, 3), (1, 4),\n (2, 4), (2, 5),\n (3, 4), (3, 5), (3, 6), (3, 8), (3, 10),\n (4, 5), (4, 6), (4, 9),\n (5, 7), (5, 8),\n (6, 5), (6, 7), (6, 8),\n (7, 8), (7, 10),\n (8, 9)\n]\n add_edge!(g, e...)\nend","category":"page"},{"location":"examples/gnn/","page":"GNNs in 16 lines","title":"GNNs in 16 lines","text":"(Image: )","category":"page"},{"location":"examples/gnn/","page":"GNNs in 16 lines","title":"GNNs in 16 lines","text":"Furthermore, let's assume that each vertex is described by three features stored in a matrix X:","category":"page"},{"location":"examples/gnn/","page":"GNNs in 16 lines","title":"GNNs in 16 lines","text":"X = ArrayNode(randn(Float32, 3, 10))","category":"page"},{"location":"examples/gnn/","page":"GNNs in 16 lines","title":"GNNs in 16 lines","text":"We use ScatteredBags from Mill to encode neighbors of each vertex. In other words, each vertex is described by a bag of its neighbors. This information is conveniently stored in fadjlist field of g, therefore the bags can be constructed as:","category":"page"},{"location":"examples/gnn/","page":"GNNs in 16 lines","title":"GNNs in 16 lines","text":"b = ScatteredBags(g.fadjlist)","category":"page"},{"location":"examples/gnn/","page":"GNNs in 16 lines","title":"GNNs in 16 lines","text":"Finally, we create two models. First model called lift will pre-process the description of vertices to some latent space for message passing, and the second one will realize the message passing itself, which we will call mp:","category":"page"},{"location":"examples/gnn/","page":"GNNs in 16 lines","title":"GNNs in 16 lines","text":"lift = reflectinmodel(X, d -> Dense(d, 4), SegmentedMean)\nU = lift(X)\nmp = reflectinmodel(BagNode(U, b), d -> Dense(d, 3), SegmentedMean)","category":"page"},{"location":"examples/gnn/","page":"GNNs in 16 lines","title":"GNNs in 16 lines","text":"Notice that BagNode(U, b) now essentially encodes vertex features as well as the adjacency matrix. This also means that one step of message passing algorithm can be realized as:","category":"page"},{"location":"examples/gnn/","page":"GNNs in 16 lines","title":"GNNs in 16 lines","text":"Y = mp(BagNode(U, b))","category":"page"},{"location":"examples/gnn/","page":"GNNs in 16 lines","title":"GNNs in 16 lines","text":"and it is differentiable, which can be verified by executing:","category":"page"},{"location":"examples/gnn/","page":"GNNs in 16 lines","title":"GNNs in 16 lines","text":"gradient(m -> sum(sin.(m(BagNode(U, b)))), mp)","category":"page"},{"location":"examples/gnn/","page":"GNNs in 16 lines","title":"GNNs in 16 lines","text":"If we put everything together, the GNN implementation is implemented in the following 16 lines:","category":"page"},{"location":"examples/gnn/","page":"GNNs in 16 lines","title":"GNNs in 16 lines","text":"struct GNN{L, M, R}\n lift::L\n mp::M\n m::R\nend\n\nFlux.@functor GNN\n\nfunction mpstep(m::GNN, U, bags, n)\n n == 0 && return(U)\n mpstep(m, m.mp(BagNode(U, bags)), bags, n - 1)\nend\n\nfunction (m::GNN)(g, X, n)\n U = m.lift(X)\n bags = Mill.ScatteredBags(g.fadjlist)\n o = mpstep(m, U, bags, n)\n m.m(vcat(mean(o, dims = 2), maximum(o, dims = 2)))\nend\n\nnothing # hide","category":"page"},{"location":"examples/gnn/","page":"GNNs in 16 lines","title":"GNNs in 16 lines","text":"As it is the case with whole Mill, even this graph neural network is properly integrated with Flux.jl ecosystem and suports automatic differentiation:","category":"page"},{"location":"examples/gnn/","page":"GNNs in 16 lines","title":"GNNs in 16 lines","text":"zd = 4\nf(d) = Chain(Dense(d, zd, relu), Dense(zd, zd))\nagg = SegmentedMeanMax\ngnn = GNN(reflectinmodel(X, f, agg),\n BagModel(f(zd), agg(zd), f(2zd)),\n f(2zd))\nnothing # hide","category":"page"},{"location":"examples/gnn/","page":"GNNs in 16 lines","title":"GNNs in 16 lines","text":"gnn(g, X, 5)\ngradient(m -> m(g, X, 5) |> sum, gnn)","category":"page"},{"location":"examples/gnn/","page":"GNNs in 16 lines","title":"GNNs in 16 lines","text":"The above implementation is surprisingly general, as it supports an arbitrarily rich description of vertices. For simplicity, we used only vectors in X, however, any Mill hierarchy is applicable.","category":"page"},{"location":"examples/gnn/","page":"GNNs in 16 lines","title":"GNNs in 16 lines","text":"To put different weights on edges, one can use Weighted aggregation.","category":"page"},{"location":"api/utilities/#Utilities","page":"Utilities","title":"Utilities","text":"","category":"section"},{"location":"api/utilities/#Index","page":"Utilities","title":"Index","text":"","category":"section"},{"location":"api/utilities/","page":"Utilities","title":"Utilities","text":"Pages = [\"utilities.md\"]","category":"page"},{"location":"api/utilities/#API","page":"Utilities","title":"API","text":"","category":"section"},{"location":"api/utilities/","page":"Utilities","title":"Utilities","text":"list_lens\nfind_lens\nfindnonempty_lens\npred_lens\n\ncode2lens\nlens2code\n\nmodel_lens\ndata_lens\n\nreplacein","category":"page"},{"location":"api/utilities/#Mill.list_lens","page":"Utilities","title":"Mill.list_lens","text":"list_lens(n)\n\nReturn a Vector of Accessors.jl lenses for accessing all nodes/fields in n.\n\nExamples\n\njulia> n = ProductNode((BagNode(missing, bags([0:-1, 0:-1])), ArrayNode([1 2; 3 4])))\nProductNode # 2 obs, 16 bytes\n ├── BagNode # 2 obs, 88 bytes\n │ ╰── ∅\n ╰── ArrayNode(2×2 Array with Int64 elements) # 2 obs, 80 bytes\n\njulia> list_lens(n)\n9-element Vector{Any}:\n identity (generic function with 1 method)\n (@optic _.data[1])\n (@optic _.data[1].data)\n (@optic _.data[1].bags)\n (@optic _.data[1].metadata)\n (@optic _.data[2])\n (@optic _.data[2].data)\n (@optic _.data[2].metadata)\n (@optic _.metadata)\n\nSee also: pred_lens, find_lens, findnonempty_lens.\n\n\n\n\n\n","category":"function"},{"location":"api/utilities/#Mill.find_lens","page":"Utilities","title":"Mill.find_lens","text":"find_lens(n, x)\n\nReturn a Vector of Accessors.jl lenses for accessing all nodes/fields in n that return true when compared to x using Base.===.\n\nExamples\n\njulia> n = ProductNode((BagNode(missing, bags([0:-1, 0:-1])), ArrayNode([1 2; 3 4])))\nProductNode # 2 obs, 16 bytes\n ├── BagNode # 2 obs, 88 bytes\n │ ╰── ∅\n ╰── ArrayNode(2×2 Array with Int64 elements) # 2 obs, 80 bytes\n\njulia> find_lens(n, n.data[1])\n1-element Vector{Any}:\n (@optic _.data[1])\n\nSee also: pred_lens, list_lens, findnonempty_lens.\n\n\n\n\n\n","category":"function"},{"location":"api/utilities/#Mill.findnonempty_lens","page":"Utilities","title":"Mill.findnonempty_lens","text":"findnonempty_lens(n)\n\nReturn a Vector of Accessors.jl lenses for accessing all nodes/fields in n that contain at least one observation.\n\nExamples\n\njulia> n = ProductNode((BagNode(missing, bags([0:-1, 0:-1])), ArrayNode([1 2; 3 4])))\nProductNode # 2 obs, 16 bytes\n ├── BagNode # 2 obs, 88 bytes\n │ ╰── ∅\n ╰── ArrayNode(2×2 Array with Int64 elements) # 2 obs, 80 bytes\n\njulia> findnonempty_lens(n)\n3-element Vector{Any}:\n identity (generic function with 1 method)\n (@optic _.data[1])\n (@optic _.data[2])\n\nSee also: pred_lens, list_lens, find_lens.\n\n\n\n\n\n","category":"function"},{"location":"api/utilities/#Mill.pred_lens","page":"Utilities","title":"Mill.pred_lens","text":"pred_lens(p, n)\n\nReturn a Vector of Accessors.jl lenses for accessing all nodes/fields in n conforming to predicate p.\n\nExamples\n\njulia> n = ProductNode((BagNode(missing, bags([0:-1, 0:-1])), ArrayNode([1 2; 3 4])))\nProductNode # 2 obs, 16 bytes\n ├── BagNode # 2 obs, 88 bytes\n │ ╰── ∅\n ╰── ArrayNode(2×2 Array with Int64 elements) # 2 obs, 80 bytes\n\njulia> pred_lens(x -> x isa ArrayNode, n)\n1-element Vector{Any}:\n (@optic _.data[2])\n\nSee also: list_lens, find_lens, findnonempty_lens.\n\n\n\n\n\n","category":"function"},{"location":"api/utilities/#Mill.code2lens","page":"Utilities","title":"Mill.code2lens","text":"code2lens(n, c)\n\nConvert code c from HierarchicalUtils.jl traversal to a Vector of Accessors.jl lenses such that they access each node in tree n egal to node under code c in the tree.\n\nExamples\n\njulia> n = ProductNode((BagNode(missing, bags([0:-1, 0:-1])), ArrayNode([1 2; 3 4])));\n\njulia> printtree(n; trav=true)\nProductNode [\"\"] # 2 obs, 16 bytes\n ├── BagNode [\"E\"] # 2 obs, 88 bytes\n │ ╰── ∅ [\"M\"]\n ╰── ArrayNode(2×2 Array with Int64 elements) [\"U\"] # 2 obs, 80 bytes\n\njulia> code2lens(n, \"U\")\n1-element Vector{Any}:\n (@optic _.data[2])\n\nSee also: lens2code.\n\n\n\n\n\n","category":"function"},{"location":"api/utilities/#Mill.lens2code","page":"Utilities","title":"Mill.lens2code","text":"lens2code(n, l)\n\nConvert Accessors.jl lens l to a Vector of codes from HierarchicalUtils.jl traversal such that they access each node in tree n egal to node accessible by lens l.\n\nExamples\n\njulia> n = ProductNode((BagNode(missing, bags([0:-1, 0:-1])), ArrayNode([1 2; 3 4])));\n\njulia> printtree(n; trav=true)\nProductNode [\"\"] # 2 obs, 16 bytes\n ├── BagNode [\"E\"] # 2 obs, 88 bytes\n │ ╰── ∅ [\"M\"]\n ╰── ArrayNode(2×2 Array with Int64 elements) [\"U\"] # 2 obs, 80 bytes\n\njulia> lens2code(n, (@optic _.data[2]))\n1-element Vector{String}:\n \"U\"\n\njulia> lens2code(n, (@optic _.data[∗]))\n2-element Vector{String}:\n \"E\"\n \"U\"\n\n\nSee also: code2lens.\n\n\n\n\n\n","category":"function"},{"location":"api/utilities/#Mill.model_lens","page":"Utilities","title":"Mill.model_lens","text":"model_lens(m, l)\n\nConvert Accessors.jl lens l for a data node to a new lens for accessing the same location in model m.\n\nExamples\n\njulia> n = ProductNode((BagNode(randn(Float32, 2, 2), bags([0:-1, 0:-1])),\n ArrayNode(Float32[1 2; 3 4])))\nProductNode # 2 obs, 24 bytes\n ├── BagNode # 2 obs, 96 bytes\n │ ╰── ArrayNode(2×2 Array with Float32 elements) # 2 obs, 64 bytes\n ╰── ArrayNode(2×2 Array with Float32 elements) # 2 obs, 64 bytes\n\njulia> m = reflectinmodel(n)\nProductModel ↦ Dense(20 => 10) # 2 arrays, 210 params, 920 bytes\n ├── BagModel ↦ BagCount([SegmentedMean(10); SegmentedMax(10)]) ↦ Dense(21 => 10) # 4 arrays, 240 params, 1.094 KiB\n │ ╰── ArrayModel(Dense(2 => 10)) # 2 arrays, 30 params, 200 bytes\n ╰── ArrayModel(Dense(2 => 10)) # 2 arrays, 30 params, 200 bytes\n\njulia> model_lens(m, (@optic _.data[2]))\n(@optic _.ms[2])\n\nSee also: data_lens.\n\n\n\n\n\n","category":"function"},{"location":"api/utilities/#Mill.data_lens","page":"Utilities","title":"Mill.data_lens","text":"data_lens(n, l)\n\nConvert Accessors.jl lens l for a model node to a new lens for accessing the same location in data node n.\n\nExamples\n\njulia> n = ProductNode((BagNode(randn(Float32, 2, 2), bags([0:-1, 0:-1])), ArrayNode(Float32[1 2; 3 4])))\nProductNode # 2 obs, 24 bytes\n ├── BagNode # 2 obs, 96 bytes\n │ ╰── ArrayNode(2×2 Array with Float32 elements) # 2 obs, 64 bytes\n ╰── ArrayNode(2×2 Array with Float32 elements) # 2 obs, 64 bytes\n\njulia> m = reflectinmodel(n)\nProductModel ↦ Dense(20 => 10) # 2 arrays, 210 params, 920 bytes\n ├── BagModel ↦ BagCount([SegmentedMean(10); SegmentedMax(10)]) ↦ Dense(21 => 10) # 4 arrays, 240 params, 1.094 KiB\n │ ╰── ArrayModel(Dense(2 => 10)) # 2 arrays, 30 params, 200 bytes\n ╰── ArrayModel(Dense(2 => 10)) # 2 arrays, 30 params, 200 bytes\n\njulia> data_lens(n, (@optic _.ms[2]))\n(@optic _.data[2])\n\nSee also: data_lens.\n\n\n\n\n\n","category":"function"},{"location":"api/utilities/#Mill.replacein","page":"Utilities","title":"Mill.replacein","text":"replacein(n, old, new)\n\nReplace in data node or model n each occurence of old by new.\n\nShort description\n\nExamples\n\njulia> n = ProductNode((BagNode(randn(2, 2), bags([0:-1, 0:-1])), ArrayNode([1 2; 3 4])))\nProductNode # 2 obs, 24 bytes\n ├── BagNode # 2 obs, 96 bytes\n │ ╰── ArrayNode(2×2 Array with Float64 elements) # 2 obs, 80 bytes\n ╰── ArrayNode(2×2 Array with Int64 elements) # 2 obs, 80 bytes\n\njulia> replacein(n, n.data[1], ArrayNode(maybehotbatch([1, 2], 1:2)))\nProductNode # 2 obs, 24 bytes\n ├── ArrayNode(2×2 MaybeHotMatrix with Bool elements) # 2 obs, 80 bytes\n ╰── ArrayNode(2×2 Array with Int64 elements) # 2 obs, 80 bytes\n\n\n\n\n\n","category":"function"},{"location":"manual/custom/","page":"Custom nodes","title":"Custom nodes","text":"using Mill\nusing Flux","category":"page"},{"location":"manual/custom/#Custom-nodes","page":"Custom nodes","title":"Custom nodes","text":"","category":"section"},{"location":"manual/custom/","page":"Custom nodes","title":"Custom nodes","text":"Mill.jl data nodes are lightweight wrappers around data, such as Array, DataFrame, and others. It is of course possible to define a custom data (and model) nodes. A useful abstraction for implementing custom data nodes suitable for most cases is LazyNode, which you can easily use to extend the functionality of Mill.","category":"page"},{"location":"manual/custom/#Unix-path-example","page":"Custom nodes","title":"Unix path example","text":"","category":"section"},{"location":"manual/custom/","page":"Custom nodes","title":"Custom nodes","text":"Let's define a custom node type for representing path names in Unix and one custom model type for processing it. LazyNode serves as a bolierplate for simple extension of Mill ecosystem. We start by by defining an example of such node:","category":"page"},{"location":"manual/custom/","page":"Custom nodes","title":"Custom nodes","text":"ds = LazyNode{:Path}([\"/var/lib/blob_files/myfile.blob\"])","category":"page"},{"location":"manual/custom/","page":"Custom nodes","title":"Custom nodes","text":"Entirely new type is not needed, because we can dispatch on the first type parameter. Specifically, :Path \"tag\" in this case defines a special kind of LazyNode. Consequently, we can define multiple variations of custom LazyNode without any conflicts in dispatch.","category":"page"},{"location":"manual/custom/","page":"Custom nodes","title":"Custom nodes","text":"As a next step, we extend the Mill.unpack2mill function, which always takes one LazyNode and produces an arbitrary Mill structure. We will represent individual file and directory names (as obtained by splitpath) using an NGramMatrix representation and, for simplicity, the whole path as a bag of individual names:","category":"page"},{"location":"manual/custom/","page":"Custom nodes","title":"Custom nodes","text":"function Mill.unpack2mill(ds::LazyNode{:Path})\n ss = splitpath.(ds.data)\n x = NGramMatrix(reduce(vcat, ss), 3)\n BagNode(ArrayNode(x), Mill.length2bags(length.(ss)))\nend","category":"page"},{"location":"manual/custom/","page":"Custom nodes","title":"Custom nodes","text":"Mill.unpack2mill(ds)","category":"page"},{"location":"manual/custom/","page":"Custom nodes","title":"Custom nodes","text":"Also, note that the node keeps an array of strings instead of just one string. This is because we want our node to be able to hold multiple observations than one. Methods such as catobs work as expected:","category":"page"},{"location":"manual/custom/","page":"Custom nodes","title":"Custom nodes","text":"ds1 = LazyNode{:Path}([\"/var/lib/blob_files/myfile.blob\"])\nds2 = LazyNode{:Path}([\"/var/lib/python\"])\nnothing # hide","category":"page"},{"location":"manual/custom/","page":"Custom nodes","title":"Custom nodes","text":"ds = catobs(ds1, ds2)","category":"page"},{"location":"manual/custom/","page":"Custom nodes","title":"Custom nodes","text":"The Mill.unpack2mill function is called lazily during the inference by a LazyModel counterpart.","category":"page"},{"location":"manual/custom/","page":"Custom nodes","title":"Custom nodes","text":"Model reflection works too:","category":"page"},{"location":"manual/custom/","page":"Custom nodes","title":"Custom nodes","text":"pm = reflectinmodel(ds, d -> Dense(d, 3))","category":"page"},{"location":"manual/custom/","page":"Custom nodes","title":"Custom nodes","text":"We can use the obtained model to perform inference as we would do with any other model.","category":"page"},{"location":"manual/custom/","page":"Custom nodes","title":"Custom nodes","text":"pm(ds)","category":"page"},{"location":"manual/custom/#Adding-custom-nodes-without-[LazyNode](@ref)","page":"Custom nodes","title":"Adding custom nodes without LazyNode","text":"","category":"section"},{"location":"manual/custom/","page":"Custom nodes","title":"Custom nodes","text":"The solution using LazyNode is sufficient in most scenarios. For other cases, it is recommended to equip custom nodes with the following functionality:","category":"page"},{"location":"manual/custom/","page":"Custom nodes","title":"Custom nodes","text":"allow nesting (if needed)\nimplement Mill.subset and optionally Base.getindex to obtain subsets of observations. Mill already defines Mill.subset for common datatypes, which can be used.\nallow concatenation of nodes with catobs. Optionally, implement reduce(catobs, ...) as well to avoid excessive compilations if a number of arguments will vary a lot\ndefine a specialized method for MLUtils.numobs, which we can however import directly from Mill.\nregister the custom node with HierarchicalUtils.jl to obtain pretty printing, iterators and other functionality","category":"page"},{"location":"manual/custom/","page":"Custom nodes","title":"Custom nodes","text":"Here is an example of a custom node with the same functionality as in the Unix path example section:","category":"page"},{"location":"manual/custom/","page":"Custom nodes","title":"Custom nodes","text":"using Mill\n\nimport Base: getindex, show\nimport Mill: catobs, numobs, data, metadata, VecOrRange, AbstractMillNode, reflectinmodel\nimport Flux\nimport HierarchicalUtils: NodeType, LeafNode\n\nstruct PathNode{S <: AbstractString, C} <: AbstractMillNode\n data::Vector{S}\n metadata::C\nend\n\nPathNode(data::Vector{S}) where {S <: AbstractString} = PathNode(data, nothing)\nBase.show(io::IO, n::PathNode) = print(io, \"PathNode ($(numobs(n)) obs)\")\n\nBase.ndims(n::PathNode) = Colon()\nnumobs(n::PathNode) = length(n.data)\ncatobs(ns::PathNode) = PathNode(vcat(data.(ns)...), catobs(metadata.(as)...))\nBase.getindex(n::PathNode, i::VecOrRange{<:Int}) = PathNode(subset(data(x), i),\n subset(metadata(x), i))\nNodeType(::Type{<:PathNode}) = LeafNode()\nnothing # hide","category":"page"},{"location":"manual/custom/","page":"Custom nodes","title":"Custom nodes","text":"We also have to define a corresponding model node type which will be a counterpart processing the data:","category":"page"},{"location":"manual/custom/","page":"Custom nodes","title":"Custom nodes","text":"The solution using LazyNode is sufficient in most scenarios. For other cases, it is recommended to equip custom nodes with the following functionality:","category":"page"},{"location":"manual/custom/","page":"Custom nodes","title":"Custom nodes","text":"struct PathModel{T, F} <: AbstractMillModel\n m::T\n path2mill::F\nend\n\nFlux.@functor PathModel\nshow(io::IO, n::PathModel) = print(io, \"PathModel\")\nNodeType(::Type{<:PathModel}) = LeafNode()\n\npath2mill(ds::PathNode) = path2mill(ds.data)\npath2mill(ss::Vector{<:AbstractString}) = reduce(catobs, map(path2mill, ss))\nfunction path2mill(s::String)\n ss = splitpath(s)\n BagNode(ArrayNode(NGramMatrix(ss, 3)), AlignedBags([1:length(ss)]))\nend\n\n(m::PathModel)(x::PathNode) = m.m(m.path2mill(x))\n\nfunction reflectinmodel(ds::PathNode, args...)\n pm = reflectinmodel(path2mill(ds), args...)\n PathModel(pm, path2mill)\nend\nnothing # hide","category":"page"},{"location":"manual/custom/","page":"Custom nodes","title":"Custom nodes","text":"Example of usage:","category":"page"},{"location":"manual/custom/","page":"Custom nodes","title":"Custom nodes","text":"ds = PathNode([\"/etc/passwd\", \"/home/tonda/.bashrc\"])\npm = reflectinmodel(ds, d -> Dense(d, 3))\npm(ds)","category":"page"},{"location":"api/data_nodes/#Data-nodes","page":"Data nodes","title":"Data nodes","text":"","category":"section"},{"location":"api/data_nodes/#Index","page":"Data nodes","title":"Index","text":"","category":"section"},{"location":"api/data_nodes/","page":"Data nodes","title":"Data nodes","text":"Pages = [\"data_nodes.md\"]","category":"page"},{"location":"api/data_nodes/#API","page":"Data nodes","title":"API","text":"","category":"section"},{"location":"api/data_nodes/","page":"Data nodes","title":"Data nodes","text":"AbstractMillNode\nAbstractProductNode\nAbstractBagNode\n\nArrayNode\nArrayNode(::AbstractArray)\n\nBagNode\nBagNode(::AbstractMillNode, ::AbstractVector, m)\n\nWeightedBagNode\nWeightedBagNode(::AbstractMillNode, ::AbstractVector, ::Vector, m)\n\nProductNode\nProductNode(::Any)\n\nLazyNode\nLazyNode(::Symbol, ::Any)\n\nMill.unpack2mill\n\nMill.data\nMill.metadata\ndatasummary\ndropmeta\ncatobs\nMill.subset\nMill.mapdata\nremoveinstances\n","category":"page"},{"location":"api/data_nodes/#Mill.AbstractMillNode","page":"Data nodes","title":"Mill.AbstractMillNode","text":"AbstractMillNode\n\nSupertype for any structure representing a data node.\n\n\n\n\n\n","category":"type"},{"location":"api/data_nodes/#Mill.AbstractProductNode","page":"Data nodes","title":"Mill.AbstractProductNode","text":"AbstractProductNode <: AbstractMillNode\n\nSupertype for any structure representing a data node implementing a Cartesian product of data in subtrees.\n\n\n\n\n\n","category":"type"},{"location":"api/data_nodes/#Mill.AbstractBagNode","page":"Data nodes","title":"Mill.AbstractBagNode","text":"AbstractBagNode <: AbstractMillNode\n\nSupertype for any data node structure representing a multi-instance learning problem.\n\n\n\n\n\n","category":"type"},{"location":"api/data_nodes/#Mill.ArrayNode","page":"Data nodes","title":"Mill.ArrayNode","text":"ArrayNode{A <: AbstractArray, C} <: AbstractMillNode\n\nData node for storing array-like data of type A and metadata of type C. The convention is that samples are stored along the last axis, e.g. in columns of a matrix.\n\nSee also: AbstractMillNode, ArrayModel.\n\n\n\n\n\n","category":"type"},{"location":"api/data_nodes/#Mill.ArrayNode-Tuple{AbstractArray}","page":"Data nodes","title":"Mill.ArrayNode","text":"ArrayNode(d::AbstractArray, m=nothing)\n\nConstruct a new ArrayNode with data d and metadata m.\n\nExamples\n\njulia> a = ArrayNode([1 2; 3 4; 5 6])\n3×2 ArrayNode{Matrix{Int64}, Nothing}:\n 1 2\n 3 4\n 5 6\n\nSee also: AbstractMillNode, ArrayModel.\n\n\n\n\n\n","category":"method"},{"location":"api/data_nodes/#Mill.BagNode","page":"Data nodes","title":"Mill.BagNode","text":"BagNode{T <: Union{AbstractMillNode, Missing}, B <: AbstractBags, C} <: AbstractBagNode\n\nData node that represents a multi-instance learning problem.\n\nContains instances stored in a subtree of type T, bag indices of type B and optional metadata of type C.\n\nSee also: WeightedBagNode, AbstractBagNode, AbstractMillNode, BagModel.\n\n\n\n\n\n","category":"type"},{"location":"api/data_nodes/#Mill.BagNode-Tuple{AbstractMillNode, AbstractVector, Any}","page":"Data nodes","title":"Mill.BagNode","text":"BagNode(d, b, m=nothing)\n\nConstruct a new BagNode with data d, bags b, and metadata m.\n\nd is either an AbstractMillNode or missing. Any other type is wrapped in an ArrayNode.\n\nIf b is an AbstractVector, Mill.bags is applied first.\n\nExamples\n\njulia> BagNode(ArrayNode(maybehotbatch([1, missing, 2], 1:2)), AlignedBags([1:1, 2:3]))\nBagNode # 2 obs, 104 bytes\n ╰── ArrayNode(2×3 MaybeHotMatrix with Union{Missing, Bool} elements) # 3 obs, 87 bytes\n\njulia> BagNode(randn(2, 5), [1, 2, 2, 1, 1])\nBagNode # 2 obs, 200 bytes\n ╰── ArrayNode(2×5 Array with Float64 elements) # 5 obs, 128 bytes\n\nSee also: WeightedBagNode, AbstractBagNode, AbstractMillNode, BagModel.\n\n\n\n\n\n","category":"method"},{"location":"api/data_nodes/#Mill.WeightedBagNode","page":"Data nodes","title":"Mill.WeightedBagNode","text":"WeightedBagNode{T <: Union{AbstractMillNode, Missing}, B <: AbstractBags, W, C} <: AbstractBagNode\n\nStructure like BagNode but allows to specify weights of type W of each instance.\n\nSee also: BagNode, AbstractBagNode, AbstractMillNode, BagModel.\n\n\n\n\n\n","category":"type"},{"location":"api/data_nodes/#Mill.WeightedBagNode-Tuple{AbstractMillNode, AbstractVector, Vector, Any}","page":"Data nodes","title":"Mill.WeightedBagNode","text":"WeightedBagNode(d, b, w::Vector, m=nothing)\n\nConstruct a new WeightedBagNode with data d, bags b, vector of weights w and metadata m.\n\nd is either an AbstractMillNode or missing. Any other type is wrapped in an ArrayNode.\n\nIf b is an AbstractVector, Mill.bags is applied first.\n\nExamples\n\njulia> WeightedBagNode(ArrayNode(NGramMatrix([\"s1\", \"s2\"])), bags([1:2, 0:-1]), [0.2, 0.8])\nWeightedBagNode # 2 obs, 184 bytes\n ╰── ArrayNode(2053×2 NGramMatrix with Int64 elements) # 2 obs, 140 bytes\n\njulia> WeightedBagNode(zeros(2, 2), [1, 2], [1, 2])\nWeightedBagNode # 2 obs, 160 bytes\n ╰── ArrayNode(2×2 Array with Float64 elements) # 2 obs, 80 bytes\n\nSee also: BagNode, AbstractBagNode, AbstractMillNode, BagModel.\n\n\n\n\n\n","category":"method"},{"location":"api/data_nodes/#Mill.ProductNode","page":"Data nodes","title":"Mill.ProductNode","text":"ProductNode{T, C} <: AbstractProductNode\n\nData node representing a Cartesian product of several spaces each represented by subtree stored in iterable of type T. May store metadata of type C.\n\nSee also: AbstractProductNode, AbstractMillNode, ProductModel.\n\n\n\n\n\n","category":"type"},{"location":"api/data_nodes/#Mill.ProductNode-Tuple{Any}","page":"Data nodes","title":"Mill.ProductNode","text":"ProductNode(dss, m=nothing)\nProductNode(m=nothing; dss...)\n\nConstruct a new ProductNode with data dss, and metadata m.\n\ndss should be a Tuple or NamedTuple and all its elements must contain the same number of observations.\n\nIf any element of dss is not an AbstractMillNode it is first wrapped in an ArrayNode.\n\nExamples\n\njulia> ProductNode((ArrayNode(zeros(2, 2)), ArrayNode(Flux.onehotbatch([1, 2], 1:2))))\nProductNode # 2 obs, 24 bytes\n ├── ArrayNode(2×2 Array with Float64 elements) # 2 obs, 80 bytes\n ╰── ArrayNode(2×2 OneHotArray with Bool elements) # 2 obs, 80 bytes\n\njulia> ProductNode(x1 = ArrayNode(NGramMatrix([\"Hello\", \"world\"])),\n x2 = BagNode(ArrayNode([1 2; 3 4]), [1:2, 0:-1]))\nProductNode # 2 obs, 48 bytes\n ├── x1: ArrayNode(2053×2 NGramMatrix with Int64 elements) # 2 obs, 146 bytes\n ╰── x2: BagNode # 2 obs, 96 bytes\n ╰── ArrayNode(2×2 Array with Int64 elements) # 2 obs, 80 bytes\n\njulia> ProductNode([1 2 3])\nProductNode # 3 obs, 8 bytes\n ╰── ArrayNode(1×3 Array with Int64 elements) # 3 obs, 72 bytes\n\njulia> ProductNode((ArrayNode([1 2; 3 4]), ArrayNode([1 2 3; 4 5 6])))\nERROR: AssertionError: All subtrees must have an equal amount of instances!\n[...]\n\nSee also: AbstractProductNode, AbstractMillNode, ProductModel.\n\n\n\n\n\n","category":"method"},{"location":"api/data_nodes/#Mill.LazyNode","page":"Data nodes","title":"Mill.LazyNode","text":"LazyNode{Name, D, C} <: AbstractMillNode\n\nData node storing data of type D in a lazy manner and optional metadata of type C.\n\nSource of data or its type is specified in Name.\n\nSee also: AbstractMillNode, LazyModel, Mill.unpack2mill.\n\n\n\n\n\n","category":"type"},{"location":"api/data_nodes/#Mill.LazyNode-Tuple{Symbol, Any}","page":"Data nodes","title":"Mill.LazyNode","text":"LazyNode([Name::Symbol], d, m=nothing)\nLazyNode{Name}(d, m=nothing)\n\nConstruct a new LazyNode with name Name, data d, and metadata m.\n\nExamples\n\njulia> LazyNode(:Codons, [\"GGGCGGCGA\", \"CCTCGCGGG\"])\nLazyNode{:Codons, Vector{String}, Nothing}:\n \"GGGCGGCGA\"\n \"CCTCGCGGG\"\n\nSee also: AbstractMillNode, LazyModel, Mill.unpack2mill.\n\n\n\n\n\n","category":"method"},{"location":"api/data_nodes/#Mill.unpack2mill","page":"Data nodes","title":"Mill.unpack2mill","text":"Mill.unpack2mill(x::LazyNode)\n\nReturn a representation of LazyNode x using Mill.jl structures. Every custom LazyNode should have a special method as it is used in LazyModel.\n\nExamples\n\njulia> function Mill.unpack2mill(ds::LazyNode{:Sentence})\n s = split.(ds.data, \" \")\n x = NGramMatrix(reduce(vcat, s))\n BagNode(x, Mill.length2bags(length.(s)))\nend;\n\njulia> LazyNode{:Sentence}([\"foo bar\", \"baz\"]) |> Mill.unpack2mill\nBagNode # 2 obs, 120 bytes\n ╰── ArrayNode(2053×3 NGramMatrix with Int64 elements) # 3 obs, 274 bytes\n\nSee also: LazyNode, LazyModel.\n\n\n\n\n\n","category":"function"},{"location":"api/data_nodes/#Mill.data","page":"Data nodes","title":"Mill.data","text":"Mill.data(n::AbstractMillNode)\n\nReturn data stored in node n.\n\nExamples\n\njulia> Mill.data(ArrayNode([1 2; 3 4], \"metadata\"))\n2×2 Matrix{Int64}:\n 1 2\n 3 4\n\njulia> Mill.data(BagNode(ArrayNode([1 2; 3 4]), [1, 2], \"metadata\"))\n2×2 ArrayNode{Matrix{Int64}, Nothing}:\n 1 2\n 3 4\n\nSee also: Mill.metadata\n\n\n\n\n\n","category":"function"},{"location":"api/data_nodes/#Mill.metadata","page":"Data nodes","title":"Mill.metadata","text":"Mill.metadata(n::AbstractMillNode)\n\nReturn metadata stored in node n.\n\nExamples\n\njulia> Mill.metadata(ArrayNode([1 2; 3 4], \"metadata\"))\n\"metadata\"\n\njulia> Mill.metadata(BagNode(ArrayNode([1 2; 3 4]), [1, 2], \"metadata\"))\n\"metadata\"\n\nSee also: Mill.data\n\n\n\n\n\n","category":"function"},{"location":"api/data_nodes/#Mill.datasummary","page":"Data nodes","title":"Mill.datasummary","text":"datasummary(n::AbstractMillNode)\n\nPrint summary of parameters of node n.\n\nExamples\n\njulia> n = ProductNode(ArrayNode(randn(2, 3)))\nProductNode # 3 obs, 8 bytes\n ╰── ArrayNode(2×3 Array with Float64 elements) # 3 obs, 96 bytes\n\njulia> datasummary(n)\n\"Data summary: 3 obs, 112 bytes.\"\n\nSee also: modelsummary.\n\n\n\n\n\n","category":"function"},{"location":"api/data_nodes/#Mill.dropmeta","page":"Data nodes","title":"Mill.dropmeta","text":"dropmeta(n:AbstractMillNode)\n\nDrop metadata stored in data node n (recursively).\n\nExamples\n\njulia> n1 = ArrayNode(NGramMatrix([\"foo\", \"bar\"]), [\"metafoo\", \"metabar\"])\n2053×2 ArrayNode{NGramMatrix{String, Vector{String}, Int64}, Vector{String}}:\n \"foo\"\n \"bar\"\n\njulia> n2 = dropmeta(n1)\n2053×2 ArrayNode{NGramMatrix{String, Vector{String}, Int64}, Nothing}:\n \"foo\"\n \"bar\"\n\njulia> isnothing(Mill.metadata(n2))\ntrue\n\nSee also: Mill.metadata.\n\n\n\n\n\n","category":"function"},{"location":"api/data_nodes/#Mill.catobs","page":"Data nodes","title":"Mill.catobs","text":"catobs(ns...)\n\nMerge multiple nodes storing samples (observations) into one suitably promoting in the process if possible.\n\nSimilar to Base.cat but concatenates along the abstract \"axis\" where samples are stored.\n\nIn case of repeated calls with varying number of arguments or argument types, use reduce(catobs, [ns...]) to save compilation time.\n\nExamples\n\njulia> catobs(ArrayNode(zeros(2, 2)), ArrayNode([1 2; 3 4]))\n2×4 ArrayNode{Matrix{Float64}, Nothing}:\n 0.0 0.0 1.0 2.0\n 0.0 0.0 3.0 4.0\n\njulia> n = ProductNode(t1=ArrayNode(randn(2, 3)), t2=BagNode(ArrayNode(randn(3, 8)), bags([1:3, 4:5, 6:8])))\nProductNode # 3 obs, 24 bytes\n ├── t1: ArrayNode(2×3 Array with Float64 elements) # 3 obs, 96 bytes\n ╰── t2: BagNode # 3 obs, 112 bytes\n ╰── ArrayNode(3×8 Array with Float64 elements) # 8 obs, 240 bytes\n\njulia> catobs(n[1], n[3])\nProductNode # 2 obs, 24 bytes\n ├── t1: ArrayNode(2×2 Array with Float64 elements) # 2 obs, 80 bytes\n ╰── t2: BagNode # 2 obs, 96 bytes\n ╰── ArrayNode(3×6 Array with Float64 elements) # 6 obs, 192 bytes\n\nSee also: Mill.subset.\n\n\n\n\n\n","category":"function"},{"location":"api/data_nodes/#Mill.subset","page":"Data nodes","title":"Mill.subset","text":"subset(n, i)\n\nExtract a subset i of samples (observations) stored in node n.\n\nSimilar to Base.getindex or MLUtils.getobs but defined for all Mill.jl compatible data as well.\n\nExamples\n\njulia> Mill.subset(ArrayNode(NGramMatrix([\"Hello\", \"world\"])), 2)\n2053×1 ArrayNode{NGramMatrix{String, Vector{String}, Int64}, Nothing}:\n \"world\"\n\njulia> Mill.subset(BagNode(ArrayNode(randn(2, 8)), [1:2, 3:3, 4:7, 8:8]), 1:3)\nBagNode # 3 obs, 112 bytes\n ╰── ArrayNode(2×7 Array with Float64 elements) # 7 obs, 160 bytes\n\nSee also: catobs.\n\n\n\n\n\n","category":"function"},{"location":"api/data_nodes/#Mill.mapdata","page":"Data nodes","title":"Mill.mapdata","text":"mapdata(f, x)\n\nRecursively apply f to data in all leaves of x.\n\nExamples\n\njulia> n1 = ProductNode(a=zeros(2,2), b=ones(2,2))\nProductNode # 2 obs, 16 bytes\n ├── a: ArrayNode(2×2 Array with Float64 elements) # 2 obs, 80 bytes\n ╰── b: ArrayNode(2×2 Array with Float64 elements) # 2 obs, 80 bytes\n\njulia> n2 = Mill.mapdata(x -> x .+ 1, n1)\nProductNode # 2 obs, 16 bytes\n ├── a: ArrayNode(2×2 Array with Float64 elements) # 2 obs, 80 bytes\n ╰── b: ArrayNode(2×2 Array with Float64 elements) # 2 obs, 80 bytes\n\njulia> Mill.data(n2).a\n2×2 ArrayNode{Matrix{Float64}, Nothing}:\n 1.0 1.0\n 1.0 1.0\n\njulia> Mill.data(n2).b\n2×2 ArrayNode{Matrix{Float64}, Nothing}:\n 2.0 2.0\n 2.0 2.0\n\n\n\n\n\n","category":"function"},{"location":"api/data_nodes/#Mill.removeinstances","page":"Data nodes","title":"Mill.removeinstances","text":"removeinstances(n::AbstractBagNode, mask)\n\nRemove instances from n using mask and remap bag indices accordingly.\n\nExamples\n\njulia> b1 = BagNode(ArrayNode([1 2 3; 4 5 6]), bags([1:2, 0:-1, 3:3]))\nBagNode # 3 obs, 112 bytes\n ╰── ArrayNode(2×3 Array with Int64 elements) # 3 obs, 96 bytes\n\njulia> b2 = removeinstances(b1, [false, true, true])\nBagNode # 3 obs, 112 bytes\n ╰── ArrayNode(2×2 Array with Int64 elements) # 2 obs, 80 bytes\n\njulia> b2.data\n2×2 ArrayNode{Matrix{Int64}, Nothing}:\n 2 3\n 5 6\n\njulia> b2.bags\nAlignedBags{Int64}(UnitRange{Int64}[1:1, 0:-1, 2:2])\n\n\n\n\n\n","category":"function"},{"location":"motivation/#Motivation","page":"Motivation","title":"Motivation","text":"","category":"section"},{"location":"motivation/","page":"Motivation","title":"Motivation","text":"In this section, we provide a short introduction into (hierarchical) multi instance learning. A much more detailed overview of this subject can be found in [1] and [4].","category":"page"},{"location":"motivation/#What-is-a-Multiple-instance-learning-problem?","page":"Motivation","title":"What is a Multiple instance learning problem?","text":"","category":"section"},{"location":"motivation/","page":"Motivation","title":"Motivation","text":"In Multiple Instance Learning (MIL), also Multi-Instance Learning, the sample bmx is a set of vectors (or matrices) x_1ldotsx_l, where x_i in mathbbR^d. As a result, order does not matter, which makes MIL problems different from sequences. In MIL parlance, sample bmx is also called a bag and its elements x_1 ldots x_2 instances. MIL problems have been introduced in [5], and extended and generalized in a series of works [2], [3], [6]. The most comprehensive introduction known to authors is [4].","category":"page"},{"location":"motivation/","page":"Motivation","title":"Motivation","text":"Why are MIL problems relevant? Since the seminal paper from [7], the majority of machine learning problems deals with problems like the one shown below:[1]","category":"page"},{"location":"motivation/","page":"Motivation","title":"Motivation","text":"[1]: Iris flower data set","category":"page"},{"location":"motivation/","page":"Motivation","title":"Motivation","text":"\"Iris\n\"Iris","category":"page"},{"location":"motivation/","page":"Motivation","title":"Motivation","text":"where the input sample bmx is a vector (or generally speaking any tensor) of a fixed dimension containing various measurements of the specimen.","category":"page"},{"location":"motivation/","page":"Motivation","title":"Motivation","text":"Most of the time, a skilled botanist is able to identify a specimen not by making use of any measuring device, but by visual or tactile inspection of its stem, leaves and blooms. For different species, different parts of the flower may need to be examined for indicators. At the same time, many species may have nearly identical-looking leaves or blooms, therefore, one needs to step back, consider the whole picture, and appropriately combine lower-level observations into high-level conclusions about the given specimen.","category":"page"},{"location":"motivation/","page":"Motivation","title":"Motivation","text":"If we want to use such more elaborate description of the Iris flower using fixed size structures, we will have a hard time, because every specimen can have a different amounts of leaves or blooms (or they may be completely missing). This means that to use the usual fixed dimension paradigm, we have to either somehow select a single leaf (blossom) and extract features from them, or design procedures for aggregating such features over whole sets, so that the output has fixed dimension. This is clearly undesirable. Mill.jl a framework that seamlessly deals with these challenges in data representation.","category":"page"},{"location":"motivation/#Hierarchical-Multiple-Instance-Learning","page":"Motivation","title":"Hierarchical Multiple Instance Learning","text":"","category":"section"},{"location":"motivation/","page":"Motivation","title":"Motivation","text":"In Hierarchical Multiple Instance Learning (HMIL) the input may consists of not only sets, but also sets of sets and Cartesian Products of these structures. Returning to the previous Iris flower example, a specimen can be represented like this for HMIL:","category":"page"},{"location":"motivation/","page":"Motivation","title":"Motivation","text":"\"Iris\n\"Iris","category":"page"},{"location":"motivation/","page":"Motivation","title":"Motivation","text":"The only stem is represented by vector bmx_s encoding its distinctive properties such as shape, color, structure or texture. Next, we inspect all blooms. Each of the blooms may have distinctive discriminative signs, therefore, we describe all three in vectors bmx_b_1 bmx_b_2 bmx_b_3, one vector for each bloom, and group them to a set. Finally, bmx_u represents the only flower which has not blossomed. Likewise, we could describe all leaves of the specimen if any were present. Here we assume that each specimen of the considered species has only one stem, but may have multiple flowers or leaves. Hence, all blooms and buds are represented as unordered sets of vectors as opposed to stem representation, which consists of only one vector.","category":"page"},{"location":"motivation/","page":"Motivation","title":"Motivation","text":"How does MIL models cope with variability in numbers of flowers and leaves? Each MIL model consists of two feed-forward neural networks with an element-wise aggregation operator like mean (or maximum) sandwiched between them. Denoting those feed-forward networks (FFNs) as f_1 and f_2, the output of the model applied to a bag is calculated for example as f_2 left(frac1lsum_i=1^l f_1(x_i) right) if we use mean as an aggregation function.","category":"page"},{"location":"motivation/","page":"Motivation","title":"Motivation","text":"The HMIL model corresponding to the Iris example above would comprise two FFNs and an aggregation to convert set of leafs to a single vector, and another two FFNs and an aggregation to convert set of blossoms to a single vector. These two outputs would be concatenated with a description of a stem, which would be fed to yet another FFN providing the final output. Since the whole scheme is differentiable, we can compute gradients and use any available gradient-based method to optimize the whole model at once using only labels on the level of output[2].","category":"page"},{"location":"motivation/","page":"Motivation","title":"Motivation","text":"[2]: Some methods for MIL problems require instance-level labels as well, which are not always available.","category":"page"},{"location":"motivation/","page":"Motivation","title":"Motivation","text":"The Mill.jl library simplifies implementation of machine learning problems using (H)MIL representation. In theory, it can represent any problem that can be represented in JSONs. That is why we have created a separate tool, JsonGrinder.jl, which helps with processing JSON documents for learning.","category":"page"},{"location":"motivation/","page":"Motivation","title":"Motivation","text":"In [6], authors have further extended the Universal approximation theorem to MIL problems, their Cartesian products, and nested MIL problems, i.e. a case where instances of one bag are in fact bags again.","category":"page"},{"location":"motivation/#Relation-to-Graph-Neural-Networks","page":"Motivation","title":"Relation to Graph Neural Networks","text":"","category":"section"},{"location":"motivation/","page":"Motivation","title":"Motivation","text":"HMIL problems can be seen as a special subset of general graphs. They differ in two important ways:","category":"page"},{"location":"motivation/","page":"Motivation","title":"Motivation","text":"In general graphs, vertices are of a small number of semantic type, whereas in HMIL problems, the number of semantic types of vertices is much higher (it is helpful to think about HMIL problems as about those for which JSON is a natural representation).\nThe computational graph of HMIL is a tree, which introduces assumption that there exist an efficient inference. Contrary, in general graphs (with loops) there is no efficient inference and one has to resort to message passing (Loopy belief propagation).\nOne update message in loopy belief propagation can be viewed as a MIL problem, as it has to produce a vector based on infomation inthe neighborhood, which can contain an arbitrary number of vertices.","category":"page"},{"location":"motivation/#Differences-from-sequence-based-modeling","page":"Motivation","title":"Differences from sequence-based modeling","text":"","category":"section"},{"location":"motivation/","page":"Motivation","title":"Motivation","text":"The major difference is that instances in bag are not ordered in any way. This means that if a sequence (abc) should be treated as a set, then the output of a function f should be the same for any permutation, i.e. f(abc) = f(cba) = f(bac) = ldots.","category":"page"},{"location":"motivation/","page":"Motivation","title":"Motivation","text":"This property has a dramatic implication on the computational complexity. Sequences are typically modeled using Recurrent Neural Networks (RNNs), where the output is calculated roughly as f(abc) = g(a g(b g(c))). During optimization, a gradient of g needs to be calculated recursively, giving raise to infamous vanishing / exploding gradient problems. In constrast, (H)MIL models calculate the output as f(frac13(g(a) + g(b) + g(c))) (slightly abusing notation again), which means that the gradient of g can be calculated in parallel and not recurrently. ","category":"page"},{"location":"examples/dag/#DAGs","page":"DAGs","title":"DAGs","text":"","category":"section"},{"location":"examples/dag/","page":"DAGs","title":"DAGs","text":"using Mill, Flux, Zygote, ChainRulesCore, Graphs","category":"page"},{"location":"examples/dag/","page":"DAGs","title":"DAGs","text":"Imagine a data/knowledge base represented in a form of a directed acyclic graph (DAG), where a vertex would be modelled based on its parents (and their parents), but not on its descendants. We will make one assumption (common in graphical models) that two children are independent given their parent or, in other words, once we have access to the data or inferred values of the parent, we do not have to inspect its other children.","category":"page"},{"location":"examples/dag/","page":"DAGs","title":"DAGs","text":"For example, in the graph below, when we infer some value for vertex e, we ignore vertices d, g, and h:","category":"page"},{"location":"examples/dag/","page":"DAGs","title":"DAGs","text":"(Image: )","category":"page"},{"location":"examples/dag/","page":"DAGs","title":"DAGs","text":"Firstly, we define a new type for our graph that would be able to store a structure of the graph together with vertex features:","category":"page"},{"location":"examples/dag/","page":"DAGs","title":"DAGs","text":"struct DagGraph{G <: SimpleDiGraph,T}\n g::G\n vertex_features::T\nend\n\nnothing # hide","category":"page"},{"location":"examples/dag/","page":"DAGs","title":"DAGs","text":"Then, we specify a model type:","category":"page"},{"location":"examples/dag/","page":"DAGs","title":"DAGs","text":"struct DagModel{M}\n m::M\n od::Int\nend\n\nFlux.@functor DagModel\n\nnothing # hide","category":"page"},{"location":"examples/dag/","page":"DAGs","title":"DAGs","text":"Here, m is a function realizing one step of the message passing procedure, and od is output dimension.","category":"page"},{"location":"examples/dag/","page":"DAGs","title":"DAGs","text":"In the course of calculating the value of vertex e, it may happen that for some vertices we will have to compute their value multiple times (for example for c, once when reached from e and once from f). Ideally, we would like to have a cache of already calculated values, which is difficult to do when autodifferentiating with Zygote as it does not support setindex operation. However, since the cache is assigned only once this can be realized through Zygote.buffer. We begin by initializing the cache:","category":"page"},{"location":"examples/dag/","page":"DAGs","title":"DAGs","text":"initcache(g, k) = [Zygote.Buffer(zeros(Float32, k, 1)) for _ in 1:nv(g)]\nChainRulesCore.@non_differentiable initcache(g, k)\nnothing # hide","category":"page"},{"location":"examples/dag/","page":"DAGs","title":"DAGs","text":"To get the already computed value of a vertex when using the model, we just delegate the question to cache as ","category":"page"},{"location":"examples/dag/","page":"DAGs","title":"DAGs","text":"function (model::DagModel)(g::DagGraph, i)\n cache = initcache(g.g, model.od)\n ArrayNode(getfromcache!(cache, g, model, i))\nend\n\n(model::DagModel)(g::SimpleDiGraph, vertex_features, i) = model(DagGraph(g, vertex_features), i)\n\nnothing # hide","category":"page"},{"location":"examples/dag/","page":"DAGs","title":"DAGs","text":"which means that the getfromcache! will do all the heavy lifting. It turns out that this function just has to check if the value in cache has been already calculated. If not, it will calculate the value (applying model on millvertex!) and freeze the calculated item in cache:","category":"page"},{"location":"examples/dag/","page":"DAGs","title":"DAGs","text":"function getfromcache!(cache, g::DagGraph, model::DagModel, i::Int)\n cache[i].freeze && return(copy(cache[i]))\n ds = millvertex!(cache, g, model, i)\n cache[i][:] = model.m(ds)\n return(copy(cache[i]))\nend\n\nfunction getfromcache!(cache, g::DagGraph, model::DagModel, ii::Vector{Int}) \n reduce(catobs, [getfromcache!(cache, g, model, i) for i in ii])\nend\n\nnothing # hide","category":"page"},{"location":"examples/dag/","page":"DAGs","title":"DAGs","text":"And what does millvertex! function do? It just takes the representation of ancestors (from cache) and put them together:","category":"page"},{"location":"examples/dag/","page":"DAGs","title":"DAGs","text":"function millvertex!(cache, g::DagGraph, model::DagModel, i)\n ProductNode(neighbours = millneighbors!(cache, g, model, i), \n vertex = vertex_features[i]\n )\nend\nnothing # hide","category":"page"},{"location":"examples/dag/","page":"DAGs","title":"DAGs","text":"The last missing piece is millneighbors! definition:","category":"page"},{"location":"examples/dag/","page":"DAGs","title":"DAGs","text":"function millneighbors!(cache, g::DagGraph, model::DagModel, ii::Vector{Int})\n isempty(ii) && return(BagNode(missing, [0:-1]))\n xs = [getfromcache!(cache, g, model, i) for i in ii]\n BagNode(ArrayNode(reduce(catobs, xs)), [1:length(xs)])\nend\n\nmillneighbors!(cache, g::DagGraph, model::DagModel, i::Int) = millneighbors!(cache, g, model, inneighbors(g.g, i))\nChainRulesCore.@non_differentiable inneighbors(g, i)\nnothing # hide","category":"page"},{"location":"examples/dag/","page":"DAGs","title":"DAGs","text":"Note that this recursive approach is not the most efficient way to implement this. It would be better to spent a little time with graphs to identify sets of vertices that can be processed in parallel and for which all ancestors are known. But this was a fun little exercise.","category":"page"},{"location":"examples/jsons/","page":"Processing JSONs","title":"Processing JSONs","text":"

    \n \n \"JsonGrinder.jl\n \"JsonGrinder.jl\n \n

    ","category":"page"},{"location":"examples/jsons/#Processing-JSONs","page":"Processing JSONs","title":"Processing JSONs","text":"","category":"section"},{"location":"examples/jsons/","page":"Processing JSONs","title":"Processing JSONs","text":"Processing JSONs is actually one of the main motivations for building Mill.jl. As a matter of fact, with Mill one is now able to process a set of valid JSON documents that follow the same meta schema. JsonGrinder.jl is a library that helps with infering the schema and other steps in the pipeline. For some examples, please refer to its documentation.","category":"page"},{"location":"manual/missing/","page":"Missing data","title":"Missing data","text":"using Mill, Flux","category":"page"},{"location":"manual/missing/#Missing-data","page":"Missing data","title":"Missing data","text":"","category":"section"},{"location":"manual/missing/","page":"Missing data","title":"Missing data","text":"One detail that was left out so far is how Mill.jl handles incomplete or missing data. This phenomenon is nowadays ubiquitous in many data sources and occurs due to:","category":"page"},{"location":"manual/missing/","page":"Missing data","title":"Missing data","text":"a high price of obtaining a (part of) observation\ninformation being unreachable due to privacy reasons\na gradual change in the definition of data being gathered\na faulty collection process","category":"page"},{"location":"manual/missing/","page":"Missing data","title":"Missing data","text":"and many other possible reasons. At the same time, it is wasteful to throw away the incomplete observations altogether. Thanks to the hierarchical structure of both samples and models, we can still process samples with missing information fragments at various levels of abstraction. Problems of this type can be categorized into 3 not necessarily separate types:","category":"page"},{"location":"manual/missing/","page":"Missing data","title":"Missing data","text":"Missing parts of raw-data in a leaf ArrayNode\nEmpty bags with no instances in a BagNode\nAnd entire key missing in a ProductNode","category":"page"},{"location":"manual/missing/","page":"Missing data","title":"Missing data","text":"At the moment, Mill is capable of handling the first two cases. The solution always involves an additional vector of parameters (denoted always by ψ) that are used during the model evaluation to substitute the missing values. Parameters ψ can be either fixed or learned during training. Everything is done automatically.","category":"page"},{"location":"manual/missing/#Empty-bags","page":"Missing data","title":"Empty bags","text":"","category":"section"},{"location":"manual/missing/","page":"Missing data","title":"Missing data","text":"It may happen that some bags in the datasets are empty by definition or no associated instances were obtained during data collection. Recall, that an empty bag is specified as empty range 0:-1 in case of AlignedBags and as an empty vector Int[] when ScatteredBags are used:","category":"page"},{"location":"manual/missing/","page":"Missing data","title":"Missing data","text":"empty_bags_1 = AlignedBags([1:2, 0:-1, 3:5, 0:-1])\nempty_bags_2 = ScatteredBags([[1, 2], Int[], [3, 4, 5], Int[]])","category":"page"},{"location":"manual/missing/","page":"Missing data","title":"Missing data","text":"To obtain the vector representation for a bag, be it for dircetly predicting some value or using it to represent some higher-level structures, we need to deal with these empty bags. This is done in Bag aggregation. Each AbstractAggregation operator carries a vector of parameters ψ, initialized to zeros upon creation:","category":"page"},{"location":"manual/missing/","page":"Missing data","title":"Missing data","text":"a = SegmentedSumMax(2)","category":"page"},{"location":"manual/missing/","page":"Missing data","title":"Missing data","text":"When we evaluate any BagModel, these values are used to compute output for empty bags instead of the aggregation itself. See the demo below:","category":"page"},{"location":"manual/missing/","page":"Missing data","title":"Missing data","text":"an = ArrayNode(randn(Float32, 2, 5))\nds = BagNode(an, empty_bags_2)\nm = BagModel(identity, a, identity)\nm(ds)","category":"page"},{"location":"manual/missing/","page":"Missing data","title":"Missing data","text":"Vector ψ is learnable and therefore after training will contain a suitable representation of an empty bag for the given problem.","category":"page"},{"location":"manual/missing/","page":"Missing data","title":"Missing data","text":"When a BagNode is entirely empty, it can be constructed with missing instead of a matrix wrapped in an ArrayNode:","category":"page"},{"location":"manual/missing/","page":"Missing data","title":"Missing data","text":"bn1 = BagNode(ArrayNode(rand(3, 4)), [1:4])\nbn2 = BagNode(missing, [0:-1])","category":"page"},{"location":"manual/missing/","page":"Missing data","title":"Missing data","text":"and everything will work as expected. For example, we can concatenate these two:","category":"page"},{"location":"manual/missing/","page":"Missing data","title":"Missing data","text":"x = catobs(bn1, bn2)","category":"page"},{"location":"manual/missing/","page":"Missing data","title":"Missing data","text":"Notice, that the resulting ArrayNode has still the same dimension as ArrayNode inside bn1. The emptiness of bn2 is stored in bags:","category":"page"},{"location":"manual/missing/","page":"Missing data","title":"Missing data","text":"x.bags","category":"page"},{"location":"manual/missing/","page":"Missing data","title":"Missing data","text":"The second element BagNode can be obtained again by indexing:","category":"page"},{"location":"manual/missing/","page":"Missing data","title":"Missing data","text":"bn1 == x[2]","category":"page"},{"location":"manual/missing/","page":"Missing data","title":"Missing data","text":"Even though this approach of using missing for data field in BagNodes is the most accurate from the semantic point of view, it may cause excessive compilation, as the types will be different. Therefore, if this happens in multiple places in the sample tree, it may be better to instead use an empty matrix for type consistency:","category":"page"},{"location":"manual/missing/","page":"Missing data","title":"Missing data","text":"BagNode(ArrayNode(zeros(3, 0)), [0:-1])","category":"page"},{"location":"manual/missing/","page":"Missing data","title":"Missing data","text":"How indexing behaves with respect to this issue depends on a global switch (off by default) and can be changed with the Mill.emptyismissing! function:","category":"page"},{"location":"manual/missing/","page":"Missing data","title":"Missing data","text":"a = BagNode(ArrayNode(rand(3, 2)), [1:2, 0:-1, 0:-1])\na[2:3] |> Mill.data\nMill.emptyismissing!(true)\na[2:3] |> Mill.data\nmissing","category":"page"},{"location":"manual/missing/","page":"Missing data","title":"Missing data","text":"Mill.emptyismissing!(false)","category":"page"},{"location":"manual/missing/#Post-imputing","page":"Missing data","title":"Post imputing","text":"","category":"section"},{"location":"manual/missing/","page":"Missing data","title":"Missing data","text":"Storing missing strings in NGramMatrix is straightforward:","category":"page"},{"location":"manual/missing/","page":"Missing data","title":"Missing data","text":"missing_ngrams = NGramMatrix([\"foo\", missing, \"bar\"], 3, 256, 5)","category":"page"},{"location":"manual/missing/","page":"Missing data","title":"Missing data","text":"When some values of categorical variables are missing, Mill defines a new type for representation:","category":"page"},{"location":"manual/missing/","page":"Missing data","title":"Missing data","text":"missing_categorical = maybehotbatch([missing, 2, missing], 1:5)","category":"page"},{"location":"manual/missing/","page":"Missing data","title":"Missing data","text":"MaybeHotMatrix behaves similarly as OneHotMatrix from Flux.jl, but it supports possibly missing values. In case when no values are missing it looks exactly like OneHotMatrix:","category":"page"},{"location":"manual/missing/","page":"Missing data","title":"Missing data","text":"maybehotbatch([5, 2, 1], 1:5)","category":"page"},{"location":"manual/missing/","page":"Missing data","title":"Missing data","text":"MaybeHotMatrix behaves like AbstractMatrix and supports left multiplication again:","category":"page"},{"location":"manual/missing/","page":"Missing data","title":"Missing data","text":"missing_categorical::AbstractMatrix{Union{Bool, Missing}}","category":"page"},{"location":"manual/missing/","page":"Missing data","title":"Missing data","text":"However, multiplying these matrices with missing data leads into missing data in the output.","category":"page"},{"location":"manual/missing/","page":"Missing data","title":"Missing data","text":"W = rand(2, 5)\nW * missing_ngrams\nW * missing_categorical","category":"page"},{"location":"manual/missing/","page":"Missing data","title":"Missing data","text":"Consequently, gradient can't be computed and any model can't be trained.","category":"page"},{"location":"manual/missing/","page":"Missing data","title":"Missing data","text":"ukn: Model debugging\nFlux gradient call returns an error like Output should be scalar; gradients are not defined for output missing when attempted on missing result. In a similar fashion as having NaNs in a model, this signifies that some missing input is not treated anywhere in the model and it propagates up. Generally speaking, it is recommended to deal with missing values as soon as possible (on the leaf level) so that they do not propagate and cause type instabilities.","category":"page"},{"location":"manual/missing/","page":"Missing data","title":"Missing data","text":"PostImputingMatrix is a solution for this. It can be constructed as follows:","category":"page"},{"location":"manual/missing/","page":"Missing data","title":"Missing data","text":"A = PostImputingMatrix(W)","category":"page"},{"location":"manual/missing/","page":"Missing data","title":"Missing data","text":"Matrix W is stored inside and A creates one vector of parameters ψ of length size(W, 1) on top of that. Suddenly, multiplication automagically works:","category":"page"},{"location":"manual/missing/","page":"Missing data","title":"Missing data","text":"A * missing_ngrams\nA * missing_categorical","category":"page"},{"location":"manual/missing/","page":"Missing data","title":"Missing data","text":"What happens under the hood is that whenever A encounters a missing column in the matrix, it fills in values from ψ after the multiplication is performed (effectively replacing all missing values in the result of multiplying with W, but implemented more efficiently). Vector ψ can be learned during training as well and everything works out of the box.","category":"page"},{"location":"manual/missing/#Pre-imputing","page":"Missing data","title":"Pre imputing","text":"","category":"section"},{"location":"manual/missing/","page":"Missing data","title":"Missing data","text":"If we have to deal with inputs where some elements of input matrix are missing:","category":"page"},{"location":"manual/missing/","page":"Missing data","title":"Missing data","text":"X = [missing 1 2; 3 missing missing]","category":"page"},{"location":"manual/missing/","page":"Missing data","title":"Missing data","text":"we can make use of PreImputingMatrix:","category":"page"},{"location":"manual/missing/","page":"Missing data","title":"Missing data","text":"W = rand(1:2, 3, 2)\nA = PreImputingMatrix(W)","category":"page"},{"location":"manual/missing/","page":"Missing data","title":"Missing data","text":"As opposed to PostImputingMatrix, A now stores a vector of values ψ with length size(W, 2). When we use it for multiplication:","category":"page"},{"location":"manual/missing/","page":"Missing data","title":"Missing data","text":"A * X","category":"page"},{"location":"manual/missing/","page":"Missing data","title":"Missing data","text":"what happens is that when we perform a dot product of a row of A and a column of X, we first fill in values from ψ into the column before the multiplication is performed. Again, it is possible to compute gradients with respect to all three of W, ψ and X and therefore learn the appropriate default values in ψ from the data:","category":"page"},{"location":"manual/missing/","page":"Missing data","title":"Missing data","text":"gradient((A, X) -> sum(A * X), A, X)","category":"page"},{"location":"manual/missing/#Model-reflection-with-missing-values","page":"Missing data","title":"Model reflection with missing values","text":"","category":"section"},{"location":"manual/missing/","page":"Missing data","title":"Missing data","text":"Model reflection takes missing values and types into account and creates appropriate (sub)models to handle them:","category":"page"},{"location":"manual/missing/","page":"Missing data","title":"Missing data","text":"ds = ProductNode((missing_ngrams, missing_categorical, X))\nm = reflectinmodel(ds)","category":"page"},{"location":"manual/missing/","page":"Missing data","title":"Missing data","text":"Here, [pre_imputing]Dense and [post_imputing]Dense are standard dense layers with a special matrix inside:","category":"page"},{"location":"manual/missing/","page":"Missing data","title":"Missing data","text":"dense = m.ms[1].m; typeof(dense.weight)","category":"page"},{"location":"manual/missing/","page":"Missing data","title":"Missing data","text":"Inside Mill we add a special definition Base.show for these types for compact printing.","category":"page"},{"location":"manual/missing/","page":"Missing data","title":"Missing data","text":"The reflectinmodel method use types to determine whether imputing is needed or not. Compare the following:","category":"page"},{"location":"manual/missing/","page":"Missing data","title":"Missing data","text":"reflectinmodel(ArrayNode(randn(Float32, 2, 3)))\nreflectinmodel(ArrayNode([1.0f0 2.0f0 missing; 4.0f0 missing missing]))\nreflectinmodel(ArrayNode(Matrix{Union{Missing, Float32}}(randn(2, 3))))","category":"page"},{"location":"manual/missing/","page":"Missing data","title":"Missing data","text":"In the last case, the imputing type is returned even though there is no missing element in the matrix. Of course, the same applies to MaybeHotVector, MaybeHotMatrix and NGramMatrix. This way, we can signify that even though there are no missing values in the available sample, we expect them to appear in the future and want our model compatible. If it is hard to determine this in advance a safe bet is to make all leaves in the model. The performance will not suffer because imputing types are as fast as their non-imputing counterparts on data not containing missing values and the only tradeoff is a slight increase in the number of parameters, some of which may never be used.","category":"page"},{"location":"api/model_nodes/#Model-nodes","page":"Model nodes","title":"Model nodes","text":"","category":"section"},{"location":"api/model_nodes/#Index","page":"Model nodes","title":"Index","text":"","category":"section"},{"location":"api/model_nodes/","page":"Model nodes","title":"Model nodes","text":"Pages = [\"model_nodes.md\"]","category":"page"},{"location":"api/model_nodes/#API","page":"Model nodes","title":"API","text":"","category":"section"},{"location":"api/model_nodes/","page":"Model nodes","title":"Model nodes","text":"AbstractMillModel\n\nArrayModel\n\nBagModel\nBagModel(::AbstractMillModel, ::Union{AbstractAggregation, BagCount}, ::ArrayModel)\n\nProductModel\nProductModel(::Any)\n\nLazyModel\nLazyModel(::Symbol, ::AbstractMillModel)\n\nreflectinmodel\nmodelsummary","category":"page"},{"location":"api/model_nodes/#Mill.AbstractMillModel","page":"Model nodes","title":"Mill.AbstractMillModel","text":"AbstractMillModel\n\nSupertype for any model defined in Mill.jl.\n\n\n\n\n\n","category":"type"},{"location":"api/model_nodes/#Mill.ArrayModel","page":"Model nodes","title":"Mill.ArrayModel","text":"ArrayModel{T} <: AbstractMillModel\n\nA model node for processing ArrayNodes. It applies a (sub)model m stored in it to data in an ArrayNode.\n\nExamples\n\njulia> Random.seed!(0);\n\njulia> n = ArrayNode(randn(Float32, 2, 2))\n2×2 ArrayNode{Matrix{Float32}, Nothing}:\n 0.94... 1.53...\n 0.13... 0.12...\n\njulia> m = ArrayModel(Dense(2, 2))\nArrayModel(Dense(2 => 2)) # 2 arrays, 6 params, 104 bytes\n\njulia> m(n)\n2×2 Matrix{Float32}:\n -0.50... -0.77...\n 0.25... 0.49...\n\nSee also: AbstractMillModel, ArrayNode.\n\n\n\n\n\n","category":"type"},{"location":"api/model_nodes/#Mill.BagModel","page":"Model nodes","title":"Mill.BagModel","text":"BagModel{T <: AbstractMillModel, A <: Union{AbstractAggregation, BagCount}, U}\n <: AbstractMillModel\n\nA model node for processing AbstractBagNodes. It first applies its \"instance (sub)model\" im on every instance, then performs elementwise segmented aggregation a and finally applies the final model bm on the aggregated representation of every bag in the data node.\n\nExamples\n\njulia> Random.seed!(0);\n\njulia> n = BagNode(ArrayNode(randn(Float32, 3, 2)), bags([0:-1, 1:2]))\nBagNode # 2 obs, 96 bytes\n ╰── ArrayNode(3×2 Array with Float32 elements) # 2 obs, 72 bytes\n\njulia> m = BagModel(ArrayModel(Dense(3, 2)), SegmentedMeanMax(2), Dense(4, 2))\nBagModel ↦ [SegmentedMean(2); SegmentedMax(2)] ↦ Dense(4 => 2) # 4 arrays, 14 params, 216 bytes\n ╰── ArrayModel(Dense(3 => 2)) # 2 arrays, 8 params, 112 bytes\n\njulia> m(n)\n2×2 Matrix{Float32}:\n 0.0 1.05...\n 0.0 0.49...\n\njulia> m(n) == m.bm(m.a(m.im(n.data), n.bags))\ntrue\n\nSee also: AbstractMillModel, AbstractAggregation, AbstractBagNode, BagNode, WeightedBagNode.\n\n\n\n\n\n","category":"type"},{"location":"api/model_nodes/#Mill.BagModel-Tuple{AbstractMillModel, Union{AbstractAggregation, BagCount}, ArrayModel}","page":"Model nodes","title":"Mill.BagModel","text":"BagModel(im, a, bm=identity)\n\nConstruct a BagModel from the arguments. im should be AbstractMillModel, a AbstractAggregation or BagCount, and bm ArrayModel.\n\nIt is also possible to pass any function as im instead of a model node. In that case, it is wrapped into an ArrayNode.\n\nExamples\n\njulia> m = BagModel(ArrayModel(Dense(3, 2)), SegmentedMeanMax(2), Dense(4, 2))\nBagModel ↦ [SegmentedMean(2); SegmentedMax(2)] ↦ Dense(4 => 2) # 4 arrays, 14 params, 216 bytes\n ╰── ArrayModel(Dense(3 => 2)) # 2 arrays, 8 params, 112 bytes\n\njulia> m = BagModel(Dense(4, 3), BagCount(SegmentedMean(3)))\nBagModel ↦ BagCount(SegmentedMean(3)) ↦ identity # 1 arrays, 3 params (all zero), 52 bytes\n ╰── ArrayModel(Dense(4 => 3)) # 2 arrays, 15 params, 140 bytes\n\nSee also: AbstractMillModel, AbstractAggregation, BagCount, AbstractBagNode, BagNode, WeightedBagNode.\n\n\n\n\n\n","category":"method"},{"location":"api/model_nodes/#Mill.ProductModel","page":"Model nodes","title":"Mill.ProductModel","text":"ProductModel{T <: Mill.VecOrTupOrNTup{<:AbstractMillModel}, U} <: AbstractMillModel\n\nA model node for processing ProductNodes. For each subtree of the data node it applies one (sub)model from ms and then applies m on the concatenation of results.\n\nExamples\n\njulia> Random.seed!(0);\n\njulia> n = ProductNode(a=ArrayNode([0 1; 2 3]), b=ArrayNode([4 5; 6 7]))\nProductNode # 2 obs, 16 bytes\n ├── a: ArrayNode(2×2 Array with Int64 elements) # 2 obs, 80 bytes\n ╰── b: ArrayNode(2×2 Array with Int64 elements) # 2 obs, 80 bytes\n\njulia> m1 = ProductModel(a=ArrayModel(Dense(2, 2)), b=ArrayModel(Dense(2, 2)))\nProductModel ↦ identity\n ├── a: ArrayModel(Dense(2 => 2)) # 2 arrays, 6 params, 104 bytes\n ╰── b: ArrayModel(Dense(2 => 2)) # 2 arrays, 6 params, 104 bytes\n\njulia> m1(n)\n4×2 Matrix{Float32}:\n -2.36... -3.58...\n -2.11... -3.40...\n -6.31... -7.61...\n -2.54... -2.66...\n\njulia> m2 = ProductModel(a=identity, b=identity)\nProductModel ↦ identity\n ├── a: ArrayModel(identity)\n ╰── b: ArrayModel(identity)\n\njulia> m2(n)\n4×2 Matrix{Int64}:\n 0 1\n 2 3\n 4 5\n 6 7\n\nSee also: AbstractMillModel, AbstractProductNode, ProductNode.\n\n\n\n\n\n","category":"type"},{"location":"api/model_nodes/#Mill.ProductModel-Tuple{Any}","page":"Model nodes","title":"Mill.ProductModel","text":"ProductModel(ms, m=identity)\nProductModel(m=identity; ms...)\n\nConstruct a ProductModel from the arguments. ms should an iterable (Tuple, NamedTuple or Vector) of one or more AbstractMillModels.\n\nIt is also possible to pass any function as elements of ms. In that case, it is wrapped into an ArrayNode.\n\nExamples\n\njulia> ProductModel(a=ArrayModel(Dense(2, 2)), b=identity)\nProductModel ↦ identity\n ├── a: ArrayModel(Dense(2 => 2)) # 2 arrays, 6 params, 104 bytes\n ╰── b: ArrayModel(identity)\n\njulia> ProductModel(Dense(4, 2); a=ArrayModel(Dense(2, 2)), b=Dense(2, 2))\nProductModel ↦ Dense(4 => 2) # 2 arrays, 10 params, 120 bytes\n ├── a: ArrayModel(Dense(2 => 2)) # 2 arrays, 6 params, 104 bytes\n ╰── b: ArrayModel(Dense(2 => 2)) # 2 arrays, 6 params, 104 bytes\n\njulia> ProductModel((identity, BagModel(ArrayModel(Dense(2, 2)), SegmentedMean(2), identity)))\nProductModel ↦ identity\n ├── ArrayModel(identity)\n ╰── BagModel ↦ SegmentedMean(2) ↦ identity # 1 arrays, 2 params (all zero), 48 bytes\n ╰── ArrayModel(Dense(2 => 2)) # 2 arrays, 6 params, 104 bytes\n\njulia> ProductModel(identity)\nProductModel ↦ identity\n ╰── ArrayModel(identity)\n\nSee also: AbstractMillModel, AbstractProductNode, ProductNode.\n\n\n\n\n\n","category":"method"},{"location":"api/model_nodes/#Mill.LazyModel","page":"Model nodes","title":"Mill.LazyModel","text":"LazyModel{Name, T} <: AbstractMillModel\n\nA model node for processing LazyNodes. It applies a (sub)model m stored in it to data of the LazyNode after calling Mill.unpack2mill.\n\nExamples\n\njulia> function Mill.unpack2mill(ds::LazyNode{:Sentence})\n s = split.(ds.data, \" \")\n x = NGramMatrix(reduce(vcat, s))\n BagNode(x, Mill.length2bags(length.(s)))\nend\n\njulia> Random.seed!(0);\n\njulia> n = LazyNode{:Sentence}([\"foo\", \"bar\", \"baz\"])\nLazyNode{:Sentence, Vector{String}, Nothing}:\n \"foo\"\n \"bar\"\n \"baz\"\n\njulia> m = LazyModel{:Sentence}(BagModel(Dense(2053, 3), SegmentedMean(3), identity))\nLazyModel{Sentence}\n ╰── BagModel ↦ SegmentedMean(3) ↦ identity # 1 arrays, 3 params (all zero), 52 bytes\n ╰── ArrayModel(Dense(2053 => 3)) # 2 arrays, 6_162 params, 24.148 KiB\n\njulia> m(n)\n3×3 Matrix{Float32}:\n -0.06... -0.03... -0.04...\n 0.02... 0.00... -0.07...\n -0.00... 0.06... -0.07...\n\nSee also: AbstractMillModel, LazyNode, Mill.unpack2mill.\n\n\n\n\n\n","category":"type"},{"location":"api/model_nodes/#Mill.LazyModel-Tuple{Symbol, AbstractMillModel}","page":"Model nodes","title":"Mill.LazyModel","text":"LazyModel([Name::Symbol], m::AbstractMillModel)\nLazyModel{Name}(m::AbstractMillModel)\n\nConstruct a new LazyModel with name Name, and model m.\n\nIt is also possible to pass any function as m instead of a model node. In that case, it is wrapped into an ArrayNode.\n\nExamples\n\njulia> LazyModel{:Sentence}(ArrayModel(Dense(2, 2)))\nLazyModel{Sentence}\n ╰── ArrayModel(Dense(2 => 2)) # 2 arrays, 6 params, 104 bytes\n\njulia> LazyModel(:Sentence, Dense(2, 2))\nLazyModel{Sentence}\n ╰── ArrayModel(Dense(2 => 2)) # 2 arrays, 6 params, 104 bytes\n\nSee also: AbstractMillModel, LazyNode, Mill.unpack2mill.\n\n\n\n\n\n","category":"method"},{"location":"api/model_nodes/#Mill.reflectinmodel","page":"Model nodes","title":"Mill.reflectinmodel","text":"reflectinmodel(x::AbstractMillNode, fm=d -> Dense(d, 10), fa=BagCount ∘ SegmentedMeanMax;\n fsm=Dict(), fsa=Dict(), single_key_identity=true, single_scalar_identity=true, all_imputing=false)\n\nBuild a Mill.jl model capable of processing x.\n\nAll inner Dense layers are constructed using fm, a function accepting input dimension d and returning a suitable model. All aggregation operators are constructed using fa in a similar manner.\n\nMore fine-grained control can be achieved with fsm and fsa keyword arguments, which should be Dicts of c => f pairs, where c is a String traversal code from HierarchicalUtils.jl and f is a function. These definitions override fm and fa.\n\nIf a ProductNode with only a single child (subtree) is encountered, its final m model is instantiated as identity instead of using fm and fsm. This can be controlled with single_key_identity.\n\nSimilarly, if an ArrayNode contains data X where size(X, 1) is 1, the corresponding model is instantiated as identity unless single_scalar_identity is false.\n\nBy default, reflectinmodel makes first Dense layers in leafs imputing only if the datatype suggests that missing data is present. This applies to\n\nArray,\nSparseMatrixCSC or SparseVector,\nPooledArray,\nMaybeHotVector,\nMaybeHotMatrix, and\nNGramMatrix\n\ntypes with eltype of {Union{Missing, T}} where T. If all_imputing is true, all leaf Dense layers in these types are replaced by their imputing variants.\n\nExamples\n\njulia> n1 = ProductNode(a=ArrayNode(NGramMatrix([\"a\", missing])))\nProductNode # 2 obs, 32 bytes\n ╰── a: ArrayNode(2053×2 NGramMatrix with Union{Missing, Int64} elements) # 2 obs, 129 bytes\n\njulia> n2 = ProductNode((ArrayNode([0 1]), BagNode(ArrayNode([0 1; 2 3]), bags([1:1, 2:2]))))\nProductNode # 2 obs, 24 bytes\n ├── ArrayNode(1×2 Array with Int64 elements) # 2 obs, 64 bytes\n ╰── BagNode # 2 obs, 96 bytes\n ╰── ArrayNode(2×2 Array with Int64 elements) # 2 obs, 80 bytes\n\njulia> n = ProductNode((n1, n2))\nProductNode # 2 obs, 56 bytes\n ├── ProductNode # 2 obs, 32 bytes\n │ ╰── a: ArrayNode(2053×2 NGramMatrix with Union{Missing, Int64} elements) # 2 obs, 129 bytes\n ╰── ProductNode # 2 obs, 24 bytes\n ├── ArrayNode(1×2 Array with Int64 elements) # 2 obs, 64 bytes\n ╰── BagNode # 2 obs, 96 bytes\n ╰── ArrayNode(2×2 Array with Int64 elements) # 2 obs, 80 bytes\n\njulia> reflectinmodel(n)\nProductModel ↦ Dense(20 => 10) # 2 arrays, 210 params, 920 bytes\n ├── ProductModel ↦ identity\n │ ╰── a: ArrayModel([postimputing]Dense(2053 => 10)) # 3 arrays, 20_550 params, 80.391 KiB\n ╰── ProductModel ↦ Dense(11 => 10) # 2 arrays, 120 params, 560 bytes\n ├── ArrayModel(identity)\n ╰── BagModel ↦ BagCount([SegmentedMean(10); SegmentedMax(10)]) ↦ Dense(21 => 10) # 4 arrays, 240 params, 1.094 KiB\n ╰── ArrayModel(Dense(2 => 10)) # 2 arrays, 30 params, 200 bytes\n\njulia> reflectinmodel(n, d -> Dense(d, 3), SegmentedMean, all_imputing=true)\nProductModel ↦ Dense(6 => 3) # 2 arrays, 21 params, 164 bytes\n ├── ProductModel ↦ identity\n │ ╰── a: ArrayModel([postimputing]Dense(2053 => 3)) # 3 arrays, 6_165 params, 24.199 KiB\n ╰── ProductModel ↦ Dense(4 => 3) # 2 arrays, 15 params, 140 bytes\n ├── ArrayModel([preimputing]Dense(1 => 1)) # 3 arrays, 3 params, 132 bytes\n ╰── BagModel ↦ SegmentedMean(3) ↦ Dense(3 => 3) # 3 arrays, 15 params, 180 bytes\n ╰── ArrayModel([preimputing]Dense(2 => 3)) # 3 arrays, 11 params, 164 bytes\n\njulia> printtree(n; trav=true)\nProductNode [\"\"] # 2 obs, 56 bytes\n ├── ProductNode [\"E\"] # 2 obs, 32 bytes\n │ ╰── a: ArrayNode(2053×2 NGramMatrix with Union{Missing, Int64} elements) [\"M\"] # 2 obs, 129 bytes\n ╰── ProductNode [\"U\"] # 2 obs, 24 bytes\n ├── ArrayNode(1×2 Array with Int64 elements) [\"Y\"] # 2 obs, 64 bytes\n ╰── BagNode [\"c\"] # 2 obs, 96 bytes\n ╰── ArrayNode(2×2 Array with Int64 elements) [\"e\"] # 2 obs, 80 bytes\n\njulia> reflectinmodel(n, d -> Dense(d, 3), SegmentedMean;\n fsm=Dict(\"e\" => d -> Chain(Dense(d, 2), Dense(2, 2))),\n fsa=Dict(\"c\" => SegmentedLSE),\n single_key_identity=false,\n single_scalar_identity=false)\nProductModel ↦ Dense(6 => 3) # 2 arrays, 21 params, 164 bytes\n ├── ProductModel ↦ Dense(3 => 3) # 2 arrays, 12 params, 128 bytes\n │ ╰── a: ArrayModel([postimputing]Dense(2053 => 3)) # 3 arrays, 6_165 params, 24.199 KiB\n ╰── ProductModel ↦ Dense(6 => 3) # 2 arrays, 21 params, 164 bytes\n ├── ArrayModel(Dense(1 => 3)) # 2 arrays, 6 params, 104 bytes\n ╰── BagModel ↦ SegmentedLSE(2) ↦ Dense(2 => 3) # 4 arrays, 13 params, 212 bytes\n ╰── ArrayModel(Chain(Dense(2 => 2), Dense(2 => 2))) # 4 arrays, 12 params, 208 bytes\n\nSee also: AbstractMillNode, AbstractMillModel, ProductNode, BagNode, ArrayNode.\n\n\n\n\n\n","category":"function"},{"location":"api/model_nodes/#Mill.modelsummary","page":"Model nodes","title":"Mill.modelsummary","text":"modelsummary(m::AbstractMillModel)\n\nPrint summary of parameters of model m.\n\nExamples\n\njulia> m = ProductModel(ArrayModel(Dense(2, 3)))\nProductModel ↦ identity\n ╰── ArrayModel(Dense(2 => 3)) # 2 arrays, 9 params, 116 bytes\n\njulia> modelsummary(m)\n\"Model summary: 2 arrays, 9 params, 116 bytes\"\n\nSee also: datasummary.\n\n\n\n\n\n","category":"function"},{"location":"examples/musk/musk/","page":"Musk","title":"Musk","text":"using Pkg\nold_path = Pkg.project().path\nPkg.activate(pwd())\nPkg.instantiate()\n\nENV[\"LINES\"] = 25\nENV[\"COLUMNS\"] = 125","category":"page"},{"location":"examples/musk/musk/","page":"Musk","title":"Musk","text":"EditURL = \"musk_literate.jl\"","category":"page"},{"location":"examples/musk/musk/#Musk","page":"Musk","title":"Musk","text":"","category":"section"},{"location":"examples/musk/musk/","page":"Musk","title":"Musk","text":"Musk dataset is a classic MIL problem of the field, introduced in [5]. Below we demonstrate how to solve this problem using Mill.jl.","category":"page"},{"location":"examples/musk/musk/","page":"Musk","title":"Musk","text":"ukn: Jupyter notebook\nThis example is also available as a Jupyter notebook and the environment is accessible here.","category":"page"},{"location":"examples/musk/musk/","page":"Musk","title":"Musk","text":"We load all dependencies and fix the seed:","category":"page"},{"location":"examples/musk/musk/","page":"Musk","title":"Musk","text":"using FileIO, JLD2, Statistics, Mill, Flux, OneHotArrays\n\nusing Random; Random.seed!(42);\nnothing #hide","category":"page"},{"location":"examples/musk/musk/#Loading-the-data","page":"Musk","title":"Loading the data","text":"","category":"section"},{"location":"examples/musk/musk/","page":"Musk","title":"Musk","text":"Now we load the dataset and transform it into a Mill structure. The musk.jld2 file contains...","category":"page"},{"location":"examples/musk/musk/","page":"Musk","title":"Musk","text":"a matrix with features, each column is one instance:","category":"page"},{"location":"examples/musk/musk/","page":"Musk","title":"Musk","text":"fMat = load(\"musk.jld2\", \"fMat\")","category":"page"},{"location":"examples/musk/musk/","page":"Musk","title":"Musk","text":"the ids of samples (bags in MIL terminology) specifying to which each instance (column in fMat) belongs to:","category":"page"},{"location":"examples/musk/musk/","page":"Musk","title":"Musk","text":"bagids = load(\"musk.jld2\", \"bagids\")","category":"page"},{"location":"examples/musk/musk/","page":"Musk","title":"Musk","text":"and labels defined on the level of instances:","category":"page"},{"location":"examples/musk/musk/","page":"Musk","title":"Musk","text":"y = load(\"musk.jld2\", \"y\")","category":"page"},{"location":"examples/musk/musk/","page":"Musk","title":"Musk","text":"We create a BagNode structure which holds:","category":"page"},{"location":"examples/musk/musk/","page":"Musk","title":"Musk","text":"feature matrix and\nranges identifying which columns in the feature matrix each bag spans.","category":"page"},{"location":"examples/musk/musk/","page":"Musk","title":"Musk","text":"ds = BagNode(ArrayNode(fMat), bagids)","category":"page"},{"location":"examples/musk/musk/","page":"Musk","title":"Musk","text":"This representation ensures that feed-forward networks do not need to deal with bag boundaries and always process full continuous matrices:","category":"page"},{"location":"examples/musk/musk/","page":"Musk","title":"Musk","text":"We also compute labels on the level of bags. In the Musk problem, bag label is defined as a maximum of instance labels (i.e. a bag is positive if at least one of its instances is positive):","category":"page"},{"location":"examples/musk/musk/","page":"Musk","title":"Musk","text":"y = map(i -> maximum(y[i]) + 1, ds.bags)\ny_oh = onehotbatch(y, 1:2)","category":"page"},{"location":"examples/musk/musk/#Model-construction","page":"Musk","title":"Model construction","text":"","category":"section"},{"location":"examples/musk/musk/","page":"Musk","title":"Musk","text":"Once the data are in Mill internal format, we will manually create a model. BagModel is designed to implement a basic multi-instance learning model utilizing two feed-forward networks with an aggregaton operator in between:","category":"page"},{"location":"examples/musk/musk/","page":"Musk","title":"Musk","text":"model = BagModel(\n Dense(166, 50, Flux.tanh),\n SegmentedMeanMax(50),\n Chain(Dense(100, 50, Flux.tanh), Dense(50, 2)))","category":"page"},{"location":"examples/musk/musk/","page":"Musk","title":"Musk","text":"Instances are first passed through a single layer with 50 neurons (input dimension is 166) with tanh non-linearity, then we use mean and max aggregation functions simultaneously (for some problems, max is better then mean, therefore we use both), and then we use one layer with 50 neurons and tanh nonlinearity followed by linear layer with 2 neurons (output dimension). We check that forward pass works","category":"page"},{"location":"examples/musk/musk/","page":"Musk","title":"Musk","text":"model(ds)","category":"page"},{"location":"examples/musk/musk/","page":"Musk","title":"Musk","text":"ukn: Easier model construction\nNote that the model can be obtained in a more straightforward way using Model reflection.","category":"page"},{"location":"examples/musk/musk/#Training","page":"Musk","title":"Training","text":"","category":"section"},{"location":"examples/musk/musk/","page":"Musk","title":"Musk","text":"Since Mill is entirely compatible with Flux.jl, we can use its Adam optimizer:","category":"page"},{"location":"examples/musk/musk/","page":"Musk","title":"Musk","text":"opt_state = Flux.setup(Adam(), model)","category":"page"},{"location":"examples/musk/musk/","page":"Musk","title":"Musk","text":"...define a loss function as Flux.logitcrossentropy:","category":"page"},{"location":"examples/musk/musk/","page":"Musk","title":"Musk","text":"loss(m, x, y) = Flux.logitcrossentropy(m(x), y)","category":"page"},{"location":"examples/musk/musk/","page":"Musk","title":"Musk","text":"...and run a simple training procedure using the Flux.train! procedure:","category":"page"},{"location":"examples/musk/musk/","page":"Musk","title":"Musk","text":"for e in 1:100\n if e % 10 == 1\n @info \"Epoch $e\" training_loss=loss(model, ds, y_oh)\n end\n Flux.train!(loss, model, [(ds, y_oh)], opt_state)\nend","category":"page"},{"location":"examples/musk/musk/","page":"Musk","title":"Musk","text":"Finally, we calculate the (training) accuracy:","category":"page"},{"location":"examples/musk/musk/","page":"Musk","title":"Musk","text":"mean(Flux.onecold(model(ds), 1:2) .== y)","category":"page"},{"location":"examples/musk/musk/","page":"Musk","title":"Musk","text":"Pkg.activate(old_path)","category":"page"},{"location":"api/bags/#Bags","page":"Bags","title":"Bags","text":"","category":"section"},{"location":"api/bags/#Index","page":"Bags","title":"Index","text":"","category":"section"},{"location":"api/bags/","page":"Bags","title":"Bags","text":"Pages = [\"bags.md\"]","category":"page"},{"location":"api/bags/#API","page":"Bags","title":"API","text":"","category":"section"},{"location":"api/bags/","page":"Bags","title":"Bags","text":"AbstractBags\n\nAlignedBags\nAlignedBags()\nAlignedBags(::UnitRange{<:Integer}...)\nAlignedBags(::Vector{<:Integer})\n\nScatteredBags\nScatteredBags()\nScatteredBags(::Vector{<:Integer})\n\nlength2bags\nbags\nremapbags\nadjustbags","category":"page"},{"location":"api/bags/#Mill.AbstractBags","page":"Bags","title":"Mill.AbstractBags","text":"AbstractBags{T}\n\nSupertype for structures storing indices of type T of bags' instances in BagNodes.\n\n\n\n\n\n","category":"type"},{"location":"api/bags/#Mill.AlignedBags","page":"Bags","title":"Mill.AlignedBags","text":"AlignedBags{T <: Integer} <: AbstractBags{T}\n\nAlignedBags struct stores indices of bags' instances in one or more UnitRange{T}s. This is only possible if instances of every bag are stored in one contiguous block.\n\nSee also: ScatteredBags.\n\n\n\n\n\n","category":"type"},{"location":"api/bags/#Mill.AlignedBags-Tuple{}","page":"Bags","title":"Mill.AlignedBags","text":"AlignedBags()\n\nConstruct a new AlignedBags struct containing no bags.\n\nExamples\n\njulia> AlignedBags()\nAlignedBags{Int64}(UnitRange{Int64}[])\n\n\n\n\n\n","category":"method"},{"location":"api/bags/#Mill.AlignedBags-Tuple{Vararg{UnitRange{<:Integer}}}","page":"Bags","title":"Mill.AlignedBags","text":"AlignedBags(bags::UnitRange{<:Integer}...)\n\nConstruct a new AlignedBags struct from bags in arguments.\n\nExamples\n\njulia> AlignedBags(1:3, 4:8)\nAlignedBags{Int64}(UnitRange{Int64}[1:3, 4:8])\n\n\n\n\n\n","category":"method"},{"location":"api/bags/#Mill.AlignedBags-Tuple{Vector{<:Integer}}","page":"Bags","title":"Mill.AlignedBags","text":"AlignedBags(k::Vector{<:Integer})\n\nConstruct a new AlignedBags struct from Vector k specifying the index of the bag each instance belongs to. Throws ArgumentError if this is not possible.\n\nExamples\n\njulia> AlignedBags([1, 1, 2, 2, 2, 4])\nAlignedBags{Int64}(UnitRange{Int64}[1:2, 3:5, 0:-1, 6:6])\n\n\n\n\n\n","category":"method"},{"location":"api/bags/#Mill.ScatteredBags","page":"Bags","title":"Mill.ScatteredBags","text":"ScatteredBags{T <: Integer} <: AbstractBags{T}\n\nScatteredBags struct stores indices of bags' instances that are not necessarily contiguous.\n\nSee also: AlignedBags.\n\n\n\n\n\n","category":"type"},{"location":"api/bags/#Mill.ScatteredBags-Tuple{}","page":"Bags","title":"Mill.ScatteredBags","text":"ScatteredBags()\n\nConstruct a new ScatteredBags struct containing no bags.\n\nExamples\n\njulia> ScatteredBags()\nScatteredBags{Int64}(Vector{Int64}[])\n\n\n\n\n\n","category":"method"},{"location":"api/bags/#Mill.ScatteredBags-Tuple{Vector{<:Integer}}","page":"Bags","title":"Mill.ScatteredBags","text":"ScatteredBags(k::Vector{<:Integer})\n\nConstruct a new ScatteredBags struct from Vector k specifying the index of the bag each instance belongs to.\n\nExamples\n\njulia> ScatteredBags([2, 2, 1, 1, 1, 3])\nScatteredBags{Int64}([[3, 4, 5], [1, 2], [6]])\n\n\n\n\n\n","category":"method"},{"location":"api/bags/#Mill.length2bags","page":"Bags","title":"Mill.length2bags","text":"length2bags(ls::Vector{<:Integer})\n\nConvert lengths of bags given in ls to AlignedBags with contiguous blocks.\n\nExamples\n\njulia> length2bags([1, 3, 2])\nAlignedBags{Int64}(UnitRange{Int64}[1:1, 2:4, 5:6])\n\nSee also: AlignedBags.\n\n\n\n\n\n","category":"function"},{"location":"api/bags/#Mill.bags","page":"Bags","title":"Mill.bags","text":"bags(k::Vector{<:Integer})\nbags(k::Vector{T}) where T <: UnitRange{<:Integer}\nbags(b::AbstractBags)\n\nConstruct an AbstractBags structure that is most suitable for the input (AlignedBags if possible, ScatteredBags otherwise).\n\nExamples\n\njulia> bags([1, 1, 3])\nAlignedBags{Int64}(UnitRange{Int64}[1:2, 0:-1, 3:3])\n\njulia> bags([2, 3, 1, 2])\nScatteredBags{Int64}([[3], [1, 4], [2]])\n\njulia> bags([1:3, 4:5])\nAlignedBags{Int64}(UnitRange{Int64}[1:3, 4:5])\n\njulia> bags(ScatteredBags())\nScatteredBags{Int64}(Vector{Int64}[])\n\nSee also: AlignedBags, ScatteredBags.\n\n\n\n\n\n","category":"function"},{"location":"api/bags/#Mill.remapbags","page":"Bags","title":"Mill.remapbags","text":"remapbags(b::AbstractBags, idcs::VecOrRange{<:Integer}) -> (rb, I)\n\nSelect a subset of bags in b corresponding to indices idcs and remap instance indices appropriately. Return new bags rb as well as a Vector of remapped instances I.\n\nExamples\n\njulia> remapbags(AlignedBags([1:1, 2:3, 4:5]), [1, 3])\n(AlignedBags{Int64}(UnitRange{Int64}[1:1, 2:3]), [1, 4, 5])\n\njulia> remapbags(ScatteredBags([[1,3], [2], Int[]]), [2])\n(ScatteredBags{Int64}([[1]]), [2])\n\n\n\n\n\n","category":"function"},{"location":"api/bags/#Mill.adjustbags","page":"Bags","title":"Mill.adjustbags","text":"adjustbags(b::AlignedBags, mask::AbstractVector{Bool})\n\nRemove indices of instances brom bags b and remap the remaining instances accordingly.\n\nExamples\n\njulia> adjustbags(AlignedBags([1:2, 0:-1, 3:4]), [false, false, true, true])\nAlignedBags{Int64}(UnitRange{Int64}[0:-1, 0:-1, 1:2])\n\n\n\n\n\n","category":"function"},{"location":"manual/leaf_data/","page":"Data in leaves","title":"Data in leaves","text":"using Mill, Flux","category":"page"},{"location":"manual/leaf_data/#Data-in-leaves","page":"Data in leaves","title":"Data in leaves","text":"","category":"section"},{"location":"manual/leaf_data/","page":"Data in leaves","title":"Data in leaves","text":"In Mill.jl tree-like data representations, there are always some raw data on the leaf level, whereas on higher levels instances are grouped into bags (BagNodes), and different sets are joined together with Cartesion products (ProductNodes) and thus more abstract concepts are created. In this section we look into several examples how the lowest-level data can be represented.","category":"page"},{"location":"manual/leaf_data/","page":"Data in leaves","title":"Data in leaves","text":"For this purpose, let's assume that we would like to identify infected clients in a network from their HTTP traffic. Since one client can make an arbitrary number of connections during the observation period, modelling the client as a bag of connections seems like the most natural approach:","category":"page"},{"location":"manual/leaf_data/","page":"Data in leaves","title":"Data in leaves","text":"connections = AlignedBags([1:2, 3:3, 4:6])","category":"page"},{"location":"manual/leaf_data/","page":"Data in leaves","title":"Data in leaves","text":"Thus, each of the six connections becomes an instance in one of the three bags representing clients. How to represent such connections instances? Each HTTP flow has properties that can be expressed as standard numerical features, categorical features or strings of characters.","category":"page"},{"location":"manual/leaf_data/#Numerical-features","page":"Data in leaves","title":"Numerical features","text":"","category":"section"},{"location":"manual/leaf_data/","page":"Data in leaves","title":"Data in leaves","text":"We have already shown how to represent standard numerical features in previous parts of this manual. It is as simple as wrapping a type that behaves like a matrix into an ArrayNode:","category":"page"},{"location":"manual/leaf_data/","page":"Data in leaves","title":"Data in leaves","text":"content_lengths = [4446, 1957, 4310,\n 11604, 17019, 13947]\ndates = [1435420950, 1376190532, 1316869962,\n 1302775198, 1555598383, 1562237892]\nnumerical_node = ArrayNode([content_lengths'; dates'])","category":"page"},{"location":"manual/leaf_data/","page":"Data in leaves","title":"Data in leaves","text":"We use Content-Length and Date request headers, the latter converted to Unix timestamp.","category":"page"},{"location":"manual/leaf_data/#Categorical-features","page":"Data in leaves","title":"Categorical features","text":"","category":"section"},{"location":"manual/leaf_data/","page":"Data in leaves","title":"Data in leaves","text":"For categorical variables, we proceed in the same way, but we use one-hot encoding implemented in Flux.jl. This way, we can encode for example a verb of the request:","category":"page"},{"location":"manual/leaf_data/","page":"Data in leaves","title":"Data in leaves","text":"ALL_VERBS = [\"GET\", \"HEAD\", \"POST\", \"PUT\", \"DELETE\"] # etc...\nverbs = [\"GET\", \"GET\", \"POST\", \"HEAD\", \"HEAD\", \"PUT\"]\nverb_node = ArrayNode(Flux.onehotbatch(verbs, ALL_VERBS))","category":"page"},{"location":"manual/leaf_data/","page":"Data in leaves","title":"Data in leaves","text":"or Content-Encoding header:","category":"page"},{"location":"manual/leaf_data/","page":"Data in leaves","title":"Data in leaves","text":"ALL_ENCODINGS = [\"bzip2\", \"gzip\", \"xz\", \"identity\"] # etc...\nencodings = [\"xz\", \"gzip\", \"bzip2\", \"xz\", \"identity\", \"bzip2\"]\nencoding_node = ArrayNode(Flux.onehotbatch(encodings, ALL_ENCODINGS))","category":"page"},{"location":"manual/leaf_data/","page":"Data in leaves","title":"Data in leaves","text":"Because Flux.OneHotMatrix supports multiplication it is possible to wrap it into an ArrayNode.","category":"page"},{"location":"manual/leaf_data/#Strings","page":"Data in leaves","title":"Strings","text":"","category":"section"},{"location":"manual/leaf_data/","page":"Data in leaves","title":"Data in leaves","text":"The last example we will consider are string features. This could for example be the Host header:","category":"page"},{"location":"manual/leaf_data/","page":"Data in leaves","title":"Data in leaves","text":"hosts = [\n \"www.foo.com\", \"www.foo.com\", \"www.baz.com\",\n \"www.foo.com\", \"www.baz.com\", \"www.foo.com\"\n]","category":"page"},{"location":"manual/leaf_data/","page":"Data in leaves","title":"Data in leaves","text":"Mill offers ngram histogram-based representation for strings. To get started, we pass the vector of strings into the constructor of NGramMatrix:","category":"page"},{"location":"manual/leaf_data/","page":"Data in leaves","title":"Data in leaves","text":"hosts_ngrams = NGramMatrix(hosts, 3, 256, 7)","category":"page"},{"location":"manual/leaf_data/","page":"Data in leaves","title":"Data in leaves","text":"Each string gets processed into ngrams (trigram in this case as specified in the first parameter). Then, each character is transformed into an integer via the codeunits function and the whole trigram is interpreted as a three digit number using a base b specified in the second parameter. Here, we use a base of 256, which is the most reasonable choice for ascii URLs. For example, for foo trigram, we obtain:","category":"page"},{"location":"manual/leaf_data/","page":"Data in leaves","title":"Data in leaves","text":"c = codeunits(\"foo\")\nc[1] * 256^2 + c[2] * 256 + c[3]","category":"page"},{"location":"manual/leaf_data/","page":"Data in leaves","title":"Data in leaves","text":"The last step is taking the modulo of this result with respect to some prime modulo m, in this case 7 (last parameter in the constructor), leaving us with 3 as a result. Therefore, for this trigram foo, we would add 1 to the third row[1]. We can convert this NGramMatrix into a sparse array and then to the standard array:","category":"page"},{"location":"manual/leaf_data/","page":"Data in leaves","title":"Data in leaves","text":"[1]: One appropriate value for modulo m for real problems is 2053","category":"page"},{"location":"manual/leaf_data/","page":"Data in leaves","title":"Data in leaves","text":"using SparseArrays","category":"page"},{"location":"manual/leaf_data/","page":"Data in leaves","title":"Data in leaves","text":"hosts_dense = hosts_ngrams |> SparseMatrixCSC |> Matrix","category":"page"},{"location":"manual/leaf_data/","page":"Data in leaves","title":"Data in leaves","text":"Again, we get one column for each string, and the matrix has the same number of rows as modulo m. For each string s, we get length(s) + n - 1 ngrams:","category":"page"},{"location":"manual/leaf_data/","page":"Data in leaves","title":"Data in leaves","text":"sum(hosts_dense; dims=1)","category":"page"},{"location":"manual/leaf_data/","page":"Data in leaves","title":"Data in leaves","text":"This is because we use special abstract characters (or tokens) for the start and the end of the string. If we denote these ^ and $, respectively, from string \"foo\", we get trigrams ^^f, ^fo, foo, oo$, o$$. Note that these special characters are purely abstract whereas ^ and $ used only for illustration purposes here are characters like any other. Both string start and string end special characters have a unique mapping to integers, which can be obtained as well as set:","category":"page"},{"location":"manual/leaf_data/","page":"Data in leaves","title":"Data in leaves","text":"Mill.string_start_code()\nMill.string_end_code()\nMill.string_start_code!(42)\nMill.string_start_code()","category":"page"},{"location":"manual/leaf_data/","page":"Data in leaves","title":"Data in leaves","text":"NGramMatrix behaves like a matrix, implements an efficient left-multiplication and thus can be used in ArrayNode:","category":"page"},{"location":"manual/leaf_data/","page":"Data in leaves","title":"Data in leaves","text":"hosts_ngrams::AbstractMatrix{Int64}\nhost_node = ArrayNode(hosts_ngrams)","category":"page"},{"location":"manual/leaf_data/","page":"Data in leaves","title":"Data in leaves","text":"Custom nodes section shows one more slightly more complex way of processing strings, specifically Unix paths.","category":"page"},{"location":"manual/leaf_data/#Putting-it-all-together","page":"Data in leaves","title":"Putting it all together","text":"","category":"section"},{"location":"manual/leaf_data/","page":"Data in leaves","title":"Data in leaves","text":"Now, we can finally put wrap all features of all six connections into one ProductNode and construct a BagNode representing a bag of all connections (corresponding to three different clients):","category":"page"},{"location":"manual/leaf_data/","page":"Data in leaves","title":"Data in leaves","text":"ds = BagNode(ProductNode(\n numerical=numerical_node,\n verb=verb_node,\n encoding=encoding_node,\n hosts=host_node\n), connections)","category":"page"},{"location":"manual/leaf_data/","page":"Data in leaves","title":"Data in leaves","text":"create a model for training and run one forward pass:","category":"page"},{"location":"manual/leaf_data/","page":"Data in leaves","title":"Data in leaves","text":"m = reflectinmodel(ds)\nm(ds)","category":"page"},{"location":"manual/leaf_data/","page":"Data in leaves","title":"Data in leaves","text":"We now obtain a matrix with three columns, each corresponding to one of the clients. Now we can for example calculate gradients with respect to the model parameters:","category":"page"},{"location":"manual/leaf_data/","page":"Data in leaves","title":"Data in leaves","text":"gradient(m -> sum(m(ds)), m)","category":"page"},{"location":"manual/leaf_data/","page":"Data in leaves","title":"Data in leaves","text":"ukn: Numerical features\nTo put all numerical features into one ArrayNode is a design choice. We could as well introduce more keys in the final ProductNode. The model treats these two cases slightly differently (see Nodes section).","category":"page"},{"location":"manual/leaf_data/","page":"Data in leaves","title":"Data in leaves","text":"This dummy example illustrates the versatility of Mill. With little to no preprocessing we are able to process complex hierarchical structures and avoid manually designing feature extraction procedures. For a more involved study on processing Internet traffic with Mill, see for example [10].","category":"page"},{"location":"manual/nodes/","page":"Nodes","title":"Nodes","text":"using Mill","category":"page"},{"location":"manual/nodes/","page":"Nodes","title":"Nodes","text":"ukw: Tip\nIt is recommended to read the Motivation section first to understand the crucial ideas behind hierarchical multiple instance learning.","category":"page"},{"location":"manual/nodes/#Nodes","page":"Nodes","title":"Nodes","text":"","category":"section"},{"location":"manual/nodes/","page":"Nodes","title":"Nodes","text":"Mill.jl enables representation of arbitrarily complex tree-like hierarchies and appropriate models for these hierarchies. It defines two core abstract types:","category":"page"},{"location":"manual/nodes/","page":"Nodes","title":"Nodes","text":"AbstractMillNode which stores data on any level of abstraction and its subtypes can be further nested\nAbstractMillModel which helps to define a corresponding model. For each specific implementation of AbstractMillNode we have one or more specific AbstractMillModels for processing it.","category":"page"},{"location":"manual/nodes/","page":"Nodes","title":"Nodes","text":"Below we will introduce ArrayNode, BagNode and ProductNode together with their corresponding models. It is possible to define data and model nodes for more complex behaviors (see Custom nodes), however, these three core types are already sufficient for most tasks. For instance, we can represent any JSON document and use appropriate models to convert it to a vector represention or classify it (see Processing JSONs).","category":"page"},{"location":"manual/nodes/#[ArrayNode](@ref)-and-[ArrayModel](@ref)","page":"Nodes","title":"ArrayNode and ArrayModel","text":"","category":"section"},{"location":"manual/nodes/","page":"Nodes","title":"Nodes","text":"ArrayNode thinly wraps an array of features (specifically any subtype of AbstractArray):","category":"page"},{"location":"manual/nodes/","page":"Nodes","title":"Nodes","text":"X = Float32.([1 2 3 ; 4 5 6])\nAN = ArrayNode(X)","category":"page"},{"location":"manual/nodes/","page":"Nodes","title":"Nodes","text":"Data carried by any AbstractMillNode can be accessed with the Mill.data function as follows:","category":"page"},{"location":"manual/nodes/","page":"Nodes","title":"Nodes","text":"Mill.data(AN)","category":"page"},{"location":"manual/nodes/","page":"Nodes","title":"Nodes","text":"Similarly, ArrayModel wraps any function performing operation over this array. In example below, we wrap a feature matrix X and a Dense model from Flux.jl:","category":"page"},{"location":"manual/nodes/","page":"Nodes","title":"Nodes","text":"using Flux: Dense","category":"page"},{"location":"manual/nodes/","page":"Nodes","title":"Nodes","text":"f = Dense(2, 4)\nAM = ArrayModel(f)","category":"page"},{"location":"manual/nodes/","page":"Nodes","title":"Nodes","text":"We can apply the model now with AM(AN) to get another ArrayNode and verify that the feedforward layer f is really applied:","category":"page"},{"location":"manual/nodes/","page":"Nodes","title":"Nodes","text":"AM(AN)\nf(X) == AM(AN)","category":"page"},{"location":"manual/nodes/","page":"Nodes","title":"Nodes","text":"ukn: Model outputs\nA convenient property of all Mill AbstractMillModel nodes is that after applying them to a corresponding data node we always obtain an array as output regardless of the type and complexity of the model. This becomes important later.","category":"page"},{"location":"manual/nodes/","page":"Nodes","title":"Nodes","text":"The most common interpretation of the data inside ArrayNodes is that each column contains features of one sample and therefore the node AN carries size(Mill.data(AN), 2) samples. In this sense, ArrayNodes wrap the standard machine learning problem, where each sample is represented with a vector, a matrix or a more general tensor of features. Alternatively, one can obtain a number of samples of any AbstractMillNode with numobs function from MLUtils.jl package, which Mill also exports:","category":"page"},{"location":"manual/nodes/","page":"Nodes","title":"Nodes","text":"numobs(AN)","category":"page"},{"location":"manual/nodes/#[BagNode](@ref)","page":"Nodes","title":"BagNode","text":"","category":"section"},{"location":"manual/nodes/","page":"Nodes","title":"Nodes","text":"BagNode represents the standard multiple instance learning problem, that is, each sample is a bag containing an arbitrary number of instances. In the simplest case, each instance is a vector:","category":"page"},{"location":"manual/nodes/","page":"Nodes","title":"Nodes","text":"BN = BagNode(AN, [1:2, 0:-1, 3:3])","category":"page"},{"location":"manual/nodes/","page":"Nodes","title":"Nodes","text":"where for simplicity we used AN from the previous example. It is also possible to use data directly, in such case it is wrapped in an ArrayNode automatically.","category":"page"},{"location":"manual/nodes/","page":"Nodes","title":"Nodes","text":"Each BagNode carries data and bags fields:","category":"page"},{"location":"manual/nodes/","page":"Nodes","title":"Nodes","text":"Mill.data(BN)\nBN.bags","category":"page"},{"location":"manual/nodes/","page":"Nodes","title":"Nodes","text":"Here, data can be an arbitrary AbstractMillNode storing representation of instances (ArrayNode in this case) and bags field contains information, which instances belong to which bag. In this specific case bn stores three bags (samples). The first one consists of a two instances {[1.0, 4.0], [2.0, 5.0]} (first two columns of AN), the second one is empty, and the thirs bag contains one instance {[3.0, 6.0]}. We can see that we deal with two top-level samples (bags):","category":"page"},{"location":"manual/nodes/","page":"Nodes","title":"Nodes","text":"numobs(BN)","category":"page"},{"location":"manual/nodes/","page":"Nodes","title":"Nodes","text":"whereas they are formed using three instances:","category":"page"},{"location":"manual/nodes/","page":"Nodes","title":"Nodes","text":"numobs(AN)","category":"page"},{"location":"manual/nodes/","page":"Nodes","title":"Nodes","text":"In Mill, there are two ways to store indices of the bag's instances:","category":"page"},{"location":"manual/nodes/","page":"Nodes","title":"Nodes","text":"in AlignedBags structure, which accepts a Vector of UnitRanges and requires all bag's instances stored continuously:","category":"page"},{"location":"manual/nodes/","page":"Nodes","title":"Nodes","text":"AlignedBags([1:2, 3:3])","category":"page"},{"location":"manual/nodes/","page":"Nodes","title":"Nodes","text":"and in ScatteredBags structure, which accepts a Vector of Vectorss storing not necessarily contiguous indices:","category":"page"},{"location":"manual/nodes/","page":"Nodes","title":"Nodes","text":"ScatteredBags([[2, 1], [3]])","category":"page"},{"location":"manual/nodes/","page":"Nodes","title":"Nodes","text":"The two examples above are semantically equivalent, as bags are unordered collections of instances. An empty bag with no instances is in AlignedBags specified as empty range 0:-1 and in ScatteredBags as an empty vector Int[]. The constructor of BagNode accepts directly one of these two structures and tries to automagically decide the better type in other cases.","category":"page"},{"location":"manual/nodes/#[BagModel](@ref)","page":"Nodes","title":"BagModel","text":"","category":"section"},{"location":"manual/nodes/","page":"Nodes","title":"Nodes","text":"Each BagNode is processed by a BagModel, which contains two (sub)models and an aggregation operator:","category":"page"},{"location":"manual/nodes/","page":"Nodes","title":"Nodes","text":"im = ArrayModel(Dense(2, 5))\na = SegmentedMax(5)\nbm = Dense(5, 3)\nBM = BagModel(im, a, bm)","category":"page"},{"location":"manual/nodes/","page":"Nodes","title":"Nodes","text":"The first network submodel (called instance model im) is responsible for converting the instance representation to a vector form:","category":"page"},{"location":"manual/nodes/","page":"Nodes","title":"Nodes","text":"y = im(AN)","category":"page"},{"location":"manual/nodes/","page":"Nodes","title":"Nodes","text":"Note that because of the property mentioned above, the output of instance model im will always be a Matrix. We get four columns, one for each instance. This result is then used in SegmentedMax operator a which takes vector representation of all instances and produces a single vector per bag:","category":"page"},{"location":"manual/nodes/","page":"Nodes","title":"Nodes","text":"y = a(y, BN.bags)","category":"page"},{"location":"manual/nodes/","page":"Nodes","title":"Nodes","text":"unk: More about aggregation\nTo read more about aggregation operators, see the Bag aggregation section. For an explanation how empty bags are aggregated, see Missing data.","category":"page"},{"location":"manual/nodes/","page":"Nodes","title":"Nodes","text":"Finally, y is then passed to a feed forward model (called bag model bm) producing the final output per bag. In our example we therefore get a matrix with three columns:","category":"page"},{"location":"manual/nodes/","page":"Nodes","title":"Nodes","text":"y = bm(y)","category":"page"},{"location":"manual/nodes/","page":"Nodes","title":"Nodes","text":"However, the best way to use a bag model node is to simply apply it, which results into the same output:","category":"page"},{"location":"manual/nodes/","page":"Nodes","title":"Nodes","text":"BM(BN) == y","category":"page"},{"location":"manual/nodes/","page":"Nodes","title":"Nodes","text":"The whole procedure is depicted in the following picture:","category":"page"},{"location":"manual/nodes/","page":"Nodes","title":"Nodes","text":"\"Bag\n\"Bag","category":"page"},{"location":"manual/nodes/","page":"Nodes","title":"Nodes","text":"Three instances of the BagNode are represented by red subtrees are first mapped with instance model im, aggregated (aggregation operator here is a concatenation of two different operators a_1 and a_2), and the results of aggregation are transformed with bag model bm.","category":"page"},{"location":"manual/nodes/","page":"Nodes","title":"Nodes","text":"ukn: Musk example\nAnother handy feature of Mill models is that they are completely differentiable and therefore fit in the Flux.jl framework. Nodes for processing arrays and bags are sufficient to solve the classical Musk problem.","category":"page"},{"location":"manual/nodes/#[ProductNode](@ref)s-and-[ProductModel](@ref)s","page":"Nodes","title":"ProductNodes and ProductModels","text":"","category":"section"},{"location":"manual/nodes/","page":"Nodes","title":"Nodes","text":"ProductNode can be thought of as a Cartesian Product or a Dictionary. It holds a Tuple or NamedTuple of nodes (not necessarily of the same type). For example, a ProductNode with the BagNode and the ArrayNode from above and two more nodes as children would look like this:","category":"page"},{"location":"manual/nodes/","page":"Nodes","title":"Nodes","text":"PN = tuple(\n ArrayNode(randn(Float32, 2, 3)),\n BagNode(ArrayNode(zeros(Float32, 4, 4)), [1:1, 2:2, 3:4]),\n BN,\n AN\n ) |> ProductNode","category":"page"},{"location":"manual/nodes/","page":"Nodes","title":"Nodes","text":"Analogically, the ProductModel contains a Tuple or NamedTuple of (sub)models processing each of its children (stored in ms field standing for models), as well as one more (sub)model m:","category":"page"},{"location":"manual/nodes/","page":"Nodes","title":"Nodes","text":"ms = tuple(\n ArrayModel(Dense(2, 2)),\n BagModel(ArrayModel(Dense(4, 6)), SegmentedMean(6), Dense(6, 5)),\n BM,\n AM);\nm = Dense(14, 9);\nPM = ProductModel(ms, m)","category":"page"},{"location":"manual/nodes/","page":"Nodes","title":"Nodes","text":"Again, since the library is based on the property that the output of each model is an array, the product model applies models from ms to appropriate children and vertically concatenates the output, which is then processed by model m. An example of model processing the above sample would be:","category":"page"},{"location":"manual/nodes/","page":"Nodes","title":"Nodes","text":"y = PM.m(vcat([PM.ms[i](PN.data[i]) for i in 1:4]...))","category":"page"},{"location":"manual/nodes/","page":"Nodes","title":"Nodes","text":"which is equivalent to:","category":"page"},{"location":"manual/nodes/","page":"Nodes","title":"Nodes","text":"PM(PN) == y","category":"page"},{"location":"manual/nodes/","page":"Nodes","title":"Nodes","text":"Application of this product model can be schematically visualized as follows:","category":"page"},{"location":"manual/nodes/","page":"Nodes","title":"Nodes","text":"\"Product\n\"Product","category":"page"},{"location":"citation/#Citation","page":"Citation","title":"Citation","text":"","category":"section"},{"location":"citation/","page":"Citation","title":"Citation","text":"For citing, please use the following entry for the original paper:","category":"page"},{"location":"citation/","page":"Citation","title":"Citation","text":"@misc{mandlik2021milljl,\n title={Mill.jl and JsonGrinder.jl: automated differentiable feature extraction for learning from raw JSON data}, \n author={Simon Mandlik and Matej Racinsky and Viliam Lisy and Tomas Pevny},\n year={2021},\n eprint={2105.09107},\n archivePrefix={arXiv},\n primaryClass={stat.ML}\n}","category":"page"},{"location":"citation/","page":"Citation","title":"Citation","text":"and the following for the implementation (fill in the used version):","category":"page"},{"location":"citation/","page":"Citation","title":"Citation","text":"@software{mill2018,\n author = {Tomas Pevny and Simon Mandlik},\n title = {Mill.jl framework: a flexible library for (hierarchical) multi-instance learning},\n url = {https://github.com/CTUAvastLab/Mill.jl},\n version = {...},\n}","category":"page"},{"location":"manual/reflectin/","page":"Model reflection","title":"Model reflection","text":"using Mill, Flux","category":"page"},{"location":"manual/reflectin/#Model-reflection","page":"Model reflection","title":"Model reflection","text":"","category":"section"},{"location":"manual/reflectin/","page":"Model reflection","title":"Model reflection","text":"Since constructions of large models can be a tedious and error-prone process, Mill.jl provides reflectinmodel function that helps to automate it. The simplest definition accepts only one argument, a sample ds, and returns a compatible model:","category":"page"},{"location":"manual/reflectin/","page":"Model reflection","title":"Model reflection","text":"ds = BagNode(ProductNode((BagNode(randn(Float32, 4, 10),\n [1:2, 3:4, 5:5, 6:7, 8:10]),\n randn(Float32, 3, 5),\n BagNode(BagNode(randn(Float32, 2, 30),\n [i:i+1 for i in 1:2:30]),\n [1:3, 4:6, 7:9, 10:12, 13:15]),\n randn(Float32, 2, 5))),\n [1:1, 2:3, 4:5]);\nprinttree(ds)\n\nm = reflectinmodel(ds, d -> Dense(d, 2));\nprinttree(m)\n\nm(ds)","category":"page"},{"location":"manual/reflectin/","page":"Model reflection","title":"Model reflection","text":"The sample ds serves here as a specimen needed to specify a structure of the problem and calculate dimensions.","category":"page"},{"location":"manual/reflectin/#Optional-arguments","page":"Model reflection","title":"Optional arguments","text":"","category":"section"},{"location":"manual/reflectin/","page":"Model reflection","title":"Model reflection","text":"To have better control over the topology, reflectinmodel accepts up to two more optional arguments and four keyword arguments:","category":"page"},{"location":"manual/reflectin/","page":"Model reflection","title":"Model reflection","text":"The first optional argument expects a function that returns a layer (or a set of layers) given input dimension d (defaults to d -> Flux.Dense(d, 10)).\nThe second optional argument is a function returning aggregation function for BagModel nodes (defaults to BagCount ∘ SegmentedMeanMax).","category":"page"},{"location":"manual/reflectin/","page":"Model reflection","title":"Model reflection","text":"Compare the following example to the previous one:","category":"page"},{"location":"manual/reflectin/","page":"Model reflection","title":"Model reflection","text":"m = reflectinmodel(ds, d -> Dense(d, 5, relu), SegmentedMax);\nprinttree(m)\n\nm(ds)","category":"page"},{"location":"manual/reflectin/#Keyword-arguments","page":"Model reflection","title":"Keyword arguments","text":"","category":"section"},{"location":"manual/reflectin/","page":"Model reflection","title":"Model reflection","text":"The reflectinmodel allows even further customization. To index into the sample (or model), we can use printtree(ds; trav=true) from HierarchicalUtils.jl that prints the sample together with identifiers of individual nodes:","category":"page"},{"location":"manual/reflectin/","page":"Model reflection","title":"Model reflection","text":"using HierarchicalUtils","category":"page"},{"location":"manual/reflectin/","page":"Model reflection","title":"Model reflection","text":"printtree(ds; trav=true)","category":"page"},{"location":"manual/reflectin/","page":"Model reflection","title":"Model reflection","text":"These identifiers can be used to override the default construction functions. Note that the output, i.e. the last feed-forward network of the whole model is always tagged with an empty string \"\", which simplifies putting linear layer with an appropriate output dimension on the end. Dictionaries with these overrides can be passed in as keyword arguments:","category":"page"},{"location":"manual/reflectin/","page":"Model reflection","title":"Model reflection","text":"fsm overrides constructions of feed-forward models\nfsa overrides construction of aggregation functions.","category":"page"},{"location":"manual/reflectin/","page":"Model reflection","title":"Model reflection","text":"For example to specify just the last feed forward neural network:","category":"page"},{"location":"manual/reflectin/","page":"Model reflection","title":"Model reflection","text":"reflectinmodel(ds, d -> Dense(d, 5, relu), SegmentedMeanMax;\n fsm = Dict(\"\" => d -> Chain(Dense(d, 20, relu), Dense(20, 12)))) |> printtree","category":"page"},{"location":"manual/reflectin/","page":"Model reflection","title":"Model reflection","text":"Both keyword arguments in action:","category":"page"},{"location":"manual/reflectin/","page":"Model reflection","title":"Model reflection","text":"reflectinmodel(ds, d -> Dense(d, 5, relu), SegmentedMeanMax;\n fsm = Dict(\"\" => d -> Chain(Dense(d, 20, relu), Dense(20, 12))),\n fsa = Dict(\"Y\" => SegmentedMean, \"g\" => SegmentedPNorm)) |> printtree","category":"page"},{"location":"manual/reflectin/","page":"Model reflection","title":"Model reflection","text":"There are even more ways to modify the reflection behavior, see the reflectinmodel api reference.","category":"page"},{"location":"manual/reflectin/#Float-precision","page":"Model reflection","title":"Float precision","text":"","category":"section"},{"location":"manual/reflectin/","page":"Model reflection","title":"Model reflection","text":"Mill.jl is built on top of Flux.jl, which by default uses 32-bit precision for model parameters:","category":"page"},{"location":"manual/reflectin/","page":"Model reflection","title":"Model reflection","text":"Dense(2, 2).weight |> eltype","category":"page"},{"location":"manual/reflectin/","page":"Model reflection","title":"Model reflection","text":"If you attempt to process Float64 data with model using lower precision, you get a warning:","category":"page"},{"location":"manual/reflectin/","page":"Model reflection","title":"Model reflection","text":"x = randn(2, 2)\neltype(x)\nm = Dense(2, 2)\nm(x)","category":"page"},{"location":"manual/reflectin/","page":"Model reflection","title":"Model reflection","text":"Unless additional arguments are provided, reflectinmodel also instantiates all Dense layers using 32-bit precision:","category":"page"},{"location":"manual/reflectin/","page":"Model reflection","title":"Model reflection","text":"x = randn(Float32, 2, 2) |> ArrayNode\neltype(Mill.data(x))\nm = reflectinmodel(x)\nm.m.weight |> eltype","category":"page"},{"location":"manual/reflectin/","page":"Model reflection","title":"Model reflection","text":"Because reflectinmodel evaluates (sub)models on parts of the input when building the model, if some Float64 values are passed in, the warning is shown during construction as well as during the evaluation:","category":"page"},{"location":"manual/reflectin/","page":"Model reflection","title":"Model reflection","text":"x = randn(2, 2) |> ArrayNode\neltype(Mill.data(x))\nm = reflectinmodel(x)\nm(x)","category":"page"},{"location":"manual/reflectin/","page":"Model reflection","title":"Model reflection","text":"To prevent this from happening, we recommend making sure that the same precision is used for input data and for reflectinmodel parameters. For example:","category":"page"},{"location":"manual/reflectin/","page":"Model reflection","title":"Model reflection","text":"x32 = randn(Float32, 2, 2) |> ArrayNode\nm = reflectinmodel(x32)\n\nx64 = randn(2, 2) |> ArrayNode\nm = reflectinmodel(x64, d -> f64(Dense(d, 5)), d -> f64(SegmentedMean(d)))","category":"page"},{"location":"manual/reflectin/","page":"Model reflection","title":"Model reflection","text":"Functions Flux.f64 and Flux.f32 may come in handy.","category":"page"},{"location":"manual/aggregation/","page":"Bag aggregation","title":"Bag aggregation","text":"using Mill, Flux","category":"page"},{"location":"manual/aggregation/#Bag-aggregation","page":"Bag aggregation","title":"Bag aggregation","text":"","category":"section"},{"location":"manual/aggregation/","page":"Bag aggregation","title":"Bag aggregation","text":"Aggregation operators in Mill.jl are all subtypes of AbstractAggregation. These structures are responsible for mapping of vector representations of multiple instances into a single vector. They all operate element-wise and independently of dimension and thus the output has the same size as representations on the input, unless the Concatenation of multiple operators is used.","category":"page"},{"location":"manual/aggregation/","page":"Bag aggregation","title":"Bag aggregation","text":"Some setup:","category":"page"},{"location":"manual/aggregation/","page":"Bag aggregation","title":"Bag aggregation","text":"d = 2\nX = Float32.([1 2 3 4; 8 7 6 5])\nbags = AlignedBags([1:1, 2:3, 4:4])","category":"page"},{"location":"manual/aggregation/","page":"Bag aggregation","title":"Bag aggregation","text":"Different choice of operator, or their combinations, are suitable for different problems. Nevertheless, because the input is interpreted as an unordered bag of instances, every operator is invariant to permutation and also does not scale when increasing size of the bag.","category":"page"},{"location":"manual/aggregation/#Non-parametric-aggregation","page":"Bag aggregation","title":"Non-parametric aggregation","text":"","category":"section"},{"location":"manual/aggregation/#Max-aggregation","page":"Bag aggregation","title":"Max aggregation","text":"","category":"section"},{"location":"manual/aggregation/","page":"Bag aggregation","title":"Bag aggregation","text":"SegmentedMax implements a simple max and is the most straightforward operator defined in one dimension as follows:","category":"page"},{"location":"manual/aggregation/","page":"Bag aggregation","title":"Bag aggregation","text":"a_max(x_1 ldots x_k) = max_i = 1 ldots k x_i","category":"page"},{"location":"manual/aggregation/","page":"Bag aggregation","title":"Bag aggregation","text":"where x_1 ldots x_k are all instances of the given bag. In Mill, the operator is constructed this way:","category":"page"},{"location":"manual/aggregation/","page":"Bag aggregation","title":"Bag aggregation","text":"a_max = SegmentedMax(d)","category":"page"},{"location":"manual/aggregation/","page":"Bag aggregation","title":"Bag aggregation","text":"The application is straightforward:","category":"page"},{"location":"manual/aggregation/","page":"Bag aggregation","title":"Bag aggregation","text":"a_max(X, bags)","category":"page"},{"location":"manual/aggregation/","page":"Bag aggregation","title":"Bag aggregation","text":"Since we have three bags, we have three columns in the output, each storing the maximal element over all instances of the given bag.","category":"page"},{"location":"manual/aggregation/#Mean-aggregation","page":"Bag aggregation","title":"Mean aggregation","text":"","category":"section"},{"location":"manual/aggregation/","page":"Bag aggregation","title":"Bag aggregation","text":"SegmentedMean implements mean function, defined as:","category":"page"},{"location":"manual/aggregation/","page":"Bag aggregation","title":"Bag aggregation","text":"a_operatornamemean(x_1 ldots x_k) = frac1k sum_i = 1^k x_i","category":"page"},{"location":"manual/aggregation/","page":"Bag aggregation","title":"Bag aggregation","text":"and used the same way:","category":"page"},{"location":"manual/aggregation/","page":"Bag aggregation","title":"Bag aggregation","text":"a_mean = SegmentedMean(d)\na_mean(X, bags)","category":"page"},{"location":"manual/aggregation/","page":"Bag aggregation","title":"Bag aggregation","text":"ukn: Sufficiency of the mean operator\nIn theory, mean aggregation is sufficient for approximation as proven in [6], but in practice, a combination of multiple operators performes better.","category":"page"},{"location":"manual/aggregation/","page":"Bag aggregation","title":"Bag aggregation","text":"The max aggregation is suitable for cases when one instance in the bag may give evidence strong enough to predict the label. On the other side of the spectrum lies the mean aggregation function, which detects well trends identifiable globally over the whole bag.","category":"page"},{"location":"manual/aggregation/#Sum-aggregation","page":"Bag aggregation","title":"Sum aggregation","text":"","category":"section"},{"location":"manual/aggregation/","page":"Bag aggregation","title":"Bag aggregation","text":"The last non-parametric operator is SegmentedSum, defined as:","category":"page"},{"location":"manual/aggregation/","page":"Bag aggregation","title":"Bag aggregation","text":"a_operatornamemean(x_1 ldots x_k) = sum_i = 1^k x_i","category":"page"},{"location":"manual/aggregation/","page":"Bag aggregation","title":"Bag aggregation","text":"and used the same way:","category":"page"},{"location":"manual/aggregation/","page":"Bag aggregation","title":"Bag aggregation","text":"a_sum = SegmentedSum(d)\na_sum(X, bags)","category":"page"},{"location":"manual/aggregation/#Parametric-aggregation","page":"Bag aggregation","title":"Parametric aggregation","text":"","category":"section"},{"location":"manual/aggregation/","page":"Bag aggregation","title":"Bag aggregation","text":"Whereas non-parametric aggregations do not use any parameter, parametric aggregations represent an entire class of functions parametrized by one or more real vectors of parameters, which can be even learned during training.","category":"page"},{"location":"manual/aggregation/#Log-sum-exp-(LSE)-aggregation","page":"Bag aggregation","title":"Log-sum-exp (LSE) aggregation","text":"","category":"section"},{"location":"manual/aggregation/","page":"Bag aggregation","title":"Bag aggregation","text":"SegmentedLSE (log-sum-exp) aggregation ([8]) is parametrized by a vector of positive numbers bmr in (mathbbR^+)^d m that specifies one real parameter for computation in each output dimension:","category":"page"},{"location":"manual/aggregation/","page":"Bag aggregation","title":"Bag aggregation","text":"a_operatornamelse(x_1 ldots x_k r) = frac1rlog left(frac1k sum_i = 1^k exp(rcdot x_i)right)","category":"page"},{"location":"manual/aggregation/","page":"Bag aggregation","title":"Bag aggregation","text":"With different values of r, LSE behaves differently and in fact both max and mean operators are limiting cases of LSE. If r is very small, the output approaches simple mean, and on the other hand, if r is a large number, LSE becomes a smooth approximation of the max function. Naively implementing the definition above may lead to numerical instabilities, however, the Mill implementation is numerically stable.","category":"page"},{"location":"manual/aggregation/","page":"Bag aggregation","title":"Bag aggregation","text":"a_lse = SegmentedLSE(d)\na_lse(X, bags)","category":"page"},{"location":"manual/aggregation/#p-norm-aggregation","page":"Bag aggregation","title":"p-norm aggregation","text":"","category":"section"},{"location":"manual/aggregation/","page":"Bag aggregation","title":"Bag aggregation","text":"(Normalized) p-norm operator ([9]) is parametrized by a vector of real numbers bmp in (mathbbR^+)^d, where forall i in 1 ldots m colon p_i geq 1, and another vector bmc in (mathbbR^+)^d. It is computed with formula:","category":"page"},{"location":"manual/aggregation/","page":"Bag aggregation","title":"Bag aggregation","text":"a_operatornamepnorm(x_1 ldots x_k p c) = left(frac1k sum_i = 1^k vert x_i - c vert ^ p right)^frac1p","category":"page"},{"location":"manual/aggregation/","page":"Bag aggregation","title":"Bag aggregation","text":"Again, the Mill implementation is stable.","category":"page"},{"location":"manual/aggregation/","page":"Bag aggregation","title":"Bag aggregation","text":"a_pnorm = SegmentedPNorm(d)\na_pnorm(X, bags)","category":"page"},{"location":"manual/aggregation/","page":"Bag aggregation","title":"Bag aggregation","text":"Because all parameter constraints are included implicitly (field ρ in both types is a real number that undergoes appropriate transformation before being used), both parametric operators are easy to use and do not require any special treatment. Replacing the definition of aggregation operators while constructing a model (either manually or with reflectinmodel) is enough.","category":"page"},{"location":"manual/aggregation/#Concatenation","page":"Bag aggregation","title":"Concatenation","text":"","category":"section"},{"location":"manual/aggregation/","page":"Bag aggregation","title":"Bag aggregation","text":"To use a concatenation of two or more operators, one can use the AggregationStack constructor:","category":"page"},{"location":"manual/aggregation/","page":"Bag aggregation","title":"Bag aggregation","text":"a = AggregationStack(a_mean, a_max)\na(X, bags)","category":"page"},{"location":"manual/aggregation/","page":"Bag aggregation","title":"Bag aggregation","text":"For the most common combinations, Mill provides some convenience definitions:","category":"page"},{"location":"manual/aggregation/","page":"Bag aggregation","title":"Bag aggregation","text":"SegmentedMeanMax(d)\nSegmentedPNormLSE(d)","category":"page"},{"location":"manual/aggregation/#Weighted-aggregation","page":"Bag aggregation","title":"Weighted aggregation","text":"","category":"section"},{"location":"manual/aggregation/","page":"Bag aggregation","title":"Bag aggregation","text":"Sometimes, different instances in the bag are not equally important and contribute to output to a different extent. For instance, this may come in handy when performing importance sampling over very large bags. SegmentedMean and SegmentedPNorm have definitions taking weights into account:","category":"page"},{"location":"manual/aggregation/","page":"Bag aggregation","title":"Bag aggregation","text":"a_operatornamemean((x_i w_i)_i=1^k) = frac1sum_i=1^k w_i sum_i = 1^k w_i cdot x_i","category":"page"},{"location":"manual/aggregation/","page":"Bag aggregation","title":"Bag aggregation","text":"a_operatornamepnorm(x_i w_i_i=1^k p c) = left(frac1sum_i=1^k w_i sum_i = 1^k w_icdotvert x_i - c vert ^ p right)^frac1p","category":"page"},{"location":"manual/aggregation/","page":"Bag aggregation","title":"Bag aggregation","text":"This is done in Mill by passing an additional parameter:","category":"page"},{"location":"manual/aggregation/","page":"Bag aggregation","title":"Bag aggregation","text":"w = Float32.([1.0, 0.2, 0.8, 0.5])\na_mean(X, bags, w)\na_pnorm(X, bags, w)","category":"page"},{"location":"manual/aggregation/","page":"Bag aggregation","title":"Bag aggregation","text":"For SegmentedMax and SegmentedLSE it is possible to pass in weights, but they are ignored during computation:","category":"page"},{"location":"manual/aggregation/","page":"Bag aggregation","title":"Bag aggregation","text":"a_max(X, bags, w) == a_max(X, bags)","category":"page"},{"location":"manual/aggregation/#Weighted-nodes","page":"Bag aggregation","title":"Weighted nodes","text":"","category":"section"},{"location":"manual/aggregation/","page":"Bag aggregation","title":"Bag aggregation","text":"WeightedBagNode is used to store instance weights into a dataset. It accepts weights in the constructor:","category":"page"},{"location":"manual/aggregation/","page":"Bag aggregation","title":"Bag aggregation","text":"wbn = WeightedBagNode(X, bags, w)","category":"page"},{"location":"manual/aggregation/","page":"Bag aggregation","title":"Bag aggregation","text":"and passes them to aggregation operators:","category":"page"},{"location":"manual/aggregation/","page":"Bag aggregation","title":"Bag aggregation","text":"m = reflectinmodel(wbn, d -> Dense(d, 3))\nm(wbn)","category":"page"},{"location":"manual/aggregation/","page":"Bag aggregation","title":"Bag aggregation","text":"Otherwise, WeightedBagNode behaves exactly like the standard BagNode.","category":"page"},{"location":"manual/aggregation/#Bag-count","page":"Bag aggregation","title":"Bag count","text":"","category":"section"},{"location":"manual/aggregation/","page":"Bag aggregation","title":"Bag aggregation","text":"For some problems, it may be beneficial to use the size of the bag directly and feed it to subsequent layers. To do this, wrap an instance of AbstractAggregation or AggregationStack in the BagCount type.","category":"page"},{"location":"manual/aggregation/","page":"Bag aggregation","title":"Bag aggregation","text":"In the aggregation phase, bag count appends one more element which stores the bag size to the output after all operators are applied. Furthermore, Mill, performs a mapping x mapsto log(x) + 1 on top of that:","category":"page"},{"location":"manual/aggregation/","page":"Bag aggregation","title":"Bag aggregation","text":"a_mean_bc = BagCount(a_mean)\na_mean_bc(X, bags)","category":"page"},{"location":"manual/aggregation/","page":"Bag aggregation","title":"Bag aggregation","text":"The matrix now has three rows, the last one storing the size of the bag.","category":"page"},{"location":"manual/aggregation/","page":"Bag aggregation","title":"Bag aggregation","text":"Model reflection adds BagCount after each aggregation operator by default.","category":"page"},{"location":"manual/aggregation/","page":"Bag aggregation","title":"Bag aggregation","text":"bn = BagNode(X, bags)\nbm = reflectinmodel(bn, d -> Dense(d, 3))","category":"page"},{"location":"manual/aggregation/","page":"Bag aggregation","title":"Bag aggregation","text":"Note that the bm (sub)model field of the BagNode has size of (7, 3), 3 for each of two aggregation outputs and 1 for sizes of bags.","category":"page"},{"location":"manual/aggregation/","page":"Bag aggregation","title":"Bag aggregation","text":"bm(bn)","category":"page"},{"location":"manual/aggregation/#Default-aggregation-values","page":"Bag aggregation","title":"Default aggregation values","text":"","category":"section"},{"location":"manual/aggregation/","page":"Bag aggregation","title":"Bag aggregation","text":"When all aggregation operators are printed, one may notice that all of them store one additional vector ψ. This is a vector of default parameters, initialized to all zeros, that are used for empty bags:","category":"page"},{"location":"manual/aggregation/","page":"Bag aggregation","title":"Bag aggregation","text":"bags = AlignedBags([1:1, 0:-1, 2:3, 0:-1, 4:4])\na_mean(X, bags)","category":"page"},{"location":"manual/aggregation/","page":"Bag aggregation","title":"Bag aggregation","text":"That's why the dimension of input is required in the constructor. See Missing data page for more information.","category":"page"},{"location":"","page":"Home","title":"Home","text":"\"Mill.jl\n\"Mill.jl","category":"page"},{"location":"","page":"Home","title":"Home","text":"Mill.jl (Multiple Instance Learning Library) is a library built on top of Flux.jl aimed to flexibly prototype hierarchical multiple instance learning models as described in [1], [2] and [3]. It is developed to be:","category":"page"},{"location":"","page":"Home","title":"Home","text":"flexible and versatile\nas general as possible\nfast \nand dependent on only handful of other packages","category":"page"},{"location":"","page":"Home","title":"Home","text":"Watch our introductory talk from JuliaCon 2021.","category":"page"},{"location":"#Installation","page":"Home","title":"Installation","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Run the following in REPL:","category":"page"},{"location":"","page":"Home","title":"Home","text":"] add Mill","category":"page"},{"location":"","page":"Home","title":"Home","text":"Julia v1.9 or later is required.","category":"page"},{"location":"#Getting-started","page":"Home","title":"Getting started","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"For the quickest start, see the Musk example.","category":"page"},{"location":"","page":"Home","title":"Home","text":"Motivation: a brief introduction into the philosophy of Mill\nManual: a brief tutorial into Mill\nExamples: some examples of Mill use\nExternal tools: examples of integration with other packages\nPublic API: extensive API reference\nReferences: related literature\nCitation: preferred citation entries","category":"page"},{"location":"api/switches/#General","page":"Switches","title":"General","text":"","category":"section"},{"location":"api/switches/#Index","page":"Switches","title":"Index","text":"","category":"section"},{"location":"api/switches/","page":"Switches","title":"Switches","text":"Pages = [\"general.md\"]","category":"page"},{"location":"api/switches/#API","page":"Switches","title":"API","text":"","category":"section"},{"location":"api/switches/","page":"Switches","title":"Switches","text":"Mill.emptyismissing\nMill.emptyismissing!\n\nMill.string_start_code\nMill.string_start_code!\n\nMill.string_end_code\nMill.string_end_code!","category":"page"},{"location":"api/switches/#Mill.emptyismissing","page":"Switches","title":"Mill.emptyismissing","text":"Mill.emptyismissing()\n\nGet the current value of the emptyismissing parameter.\n\nSee also: Mill.emptyismissing!.\n\n\n\n\n\n","category":"function"},{"location":"api/switches/#Mill.emptyismissing!","page":"Switches","title":"Mill.emptyismissing!","text":"Mill.emptyismissing!(::Bool; persist=false)\n\nSet the new value to the emptyismissing parameter.\n\nSet persist=true to persist this setting between sessions.\n\nSee also: Mill.emptyismissing.\n\n\n\n\n\n","category":"function"},{"location":"api/switches/#Mill.string_start_code","page":"Switches","title":"Mill.string_start_code","text":"Mill.string_start_code()\n\nGet the current value of the string_start_code parameter used as a code point of the abstract string-start character. The default value of the parameter is 0x02, which corresponds to the STX character in ASCII encoding.\n\nSee also: Mill.string_start_code!, Mill.string_end_code, Mill.string_end_code!.\n\n\n\n\n\n","category":"function"},{"location":"api/switches/#Mill.string_start_code!","page":"Switches","title":"Mill.string_start_code!","text":"Mill.string_start_code!(c::Integer; persist=false)\n\nSet the new value to the string_start_code parameter used as a code point of the abstract string-start character to c. The default value of the parameter is 0x02, which corresponds to the STX character in ASCII encoding.\n\nc should fit into UInt8.\n\nSet persist=true to persist this setting between sessions.\n\nSee also: Mill.string_start_code, Mill.string_end_code, Mill.string_end_code!.\n\n\n\n\n\n","category":"function"},{"location":"api/switches/#Mill.string_end_code","page":"Switches","title":"Mill.string_end_code","text":"Mill.string_end_code()\n\nGet the current value of the string_end_code parameter used as a code point of the abstract string-end character. The default value of the parameter is 0x03, which corresponds to the ETX character in ASCII encoding.\n\nSee also: Mill.string_end_code!, Mill.string_start_code, Mill.string_start_code!.\n\n\n\n\n\n","category":"function"},{"location":"api/switches/#Mill.string_end_code!","page":"Switches","title":"Mill.string_end_code!","text":"Mill.string_end_code!(c::Integer; persist=false)\n\nSet the new value to the string_end_code parameter used as a code point of the abstract string-end character to c. The default value of the parameter is 0x03, which corresponds to the ETX character in ASCII encoding.\n\nc should fit into UInt8.\n\nSet persist=true to persist this setting between sessions.\n\nSee also: Mill.string_end_code, Mill.string_start_code, Mill.string_start_code!.\n\n\n\n\n\n","category":"function"}] +} diff --git a/v2.10.1/siteinfo.js b/v2.10.1/siteinfo.js new file mode 100644 index 00000000..715e4711 --- /dev/null +++ b/v2.10.1/siteinfo.js @@ -0,0 +1 @@ +var DOCUMENTER_CURRENT_VERSION = "v2.10.1"; diff --git a/v2.10.1/tools/hierarchical/index.html b/v2.10.1/tools/hierarchical/index.html new file mode 100644 index 00000000..ac431a40 --- /dev/null +++ b/v2.10.1/tools/hierarchical/index.html @@ -0,0 +1,83 @@ + +HierarchicalUtils.jl · Mill.jl

    HierarchicalUtils.jl

    Mill.jl uses HierarchicalUtils.jl which brings a lot of additional features.

    using HierarchicalUtils

    Printing

    For instance, Base.show with text/plain MIME calls HierarchicalUtils.printtree:

    julia> ds = BagNode(ProductNode((BagNode(randn(4, 10),
    +                                         [1:2, 3:4, 5:5, 6:7, 8:10]),
    +                                 randn(3, 5),
    +                                 BagNode(BagNode(randn(2, 30),
    +                                                 [i:i+1 for i in 1:2:30]),
    +                                         [1:3, 4:6, 7:9, 10:12, 13:15]),
    +                                 randn(2, 5))),
    +                    [1:1, 2:3, 4:5])BagNode  # 3 obs, 160 bytes
    +  ╰── ProductNode  # 5 obs, 56 bytes
    +        ├── BagNode  # 5 obs, 144 bytes
    +        ╰── ArrayNode(4×10 Array with Float64 elements)  # 10 obs, 368 bytes
    +        ├── ArrayNode(3×5 Array with Float64 elements)  # 5 obs, 168 bytes
    +        ├── BagNode  # 5 obs, 152 bytes
    +        ╰── BagNode  # 15 obs, 304 bytes
    +              ╰── ArrayNode(2×30 Array with Float64 elements)  # 30 obs, 528 bytes
    +        ╰── ArrayNode(2×5 Array with Float64 elements)  # 5 obs, 128 bytes
    julia> printtree(ds; htrunc=3)BagNode # 3 obs, 160 bytes + ╰── ProductNode # 5 obs, 56 bytes + ├── BagNode # 5 obs, 144 bytes + │ ┊ + ├── ArrayNode(3×5 Array with Float64 elements) # 5 obs, 168 bytes + ├── BagNode # 5 obs, 152 bytes + │ ┊ + ╰── ArrayNode(2×5 Array with Float64 elements) # 5 obs, 128 bytes

    This can be used to print a non-truncated version of a model:

    julia> printtree(ds)BagNode  # 3 obs, 160 bytes
    +  ╰── ProductNode  # 5 obs, 56 bytes
    +        ├── BagNode  # 5 obs, 144 bytes
    +        │     ╰── ArrayNode(4×10 Array with Float64 elements)  # 10 obs, 368 bytes
    +        ├── ArrayNode(3×5 Array with Float64 elements)  # 5 obs, 168 bytes
    +        ├── BagNode  # 5 obs, 152 bytes
    +        │     ╰── BagNode  # 15 obs, 304 bytes
    +        │           ╰── ArrayNode(2×30 Array with Float64 elements)  # 30 obs, 528 bytes
    +        ╰── ArrayNode(2×5 Array with Float64 elements)  # 5 obs, 128 bytes

    Traversal encoding

    Callling with trav=true enables convenient traversal functionality with string indexing:

    julia> m = reflectinmodel(ds)┌ Warning: Layer with Float32 parameters got Float64 input.
    +│   The input will be converted, but any earlier layers may be very slow.
    +│   layer = Dense(4 => 10)      # 50 parameters
    +│   summary(x) = "4×10 Matrix{Float64}"
    +└ @ Flux ~/.julia/packages/Flux/ljuc2/src/layers/stateless.jl:60
    +BagModel ↦ BagCount([SegmentedMean(10); SegmentedMax(10)]) ↦ Dense(21 => 10)  # 4 arrays, 240 params, 1.094 KiB
    +  ╰── ProductModel ↦ Dense(40 => 10)  # 2 arrays, 410 params, 1.680 KiB
    +        ├── BagModel ↦ BagCount([SegmentedMean(10); SegmentedMax(10)]) ↦ Dense(21 => 10)  # 4 arrays, 240 params, 1.094 KiB
    +        ╰── ArrayModel(Dense(4 => 10))  # 2 arrays, 50 params, 280 bytes
    +        ├── ArrayModel(Dense(3 => 10))  # 2 arrays, 40 params, 240 bytes
    +        ├── BagModel ↦ BagCount([SegmentedMean(10); SegmentedMax(10)]) ↦ Dense(21 => 10)  # 4 arrays, 240 params, 1.094 KiB
    +        ╰── BagModel ↦ BagCount([SegmentedMean(10); SegmentedMax(10)]) ↦ Dense(21 => 10)  # 4 arrays, 240 params, 1.0 ⋯
    +              ╰── ArrayModel(Dense(2 => 10))  # 2 arrays, 30 params, 200 bytes
    +        ╰── ArrayModel(Dense(2 => 10))  # 2 arrays, 30 params, 200 bytes
    julia> printtree(m; trav=true)BagModel ↦ BagCount([SegmentedMean(10); SegmentedMax(10)]) ↦ Dense(21 => 10) [""] # 4 arrays, 240 params, 1.094 KiB + ╰── ProductModel ↦ Dense(40 => 10) ["U"] # 2 arrays, 410 params, 1.680 KiB + ├── BagModel ↦ BagCount([SegmentedMean(10); SegmentedMax(10)]) ↦ Dense(21 => 10) ["Y"] # 4 arrays, 240 params, 1.094 KiB + │ ╰── ArrayModel(Dense(4 => 10)) ["a"] # 2 arrays, 50 params, 280 bytes + ├── ArrayModel(Dense(3 => 10)) ["c"] # 2 arrays, 40 params, 240 bytes + ├── BagModel ↦ BagCount([SegmentedMean(10); SegmentedMax(10)]) ↦ Dense(21 => 10) ["g"] # 4 arrays, 240 params, 1.094 KiB + │ ╰── BagModel ↦ BagCount([SegmentedMean(10); SegmentedMax(10)]) ↦ Dense(21 => 10) ["i"] # 4 arrays, 240 params, 1.094 KiB + │ ╰── ArrayModel(Dense(2 => 10)) ["j"] # 2 arrays, 30 params, 200 bytes + ╰── ArrayModel(Dense(2 => 10)) ["k"] # 2 arrays, 30 params, 200 bytes

    This way any node in the model tree is swiftly accessible, which may come in handy when inspecting model parameters or simply deleting/replacing/inserting nodes to tree (for instance when constructing adversarial samples). All tree nodes are accessible by indexing with the traversal code:.

    julia> m["Y"]BagModel ↦ BagCount([SegmentedMean(10); SegmentedMax(10)]) ↦ Dense(21 => 10)  # 4 arrays, 240 params, 1.094 KiB
    +  ╰── ArrayModel(Dense(4 => 10))  # 2 arrays, 50 params, 280 bytes

    The following two approaches give the same result:

    julia> m["Y"] ≡ m.im.ms[1]true

    Counting functions

    Other functions provided by HierarchicalUtils.jl:

    julia> nnodes(ds)9
    julia> nleafs(ds)4
    julia> NodeIterator(ds) |> collect9-element Vector{AbstractMillNode}: + BagNode + ProductNode + BagNode + ArrayNode(4×10 Array with Float64 elements) + ArrayNode(3×5 Array with Float64 elements) + BagNode + BagNode + ArrayNode(2×30 Array with Float64 elements) + ArrayNode(2×5 Array with Float64 elements)
    julia> NodeIterator(ds, m) |> collect9-element Vector{Tuple{AbstractMillNode, AbstractMillModel}}: + (BagNode, BagModel ↦ BagCount([SegmentedMean(10); SegmentedMax(10)]) ↦ Dense(21 => 10)) + (ProductNode, ProductModel ↦ Dense(40 => 10)) + (BagNode, BagModel ↦ BagCount([SegmentedMean(10); SegmentedMax(10)]) ↦ Dense(21 => 10)) + (ArrayNode(4×10 Array with Float64 elements), ArrayModel(Dense(4 => 10))) + (ArrayNode(3×5 Array with Float64 elements), ArrayModel(Dense(3 => 10))) + (BagNode, BagModel ↦ BagCount([SegmentedMean(10); SegmentedMax(10)]) ↦ Dense(21 => 10)) + (BagNode, BagModel ↦ BagCount([SegmentedMean(10); SegmentedMax(10)]) ↦ Dense(21 => 10)) + (ArrayNode(2×30 Array with Float64 elements), ArrayModel(Dense(2 => 10))) + (ArrayNode(2×5 Array with Float64 elements), ArrayModel(Dense(2 => 10)))
    julia> LeafIterator(ds) |> collect4-element Vector{ArrayNode{Matrix{Float64}, Nothing}}: + ArrayNode(4×10 Array with Float64 elements) + ArrayNode(3×5 Array with Float64 elements) + ArrayNode(2×30 Array with Float64 elements) + ArrayNode(2×5 Array with Float64 elements)
    julia> TypeIterator(BagModel, m) |> collect4-element Vector{BagModel{T, BagCount{AggregationStack{Tuple{SegmentedMean{Vector{Float32}}, SegmentedMax{Vector{Float32}}}}}, Dense{typeof(identity), Matrix{Float32}, Vector{Float32}}} where T<:AbstractMillModel}: + BagModel ↦ BagCount([SegmentedMean(10); SegmentedMax(10)]) ↦ Dense(21 => 10) + BagModel ↦ BagCount([SegmentedMean(10); SegmentedMax(10)]) ↦ Dense(21 => 10) + BagModel ↦ BagCount([SegmentedMean(10); SegmentedMax(10)]) ↦ Dense(21 => 10) + BagModel ↦ BagCount([SegmentedMean(10); SegmentedMax(10)]) ↦ Dense(21 => 10)
    julia> PredicateIterator(x -> numobs(x) ≥ 10, ds) |> collect3-element Vector{AbstractMillNode}: + ArrayNode(4×10 Array with Float64 elements) + BagNode + ArrayNode(2×30 Array with Float64 elements)

    For the complete showcase of possibilites, refer to HierarchicalUtils.jl and this notebook.

    diff --git a/versions.js b/versions.js index 7383bbd8..b873eec8 100644 --- a/versions.js +++ b/versions.js @@ -13,5 +13,5 @@ var DOC_VERSIONS = [ "v2.0", "dev", ]; -var DOCUMENTER_NEWEST = "v2.10.0"; +var DOCUMENTER_NEWEST = "v2.10.1"; var DOCUMENTER_STABLE = "stable";