-module(yum@yaml@resolver).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/yum/yaml/resolver.gleam").
-export([resolve/2]).
-export_type([resolved_mapping_entry/0]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
?MODULEDOC(false).
-type resolved_mapping_entry() :: {resolved_mapping_entry,
yum@yaml@node:node_(),
yum@yaml@node:node_(),
gleam@dict:dict(binary(), yum@yaml@node:node_())}.
-file("src/yum/yaml/resolver.gleam", 434).
?DOC(false).
-spec register_anchor(
gleam@dict:dict(binary(), yum@yaml@node:node_()),
yum@yaml@node:node_()
) -> gleam@dict:dict(binary(), yum@yaml@node:node_()).
register_anchor(Anchors, Value) ->
case yum@yaml@node:anchor(Value) of
{some, Anchor} ->
gleam@dict:insert(Anchors, Anchor, Value);
none ->
Anchors
end.
-file("src/yum/yaml/resolver.gleam", 522).
?DOC(false).
-spec copy_alias(yum@yaml@node:node_(), yum@yaml@node:node_()) -> yum@yaml@node:node_().
copy_alias(Value, Source) ->
case yum@yaml@node:alias(Source) of
{some, Alias} ->
yum@yaml@node:with_alias(Value, Alias);
none ->
Value
end.
-file("src/yum/yaml/resolver.gleam", 515).
?DOC(false).
-spec copy_anchor(yum@yaml@node:node_(), yum@yaml@node:node_()) -> yum@yaml@node:node_().
copy_anchor(Value, Source) ->
case yum@yaml@node:anchor(Source) of
{some, Anchor} ->
yum@yaml@node:with_anchor(Value, Anchor);
none ->
Value
end.
-file("src/yum/yaml/resolver.gleam", 508).
?DOC(false).
-spec apply_tag(yum@yaml@node:node_(), gleam@option:option(binary())) -> yum@yaml@node:node_().
apply_tag(Value, Tag) ->
case Tag of
{some, Tag@1} ->
yum@yaml@node:with_tag(Value, Tag@1);
none ->
Value
end.
-file("src/yum/yaml/resolver.gleam", 444).
?DOC(false).
-spec rebuild(yum@yaml@node:node_(), yum@yaml@node:kind()) -> yum@yaml@node:node_().
rebuild(Source, Kind) ->
_pipe = yum@yaml@node:new(
Kind,
yum@yaml@node:span(Source),
yum@yaml@node:style(Source)
),
_pipe@1 = apply_tag(_pipe, yum@yaml@node:tag(Source)),
_pipe@2 = copy_anchor(_pipe@1, Source),
copy_alias(_pipe@2, Source).
-file("src/yum/yaml/resolver.gleam", 543).
?DOC(false).
-spec bool_identity(boolean()) -> binary().
bool_identity(Value) ->
case Value of
true ->
<<"true"/utf8>>;
false ->
<<"false"/utf8>>
end.
-file("src/yum/yaml/resolver.gleam", 529).
?DOC(false).
-spec key_identity(yum@yaml@node:node_()) -> gleam@option:option(binary()).
key_identity(Key) ->
case yum@yaml@node:kind(Key) of
null ->
{some, <<"null:"/utf8>>};
{bool, Value} ->
{some, <<"bool:"/utf8, (bool_identity(Value))/binary>>};
{int, Value@1} ->
{some, <<"int:"/utf8, (erlang:integer_to_binary(Value@1))/binary>>};
{float, Value@2} ->
{some,
<<"float:"/utf8,
(gleam_stdlib:float_to_string(Value@2))/binary>>};
pos_inf ->
{some, <<"float:.inf"/utf8>>};
neg_inf ->
{some, <<"float:-.inf"/utf8>>};
nan ->
{some, <<"float:.nan"/utf8>>};
{string, Value@3} ->
{some, <<"string:"/utf8, Value@3/binary>>};
{sequence, _} ->
none;
{mapping, _} ->
none
end.
-file("src/yum/yaml/resolver.gleam", 412).
?DOC(false).
-spec seen_key_identities(list({yum@yaml@node:node_(), yum@yaml@node:node_()})) -> gleam@dict:dict(binary(), nil).
seen_key_identities(Entries) ->
gleam@list:fold(
Entries,
maps:new(),
fun(Seen, Entry) ->
{Key, _} = Entry,
case key_identity(Key) of
none ->
Seen;
{some, Identity} ->
gleam@dict:insert(Seen, Identity, nil)
end
end
).
-file("src/yum/yaml/resolver.gleam", 390).
?DOC(false).
-spec deduplicate_merged_entries(
list({yum@yaml@node:node_(), yum@yaml@node:node_()}),
gleam@dict:dict(binary(), nil)
) -> list({yum@yaml@node:node_(), yum@yaml@node:node_()}).
deduplicate_merged_entries(Entries, Seen) ->
{Entries@2, _} = gleam@list:fold(
Entries,
{[], Seen},
fun(Acc, Entry) ->
{Entries@1, Seen@1} = Acc,
{Key, _} = Entry,
case key_identity(Key) of
none ->
{[Entry | Entries@1], Seen@1};
{some, Identity} ->
case gleam@dict:has_key(Seen@1, Identity) of
true ->
Acc;
false ->
{[Entry | Entries@1],
gleam@dict:insert(Seen@1, Identity, nil)}
end
end
end
),
lists:reverse(Entries@2).
-file("src/yum/yaml/resolver.gleam", 378).
?DOC(false).
-spec merge_target_entries(yum@yaml@node:node_(), yum@yaml@node:span()) -> {list({yum@yaml@node:node_(),
yum@yaml@node:node_()}),
list(yum@yaml@diagnostic:diagnostic())}.
merge_target_entries(Target, Span) ->
case yum@yaml@node:kind(Target) of
{mapping, Entries} ->
{Entries, []};
_ ->
{[],
[{invalid_merge_target, yum@yaml@node:kind_name(Target), Span}]}
end.
-file("src/yum/yaml/resolver.gleam", 363).
?DOC(false).
-spec expand_merge_sequence_entry(
yum@yaml@node:node_(),
gleam@dict:dict(binary(), yum@yaml@node:node_())
) -> {list({yum@yaml@node:node_(), yum@yaml@node:node_()}),
list(yum@yaml@diagnostic:diagnostic())}.
expand_merge_sequence_entry(Entry, Anchors) ->
case yum@yaml@node:alias(Entry) of
{some, Alias} ->
case gleam_stdlib:map_get(Anchors, Alias) of
{ok, Target} ->
merge_target_entries(Target, yum@yaml@node:span(Entry));
{error, _} ->
{[], []}
end;
none ->
merge_target_entries(Entry, yum@yaml@node:span(Entry))
end.
-file("src/yum/yaml/resolver.gleam", 347).
?DOC(false).
-spec expand_merge_sequence(
list(yum@yaml@node:node_()),
gleam@dict:dict(binary(), yum@yaml@node:node_())
) -> {list({yum@yaml@node:node_(), yum@yaml@node:node_()}),
list(yum@yaml@diagnostic:diagnostic())}.
expand_merge_sequence(Entries, Anchors) ->
gleam@list:fold(
Entries,
{[], []},
fun(Acc, Entry) ->
{Merged_entries, Diagnostics} = Acc,
{Entries@1, Entry_diagnostics} = expand_merge_sequence_entry(
Entry,
Anchors
),
{lists:append(Merged_entries, Entries@1),
lists:append(Diagnostics, Entry_diagnostics)}
end
).
-file("src/yum/yaml/resolver.gleam", 322).
?DOC(false).
-spec expand_merge_value(
yum@yaml@node:node_(),
gleam@dict:dict(binary(), yum@yaml@node:node_())
) -> {list({yum@yaml@node:node_(), yum@yaml@node:node_()}),
list(yum@yaml@diagnostic:diagnostic())}.
expand_merge_value(Value, Anchors) ->
case yum@yaml@node:alias(Value) of
{some, Alias} ->
case gleam_stdlib:map_get(Anchors, Alias) of
{ok, Target} ->
merge_target_entries(Target, yum@yaml@node:span(Value));
{error, _} ->
{[], []}
end;
none ->
case yum@yaml@node:kind(Value) of
{mapping, Entries} ->
{Entries, []};
{sequence, Entries@1} ->
expand_merge_sequence(Entries@1, Anchors);
_ ->
{[],
[{invalid_merge_target,
yum@yaml@node:kind_name(Value),
yum@yaml@node:span(Value)}]}
end
end.
-file("src/yum/yaml/resolver.gleam", 423).
?DOC(false).
-spec is_merge_key(yum@yaml@node:node_()) -> boolean().
is_merge_key(Key) ->
case yum@yaml@node:tag(Key) of
{some, <<"tag:yaml.org,2002:merge"/utf8>>} ->
true;
_ ->
case yum@yaml@node:kind(Key) of
{string, <<"<<"/utf8>>} ->
true;
_ ->
false
end
end.
-file("src/yum/yaml/resolver.gleam", 285).
?DOC(false).
-spec expand_mapping_merges(list(resolved_mapping_entry())) -> {list({yum@yaml@node:node_(),
yum@yaml@node:node_()}),
list(yum@yaml@diagnostic:diagnostic())}.
expand_mapping_merges(Entries) ->
Explicit_entries = begin
_pipe = Entries,
gleam@list:filter_map(
_pipe,
fun(Entry) -> case is_merge_key(erlang:element(2, Entry)) of
true ->
{error, nil};
false ->
{ok,
{erlang:element(2, Entry), erlang:element(3, Entry)}}
end end
)
end,
{Merged_entries@1, Diagnostics@1} = gleam@list:fold(
Entries,
{[], []},
fun(Acc, Entry@1) ->
{Merged_entries, Diagnostics} = Acc,
case is_merge_key(erlang:element(2, Entry@1)) of
false ->
Acc;
true ->
{Entries@1, Entry_diagnostics} = expand_merge_value(
erlang:element(3, Entry@1),
erlang:element(4, Entry@1)
),
{lists:append(Merged_entries, Entries@1),
lists:append(Diagnostics, Entry_diagnostics)}
end
end
),
Merged_entries@2 = begin
_pipe@1 = Merged_entries@1,
deduplicate_merged_entries(
_pipe@1,
seen_key_identities(Explicit_entries)
)
end,
{lists:append(Explicit_entries, Merged_entries@2), Diagnostics@1}.
-file("src/yum/yaml/resolver.gleam", 256).
?DOC(false).
-spec resolve_mapping_merges(
list({yum@yaml@node:node_(), yum@yaml@node:node_()}),
gleam@dict:dict(binary(), yum@yaml@node:node_())
) -> {list({yum@yaml@node:node_(), yum@yaml@node:node_()}),
gleam@dict:dict(binary(), yum@yaml@node:node_()),
list(yum@yaml@diagnostic:diagnostic())}.
resolve_mapping_merges(Entries, Anchors) ->
{Entries@2, Anchors@4, Diagnostics@1} = gleam@list:fold(
Entries,
{[], Anchors, []},
fun(Acc, Entry) ->
{Entries@1, Anchors@1, Diagnostics} = Acc,
{Key, Value} = Entry,
{Key@1, Anchors@2, Key_diagnostics} = resolve_node_merges(
Key,
Anchors@1
),
{Value@1, Anchors@3, Value_diagnostics} = resolve_node_merges(
Value,
Anchors@2
),
{[{resolved_mapping_entry, Key@1, Value@1, Anchors@3} | Entries@1],
Anchors@3,
begin
_pipe = Diagnostics,
_pipe@1 = lists:append(_pipe, Key_diagnostics),
lists:append(_pipe@1, Value_diagnostics)
end}
end
),
{Entries@3, Merge_diagnostics} = begin
_pipe@2 = Entries@2,
_pipe@3 = lists:reverse(_pipe@2),
expand_mapping_merges(_pipe@3)
end,
{Entries@3, Anchors@4, lists:append(Diagnostics@1, Merge_diagnostics)}.
-file("src/yum/yaml/resolver.gleam", 236).
?DOC(false).
-spec resolve_sequence_merges(
list(yum@yaml@node:node_()),
gleam@dict:dict(binary(), yum@yaml@node:node_())
) -> {list(yum@yaml@node:node_()),
gleam@dict:dict(binary(), yum@yaml@node:node_()),
list(yum@yaml@diagnostic:diagnostic())}.
resolve_sequence_merges(Entries, Anchors) ->
{Entries@2, Anchors@3, Diagnostics@1} = gleam@list:fold(
Entries,
{[], Anchors, []},
fun(Acc, Entry) ->
{Entries@1, Anchors@1, Diagnostics} = Acc,
{Entry@1, Anchors@2, Entry_diagnostics} = resolve_node_merges(
Entry,
Anchors@1
),
{[Entry@1 | Entries@1],
Anchors@2,
lists:append(Diagnostics, Entry_diagnostics)}
end
),
{lists:reverse(Entries@2), Anchors@3, Diagnostics@1}.
-file("src/yum/yaml/resolver.gleam", 210).
?DOC(false).
-spec resolve_node_merges(
yum@yaml@node:node_(),
gleam@dict:dict(binary(), yum@yaml@node:node_())
) -> {yum@yaml@node:node_(),
gleam@dict:dict(binary(), yum@yaml@node:node_()),
list(yum@yaml@diagnostic:diagnostic())}.
resolve_node_merges(Value, Anchors) ->
{Kind@1, Anchors@3, Nested_diagnostics} = case yum@yaml@node:kind(Value) of
{sequence, Entries} ->
{Entries@1, Anchors@1, Diagnostics} = resolve_sequence_merges(
Entries,
Anchors
),
{{sequence, Entries@1}, Anchors@1, Diagnostics};
{mapping, Entries@2} ->
{Entries@3, Anchors@2, Diagnostics@1} = resolve_mapping_merges(
Entries@2,
Anchors
),
{{mapping, Entries@3}, Anchors@2, Diagnostics@1};
Kind ->
{Kind, Anchors, []}
end,
Value@1 = rebuild(Value, Kind@1),
Anchors@4 = register_anchor(Anchors@3, Value@1),
{Value@1, Anchors@4, Nested_diagnostics}.
-file("src/yum/yaml/resolver.gleam", 496).
?DOC(false).
-spec expand_tag_handle(
binary(),
binary(),
gleam@dict:dict(binary(), binary()),
yum@yaml@node:span()
) -> {ok, binary()} | {error, yum@yaml@diagnostic:diagnostic()}.
expand_tag_handle(Handle, Suffix, Handles, Span) ->
case gleam_stdlib:map_get(Handles, Handle) of
{ok, Prefix} ->
{ok, <<Prefix/binary, Suffix/binary>>};
{error, _} ->
{error, {unknown_tag_handle, Handle, Span}}
end.
-file("src/yum/yaml/resolver.gleam", 466).
?DOC(false).
-spec expand_tag(
binary(),
gleam@dict:dict(binary(), binary()),
yum@yaml@node:span()
) -> {ok, binary()} | {error, yum@yaml@diagnostic:diagnostic()}.
expand_tag(Tag, Handles, Span) ->
case Tag of
<<"<"/utf8, Verbatim/binary>> ->
case {gleam_stdlib:string_ends_with(Verbatim, <<">"/utf8>>),
gleam@string:drop_end(Verbatim, 1)} of
{true, <<""/utf8>>} ->
{error, {invalid_tag, Tag, Span}};
{true, Uri} ->
{ok, Uri};
{false, _} ->
{error, {invalid_tag, Tag, Span}}
end;
<<"!"/utf8, Suffix/binary>> ->
expand_tag_handle(<<"!!"/utf8>>, Suffix, Handles, Span);
_ ->
case gleam@string:split(Tag, <<"!"/utf8>>) of
[] ->
expand_tag_handle(<<"!"/utf8>>, Tag, Handles, Span);
[Suffix@1] ->
expand_tag_handle(<<"!"/utf8>>, Suffix@1, Handles, Span);
[Handle | Suffix@2] ->
expand_tag_handle(
<<<<"!"/utf8, Handle/binary>>/binary, "!"/utf8>>,
gleam@string:join(Suffix@2, <<"!"/utf8>>),
Handles,
Span
)
end
end.
-file("src/yum/yaml/resolver.gleam", 451).
?DOC(false).
-spec resolve_tag(
gleam@option:option(binary()),
gleam@dict:dict(binary(), binary()),
yum@yaml@node:span()
) -> {gleam@option:option(binary()), list(yum@yaml@diagnostic:diagnostic())}.
resolve_tag(Tag, Handles, Span) ->
case Tag of
none ->
{none, []};
{some, Tag@1} ->
case expand_tag(Tag@1, Handles, Span) of
{ok, Tag@2} ->
{{some, Tag@2}, []};
{error, Diagnostic} ->
{{some, Tag@1}, [Diagnostic]}
end
end.
-file("src/yum/yaml/resolver.gleam", 188).
?DOC(false).
-spec resolve_mapping_tags(
list({yum@yaml@node:node_(), yum@yaml@node:node_()}),
gleam@dict:dict(binary(), binary())
) -> {list({yum@yaml@node:node_(), yum@yaml@node:node_()}),
list(yum@yaml@diagnostic:diagnostic())}.
resolve_mapping_tags(Entries, Handles) ->
{Entries@2, Diagnostics@1} = gleam@list:fold(
Entries,
{[], []},
fun(Acc, Entry) ->
{Entries@1, Diagnostics} = Acc,
{Key, Value} = Entry,
{Key@1, Key_diagnostics} = resolve_node_tags(Key, Handles),
{Value@1, Value_diagnostics} = resolve_node_tags(Value, Handles),
{[{Key@1, Value@1} | Entries@1],
begin
_pipe = Diagnostics,
_pipe@1 = lists:append(_pipe, Key_diagnostics),
lists:append(_pipe@1, Value_diagnostics)
end}
end
),
{lists:reverse(Entries@2), Diagnostics@1}.
-file("src/yum/yaml/resolver.gleam", 173).
?DOC(false).
-spec resolve_sequence_tags(
list(yum@yaml@node:node_()),
gleam@dict:dict(binary(), binary())
) -> {list(yum@yaml@node:node_()), list(yum@yaml@diagnostic:diagnostic())}.
resolve_sequence_tags(Entries, Handles) ->
{Entries@2, Diagnostics@1} = gleam@list:fold(
Entries,
{[], []},
fun(Acc, Entry) ->
{Entries@1, Diagnostics} = Acc,
{Entry@1, Entry_diagnostics} = resolve_node_tags(Entry, Handles),
{[Entry@1 | Entries@1],
lists:append(Diagnostics, Entry_diagnostics)}
end
),
{lists:reverse(Entries@2), Diagnostics@1}.
-file("src/yum/yaml/resolver.gleam", 142).
?DOC(false).
-spec resolve_node_tags(
yum@yaml@node:node_(),
gleam@dict:dict(binary(), binary())
) -> {yum@yaml@node:node_(), list(yum@yaml@diagnostic:diagnostic())}.
resolve_node_tags(Value, Handles) ->
{Kind@1, Nested_diagnostics} = case yum@yaml@node:kind(Value) of
{sequence, Entries} ->
{Entries@1, Diagnostics} = resolve_sequence_tags(Entries, Handles),
{{sequence, Entries@1}, Diagnostics};
{mapping, Entries@2} ->
{Entries@3, Diagnostics@1} = resolve_mapping_tags(
Entries@2,
Handles
),
{{mapping, Entries@3}, Diagnostics@1};
Kind ->
{Kind, []}
end,
{Tag, Tag_diagnostics} = begin
_pipe = yum@yaml@node:tag(Value),
resolve_tag(_pipe, Handles, yum@yaml@node:span(Value))
end,
Resolved = begin
_pipe@1 = yum@yaml@node:new(
Kind@1,
yum@yaml@node:span(Value),
yum@yaml@node:style(Value)
),
_pipe@2 = apply_tag(_pipe@1, Tag),
_pipe@3 = copy_anchor(_pipe@2, Value),
copy_alias(_pipe@3, Value)
end,
{Resolved, lists:append(Tag_diagnostics, Nested_diagnostics)}.
-file("src/yum/yaml/resolver.gleam", 134).
?DOC(false).
-spec valid_tag_handle(binary()) -> boolean().
valid_tag_handle(Handle) ->
case Handle of
<<"!"/utf8>> ->
true;
<<"!!"/utf8>> ->
true;
<<"!"/utf8, Rest/binary>> ->
gleam_stdlib:string_ends_with(Rest, <<"!"/utf8>>) andalso (string:length(
Rest
)
> 1);
_ ->
false
end.
-file("src/yum/yaml/resolver.gleam", 128).
?DOC(false).
-spec default_tag_handles() -> gleam@dict:dict(binary(), binary()).
default_tag_handles() ->
_pipe = maps:new(),
_pipe@1 = gleam@dict:insert(_pipe, <<"!"/utf8>>, <<"!"/utf8>>),
gleam@dict:insert(_pipe@1, <<"!!"/utf8>>, <<"tag:yaml.org,2002:"/utf8>>).
-file("src/yum/yaml/resolver.gleam", 102).
?DOC(false).
-spec tag_handles(list(yum@yaml@document:directive())) -> {gleam@dict:dict(binary(), binary()),
list(yum@yaml@diagnostic:diagnostic())}.
tag_handles(Directives) ->
gleam@list:fold(
Directives,
{default_tag_handles(), []},
fun(Acc, Directive) ->
{Handles, Diagnostics} = Acc,
case Directive of
{directive, <<"TAG"/utf8>>, [Handle, Prefix], Span} ->
case valid_tag_handle(Handle) of
true ->
{gleam@dict:insert(Handles, Handle, Prefix),
Diagnostics};
false ->
{Handles,
lists:append(
Diagnostics,
[{invalid_tag_directive, Span}]
)}
end;
{directive, <<"TAG"/utf8>>, _, Span@1} ->
{Handles,
lists:append(
Diagnostics,
[{invalid_tag_directive, Span@1}]
)};
_ ->
Acc
end
end
).
-file("src/yum/yaml/resolver.gleam", 58).
?DOC(false).
-spec validate_yaml_directives(list(yum@yaml@document:directive())) -> list(yum@yaml@diagnostic:diagnostic()).
validate_yaml_directives(Directives) ->
{_, Diagnostics@1} = gleam@list:fold(
Directives,
{none, []},
fun(Acc, Directive) ->
{First_yaml, Diagnostics} = Acc,
case Directive of
{directive, <<"YAML"/utf8>>, [Version], Span} ->
case First_yaml of
{some, Original} ->
{First_yaml,
lists:append(
Diagnostics,
[{duplicate_yaml_directive, Span, Original}]
)};
none ->
case Version of
<<"1.2"/utf8>> ->
{{some, Span}, Diagnostics};
_ ->
{{some, Span},
lists:append(
Diagnostics,
[{unsupported_yaml_version,
Version,
Span}]
)}
end
end;
{directive, <<"YAML"/utf8>>, _, Span@1} ->
{First_yaml,
lists:append(
Diagnostics,
[{invalid_yaml_directive, Span@1}]
)};
_ ->
Acc
end
end
),
Diagnostics@1.
-file("src/yum/yaml/resolver.gleam", 25).
?DOC(false).
-spec resolve(yum@yaml@node:node_(), list(yum@yaml@document:directive())) -> {ok,
{yum@yaml@node:node_(), list(yum@yaml@diagnostic:diagnostic())}} |
{error, list(yum@yaml@diagnostic:diagnostic())}.
resolve(Root, Directives) ->
Yaml_directive_diagnostics = begin
_pipe = Directives,
validate_yaml_directives(_pipe)
end,
{Tag_handles, Directive_diagnostics} = begin
_pipe@1 = Directives,
tag_handles(_pipe@1)
end,
{Root@1, Tag_diagnostics} = begin
_pipe@2 = Root,
resolve_node_tags(_pipe@2, Tag_handles)
end,
Property_diagnostics = yum@yaml@diagnostic:collect(Root@1),
{Root@2, _, Merge_diagnostics} = resolve_node_merges(Root@1, maps:new()),
Diagnostics = begin
_pipe@3 = [],
_pipe@4 = lists:append(_pipe@3, Yaml_directive_diagnostics),
_pipe@5 = lists:append(_pipe@4, Directive_diagnostics),
_pipe@6 = lists:append(_pipe@5, Tag_diagnostics),
_pipe@7 = lists:append(_pipe@6, Property_diagnostics),
lists:append(_pipe@7, Merge_diagnostics)
end,
case yum@yaml@diagnostic:has_errors(Diagnostics) of
true ->
{error, Diagnostics};
false ->
{ok, {Root@2, Diagnostics}}
end.