|
ra8-firmware 0.1.0
Bare-metal firmware for the Renesas RA8 family (RA8D2 / RA8P1)
|
Module-private contracts shared by chapter export writers. More...
#include <stddef.h>#include <stdint.h>#include "mdl_export.h"#include "mdl_export_io_internal.h"#include "miniz.h"#include "ra8_attributes.h"#include "ra8_err.h"Go to the source code of this file.
Data Structures | |
| struct | mdl_external_cover_t |
| Validated external cover details retained without owning storage. More... | |
| struct | mdl_zip_block_t |
| Metadata stored immediately before each bounded miniz allocation. More... | |
| struct | mdl_zip_allocator_t |
| Per-writer adapter from miniz callbacks to one caller workspace. More... | |
Enumerations | |
| enum | mdl_export_limits_t : uint16_t { k_max_pages = 2048 , k_name_max = 256 } |
| Fixed bounds on the per-chapter page list. More... | |
| enum | mdl_cover_bounds_t : uint8_t { k_cover_ext_bytes = 8U , k_cover_mime_bytes = 32U , k_cover_entry_bytes = 32U } |
| Fixed storage used to describe a validated external cover. More... | |
Functions | |
| ra8_err_t | priv_mdl_export_validate_source_url (const char *url) |
| Validate an optional bounded source-attribution URL. | |
| bool | priv_mdl_export_snprintf_fit (int written, size_t cap) |
| Report whether an snprintf result fit its destination. | |
| void | priv_mdl_zip_workspace_bind (mz_zip_archive *zip, mdl_zip_allocator_t *alloc, mdl_export_workspace_t *ws) |
| Bind a miniz archive to caller-owned bounded storage. | |
| void | priv_mdl_zip_workspace_release (mdl_zip_allocator_t *alloc) |
| Restore a workspace after a miniz writer ends. | |
| ra8_err_t | priv_mdl_zip_workspace_error (const mdl_zip_allocator_t *alloc) |
| Classify a miniz writer failure. | |
| ra8_err_t | priv_mdl_export_prepare_cover (mdl_storage_t *storage, const mdl_export_meta_t *meta, const char names[][k_name_max], size_t count, mdl_external_cover_t *cover) |
| Validate and canonicalize an external cover. | |
| ra8_err_t | priv_mdl_export_cbz (mdl_storage_t *storage, const char *dir, char names[][k_name_max], size_t count, mdl_export_output_t *output, const mdl_export_meta_t *meta, mdl_export_workspace_t *ws) |
| Write a CBZ into a caller-owned staged output. | |
| ra8_err_t | priv_mdl_export_tar (mdl_storage_t *storage, const char *dir, char names[][k_name_max], size_t count, mdl_export_output_t *output, const mdl_export_meta_t *meta) |
| Write an uncompressed CBT tar archive. | |
| ra8_err_t | priv_mdl_export_tar_gzip (mdl_storage_t *storage, const char *dir, char names[][k_name_max], size_t count, mdl_export_output_t *output, const mdl_export_meta_t *meta, mdl_export_workspace_t *ws) |
| Write a gzip-wrapped CBT archive. | |
| ra8_err_t | priv_mdl_export_epub (mdl_storage_t *storage, const char *dir, char names[][k_name_max], size_t count, mdl_export_output_t *output, const mdl_export_meta_t *meta, mdl_export_workspace_t *ws) |
| Write a fixed-layout EPUB3 archive. | |
| ra8_err_t | priv_mdl_export_rabook (mdl_storage_t *storage, const char *directory, char names[][k_name_max], size_t count, const char *destination, const mdl_export_meta_t *meta, mdl_export_workspace_t *workspace) |
| Compile one page directory into a strict chunked RABOOK artifact. | |
| ra8_err_t | priv_mdl_export_jof (mdl_storage_t *storage, const char *dir, const char names[][k_name_max], size_t count, mdl_export_workspace_t *ws) |
| Convert every page in a chapter directory to a sibling .jof atlas. | |
Module-private contracts shared by chapter export writers.
Defines the bounded page table, miniz workspace adapter, canonical external-cover descriptor, and the cross-translation-unit writer seams. None of these declarations is part of the exporter-facing API.
[Ring 4 / Domain] {World: NS}
Definition in file mdl_export_internal.h.
| enum mdl_cover_bounds_t : uint8_t |
Fixed storage used to describe a validated external cover.
| Enumerator | |
|---|---|
| k_cover_ext_bytes | Canonical image extension buffer. |
| k_cover_mime_bytes | Canonical image MIME buffer. |
| k_cover_entry_bytes | Canonical archive member path. |
Definition at line 34 of file mdl_export_internal.h.
| enum mdl_export_limits_t : uint16_t |
Fixed bounds on the per-chapter page list.
| Enumerator | |
|---|---|
| k_max_pages | Maximum page entries per chapter. |
| k_name_max | Maximum entry-name bytes. |
Definition at line 28 of file mdl_export_internal.h.
| ra8_err_t priv_mdl_export_cbz | ( | mdl_storage_t * | storage, |
| const char * | dir, | ||
| char | names[][k_name_max], | ||
| size_t | count, | ||
| mdl_export_output_t * | output, | ||
| const mdl_export_meta_t * | meta, | ||
| mdl_export_workspace_t * | ws ) |
Write a CBZ into a caller-owned staged output.
Stores page and optional cover members and appends ComicInfo before finalizing the bounded ZIP writer.
| [in,out] | storage | Injected portable file reader. |
| [in] | dir | Chapter directory. |
| [in] | names | Sorted page-name rows. |
| [in] | count | Page count. |
| [in,out] | output | Active validated-publication output. |
| [in] | meta | Resolved metadata. |
| [in,out] | ws | Exclusive exporter workspace. |
| k_ra8_ok | A finalized CBZ was written. |
| k_ra8_err_invalid_size | A bound or workspace was exceeded. |
| k_ra8_err_validation_failed | An external cover was invalid. |
| k_ra8_fail | ZIP or file I/O failed. |
output owns an active transaction and remains valid through finalization. Write a CBZ into a caller-owned staged output.
Stores each page without recompression, inserts an external cover first when present, and finalizes only after ComicInfo succeeds.
| [in,out] | storage | Injected portable file reader. |
| [in] | dir | NUL-terminated chapter directory. |
| [in] | names | Sorted page-name rows. |
| [in] | count | Number of pages to archive. |
| [in,out] | output | Active validated-publication output. |
| [in] | meta | Metadata to embed, or NULL. |
| [in,out] | ws | Exclusive caller-owned workspace. |
| k_ra8_ok | The ZIP central directory finalized successfully. |
| k_ra8_err_validation_failed | An external cover is invalid. |
| k_ra8_err_invalid_size | Metadata or a bounded name does not fit. |
| k_ra8_fail | ZIP creation, member writing, or finalization failed. |
output owns an active transaction. Definition at line 458 of file mdl_export_zip.c.
References mdl_external_cover_t::entry, mdl_export_output_t::error, mdl_zip_allocator_t::exhausted, mdl_external_cover_t::external, internal_cbz_add_metadata(), internal_cbz_add_pages(), k_name_max, k_ra8_err_invalid_size, k_ra8_fail, k_ra8_ok, priv_mdl_export_prepare_cover(), priv_mdl_export_zip_add_file(), priv_mdl_export_zip_write(), priv_mdl_zip_workspace_bind(), priv_mdl_zip_workspace_error(), priv_mdl_zip_workspace_release(), RA8_PRIV, and mdl_external_cover_t::source.
Referenced by internal_export_dispatch().
| ra8_err_t priv_mdl_export_epub | ( | mdl_storage_t * | storage, |
| const char * | dir, | ||
| char | names[][k_name_max], | ||
| size_t | count, | ||
| mdl_export_output_t * | output, | ||
| const mdl_export_meta_t * | meta, | ||
| mdl_export_workspace_t * | ws ) |
Write a fixed-layout EPUB3 archive.
Emits OCF roots, page XHTML, images, metadata, cover information, navigation, and the final ZIP directory from caller storage.
| [in,out] | storage | Injected portable file reader. |
| [in] | dir | Chapter directory. |
| [in] | names | Sorted page-name rows. |
| [in] | count | Page count. |
| [in,out] | output | Active validated-publication output. |
| [in] | meta | Resolved metadata. |
| [in,out] | ws | Exclusive exporter workspace. |
| k_ra8_ok | A finalized EPUB was written. |
| k_ra8_err_invalid_size | A text or workspace bound was exceeded. |
| k_ra8_err_validation_failed | An external cover was invalid. |
| k_ra8_fail | ZIP, formatting, or file I/O failed. |
output remain live through writer teardown. Write a fixed-layout EPUB3 archive.
Carves all XML accumulators from caller storage, adds OCF roots, canonical cover, page members, metadata, and finalizes the staged archive.
| [in,out] | storage | Injected portable file reader. |
| [in] | dir | Chapter directory. |
| [in] | names | Sorted page-name rows. |
| [in] | count | Number of page rows. |
| [in,out] | output | Active validated-publication output. |
| [in] | meta | Metadata to encode, or NULL. |
| [in,out] | ws | Exclusive caller-owned workspace. |
| k_ra8_ok | A complete finalized EPUB was written. |
| k_ra8_err_invalid_size | Workspace or metadata bounds were exceeded. |
| k_ra8_err_validation_failed | External cover validation failed. |
| k_ra8_fail | ZIP, XHTML, or metadata writing failed. |
ws is exclusive and owns writable arena storage. Definition at line 584 of file mdl_export_epub.c.
References internal_epub_add_external_cover(), internal_epub_add_page(), internal_epub_carve_workspace(), internal_epub_finish_writer(), internal_epub_page_meta(), k_epub_base_bytes, k_epub_per_page_bytes, k_name_max, k_ra8_fail, k_ra8_ok, priv_mdl_epub_add_meta(), priv_mdl_epub_add_str(), priv_mdl_export_prepare_cover(), priv_mdl_export_zip_write(), priv_mdl_zip_workspace_bind(), priv_mdl_zip_workspace_error(), RA8_PRIV, and s_epub_container_xml.
Referenced by internal_export_dispatch(), and internal_write_temp_epub().
| ra8_err_t priv_mdl_export_jof | ( | mdl_storage_t * | storage, |
| const char * | dir, | ||
| const char | names[][k_name_max], | ||
| size_t | count, | ||
| mdl_export_workspace_t * | ws ) |
Convert every page in a chapter directory to a sibling .jof atlas.
Transcodes each listed page in place: page.jpg becomes page.jof beside it, leaving the source file untouched. Each page is produced through the firmware's own jof producer, so a container this tool writes is byte-identical to one the board would produce from the same source, and the full-width band geometry is the shape longstrip scrolls.
Stops at the first page that fails and reports that page's error, so a partially converted directory is always explained by a non-ok return rather than discovered later; pages already written before the failure remain.
| [in,out] | storage | Injected portable storage and transaction provider. |
| [in] | dir | Chapter directory holding the page files. |
| [in] | names | Page file names, count entries of at most k_name_max bytes each, in the order they should be converted. |
| [in] | count | Number of valid entries in names. |
| [in,out] | ws | Exclusive caller-owned exporter workspace. |
| k_ra8_ok | Every page was transcoded. |
| k_ra8_err_not_supported | A page is in no format the producer decodes. |
| k_ra8_err_invalid_size | A page's geometry admits no work arena. |
| k_ra8_fail | A page could not be read, or its output could not be opened or written. |
storage is initialized and exclusive to this export. dir names an existing, readable directory. names holds count readable entries. names. Definition at line 415 of file mdl_export_jof.c.
References internal_jof_one(), k_fw_fs_path_cap, k_name_max, k_ra8_err_invalid_size, k_ra8_ok, memcpy(), priv_mdl_export_path_join(), priv_mdl_export_snprintf_fit(), RA8_PRIV, strrchr(), and mdl_export_workspace::used.
Referenced by mdl_export_chapter_meta_ws().
| ra8_err_t priv_mdl_export_prepare_cover | ( | mdl_storage_t * | storage, |
| const mdl_export_meta_t * | meta, | ||
| const char | names[][k_name_max], | ||
| size_t | count, | ||
| mdl_external_cover_t * | cover ) |
Validate and canonicalize an external cover.
Leaves in-chapter covers alone and maps a validated external image to a type-derived canonical member path.
| [in,out] | storage | Injected portable file reader. |
| [in] | meta | Metadata carrying the cover path, or NULL. |
| [in] | names | Sorted chapter page names. |
| [in] | count | Readable page-name rows. |
| [out] | cover | Canonical cover descriptor. |
| k_ra8_ok | No external cover is needed or one is valid. |
| k_ra8_err_invalid_arg | The fixed path is unterminated. |
| k_ra8_err_invalid_size | The canonical path does not fit. |
| k_ra8_err_validation_failed | The source is not a valid image. |
names and cover are valid for the declared bounds. meta is NULL or stable for the call. cover completely. Validate and canonicalize an external cover.
Recognizes an in-chapter page by exact name; otherwise requires a stable regular image file, sniffs its bytes, and hides the trusted host path behind cover/cover.<actual-type>.
| [in,out] | storage | Injected portable file reader. |
| [in] | meta | Metadata carrying the trusted cover path, or NULL. |
| [in] | names | Sorted chapter page rows. |
| [in] | count | Number of readable rows. |
| [out] | cover | Canonical external-cover descriptor. |
| k_ra8_ok | No external cover is needed or one was validated. |
| k_ra8_err_invalid_arg | The fixed path lacks a terminating NUL. |
| k_ra8_err_invalid_size | The canonical member path does not fit. |
| k_ra8_err_validation_failed | The source is absent, nonregular, or not an image. |
cover and names are valid for count rows. meta is NULL or exclusively stable for the call. cover. Definition at line 305 of file mdl_export_zip.c.
References mdl_export_meta_t::cover_path, mdl_external_cover_t::entry, fw_fs_stat_t::exists, mdl_external_cover_t::external, mdl_storage_t::fs, fw_fs_stat(), k_cover_ext_bytes, k_fw_fs_node_file, k_name_max, k_ra8_err_invalid_arg, k_ra8_err_invalid_size, k_ra8_err_validation_failed, k_ra8_ok, mdl_urlname_sniff_file(), memset(), mdl_external_cover_t::mime, fw_fs_t::names, priv_mdl_export_snprintf_fit(), RA8_PRIV, fw_fs_stat_t::size_bytes, mdl_external_cover_t::source, strcmp(), strnlen(), and fw_fs_stat_t::type.
Referenced by priv_mdl_export_cbz(), and priv_mdl_export_epub().
| ra8_err_t priv_mdl_export_rabook | ( | mdl_storage_t * | storage, |
| const char * | directory, | ||
| char | names[][k_name_max], | ||
| size_t | count, | ||
| const char * | destination, | ||
| const mdl_export_meta_t * | meta, | ||
| mdl_export_workspace_t * | workspace ) |
Compile one page directory into a strict chunked RABOOK artifact.
Produces a private fixed-layout EPUB with the production writer, compiles it through the firmware RABOOK1 pipeline, wraps the flat blob as independent RBKC chunks, and validates the complete staged artifact before atomic publication.
| [in,out] | storage | Injected portable storage and transaction provider. |
| [in] | directory | Canonical chapter directory. |
| [in] | names | Sorted page-name rows. |
| [in] | count | Page count within the fixed RABOOK profile. |
| [in] | destination | Canonical final .rabook path. |
| [in] | meta | Resolved metadata to embed. |
| [in,out] | workspace | Exclusive caller-owned export/compiler workspace. |
| k_ra8_ok | One strict RBKC artifact was published. |
| k_ra8_err_invalid_size | A page/profile/workspace bound was exceeded. |
| k_ra8_err_validation_failed | An intermediate or final artifact failed validation. |
ws is exclusively mutable and no competing writer owns the destination. Definition at line 475 of file mdl_export_rabook.c.
References mdl_storage_t::fs, fw_fs_unlink(), internal_compile_temp(), internal_emit_container(), internal_write_temp_epub(), k_fw_fs_path_cap, k_name_max, k_ra8_err_invalid_arg, k_ra8_err_invalid_size, k_ra8_ok, k_rabook_page_cap, fw_fs_t::names, and RA8_PRIV.
Referenced by mdl_export_chapter_meta_ws().
| bool priv_mdl_export_snprintf_fit | ( | int | written, |
| size_t | cap ) |
Report whether an snprintf result fit its destination.
Rejects encoding errors and values that consumed the NUL position.
| [in] | written | Return value from snprintf. |
| [in] | cap | Destination capacity passed to snprintf. |
| true | The complete result fit. |
| false | Formatting failed or truncated. |
cap matches the formatted destination. written is the unmodified formatting result. Report whether an snprintf result fit its destination.
Rejects encoding errors and results equal to capacity because the terminating NUL would not fit.
| [in] | written | Return value produced by snprintf. |
| [in] | cap | Destination capacity passed to snprintf. |
| true | written is nonnegative and below cap. |
| false | Formatting failed or truncated. |
cap matches the formatted destination. written is the unmodified snprintf result. Definition at line 90 of file mdl_export_meta.c.
References RA8_PRIV.
Referenced by internal_epub_add_external_cover(), internal_epub_add_page(), internal_epub_append_frags(), internal_epub_prepare_optional(), internal_epub_render_meta(), internal_epub_write_page_xhtml(), internal_render_comicinfo(), mdl_export_build_comicinfo_pages(), priv_mdl_export_jof(), and priv_mdl_export_prepare_cover().
| ra8_err_t priv_mdl_export_tar | ( | mdl_storage_t * | storage, |
| const char * | dir, | ||
| char | names[][k_name_max], | ||
| size_t | count, | ||
| mdl_export_output_t * | output, | ||
| const mdl_export_meta_t * | meta ) |
Write an uncompressed CBT tar archive.
Streams page members and ComicInfo through deterministic ustar records without retaining the whole archive.
| [in,out] | storage | Injected portable file reader. |
| [in] | dir | Chapter directory. |
| [in] | names | Sorted page-name rows. |
| [in] | count | Page count. |
| [in,out] | output | Active validated-publication output. |
| [in] | meta | Resolved metadata. |
| k_ra8_ok | A complete CBT was written. |
| k_ra8_err_invalid_size | A ustar or metadata bound was exceeded. |
| k_ra8_fail | File I/O failed. |
output owns an active transaction. Definition at line 425 of file mdl_export_tar.c.
References internal_build_tar(), internal_direct_sink(), k_name_max, and RA8_PRIV.
Referenced by internal_export_dispatch().
| ra8_err_t priv_mdl_export_tar_gzip | ( | mdl_storage_t * | storage, |
| const char * | dir, | ||
| char | names[][k_name_max], | ||
| size_t | count, | ||
| mdl_export_output_t * | output, | ||
| const mdl_export_meta_t * | meta, | ||
| mdl_export_workspace_t * | ws ) |
Write a gzip-wrapped CBT archive.
Streams deterministic ustar records directly through caller-arena DEFLATE into the active output; no intermediate archive exists.
| [in,out] | storage | Injected portable file reader. |
| [in] | dir | Chapter directory. |
| [in] | names | Sorted page-name rows. |
| [in] | count | Page count. |
| [in,out] | output | Active validated-publication output. |
| [in] | meta | Resolved metadata. |
| [in,out] | ws | Exclusive exporter workspace. |
| k_ra8_ok | A complete gzip stream was written. |
| k_ra8_err_invalid_size | A bound or workspace was exceeded. |
| k_ra8_fail | File or compression I/O failed. |
Definition at line 436 of file mdl_export_tar.c.
References internal_gzip_sink_t::crc, internal_gzip_sink_t::error, internal_build_tar(), internal_gzip_put(), internal_gzip_sink(), internal_put_u32le(), k_gzip_deflate, k_gzip_header_bytes, k_gzip_id1, k_gzip_id2, k_gzip_os_unknown, k_gzip_u32_bytes, k_name_max, k_ra8_err_invalid_size, k_ra8_fail, k_ra8_ok, mdl_export_workspace_take(), priv_mdl_export_output_write(), RA8_PRIV, and internal_gzip_sink_t::size.
Referenced by internal_export_dispatch().
| ra8_err_t priv_mdl_export_validate_source_url | ( | const char * | url | ) |
Validate an optional bounded source-attribution URL.
Accepts empty fields or complete absolute HTTP(S) URLs and rejects whitespace, control bytes, invalid authority, and unterminated storage.
| [in] | url | Fixed-capacity source URL field. |
| k_ra8_ok | The field is empty or valid. |
| k_ra8_err_invalid_size | The field is not NUL-terminated. |
| k_ra8_err_invalid_arg | The nonempty URL is invalid. |
url addresses k_mdl_meta_url_max readable bytes. Requires complete NUL termination, an HTTP(S) scheme, a nonempty authority, and no whitespace/control bytes while permitting XML metacharacters that the container emitters escape later.
| [in] | url | Fixed-capacity source URL field. |
| k_ra8_ok | The field is empty or a valid absolute HTTP(S) URL. |
| k_ra8_err_invalid_size | The fixed field lacks a terminating NUL. |
| k_ra8_err_invalid_arg | The nonempty URL has an invalid scheme, authority, whitespace, or control byte. |
url points to at least k_mdl_meta_url_max readable bytes. url is not modified. Definition at line 54 of file mdl_export_meta.c.
References k_mdl_meta_url_max, k_ra8_err_invalid_arg, k_ra8_err_invalid_size, k_ra8_ok, mdl_url_host(), mdl_url_scheme_allowed(), RA8_PRIV, and strnlen().
Referenced by internal_apply_semantic_key(), internal_parse_xml_semantics(), internal_resolve_export_metadata(), mdl_export_build_comicinfo_pages(), and priv_mdl_epub_add_meta().
| void priv_mdl_zip_workspace_bind | ( | mz_zip_archive * | zip, |
| mdl_zip_allocator_t * | alloc, | ||
| mdl_export_workspace_t * | ws ) |
Bind a miniz archive to caller-owned bounded storage.
Installs the module allocator callbacks and records the workspace cursor that writer teardown must restore.
| [out] | zip | Zeroed archive descriptor receiving callbacks. |
| [out] | alloc | Writer-lifetime allocator adapter. |
| [in,out] | ws | Exclusive initialized exporter workspace. |
alloc records the initial workspace cursor. Bind a miniz archive to caller-owned bounded storage.
Records the current workspace floor and installs allocation, release, and resize callbacks before miniz initialization.
| [out] | zip | Archive descriptor to initialize. |
| [out] | alloc | Callback adapter with writer lifetime. |
| [in,out] | ws | Exclusive initialized exporter workspace. |
ws owns live writable storage through writer teardown. zip has no default miniz allocator callback. alloc records the cursor restored by priv_mdl_zip_workspace_release. Definition at line 232 of file mdl_export_zip.c.
References internal_zip_workspace_alloc(), internal_zip_workspace_free(), internal_zip_workspace_realloc(), memset(), RA8_PRIV, and mdl_export_workspace::used.
Referenced by priv_mdl_export_cbz(), and priv_mdl_export_epub().
| ra8_err_t priv_mdl_zip_workspace_error | ( | const mdl_zip_allocator_t * | alloc | ) |
Classify a miniz writer failure.
Distinguishes caller-arena exhaustion from other ZIP failures.
| [in] | alloc | Active allocator adapter, or NULL. |
| k_ra8_err_invalid_size | Bounded storage was exhausted. |
| k_ra8_fail | No exhaustion was recorded. |
alloc is NULL or remains live. Classify a miniz writer failure.
Distinguishes an arena callback refusal from ordinary ZIP I/O or format failures so callers can size their explicit workspace.
| [in] | alloc | Active callback adapter, or NULL. |
| k_ra8_err_invalid_size | Bounded callback capacity was exhausted. |
| k_ra8_fail | No allocator exhaustion was recorded. |
alloc is NULL or remains alive through result classification. Definition at line 278 of file mdl_export_zip.c.
References mdl_zip_allocator_t::exhausted, k_ra8_err_invalid_size, k_ra8_fail, and RA8_PRIV.
Referenced by internal_cbz_add_metadata(), priv_mdl_export_cbz(), and priv_mdl_export_epub().
| void priv_mdl_zip_workspace_release | ( | mdl_zip_allocator_t * | alloc | ) |
Restore a workspace after a miniz writer ends.
Releases every transient archive block in one cursor operation while retaining the measured high-water mark.
| [in,out] | alloc | Active adapter, or NULL. |
alloc is NULL or its writer has ended. Restore a workspace after a miniz writer ends.
Restores the bump cursor to its pre-writer floor after miniz has ended, making transient writer storage reusable by later phases.
| [in,out] | alloc | Active callback adapter, or NULL. |
alloc is NULL or its writer has ended or failed initialization. Definition at line 256 of file mdl_export_zip.c.
References mdl_zip_allocator_t::floor, RA8_PRIV, mdl_export_workspace::used, and mdl_zip_allocator_t::ws.
Referenced by internal_epub_finish_writer(), and priv_mdl_export_cbz().