{"id":16833042,"url":"https://github.com/mariokonrad/marnav","last_synced_at":"2025-10-24T06:09:04.386Z","repository":{"id":33655771,"uuid":"37308245","full_name":"mariokonrad/marnav","owner":"mariokonrad","description":"a library for MARitime NAVigation","archived":false,"fork":false,"pushed_at":"2023-06-05T14:15:05.000Z","size":8383,"stargazers_count":103,"open_issues_count":5,"forks_count":48,"subscribers_count":13,"default_branch":"master","last_synced_at":"2025-03-16T08:11:35.722Z","etag":null,"topics":["ais","c-plus-plus","cpp","cpp11","cpp17","mmsi","nmea","nmea-protocol","nmea-sentences"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mariokonrad.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2015-06-12T07:26:41.000Z","updated_at":"2025-03-11T17:28:33.000Z","dependencies_parsed_at":"2024-10-13T11:51:17.368Z","dependency_job_id":"abb9540b-1a0b-4269-9147-de48a32e6aaf","html_url":"https://github.com/mariokonrad/marnav","commit_stats":null,"previous_names":[],"tags_count":22,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mariokonrad%2Fmarnav","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mariokonrad%2Fmarnav/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mariokonrad%2Fmarnav/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mariokonrad%2Fmarnav/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mariokonrad","download_url":"https://codeload.github.com/mariokonrad/marnav/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243974648,"owners_count":20377411,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ais","c-plus-plus","cpp","cpp11","cpp17","mmsi","nmea","nmea-protocol","nmea-sentences"],"created_at":"2024-10-13T11:51:11.553Z","updated_at":"2025-10-24T06:09:04.339Z","avatar_url":"https://github.com/mariokonrad.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"marnav\n======\n\nCopyright (c) 2022 Mario Konrad (mario.konrad@gmx.net)\n\n---\n\nAbstract\n--------\n\nThis is a C++ library for **MAR**itime **NAV**igation purposes.\n\nIt supports (partially):\n- NMEA-0183\n- AIS\n- SeaTalk (Raymarine device communication)\n- Basic geodesic functions, suitable for martime navigation.\n- Reading data from serial ports (NMEA, SeaTalk). This is a separate library,\n  available only if required environment is present, typically a Linux system.\n\nSee chapter _Features_ for a complete and detailed list.\n\n---\n\nGoals\n-----\n\nThere are already implementaions for reading and writing NMEA-0183 or AIS.\nThe goal of this library is\n- to have an implementation in modern C++\n- easy to use API (std lib like, integrating well)\n- unit tested (high test coverage)\n- trivial integration into projects (liberal license, as few dependencies as\n  possible)\n- (more or less) well documented\n- (more or less) complete, as far as information is freely available\n- having fun\n\n---\n\nFeatures\n--------\n\n### NMEA-0183\n\nSupported sentences for NMEA-0183 (read and write):\n\n- AAM: Waypoint Arrival Alarm\n- ACK: Acknowledge Alarm\n- ALM: GPS Almanac Data\n- ALR: Set Alarm State\n- APB: Autopilot Sentence \"B\"\n- BEC: Bearing and Distance to Waypoint\n- BOD: Bearing - Waypoint to Waypoint\n- BWC: Bearing \u0026 Distance to Waypoint - Geat Circle\n- BWR: Bearing and Distance to Waypoint - Rhumb Line\n- BWW: Bearing - Waypoint to Waypoint\n- DBT: Depth Below Transducer\n- DPT: Depth of Water\n- DSC: Digital Selective Calling Information (**experimental**)\n- DSE: Extended DSC (**experimental**)\n- DTM: Datum Reference\n- FSI: Frequency Set Information\n- GBS: GPS Satellite Fault Detection\n- GGA: Global Positioning System Fix Data\n- GLC: Geographic Position, Loran-C\n- GLL: Geographic Position - Latitude/Longitude\n- GNS: Fix data\n- GRS: GPS Range Residuals\n- GSA: Geographic Position - Latitude/Longitude\n- GST: GPS Pseudorange Noise Statistics\n- GSV: Satellites in view\n- HDG: Heading - Deviation \u0026 Variation\n- HDT: Heading - True\n- HFB: Trawl Headrope to Footrope and Bottom\n- HSC: Heading Steering Command\n- ITS: Trawl Door Spread 2 Distance\n- LCD: Loran-C Signal Data\n- MOB: Man over Board\n- MSK: Control for a Beacon Receiver\n- MSS: Beacon Receiver Status\n- MTW: Mean Temperature of Water\n- MWD: Wind Direction and Speed\n- MWV: Wind Speed and Angle\n- OSD: Own Ship Data\n- RMA: Recommended Minimum Navigation Information\n- RMB: Recommended Minimum Navigation Information\n- RMC: Recommended Minimum Navigation Information\n- ROT: Rate Of Turn\n- RPM: Revolutions\n- RSA: Rudder Sensor Angle\n- RSD: RADAR System Data (**experimental**)\n- RTE: Routes\n- SFI: Scanning Frequency Information\n- STN: Multiple Data ID\n- TDS: Trawl Door Spread Distance\n- TEP: Transit Satellite Predicted Elevation\n- TFI: Trawl Filling Indicator\n- TLL: Target Latitude and Longitude\n- TPC: Trawl Position Cartesian Coordinates\n- TPR: Trawl Position Relative Vessel\n- TPT: Trawl Position True\n- TTM: Tracked Target Message\n- VBW: Dual Ground/Water Speed\n- VDM: AIS VHF Data-Link Message\n- VDO: AIS VHF Data-Link Own-Vessel Report\n- VDR: Set and Drift\n- VHW: Water speed and heading\n- VLW: Distance Traveled through Water\n- VPW: Speed - Measured Parallel to Wind\n- VTG: Track made good and Ground speed\n- WCV: Waypoint Closure Velocity\n- WNC: Distance - Waypoint to Waypoint\n- WPL: Waypoint Location\n- XDR: Transducer Measurement\n- XTE: Cross-Track Error, Measured\n- XTR: Cross Track Error - Dead Reckoning\n- ZDA: Time \u0026 Date - UTC, day, month, year and local time zone\n- ZDL: Time and Distance to Variable Point\n- ZFO: UTC \u0026 Time from origin Waypoint\n- ZPI - Arrival time at point of interest\n- ZTG: UTC \u0026 Time to Destination Waypoint\n\nObsolete (according to [NMEA Revealed]) but implemented:\n\n- APA: Autopilot Sentence \"A\"\n- DBK: Depth Below Keel\n- GTD: Geographic Location in Time Differences\n- HDM: Heading - Magnetic (obsolete as of 2009)\n- MTA: Air Temperature\n- R00: Waypoints in active route\n- VWE: Wind Track Efficiency\n- VWR: Relative Wind Speed and Angle.\n- WDC: Distance to Waypoint\n- WDR: Distance to Waypoint, Rumb line\n- ZFI: Elapsed time since point of interest\n- ZLZ: Time of Day\n- ZTA: UTC \u0026 Estimated arrival time at point of interest\n- ZTE: UTC \u0026 Estimated remaining time to event\n\nVendor Extensions:\n\n- PGRME: Garmin Estimated Error\n- PGRMM: Garmin Map Datum\n- PGRMZ: Garmin Altitude Information\n- STALK: SeaTalk Raw Format\n\nMiscellaneous:\n\n- Tag Block Support (generic for all sentences)\n\n\n### AIS\n\nSupported messages for AIS (decode and encode):\n\n- Type 01: Position Report Class A\n- Type 02: Position Report Class A (Assigned Schedule)\n- Type 03: Position Report Class A (Response to Interrogation)\n- Type 04: Base Station Report\n- Type 05: Static and Voyage Related Data\n- Type 06: Binary Addressed Message\n- Type 07: Binary Acknowledge\n- Type 08: Binary Broadcast Message\n- Type 09: Standard SAR Aircraft Position Report\n- Type 10: UTC/Date Inquiry\n- Type 11: UTC/Date Response\n- Type 12: Addressed Safety-Related Message\n- Type 13: Safety-Related Acknowledgement\n- Type 14: Safety-Related Broadcast Message\n- Type 17: DGNSS Broadcast Binary Message\n- Type 18: Standard Class B CS Position Report\n- Type 19: Extended Class B CS Position Report\n- Type 20: Data Link Management\n- Type 21: Aid-to-Navigation Report\n- Type 22: Channel Management\n- Type 23: Group Assignment Command\n- Type 24: Static Data Report (part A and B, norma and auxiliary vessel)\n\nSupported payload of binary message 08:\n- 001/11: Meteorological and Hydrological Data (IMO236)\n- 200/10: Inland ship static and voyage related data (Inland AIS)\n\n### SeaTalk\n\nSuported messages for SeaTalk (decode and encode):\n\n- Type 00: depth below transducer\n- Type 01: equipment id\n- Type 05: Engine RPM and PITCH\n- Type 10: apparent wind angle\n- Type 11: apparent wind speed\n- Type 20: speed through water\n- Type 21: trip mileage\n- Type 22: total mileage\n- Type 23: water temperature 1\n- Type 24: Display unit for Mileage and Speed\n- Type 25: total and trip log\n- Type 26: Speed through Water\n- Type 27: water temperature 2\n- Type 30: Set Lamp Intensity\n- Type 36: Cancel MOB condition\n- Type 38: Codelock data (**experimental**)\n- Type 50: LAT Postion\n- Type 51: LON Postion\n- Type 52: Speed over Ground\n- Type 53: Magnetic Course in Degrees\n- Type 54: GMT Time\n- Type 56: Date\n- Type 58: LAT/LON\n- Type 59: Set Count Down Timer (sent by ST60)\n- Type 65: Select Fathom display unit for depth display (see message 00)\n- Type 66: Wind Alarm\n- Type 6C: Second equipment-ID\n- Type 86: Keystroke\n- Type 87: Response Level\n- Type 89: Compass heading (sent by ST40 compass instrument)\n\n\n### IO\n\n- Reading data from serial ports (NMEA, SeaTalk).\n  Available only if the environment supports the implementation,\n  typically a Linux system.\n\n\n### Geodesic Functions\n\nBasic geodesic functions, suitable for martime navigation.\n\n- Calculation of CPA (closest point of approach)\n  and TCPA (time to closest point of approach)\n- Distance of two points on a sphere\n- Distance of two points on an ellipsoid using formula of Vincenty\n- Distance of two points on an ellipsoid using formula of Lambert\n\n\n---\n\nExamples\n--------\n\nMore examples [here](examples/README.md).\n\n### Parse NMEA Sentence\n\n~~~~~~~~~~~~~{.cpp}\nusing namespace marnav;\n\nauto sentence = nmea::make_sentence(\n\t\"$GPRMC,201034,A,4702.4040,N,00818.3281,E,0.0,328.4,260807,0.6,E,A*17\");\nstd::cout \u003c\u003c sentence-\u003etag() \u003c\u003c \"\\n\";\nauto rmc = nmea::sentence_cast\u003cnmea::rmc\u003e(sentence);\nstd::cout \u003c\u003c \"latitude : \" \u003c\u003c nmea::to_string(rmc-\u003eget_latitude()) \u003c\u003c \"\\n\";\nstd::cout \u003c\u003c \"longitude: \" \u003c\u003c nmea::to_string(rmc-\u003eget_longitude()) \u003c\u003c \"\\n\";\n~~~~~~~~~~~~~\n\nCreate a specific sentence directly:\n\n~~~~~~~~~~~~~{.cpp}\nusing namespace marnav;\n\nauto rmc = nmea::create_sentence\u003cnmea::rmc\u003e(\n\t\"$GPRMC,201034,A,4702.4040,N,00818.3281,E,0.0,328.4,260807,0.6,E,A*17\");\nstd::cout \u003c\u003c \"latitude : \" \u003c\u003c nmea::to_string(rmc.get_latitude()) \u003c\u003c \"\\n\";\nstd::cout \u003c\u003c \"longitude: \" \u003c\u003c nmea::to_string(rmc.get_longitude()) \u003c\u003c \"\\n\";\n~~~~~~~~~~~~~\n\n### Write NMEA Sentence\n\n~~~~~~~~~~~~~{.cpp}\nnmea::mtw mtw;\nmtw.set_temperature(units::celsius{22.5});\nstd::string data = nmea::to_string(mtw);\n~~~~~~~~~~~~~\n\n### Parse AIS Message from NMEA data\n\n~~~~~~~~~~~~~{.cpp}\nusing namespace marnav;\n\n// received sentences\nconst std::vector\u003cstd::string\u003e received_strings\n\t= {\"!AIVDM,2,1,3,B,55P5TL01VIaAL@7WKO@mBplU@\u003cPDhh000000001S;AJ::4A80?4i@E53,0*3E\",\n\t\t\"!AIVDM,2,2,3,B,1@0000000000000,2*55\"};\n\n// parse NMEA sentences\nstd::vector\u003cstd::unique_ptr\u003cnmea::sentence\u003e\u003e sentences;\nfor (auto const \u0026 txt : received_strings) {\n\tauto sentence = nmea::make_sentence(txt);\n\tif (sentence-\u003eid() == nmea::sentence_id::VDM) {\n\t\tsentences.push_back(std::move(sentence));\n\t}\n}\n\n// parse and and process AIS messags\nauto payload = nmea::collect_payload(sentences.begin(), sentences.end());\nauto message = ais::make_message(payload);\nif (message-\u003etype() == ais::message_id::static_and_voyage_related_data) {\n\tauto report = ais::message_cast\u003cais::message_05\u003e(message);\n\tstd::cout \u003c\u003c \"shipname: \" \u003c\u003c report-\u003eget_shipname() \u003c\u003c \"\\n\";\n\tstd::cout \u003c\u003c \"callsign: \" \u003c\u003c report-\u003eget_callsign() \u003c\u003c \"\\n\";\n}\n~~~~~~~~~~~~~\n\n### Create NMEA sentences from AIS data\n\n~~~~~~~~~~~~~{.cpp}\nusing namespace marnav;\n\n// prepare AIS data\nais::message_01 pos_report;\npos_report.set_sog(units::knots{8.2});\n// ... most data not shown here\n\n// create payload\nauto payload = ais::encode_message(pos_report);\n\n// create NMEA sentences\nfor (uint32_t fragment = 0; fragment \u003c payload.size(); ++fragment) {\n\tnmea::vdm vdm;\n\tvdm.set_n_fragments(payload.size());\n\tvdm.set_fragment(fragment + 1);\n\tvdm.set_radio_channel(nmea::ais_channel::B);\n\tvdm.set_payload(payload[fragment]);\n\n\t// collect, send or do something with the sentence...\n\tstd::string s = nmea::to_string(vdm);\n\tstd::cout \u003c\u003c s \u003c\u003c \"\\n\";\n}\n~~~~~~~~~~~~~\n\nor simply use `nmea::make_vdms`:\n\n~~~~~~~~~~~~~{.cpp}\nusing namespace marnav;\n\n// prepare AIS data\nais::message_01 pos_report;\npos_report.set_sog(units::knots{8.2});\n// ... most data not shown here\n\n// create payload\nauto payload = ais::encode_message(pos_report);\n\n// create NMEA sentences\nauto sentences = nmea::make_vdms(payload);\n\n// process sentences, somehow...\nfor (auto const \u0026 sentence : sentences) {\n\tstd::cout \u003c\u003c nmea::to_string(*sentence) \u003c\u003c \"\\n\";\n}\n~~~~~~~~~~~~~\n\n---\n\nRequirements\n------------\n\nThe primary target architecture is `x86_64`, Linux on ARM is supposed to work\nas well though. It is possible to run unit tests through `qemu-arm` or use `binfmt_misc`\non Linux hosts.\n\nThis chapter describes the requirements in order to build the library.\nTools and their versions are listed below, newer/older/other tools\n(i.e. compilers, etc.) may work, but not tested.\n\nCompiler:\n- GCC 7\n- GCC 8\n- GCC 9\n- GCC 10\n- GCC 11\n- GCC 12\n- GCC 13\n- Clang 5\n- Clang 6\n- Clang 7\n- Clang 8\n- Clang 9\n- Clang 10\n- Clang 11\n- Clang 12\n- Clang 13\n- Clang 14\n- Clang 15\n- Clang 16\n- Clang 17\n- VC++ 14.34 (_MSC_VER=1934, Visual Studio 2022)\n\nTools needed to build the library:\n- cmake 3.19 or newer\n\nTools needed to develop the library:\n- git\n- clang-format 10\n\nTools needed to build the documentation:\n- doxygen\n- graphviz\n- LaTeX (there are formulas!)\n\nOptional used for development:\n- lcov / genhtml, c++filt\n- cppcheck\n- clang-tools (analyzer)\n- perf\n\nOptional (no core dependency):\n- Boost.ASIO (used only for some examples)\n- Qt 5 (used only for some examples)\n\nOpeating system:\n- Linux\n- Windows 10\n\nThere are no other dependencies despite the standard library (C++17)\nto build this library.\n\n---\n\nBuild\n-----\n\nThe following build types `-DCMAKE_BUILD_TYPE=x` are possible:\n- Debug\n- Release\n- Coverage\n\nBuild options:\n- `ENABLE_STATIC` : enables static build, if `OFF`, a shared library is being built.\n  Default: `ON`\n- `ENABLE_PROFILING` : enables profiling for `gprof`\n- `ENABLE_BENCHMARK` : enables benchmarking (disables some optimization)\n- `ENABLE_SANITIZER` : enables address and undefined sanitizers\n\nComponents:\n- `ENABLE_EXAMPLES`: enables examples. Default: `ON`\n- `ENABLE_TOOLS`: enables tools. Default: `ON`\n- `ENABLE_TESTS`: enables unit tests, integration tests and benchmarks. Default: `ON`\n- `ENABLE_TESTS_BENCHMARK`: enables benchmark tests, enabled only if `ENABLE_TESTS` is also enabled. Default: `ON`\n\n\n### Library\n\n\tmkdir build\n\tcd build\n\tcmake -DCMAKE_BUILD_TYPE=Release ..\n\tmake\n\n\n### Documentation\n\n\tmkdir build\n\tcd build\n\tcmake ..\n\tmake doc\n\n\n### Package\n\n\tmake package\n\nor individual package types:\n\n\tcpack -G TGZ\n\tcpack -G DEB\n\n\n### Developpers Choice\n\n\tmkdir build\n\tcd build\n\tcmake -DCMAKE_BUILD_TYPE=Coverage ..\n\tmake -j 8\n\tmake coverage doc cppcheck\n\n\n### Static Analysis with Clang\n\nThere is a script ```bin/static-analysis-clang``` for doing this, there is not yet\nan integration of clang-tidy in the cmake build.\n\n\n### Perform Benchmarks\n\nBuild in `Release` mode, perform individual benchmarks:\n\n\tmkdir build\n\tcd build\n\tcmake -DCMAKE_BUILD_TYPE=Release ..\n\tmake -j 8\n\ttest/benchmark_nmea_split\n\nUsing `perf` to do performance analysis:\n\n\tmkdir build\n\tcd build\n\tcmake -DCMAKE_BUILD_TYPE=Release -DENABLE_BENCHMARK=ON ..\n\tmake -j 8\n\tperf record -g test/benchmark_nmea_split\n\tperf report -g 'graph,0.5,caller'\n\n\n### Formatting Test\n\nThere is a helper script ```bin/check-format``` which uses ```clang-format``` to\ncheck the formatting of all files in the directories containing code (```src```,\n```test``` and ```examples```). This script can be used manually:\n\n\tbin/check-format\n\nor used as git pre-commit hook:\n\n\tcd .git/hooks\n\tln -s ../../bin/check-format pre-commit\n\nwhich prevents a commit if there are files not complying with the formatting\nrules. Be aware of using the script as pre-commit hook, the checking can take\nseveral seconds.\n\n\n---\n\nAuthors\n-------\n\nMario Konrad (mario.konrad@gmx.net) with help from others.\n\nSearch the repository for a complete list:\n\n\tgit log --format=%an | sort -u\n\n---\n\nLinks\n-----\n\nA (non-complete) collection of resources from where information was gathered.\n\n- [NMEA Revealed](http://www.catb.org/gpsd/NMEA.html) (by Eric S. Raymond)\n- [NMEA FAQ](http://www.kh-gps.de/nmea.faq)\n- [it-digin's blog](http://www.it-digin.com/blog/?cat=4)\n- [AIVDM/AIVDO Protocol decoding](http://www.catb.org/gpsd/AIVDM.html) (by Eric S. Raymond)\n- [DSC Position Request](http://www.thehulltruth.com/marine-electronics-forum/43945-dsc-position-request.html)\n- [NMEA-0183 Sentences DSC,DSE](http://www.cruisersforum.com/forums/f13/nmea-0183-sentences-dsc-dse-124887.html)\n- [NMEA-0183 Sentence ALR](https://www.cruisersforum.com/forums/f134/opencpn-and-external-nmea0183-alarms-81396.html)\n- [SerialMon - NMEA 0183 Protocol](http://www.serialmon.com/protocols/nmea0183.html)\n- [SeaTalk Reference](http://thomasknauf.de/seatalk.htm) (by Thomas Knauf)\n- [Navigation Center - AIS Standard Class B Equipment Position Report](http://www.navcen.uscg.gov/?pageName=AISMessagesB)\n- [GPS Forums](http://www.gps-forums.net)\n- [NMEA Datensaetze](http://www.nmea.de/nmea0183datensaetze.html)\n- [AIS VDM \u0026 VDO Message Decoder](http://www.maritec.co.za/tools/aisvdmvdodecoding/)\n- [AIS VDM \u0026 VDO Message Decoder](http://www.maritec.co.za/tools/aisvdmvdodecoding/)\n- [Code comments from library NMEA0183](https://github.com/SammyB428/NMEA0183)\n\n---\n\nLICENSE\n-------\n\n\u003e NOTE:\n\u003e The official NMEA 0183 Standard document is not available for free. It was not\n\u003e consulted at any point during the development of this library. All information\n\u003e was found from free sources on the internet. This library (especially the NMEA\n\u003e part) is not derivative work of this standard.\n\n\nSee also [LICENSE](LICENSE)\n\n(BSD)\n\n```\nCopyright (c) 2022, Mario Konrad\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n1. Redistributions of source code must retain the above copyright\n   notice, this list of conditions and the following disclaimer.\n2. Redistributions in binary form must reproduce the above copyright\n   notice, this list of conditions and the following disclaimer in the\n   documentation and/or other materials provided with the distribution.\n3. All advertising materials mentioning features or use of this software\n   must display the following acknowledgement:\n   This product includes software developed by Mario Konrad.\n4. Neither the name of the software nor the names of its contributors\n   may be used to endorse or promote products derived from this software\n   without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n```\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmariokonrad%2Fmarnav","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmariokonrad%2Fmarnav","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmariokonrad%2Fmarnav/lists"}