consumers
	bin/mirror/requirements.txt:ccb-extras==1.0.0
	bin/music/requirements.txt:ccb-extras>=1.0.0
	bin/remote_archive/requirements.txt:ccb-extras>=1.1.0
	bin/requirements.txt:ccb-extras==1.0.0
	bin/sync/requirements.txt:ccb-extras==1.0.0

OPENSSL path
check stash

crypto.py tests

sync-quick
	new repo?
	https://docs.astral.sh/uv/concepts/projects/init/

example usage to docs/crypto.md
    local_hash = md5_file(local_path)
    client = get_client(args.alias, test_server=False)
	with local_path.open('rb') as file_data:
		res = state.client.put_object(
			bucket_name=state.bucket,
			object_name=dest_path,
			data=file_data,
			length=local_size,
			part_size=0 if local_size < MIN_PART_SIZE else local_size,  # Force one-part upload so eTags will work.
		)
	if local_hash != res.etag:
		log.error(f'fput_object() uploaded {local_path} but returned etag {res.etag} vs file hash {local_hash}')
		return False

port from vella-python-utils - TODO is it on `X partial backup`?
	decimate -> gps-utils
	git
	pip
	time
	string
from blobstore
	protobuf utils
		read_proto_file
		write_proto_file
	S3
		~/dev/mapper/mapper-annotator/tools/S3Data.py
		vella-offline-data-processing/split_session.py
		~/dev/vella/siasearch-tools/S3Data.py
more tools:
	https://github.com/MartinThoma/mpu
