GithubHelp home page GithubHelp logo

nozwock / yanu Goto Github PK

View Code? Open in Web Editor NEW
197.0 9.0 13.0 6.9 MB

Yet Another NSP Updater for Skyline

License: GNU General Public License v2.0

Rust 93.70% Just 1.30% Shell 4.45% Dockerfile 0.55%
egui rust termux cli desktop-app switch nintendo

yanu's Introduction

yanu

Yet Another NSP Updater for Skyline

Consider starring 🌟 the project if it helped


About

download badge

Yanu is a Nintendo Switch ROM updater designed to work with Skyline on Android w/Termux, Linux, and Windows, as well as other platforms with the help of Docker images. It serves as a temporary solution until Skyline supports Updates/DLCs natively.

Warning - Doesn't support DLCs.

Precompiled binaries are available from the GitHub releases page.

Screenshot screenshot

Supported File Types

  • NSP
  • XCI* (through XCI-NSP conversion)

Installation

Android w/Termux

Check out Video Tutorial by SmokeyMC for Android.

  1. Download & Install Termux from F-droid.
  2. Copy-paste the following in Termux and hit enter:
bash <(curl -L https://raw.githubusercontent.com/nozwock/yanu/main/scripts/yanu-bootstrap-termux.sh)

Relevant resources:

Linux

  1. Ensure that your system has all the necessary dependencies installed to build hactool/hacPack/etc. For example:
    sudo apt -y install gcc-12 g++-12 make git libjpeg-dev binutils-dev libicu-dev
  2. Download & give executable permission to yanu:
    chmod +x yanu-x86_64-unknown-linux-musl

Windows

Note
Due to the lack of code-signing, some anti-virus programs may falsely identify the program as malicious. I cannot afford expensive certificates to prevent this. Exercise caution if concerned and consider using tools like virustotal.com or hybrid-analysis.com.

Docker

Go here to pull the container you wish to use. Once you have the container, you can use it like this:

   # Expecting 'prod.keys` in pwd
   docker run -v $(pwd)/prod.keys:/root/.switch/prod.keys -v $(pwd):/work ghcr.io/nozwock/yanu update --base '/path/to/base' --update '/path/to/update' 

Usage (CLI only)

View CLI help with:

yanu-cli --help

For updating a ROM:

yanu-cli --keyfile '/path/to/keyfile' update --base '/path/to/base' --update '/path/to/update'

Set a new Yanu Directory (Used in tui) with:

yanu-cli config --yanu-dir '/new/path/here'

For unpacking ROMs:

yanu-cli unpack --base '/path/to/base' --update '/path/to/update'

OR, for only unpacking a single ROM:

yanu-cli unpack --base '/path/to/base'

For packing unpacked ROM data (both base+update were unpacked):

yanu-cli pack --controlnca './base+update.xxxxxx/patchdata/control.nca' --titleid 'xxxxxxxxxxxxxxxx' --romfsdir './base+update.xxxxxx/romfs' --exefsdir './base+update.xxxxxx/exefs'

If only base was unpacked, get the control NCA from basedata.

Note

  • For Windows, adapt the above examples by replacing / with \ and using the appropriate path to the executable.
  • Control NCA is typically around 1MB in size.
  • Yanu only accepts Control Type NCA. If unsure of the Type, trial and error can help narrow down the options.
  • Check the logs for guidance on which TitleID to use if using the wrong one.

Directories Used

Used for Windows Linux
Keys %USERPROFILE%\.switch $HOME/.switch
Cache %LOCALAPPDATA%\com.github.nozwock.yanu $HOME/.cache/com.github.nozwock.yanu
Config %APPDATA%\com.github.nozwock.yanu $HOME/.config/com.github.nozwock.yanu

Troubleshooting

  • Newer games failing to update.
    Before applying the update, it is necessary to either use the latest product keys or perform a downgrade of the base and update the ROM files firmware using NSCB. This approach has proven to be effective.

  • If you encounter errors such as 'Failed to sync package repos' while installing yanu on Termux, try updating your outdated repositories using:

    termux-change-repo

Special Thanks

yanu's People

Contributors

arturkasperek avatar nekomekoraiyuu avatar nozwock avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

yanu's Issues

Can't locate SD card on Android

now yuzu is dead, skyline is my back up emulator,i tried to patch a file located on sd card,but it can't locate the path if its on sd card, what should I do,im using android btw

unrecognized subcommand 'update-prompt'

When using only 'yanu' in Termux.

error: unrecognized subcommand 'update-prompt'
note: subcommand 'update' exists
note: to pass 'update-prompt' as a value, use 'yanu -- update-prompt'

Usage: yanu [OPTIONS] [COMMAND]

Add option to reset selected keys

I selected the wrong key files and now unless i use the cli option, i can't make it work, i tried to look where the prod.key path is stored, but couldn't find it, and on top of that, deleting the file i selected didn't make the program ask for it again

Diablo 3 Eternal Collection: Encountered an error while unpacking NCAs

Hi im using yanu for windows but it show error like this

Failed to match key device_key_4x
Failed to match key eticket_rsa_kek_source
Failed to match key eticket_rsa_kekek_source
Failed to match key save_mac_key
Failed to match key ssl_rsa_kek_source
Failed to match key ssl_rsa_kekek_source
Failed to match key ssl_rsa_key

when i wait to finish there is an error in the end failed to create nsp i think im updating diablo 3 to 2.75

Add DLCs

Is there a way to update the nsp version and add the DLCs?

Fails to update to Skyrim 1.1.177.3285177

When trying to update Skyrim NSP, the tool fails to extract the base Skyrim NSP. The error output it gives goes as follows:

"PFS0:
Magic: PFS0
Number of files: 6
Files: pfs0:/3cad207409bec099fbbf02548bdf4d6b.nca
pfs0:/52b98696777222a184a54e56222d24ac.nca
pfs0:/a34ebd3c9d2787c3aa9a451bede93f5d.nca
pfs0:/0982738232945779ed215f8badb091da.cnmt.nca
pfs0:/01000a10041ea0000000000000000003.tik
pfs0:/01000a10041ea0000000000000000003.cert

/3cad207409bec099fbbf02548bdf4d6b.nca
Error:
0: Failed to extract "C:\Users\iamlo\Downloads\Elder\Skyrim00.nsp"

Location:
C:\Users\user\Desktop\yanu\src\hac\rom.rs:83"

I'm on Windows. The base Skyrim file is ver. 1.0.12.517175 and the Update file is 1.1.177.3285177

Error occured while merging Diablo 3 with language pack

Hi
as in title I got error while merging Diablo 3 with language pack.

Failed to extract (location to game base).

Logs
Location:
   �[35mC:\Users\user\Desktop\yanu\src\hac\rom.rs�[0m:�[35m83�[0m
�[2m2023-03-26T11:33:53.962639Z�[0m �[32m INFO�[0m �[2myanu�[0m�[2m:�[0m Launching yanu on windows!
�[2m2023-03-26T11:33:53.962680Z�[0m �[32m INFO�[0m �[2myanu�[0m�[2m:�[0m �[3mversion�[0m�[2m=�[0m"0.6.1"
�[2m2023-03-26T11:33:58.820721Z�[0m �[32m INFO�[0m �[2myanu::utils�[0m�[2m:�[0m Selected file �[3mpath�[0m�[2m=�[0m"C:\\Users\\Tomek\\Downloads\\Diablo 3 Eternal Collection [ UPDATE 2.7.4.84040 ] [01001B300B9BE000].nsp"
�[2m2023-03-26T11:34:04.566483Z�[0m �[32m INFO�[0m �[2myanu::utils�[0m�[2m:�[0m Selected file �[3mpath�[0m�[2m=�[0m"C:\\Users\\Tomek\\Downloads\\Compressed\\D3-EC-NSwTcH-LANG-[POLISHPACK]-NSP-Ziperto\\Diablo III Eternal Collection [Polish Language Pack] [01001B300B9BF00E][v0].nsp"
�[2m2023-03-26T11:34:05.519045Z�[0m �[32m INFO�[0m �[2myanu�[0m�[2m:�[0m Started patching!
�[2m2023-03-26T11:34:05.533731Z�[0m �[32m INFO�[0m �[2myanu::hac::rom�[0m�[2m:�[0m Extracting �[3mself.path�[0m�[2m=�[0m"C:\\Users\\Tomek\\Downloads\\Diablo 3 Eternal Collection [ UPDATE 2.7.4.84040 ] [01001B300B9BE000].nsp"
�[2m2023-03-26T11:34:05.594488Z�[0m �[31mERROR�[0m �[2myanu::hac::rom�[0m�[2m:�[0m Encountered an error while unpacking NSP �[3mstderr�[0m�[2m=�[0m
ERROR: ResultFsUsableSpaceNotEnough (2002-0030)

Additional information:
   at LibHac.Common.ThrowHelper.ThrowResult(Result) + 0x2c
   at LibHac.Tools.FsSystem.FileSystemExtensions.Extract(IFileSystem, String, IProgressReport) + 0x63
   at hactoolnet.ProcessPfs.Process(Context) + 0x1af
   at hactoolnet.Program.Run(String[]) + 0x2ca
   at hactoolnet.Program.Main(String[]) + 0x27

�[2m2023-03-26T11:34:05.595163Z�[0m �[31mERROR�[0m �[2myanu�[0m�[2m:�[0m �[3merr�[0m�[2m=�[0m
   0: �[91mFailed to extract "C:\\Users\\Tomek\\Downloads\\Diablo 3 Eternal Collection [ UPDATE 2.7.4.84040 ] [01001B300B9BE000].nsp"�[0m

Location:
   �[35mC:\Users\user\Desktop\yanu\src\hac\rom.rs�[0m:�[35m83�[0m

No support other distros? fedora 38 hac2l failed

I installed the fedora equivalent dependencies. but i get an error. is support only for ubuntu users?

/tmp/.tmpe2zXb6/libraries/config//../libvapours/include/vapours/util/util_optional.hpp:632:48: note: candidate: ‘template<class T, class U> constexpr ams::util::impl::optional_ne_t<T, U> ams::util::operator!=(const optional<T>&, const optional<U>&)’
  632 |     constexpr inline impl::optional_ne_t<T, U> operator!=(const optional<T> &lhs, const optional<U> &rhs) { return static_cast<bool>(lhs) != static_cast<bool>(rhs) || (static_cast<bool>(lhs) && *lhs != *rhs); }
      |                                                ^~~~~~~~
/tmp/.tmpe2zXb6/libraries/config//../libvapours/include/vapours/util/util_optional.hpp:632:48: note:   template argument deduction/substitution failed:
/tmp/.tmpe2zXb6/tools/hac2l/source/hactool_processor.nca.cpp:140:265: note:   ‘ams::util::IntrusiveRedBlackTree<ams::hactool::ApplicationContentTreeEntry<ams::hactool::Processor::ProcessAsApplicationFileSystemContext::ApplicationEntryData>, ams::util::IntrusiveRedBlackTreeBaseTraits<ams::hactool::ApplicationContentTreeEntry<ams::hactool::Processor::ProcessAsApplicationFileSystemContext::ApplicationEntryData> >, ams::hactool::ApplicationContentTreeEntryCompare<ams::hactool::Processor::ProcessAsApplicationFileSystemContext::ApplicationEntryData> >::Iterator<false>’ is not derived from ‘const ams::util::optional<T>’
  140 |                     if (auto app_prog = app_ctx.apps.Find(ncm::ApplicationId{ctx->reader->GetProgramId() & ~static_cast<u64>(0xFF)}, 0, ctx->reader->GetProgramId() & 0xFF, ncm::ContentType::Program, ncm::ContentMetaType::Application); app_prog != app_ctx.apps.end()) {
      |                                                                                                                                                                                                                                                                         ^
/tmp/.tmpe2zXb6/libraries/config//../libvapours/include/vapours/util/util_optional.hpp:662:48: note: candidate: ‘template<class T, class U> constexpr ams::util::impl::optional_ne_t<T, U> ams::util::operator!=(const optional<T>&, const U&)’
  662 |     constexpr inline impl::optional_ne_t<T, U> operator!=(const optional<T> &lhs, const U &rhs) { return !lhs || *lhs != rhs; }
      |                                                ^~~~~~~~
/tmp/.tmpe2zXb6/libraries/config//../libvapours/include/vapours/util/util_optional.hpp:662:48: note:   template argument deduction/substitution failed:
/tmp/.tmpe2zXb6/tools/hac2l/source/hactool_processor.nca.cpp:140:265: note:   ‘ams::util::IntrusiveRedBlackTree<ams::hactool::ApplicationContentTreeEntry<ams::hactool::Processor::ProcessAsApplicationFileSystemContext::ApplicationEntryData>, ams::util::IntrusiveRedBlackTreeBaseTraits<ams::hactool::ApplicationContentTreeEntry<ams::hactool::Processor::ProcessAsApplicationFileSystemContext::ApplicationEntryData> >, ams::hactool::ApplicationContentTreeEntryCompare<ams::hactool::Processor::ProcessAsApplicationFileSystemContext::ApplicationEntryData> >::Iterator<false>’ is not derived from ‘const ams::util::optional<T>’
  140 |                     if (auto app_prog = app_ctx.apps.Find(ncm::ApplicationId{ctx->reader->GetProgramId() & ~static_cast<u64>(0xFF)}, 0, ctx->reader->GetProgramId() & 0xFF, ncm::ContentType::Program, ncm::ContentMetaType::Application); app_prog != app_ctx.apps.end()) {
      |                                                                                                                                                                                                                                                                         ^
/tmp/.tmpe2zXb6/libraries/config//../libvapours/include/vapours/util/util_optional.hpp:665:48: note: candidate: ‘template<class T, class U> constexpr ams::util::impl::optional_ne_t<U, T> ams::util::operator!=(const U&, const optional<T>&)’
  665 |     constexpr inline impl::optional_ne_t<U, T> operator!=(const U &lhs, const optional<T> &rhs) { return !rhs || lhs != *rhs; }
      |                                                ^~~~~~~~
/tmp/.tmpe2zXb6/libraries/config//../libvapours/include/vapours/util/util_optional.hpp:665:48: note:   template argument deduction/substitution failed:
/tmp/.tmpe2zXb6/tools/hac2l/source/hactool_processor.nca.cpp:140:265: note:   ‘ams::util::IntrusiveRedBlackTree<ams::hactool::ApplicationContentTreeEntry<ams::hactool::Processor::ProcessAsApplicationFileSystemContext::ApplicationEntryData>, ams::util::IntrusiveRedBlackTreeBaseTraits<ams::hactool::ApplicationContentTreeEntry<ams::hactool::Processor::ProcessAsApplicationFileSystemContext::ApplicationEntryData> >, ams::hactool::ApplicationContentTreeEntryCompare<ams::hactool::Processor::ProcessAsApplicationFileSystemContext::ApplicationEntryData> >::Iterator<true>’ is not derived from ‘const ams::util::optional<T>’
  140 |                     if (auto app_prog = app_ctx.apps.Find(ncm::ApplicationId{ctx->reader->GetProgramId() & ~static_cast<u64>(0xFF)}, 0, ctx->reader->GetProgramId() & 0xFF, ncm::ContentType::Program, ncm::ContentMetaType::Application); app_prog != app_ctx.apps.end()) {
      |                                                                                                                                                                                                                                                                         ^
make[2]: *** [/tmp/.tmpe2zXb6/libraries/config//arch/x64/base_rules:13: hactool_processor.nca.o] Error 1
make[2]: ** Esperando que outros processos terminem.
make[2]: *** [/tmp/.tmpe2zXb6/libraries/config//arch/x64/base_rules:13: hactool_processor.app_fs.o] Error 1
make[1]: *** [/tmp/.tmpe2zXb6/tools/hac2l/tool.mk:80: all] Error 2
make[1]: Saindo do diretório '/tmp/.tmpe2zXb6/tools/hac2l'

make: *** [Makefile:43: linux_x64_release] Error 2

image

Temp dirs are not cleaned up automatically upon exit

Copy pasted from #23

  • When the main thread exits during loading, running child threads abort instead of unwinding, which prevents the Drop from being called for tempfile::TempDir instances. As a result, temp dirs are not cleaned up automatically upon exit.
  • Affects PC builds only.

Cant patch because full of storage

My "media storage" system is taking 44GB trying to patch diablo 3 and yanu said storage full cant patch, can you show me how to delete the "temp" patch files so I can clear more storage before patch the rom thank you!

Path error in termux installer

I'm following the guide and I get this error:
Downloading 100% [=] (3.7/3.7 MB, 6.688 MB/s) Extracted "yanu-cli-aarch64-termux_proot-linux-musl" to "/usr/bin/yanu" /proc/self/fd/11: line 68: /data/data/com.termux/files/home/.local/bin:/data/data/com.termux/files/usr/bin/yanu-cli: No such file or directory Error: Failed to write entry script

I think it's because $PATH shows multiple paths, one of which termux doesn't have permission to write to.
My fix is to just replace all occurances of $PATH with /data/data/com.termux/files/home/.local/bin

It's probably not an ideal solution, but it works.

Atualização Yanu

Vcs ainda vão continuar o projeto Yanu? Eu ainda utilizo mesmo com o yuzu sendo lançado pra Android.

Yanu hac2l backend build error

yanu-cli config --nsp-extractor hactool --nca-extractor hac2l
[crates/yanu-cli/src/main.rs:288] nsp_extractor = Hactool
[crates/yanu-cli/src/main.rs:296] nsp_extractor = Hac2l

ls hac2l hactool
hac2l  hactool

./yanu-cli ...
Copied keys successfully from 'keys/prod.keys'
Cloning into '/tmp/.tmpwS41s9'...
...

It's still trying to run setup-backend like it can't find the files. All files are in my home root

`yanu-cli` commands not working

my yanu directory is set to /sdcard/yanu and inside i have prod.keys and title.keys (both set up), and a nsp file that I'd like to unpack. when i run

yanu-cli unpack --base /sdcard/yanu/thegame.nsp

i get an error about missing base parameter.

when i run

yanu-cli unpack --base thegame.nsp

i am prompted to select a file. upon selecting the game, it tells me there's no other 2nd file to select. If it matters, I am using android 13, termux latest debug version

Can't use SD card on Android

how to put this update,its my problem my internal storage is too small for the nsp file im patching i want to patch it in external storage but it yanu cant read or locate the the folder path from the sd card
i just read on this update that it supports the external storage location no need to move to internal,but i don't know how to build this version on yanu on termux, please help

Thanks

It's not an issue, but your software is working perfectly. I was able to patch narita boy where sak was leading to invalid dump on skyline. Keep going !

How to Unpack/Repack

So I want to try unpacking a rom (only rom without update), I use Termux. When I enter the command yanu unpack --base /storage/emulated/0/Switch/God Eater 3.nsp
Yanu asked for the update file

Error

Failed to sync package repos.

DLC ?

Hey, is there any clue how to make it supports the dlc nsp too?

dlc

i just want to ask if you planning to make it support for updating dlc or you can't do that because skyline doesn't natively support dlc

How to delete temp directory?

While updating an NSP, with result of fail (failed to pack FS files to NCA)
Location :
/project/crates/hac/src/vfs/nca.rs

And my storage still used with that patching

Add an option to pick a version while installing on Android

The current installation command is only capable of installing the latest version.

bash <(curl -L https://raw.githubusercontent.com/nozwock/yanu/main/resources/scripts/yanu-bootstrap-termux_proot.sh)

Sometimes it's required to be able to choose a specific version in case of issues or for debugging, etc.

Add an argument in the bootstrap script to accept an optional version number, and then continue to install the given version instead of the latest, for eg-

bash <(curl -L https://raw.githubusercontent.com/nozwock/yanu/main/resources/scripts/yanu-bootstrap-termux_proot.sh) -- -v 0.6.0

Passing -- -v 0.6.0 to install the 0.6.0 version instead of latest.

Looks like latest/download would need to be replaced with download/{version_tag} in this line to download the bin of a specific version.

Failed to build hac2l on 0.6.1 binary

I'm trying to run 0.6.1 pre-compiled binary on Ubuntu Linux x64 22.04 and i receive the error message "Failed to build hac2l".

I see on release notes of this version "Fixed hac2l not compiling on Linux due to a missing build flag.".

I'm not compiling i just want to run.

The message shows after select keys, base and update file.

Sea of Stars - "Encountered an error while unpacking RomFS from NCA"

Encountered an error while unpacking RomFS from NCA

Sea of Stars[01008C0016544000][1.0.45861][0]
Sea of Stars[01008C0016544800][1.0.46047][131072]

log below

�[2mTue, 19 Sep 2023 00:55:11�[0m �[32mINFO�[0m �[36m[crates\yanu\src\main.rs:40]�[0m: Launching yanu �[3mversion�[0m�[2m=�[0m"0.10.1" �[3march�[0m�[2m=�[0m"x86_64" �[3mos�[0m�[2m=�[0m"windows"
�[2mTue, 19 Sep 2023 00:55:39�[0m �[32mINFO�[0m �[36m[crates\yanu\src\utils.rs:64]�[0m: Picked file �[3mpath�[0m�[2m=�[0m"F:\\yanu\\Sea of Stars[01008C0016544000][1.0.45861][0][16.0.3].nsp" �[3msize�[0m�[2m=�[0m4.2 GB
�[2mTue, 19 Sep 2023 00:55:41�[0m �[32mINFO�[0m �[36m[crates\yanu\src\utils.rs:64]�[0m: Picked file �[3mpath�[0m�[2m=�[0m"F:\\yanu\\Sea of Stars[01008C0016544800][1.0.46047][131072][16.1.0].nsp" �[3msize�[0m�[2m=�[0m159.8 MB
�[2mTue, 19 Sep 2023 00:55:46�[0m �[32mINFO�[0m �[36m[crates\hac\src\vfs\nsp.rs:35]�[0m: Unpacking NSP �[3mnsp�[0m�[2m=�[0mF:\yanu\Sea of Stars[01008C0016544000][1.0.45861][0][16.0.3].nsp
�[2mTue, 19 Sep 2023 00:55:53�[0m �[32mINFO�[0m �[36m[crates\hac\src\vfs\nsp.rs:60]�[0m: Unpacked NSP �[3mnsp�[0m�[2m=�[0mF:\yanu\Sea of Stars[01008C0016544000][1.0.45861][0][16.0.3].nsp �[3mto�[0m�[2m=�[0mF:\yanu\.\.tmp7a13mH
�[2mTue, 19 Sep 2023 00:55:53�[0m �[32mINFO�[0m �[36m[crates\hac\src\vfs\nsp.rs:35]�[0m: Unpacking NSP �[3mnsp�[0m�[2m=�[0mF:\yanu\Sea of Stars[01008C0016544800][1.0.46047][131072][16.1.0].nsp
�[2mTue, 19 Sep 2023 00:55:53�[0m �[32mINFO�[0m �[36m[crates\hac\src\vfs\nsp.rs:60]�[0m: Unpacked NSP �[3mnsp�[0m�[2m=�[0mF:\yanu\Sea of Stars[01008C0016544800][1.0.46047][131072][16.1.0].nsp �[3mto�[0m�[2m=�[0mF:\yanu\.\.tmpDBpStB
�[2mTue, 19 Sep 2023 00:55:53�[0m �[32mINFO�[0m �[36m[crates\hac\src\vfs\nsp.rs:113]�[0m: Deriving TitleKey �[3mnsp�[0m�[2m=�[0mF:\yanu\Sea of Stars[01008C0016544000][1.0.45861][0][16.0.3].nsp
�[2mTue, 19 Sep 2023 00:55:53�[0m �[32mINFO�[0m �[36m[crates\hac\src\vfs\ticket.rs:40]�[0m: Reading ticket �[3mtik�[0m�[2m=�[0mF:\yanu\.\.tmp7a13mH\01008c00165440000000000000000010.tik
�[2mTue, 19 Sep 2023 00:55:53�[0m �[34mDEBUG�[0m �[36m[crates\hac\src\vfs\ticket.rs:47]�[0m: �[3mtitle_key�[0m�[2m=�[0m"01008c00165440000000000000000010=5ce2255224f2c98882b35dbf970e2f91"
�[2mTue, 19 Sep 2023 00:55:53�[0m �[32mINFO�[0m �[36m[crates\hac\src\vfs\nsp.rs:127]�[0m: Derived TitleKey
�[2mTue, 19 Sep 2023 00:55:53�[0m �[32mINFO�[0m �[36m[crates\hac\src\vfs\nsp.rs:113]�[0m: Deriving TitleKey �[3mnsp�[0m�[2m=�[0mF:\yanu\Sea of Stars[01008C0016544800][1.0.46047][131072][16.1.0].nsp
�[2mTue, 19 Sep 2023 00:55:53�[0m �[32mINFO�[0m �[36m[crates\hac\src\vfs\ticket.rs:40]�[0m: Reading ticket �[3mtik�[0m�[2m=�[0mF:\yanu\.\.tmpDBpStB\01008c00165448000000000000000010.tik
�[2mTue, 19 Sep 2023 00:55:53�[0m �[34mDEBUG�[0m �[36m[crates\hac\src\vfs\ticket.rs:47]�[0m: �[3mtitle_key�[0m�[2m=�[0m"01008c00165448000000000000000010=de8578481abd0877b7a4f2ae4a91de7b"
�[2mTue, 19 Sep 2023 00:55:53�[0m �[32mINFO�[0m �[36m[crates\hac\src\vfs\nsp.rs:127]�[0m: Derived TitleKey
�[2mTue, 19 Sep 2023 00:55:53�[0m �[32mINFO�[0m �[36m[crates\hac\src\utils\mod.rs:30]�[0m: Storing TitleKeys �[3mkeyfile�[0m�[2m=�[0m"C:\\Users\\Niels\\.switch\\title.keys"
�[2mTue, 19 Sep 2023 00:55:53�[0m �[32mINFO�[0m �[36m[crates\hac\src\utils\update.rs:81]�[0m: Using Hactoolnet as reader
�[2mTue, 19 Sep 2023 00:55:54�[0m �[32mINFO�[0m �[36m[crates\hac\src\vfs\nca.rs:65]�[0m: Identifying TitleID and ContentType �[3mnca�[0m�[2m=�[0mF:\yanu\.\.tmp7a13mH\0ff083356dc805783456080bc1988136.nca �[3msize�[0m�[2m=�[0m4.2 GB
�[2mTue, 19 Sep 2023 00:55:54�[0m �[33mWARN�[0m �[36m[crates\hac\src\vfs\nca.rs:76]�[0m: Encountered an error while viewing info �[3mnca�[0m�[2m=�[0mF:\yanu\.\.tmp7a13mH\0ff083356dc805783456080bc1988136.nca �[3mbackend�[0m�[2m=�[0mHactoolnet �[3mstderr�[0m�[2m=�[0m
ERROR: Unable to decrypt title key.
Key Type: 1
Key Name: titlekek_0f
A required key is missing.
Key name: titlekek_0f

�[2mTue, 19 Sep 2023 00:55:54�[0m �[33mWARN�[0m �[36m[crates\hac\src\vfs\nca.rs:405]�[0m: �[3merr�[0m�[2m=�[0mFailed to process ProgramID of 'F:\yanu\.\.tmp7a13mH\0ff083356dc805783456080bc1988136.nca'
�[2mTue, 19 Sep 2023 00:55:54�[0m �[32mINFO�[0m �[36m[crates\hac\src\vfs\nca.rs:65]�[0m: Identifying TitleID and ContentType �[3mnca�[0m�[2m=�[0mF:\yanu\.\.tmp7a13mH\5b766b06d344e592d764b0055da198d0.nca �[3msize�[0m�[2m=�[0m639.5 KB
�[2mTue, 19 Sep 2023 00:55:54�[0m �[33mWARN�[0m �[36m[crates\hac\src\vfs\nca.rs:76]�[0m: Encountered an error while viewing info �[3mnca�[0m�[2m=�[0mF:\yanu\.\.tmp7a13mH\5b766b06d344e592d764b0055da198d0.nca �[3mbackend�[0m�[2m=�[0mHactoolnet �[3mstderr�[0m�[2m=�[0m
ERROR: Unable to decrypt NCA section.
Key Type: 1
Key Name: key_area_key_application_0f
A required key is missing.
Key name: key_area_key_application_0f

�[2mTue, 19 Sep 2023 00:55:54�[0m �[33mWARN�[0m �[36m[crates\hac\src\vfs\nca.rs:405]�[0m: �[3merr�[0m�[2m=�[0mFailed to process ProgramID of 'F:\yanu\.\.tmp7a13mH\5b766b06d344e592d764b0055da198d0.nca'
�[2mTue, 19 Sep 2023 00:55:54�[0m �[32mINFO�[0m �[36m[crates\hac\src\vfs\nca.rs:65]�[0m: Identifying TitleID and ContentType �[3mnca�[0m�[2m=�[0mF:\yanu\.\.tmp7a13mH\8dfc42d7508cde635afc4b86cda93eaa.nca �[3msize�[0m�[2m=�[0m170.0 KB
�[2mTue, 19 Sep 2023 00:55:54�[0m �[33mWARN�[0m �[36m[crates\hac\src\vfs\nca.rs:76]�[0m: Encountered an error while viewing info �[3mnca�[0m�[2m=�[0mF:\yanu\.\.tmp7a13mH\8dfc42d7508cde635afc4b86cda93eaa.nca �[3mbackend�[0m�[2m=�[0mHactoolnet �[3mstderr�[0m�[2m=�[0m
ERROR: Unable to decrypt NCA section.
Key Type: 1
Key Name: key_area_key_application_0f
A required key is missing.
Key name: key_area_key_application_0f

�[2mTue, 19 Sep 2023 00:55:54�[0m �[33mWARN�[0m �[36m[crates\hac\src\vfs\nca.rs:405]�[0m: �[3merr�[0m�[2m=�[0mFailed to process ProgramID of 'F:\yanu\.\.tmp7a13mH\8dfc42d7508cde635afc4b86cda93eaa.nca'
�[2mTue, 19 Sep 2023 00:55:54�[0m �[32mINFO�[0m �[36m[crates\hac\src\vfs\nca.rs:65]�[0m: Identifying TitleID and ContentType �[3mnca�[0m�[2m=�[0mF:\yanu\.\.tmp7a13mH\ea87863f12a321df05100d3408d491ca.cnmt.nca �[3msize�[0m�[2m=�[0m3.6 KB
�[2mTue, 19 Sep 2023 00:55:54�[0m �[33mWARN�[0m �[36m[crates\hac\src\vfs\nca.rs:76]�[0m: Encountered an error while viewing info �[3mnca�[0m�[2m=�[0mF:\yanu\.\.tmp7a13mH\ea87863f12a321df05100d3408d491ca.cnmt.nca �[3mbackend�[0m�[2m=�[0mHactoolnet �[3mstderr�[0m�[2m=�[0m
ERROR: Unable to decrypt NCA section.
Key Type: 1
Key Name: key_area_key_application_0f
A required key is missing.
Key name: key_area_key_application_0f

�[2mTue, 19 Sep 2023 00:55:54�[0m �[33mWARN�[0m �[36m[crates\hac\src\vfs\nca.rs:405]�[0m: �[3merr�[0m�[2m=�[0mFailed to process ProgramID of 'F:\yanu\.\.tmp7a13mH\ea87863f12a321df05100d3408d491ca.cnmt.nca'
�[2mTue, 19 Sep 2023 00:55:54�[0m �[32mINFO�[0m �[36m[crates\hac\src\utils\update.rs:81]�[0m: Using Hac2l as reader
�[2mTue, 19 Sep 2023 00:55:54�[0m �[32mINFO�[0m �[36m[crates\hac\src\vfs\nca.rs:65]�[0m: Identifying TitleID and ContentType �[3mnca�[0m�[2m=�[0mF:\yanu\.\.tmp7a13mH\0ff083356dc805783456080bc1988136.nca �[3msize�[0m�[2m=�[0m4.2 GB
�[2mTue, 19 Sep 2023 00:55:54�[0m �[34mDEBUG�[0m �[36m[crates\hac\src\vfs\nca.rs:108]�[0m: �[3mprogram_id�[0m�[2m=�[0m"01008c0016544000"
�[2mTue, 19 Sep 2023 00:55:54�[0m �[34mDEBUG�[0m �[36m[crates\hac\src\vfs\nca.rs:133]�[0m: �[3mcontent_type�[0m�[2m=�[0mProgram
�[2mTue, 19 Sep 2023 00:55:54�[0m �[32mINFO�[0m �[36m[crates\hac\src\vfs\nca.rs:65]�[0m: Identifying TitleID and ContentType �[3mnca�[0m�[2m=�[0mF:\yanu\.\.tmp7a13mH\5b766b06d344e592d764b0055da198d0.nca �[3msize�[0m�[2m=�[0m639.5 KB
�[2mTue, 19 Sep 2023 00:55:54�[0m �[34mDEBUG�[0m �[36m[crates\hac\src\vfs\nca.rs:108]�[0m: �[3mprogram_id�[0m�[2m=�[0m"01008c0016544000"
�[2mTue, 19 Sep 2023 00:55:54�[0m �[34mDEBUG�[0m �[36m[crates\hac\src\vfs\nca.rs:133]�[0m: �[3mcontent_type�[0m�[2m=�[0mControl
�[2mTue, 19 Sep 2023 00:55:54�[0m �[32mINFO�[0m �[36m[crates\hac\src\vfs\nca.rs:65]�[0m: Identifying TitleID and ContentType �[3mnca�[0m�[2m=�[0mF:\yanu\.\.tmp7a13mH\8dfc42d7508cde635afc4b86cda93eaa.nca �[3msize�[0m�[2m=�[0m170.0 KB
�[2mTue, 19 Sep 2023 00:55:54�[0m �[34mDEBUG�[0m �[36m[crates\hac\src\vfs\nca.rs:108]�[0m: �[3mprogram_id�[0m�[2m=�[0m"01008c0016544000"
�[2mTue, 19 Sep 2023 00:55:54�[0m �[34mDEBUG�[0m �[36m[crates\hac\src\vfs\nca.rs:133]�[0m: �[3mcontent_type�[0m�[2m=�[0mManual
�[2mTue, 19 Sep 2023 00:55:54�[0m �[32mINFO�[0m �[36m[crates\hac\src\vfs\nca.rs:65]�[0m: Identifying TitleID and ContentType �[3mnca�[0m�[2m=�[0mF:\yanu\.\.tmp7a13mH\ea87863f12a321df05100d3408d491ca.cnmt.nca �[3msize�[0m�[2m=�[0m3.6 KB
�[2mTue, 19 Sep 2023 00:55:54�[0m �[34mDEBUG�[0m �[36m[crates\hac\src\vfs\nca.rs:108]�[0m: �[3mprogram_id�[0m�[2m=�[0m"01008c0016544000"
�[2mTue, 19 Sep 2023 00:55:54�[0m �[34mDEBUG�[0m �[36m[crates\hac\src\vfs\nca.rs:133]�[0m: �[3mcontent_type�[0m�[2m=�[0mMeta
�[2mTue, 19 Sep 2023 00:55:54�[0m �[34mDEBUG�[0m �[36m[crates\hac\src\utils\update.rs:87]�[0m: �[3mbase_nca�[0m�[2m=�[0mNca { path: "F:\\yanu\\.\\.tmp7a13mH\\0ff083356dc805783456080bc1988136.nca", program_id: "01008c0016544000", content_type: Program }
�[2mTue, 19 Sep 2023 00:55:54�[0m �[32mINFO�[0m �[36m[crates\hac\src\utils\update.rs:93]�[0m: Using Hactoolnet as reader
�[2mTue, 19 Sep 2023 00:55:54�[0m �[32mINFO�[0m �[36m[crates\hac\src\vfs\nca.rs:65]�[0m: Identifying TitleID and ContentType �[3mnca�[0m�[2m=�[0mF:\yanu\.\.tmpDBpStB\e5c4bd3e5c813f4d6f174059c91718bb.nca �[3msize�[0m�[2m=�[0m158.9 MB
�[2mTue, 19 Sep 2023 00:55:54�[0m �[33mWARN�[0m �[36m[crates\hac\src\vfs\nca.rs:76]�[0m: Encountered an error while viewing info �[3mnca�[0m�[2m=�[0mF:\yanu\.\.tmpDBpStB\e5c4bd3e5c813f4d6f174059c91718bb.nca �[3mbackend�[0m�[2m=�[0mHactoolnet �[3mstderr�[0m�[2m=�[0m
ERROR: Unable to decrypt title key.
Key Type: 1
Key Name: titlekek_0f
A required key is missing.
Key name: titlekek_0f

�[2mTue, 19 Sep 2023 00:55:54�[0m �[33mWARN�[0m �[36m[crates\hac\src\vfs\nca.rs:405]�[0m: �[3merr�[0m�[2m=�[0mFailed to process ProgramID of 'F:\yanu\.\.tmpDBpStB\e5c4bd3e5c813f4d6f174059c91718bb.nca'
�[2mTue, 19 Sep 2023 00:55:54�[0m �[32mINFO�[0m �[36m[crates\hac\src\vfs\nca.rs:65]�[0m: Identifying TitleID and ContentType �[3mnca�[0m�[2m=�[0mF:\yanu\.\.tmpDBpStB\cbec114c87f267e6b52a35bf36f89918.nca �[3msize�[0m�[2m=�[0m639.5 KB
�[2mTue, 19 Sep 2023 00:55:54�[0m �[33mWARN�[0m �[36m[crates\hac\src\vfs\nca.rs:76]�[0m: Encountered an error while viewing info �[3mnca�[0m�[2m=�[0mF:\yanu\.\.tmpDBpStB\cbec114c87f267e6b52a35bf36f89918.nca �[3mbackend�[0m�[2m=�[0mHactoolnet �[3mstderr�[0m�[2m=�[0m
ERROR: Unable to decrypt NCA section.
Key Type: 1
Key Name: key_area_key_application_0f
A required key is missing.
Key name: key_area_key_application_0f

�[2mTue, 19 Sep 2023 00:55:54�[0m �[33mWARN�[0m �[36m[crates\hac\src\vfs\nca.rs:405]�[0m: �[3merr�[0m�[2m=�[0mFailed to process ProgramID of 'F:\yanu\.\.tmpDBpStB\cbec114c87f267e6b52a35bf36f89918.nca'
�[2mTue, 19 Sep 2023 00:55:54�[0m �[32mINFO�[0m �[36m[crates\hac\src\vfs\nca.rs:65]�[0m: Identifying TitleID and ContentType �[3mnca�[0m�[2m=�[0mF:\yanu\.\.tmpDBpStB\9ea22684f0524e5b046fd2dc93c9cf65.nca �[3msize�[0m�[2m=�[0m170.0 KB
�[2mTue, 19 Sep 2023 00:55:54�[0m �[33mWARN�[0m �[36m[crates\hac\src\vfs\nca.rs:76]�[0m: Encountered an error while viewing info �[3mnca�[0m�[2m=�[0mF:\yanu\.\.tmpDBpStB\9ea22684f0524e5b046fd2dc93c9cf65.nca �[3mbackend�[0m�[2m=�[0mHactoolnet �[3mstderr�[0m�[2m=�[0m
ERROR: Unable to decrypt NCA section.
Key Type: 1
Key Name: key_area_key_application_0f
A required key is missing.
Key name: key_area_key_application_0f

�[2mTue, 19 Sep 2023 00:55:54�[0m �[33mWARN�[0m �[36m[crates\hac\src\vfs\nca.rs:405]�[0m: �[3merr�[0m�[2m=�[0mFailed to process ProgramID of 'F:\yanu\.\.tmpDBpStB\9ea22684f0524e5b046fd2dc93c9cf65.nca'
�[2mTue, 19 Sep 2023 00:55:54�[0m �[32mINFO�[0m �[36m[crates\hac\src\vfs\nca.rs:65]�[0m: Identifying TitleID and ContentType �[3mnca�[0m�[2m=�[0mF:\yanu\.\.tmpDBpStB\172c18b228bebb004b03d170e84a0262.cnmt.nca �[3msize�[0m�[2m=�[0m4.6 KB
�[2mTue, 19 Sep 2023 00:55:54�[0m �[33mWARN�[0m �[36m[crates\hac\src\vfs\nca.rs:76]�[0m: Encountered an error while viewing info �[3mnca�[0m�[2m=�[0mF:\yanu\.\.tmpDBpStB\172c18b228bebb004b03d170e84a0262.cnmt.nca �[3mbackend�[0m�[2m=�[0mHactoolnet �[3mstderr�[0m�[2m=�[0m
ERROR: Unable to decrypt NCA section.
Key Type: 1
Key Name: key_area_key_application_0f
A required key is missing.
Key name: key_area_key_application_0f

�[2mTue, 19 Sep 2023 00:55:54�[0m �[33mWARN�[0m �[36m[crates\hac\src\vfs\nca.rs:405]�[0m: �[3merr�[0m�[2m=�[0mFailed to process ProgramID of 'F:\yanu\.\.tmpDBpStB\172c18b228bebb004b03d170e84a0262.cnmt.nca'
�[2mTue, 19 Sep 2023 00:55:54�[0m �[32mINFO�[0m �[36m[crates\hac\src\utils\update.rs:93]�[0m: Using Hac2l as reader
�[2mTue, 19 Sep 2023 00:55:54�[0m �[32mINFO�[0m �[36m[crates\hac\src\vfs\nca.rs:65]�[0m: Identifying TitleID and ContentType �[3mnca�[0m�[2m=�[0mF:\yanu\.\.tmpDBpStB\e5c4bd3e5c813f4d6f174059c91718bb.nca �[3msize�[0m�[2m=�[0m158.9 MB
�[2mTue, 19 Sep 2023 00:55:54�[0m �[34mDEBUG�[0m �[36m[crates\hac\src\vfs\nca.rs:108]�[0m: �[3mprogram_id�[0m�[2m=�[0m"01008c0016544000"
�[2mTue, 19 Sep 2023 00:55:54�[0m �[34mDEBUG�[0m �[36m[crates\hac\src\vfs\nca.rs:133]�[0m: �[3mcontent_type�[0m�[2m=�[0mProgram
�[2mTue, 19 Sep 2023 00:55:54�[0m �[32mINFO�[0m �[36m[crates\hac\src\vfs\nca.rs:65]�[0m: Identifying TitleID and ContentType �[3mnca�[0m�[2m=�[0mF:\yanu\.\.tmpDBpStB\cbec114c87f267e6b52a35bf36f89918.nca �[3msize�[0m�[2m=�[0m639.5 KB
�[2mTue, 19 Sep 2023 00:55:54�[0m �[34mDEBUG�[0m �[36m[crates\hac\src\vfs\nca.rs:108]�[0m: �[3mprogram_id�[0m�[2m=�[0m"01008c0016544000"
�[2mTue, 19 Sep 2023 00:55:54�[0m �[34mDEBUG�[0m �[36m[crates\hac\src\vfs\nca.rs:133]�[0m: �[3mcontent_type�[0m�[2m=�[0mControl
�[2mTue, 19 Sep 2023 00:55:54�[0m �[32mINFO�[0m �[36m[crates\hac\src\vfs\nca.rs:65]�[0m: Identifying TitleID and ContentType �[3mnca�[0m�[2m=�[0mF:\yanu\.\.tmpDBpStB\9ea22684f0524e5b046fd2dc93c9cf65.nca �[3msize�[0m�[2m=�[0m170.0 KB
�[2mTue, 19 Sep 2023 00:55:54�[0m �[34mDEBUG�[0m �[36m[crates\hac\src\vfs\nca.rs:108]�[0m: �[3mprogram_id�[0m�[2m=�[0m"01008c0016544000"
�[2mTue, 19 Sep 2023 00:55:54�[0m �[34mDEBUG�[0m �[36m[crates\hac\src\vfs\nca.rs:133]�[0m: �[3mcontent_type�[0m�[2m=�[0mManual
�[2mTue, 19 Sep 2023 00:55:54�[0m �[32mINFO�[0m �[36m[crates\hac\src\vfs\nca.rs:65]�[0m: Identifying TitleID and ContentType �[3mnca�[0m�[2m=�[0mF:\yanu\.\.tmpDBpStB\172c18b228bebb004b03d170e84a0262.cnmt.nca �[3msize�[0m�[2m=�[0m4.6 KB
�[2mTue, 19 Sep 2023 00:55:54�[0m �[34mDEBUG�[0m �[36m[crates\hac\src\vfs\nca.rs:108]�[0m: �[3mprogram_id�[0m�[2m=�[0m"01008c0016544800"
�[2mTue, 19 Sep 2023 00:55:54�[0m �[34mDEBUG�[0m �[36m[crates\hac\src\vfs\nca.rs:133]�[0m: �[3mcontent_type�[0m�[2m=�[0mMeta
�[2mTue, 19 Sep 2023 00:55:54�[0m �[34mDEBUG�[0m �[36m[crates\hac\src\utils\update.rs:115]�[0m: �[3mupdate_nca�[0m�[2m=�[0mNca { path: "F:\\yanu\\.\\.tmpDBpStB\\e5c4bd3e5c813f4d6f174059c91718bb.nca", program_id: "01008c0016544000", content_type: Program }
�[2mTue, 19 Sep 2023 00:55:54�[0m �[34mDEBUG�[0m �[36m[crates\hac\src\utils\update.rs:116]�[0m: �[3mcontrol_nca�[0m�[2m=�[0mNca { path: "F:\\yanu\\.\\.tmpDBpStB\\cbec114c87f267e6b52a35bf36f89918.nca", program_id: "01008c0016544000", content_type: Control }
�[2mTue, 19 Sep 2023 00:55:54�[0m �[32mINFO�[0m �[36m[crates\hac\src\vfs\nca.rs:145]�[0m: Unpacking RomFS from NCA �[3mnca�[0m�[2m=�[0mF:\yanu\.\.tmpDBpStB\cbec114c87f267e6b52a35bf36f89918.nca
�[2mTue, 19 Sep 2023 00:55:54�[0m �[33mWARN�[0m �[36m[crates\hac\src\vfs\nca.rs:158]�[0m: Encountered an error while unpacking RomFS from NCA �[3mnca�[0m�[2m=�[0mF:\yanu\.\.tmpDBpStB\cbec114c87f267e6b52a35bf36f89918.nca �[3mbackend�[0m�[2m=�[0mHactoolnet �[3mstderr�[0m�[2m=�[0m
ERROR: Unable to decrypt NCA section.
Key Type: 1
Key Name: key_area_key_application_0f
A required key is missing.
Key name: key_area_key_application_0f

Updated games are not recognized in Yuzu

updated games show and work fine on skyline ... but if i try to use the same file with Yuzu, Yuzu doesn't recognize it at all, it doesn't even show up in the game's list.

moreover, i use SAK before to uodate games. it does work with Yuzu... yes skyline doesnt recognize the update but at least the game is still playable in its base version.

this situation force me to waste storge by needing to keep 1. base version,
2. the update,
3. the updated game by SAK to use woth Yuzu
4.Ithe updated game by Yanu to use with skyline

I wish if Yanu can find a way to make updated games work in both skyline and Yuzu/ryujinx. that way we dont have to keep every file just to eat precious storage

Failed to find base NCA?

I was trying to update a game NSP with an update NSP on windows, with the 16.0.2 prod.keys and title.keys file, but I keep running into this error where it says "Failed to find base NCA" in the first NSP file. I am quite new to this and I might be doing something wrong, so I would appreciate some help.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.