Skip to main content

An AI-inference engine for 3D clinical and preclinical whole-body segmentation tasks

Project description

Moose-logo

MOOSE 3.0 ๐ŸฆŒ- Furiously Fast. Brutally Efficient. Unmatched Precision. ๐Ÿ’ช

Documentation Status PyPI version Code License: Apache 2.0 Model License: CC BY 4.0 Discord Commercial Version

Welcome to the new and improved MOOSE (v3.0), where speed and efficiency aren't just buzzwordsโ€”they're a way of life.

๐Ÿ’จ 3x Faster Than Before
Like a moose sprinting through the woods (okay, maybe not that fast), MOOSE 3.0 is built for speed. It's 3x faster than its older sibling, MOOSE 2.0, which was already no slouch. Blink and you'll miss it. โšก

๐Ÿ’ป Memory: Light as a Feather, Strong as a Bull
Forget "Does it fit on my laptop?" The answer is YES. ๐Ÿ•บ Thanks to Dask wizardry, all that data stays in memory. No disk writes, no fuss. Run total-body CT on that 'decent' laptop you bought three years ago and feel like youโ€™ve upgraded. ๐Ÿฅณ

๐Ÿ› ๏ธ Any OS, Anytime, Anywhere
Windows, Mac, Linuxโ€”we donโ€™t play favorites. ๐Ÿ Mac users, youโ€™re in luck: MOOSE runs natively on MPS, getting you GPU-like speeds without the NVIDIA guilt. ๐Ÿš€

๐ŸŽฏ Trained to Perfection
This is our best model yet, trained on a whopping 1.7k datasets. More data, better results. Plus you can run multiple models at the same time - You'll be slicing through images like a knife through warm butter. (Or tofu, if you prefer.) ๐Ÿงˆ๐Ÿ”ช

๐Ÿ–ฅ๏ธ The 'Herd' Mode ๐Ÿ–ฅ๏ธ
Got a powerhouse server just sitting around? Time to let the herd loose! Flip the Herd Mode switch and watch MOOSE multiply across your compute like... well, like a herd of moose! ๐ŸฆŒ๐ŸฆŒ๐ŸฆŒ The more hardware you have, the faster your inference gets done. Scale up, speed up, and make every bit of your server earn its oats. ๐ŸŒพ๐Ÿ’จ

MOOSE 3.0 isn't just an upgradeโ€”it's a lifestyle. A faster, leaner, and stronger lifestyle. Ready to join the herd? ๐ŸฆŒโœจ

https://github.com/user-attachments/assets/b121a9f5-30b6-4a40-a451-6bad6570eb55

Available Segmentation Models ๐Ÿงฌ

MOOSE 3.0 offers a wide range of segmentation models catering to various clinical and preclinical needs. Here are the models currently available:

Clinical ๐Ÿ‘ซ๐Ÿฝ

Model Name Intensities and Regions
clin_ct_body 1:Legs, 2:Body, 3:Head, 4:Arms
clin_ct_cardiac 1: heart_myocardium, 2: heart_atrium_left, 3: heart_atrium_right, 4: heart_ventricle_left, 5: heart_ventricle_right, 6: aorta, 7: iliac_artery_left, 8: iliac_artery_right, 9: iliac_vena_left, 10: iliac_vena_right, 11: inferior_vena_cava, 12: portal_splenic_vein, 13: pulmonary_artery
clin_ct_digestive 1: colon, 2: duodenum, 3: esophagus, 4: small_bowel
clin_ct_lungs 1:lung_upper_lobe_left, 2:lung_lower_lobe_left, 3:lung_upper_lobe_right, 4:lung_middle_lobe_right, 5:lung_lower_lobe_right
clin_ct_muscles 1: autochthon_left, 2: autochthon_right, 3: gluteus_maximus_left, 4: gluteus_maximus_right, 5: gluteus_medius_left, 6: gluteus_medius_right, 7: gluteus_minimus_left, 8: gluteus_minimus_right, 9: iliopsoas_left, 10: iliopsoas_right
clin_ct_organs 1: adrenal_gland_left, 2: adrenal_gland_right, 3: bladder, 4: brain, 5: gallbladder, 6: kidney_left, 7: kidney_right, 8: liver, 9: lung_lower_lobe_left, 10: lung_lower_lobe_right, 11: lung_middle_lobe_right, 12: lung_upper_lobe_left, 13: lung_upper_lobe_right, 14: pancreas, 15: spleen, 16: stomach, 17: thyroid_left, 18: thyroid_right, 19: trachea
clin_ct_peripheral_bones 1: carpal_left, 2: carpal_right, 3: clavicle_left, 4: clavicle_right, 5: femur_left, 6: femur_right, 7: fibula_left, 8: fibula_right, 9: fingers_left, 10: fingers_right, 11: humerus_left, 12: humerus_right, 13: metacarpal_left, 14: metacarpal_right, 15: metatarsal_left, 16: metatarsal_right, 17: patella_left, 18: patella_right, 19: radius_left, 20: radius_right, 21: scapula_left, 22: scapula_right, 23: skull, 24: tarsal_left, 25: tarsal_right, 26: tibia_left, 27: tibia_right, 28: toes_left, 29: toes_right, 30: ulna_left, 31: ulna_right
clin_ct_ribs 1: rib_left_1, 2: rib_left_2, 3: rib_left_3, 4: rib_left_4, 5: rib_left_5, 6: rib_left_6, 7: rib_left_7, 8: rib_left_8, 9: rib_left_9, 10: rib_left_10, 11: rib_left_11, 12: rib_left_12, 13: rib_left_13, 14: rib_right_1, 15: rib_right_2, 16: rib_right_3, 17: rib_right_4, 18: rib_right_5, 19: rib_right_6, 20: rib_right_7, 21: rib_right_8, 22: rib_right_9, 23: rib_right_10, 24: rib_right_11, 25: rib_right_12, 26: rib_right_13, 27: sternum
clin_ct_vertebrae 1: vertebra_C1, 2: vertebra_C2, 3: vertebra_C3, 4: vertebra_C4, 5: vertebra_C5, 6: vertebra_C6, 7: vertebra_C7, 8: vertebra_T1, 9: vertebra_T2, 10: vertebra_T3, 11: vertebra_T4, 12: vertebra_T5, 13: vertebra_T6, 14: vertebra_T7, 15: vertebra_T8, 16: vertebra_T9, 17: vertebra_T10, 18: vertebra_T11, 19: vertebra_T12, 20: vertebra_L1, 21: vertebra_L2, 22: vertebra_L3, 23: vertebra_L4, 24: vertebra_L5, 25: vertebra_L6, 26: hip_left, 27: hip_right, 28: sacrum
clin_ct_body_composition 1: skeletal_muscle, 2: subcutaneous_fat, 3: visceral_fat

Preclinical ๐Ÿ

Model Name Intensities and Regions
preclin_ct_legs 1:right_leg_muscle, 2:left_leg_muscle
preclin_mr_all 1:Brain, 2:Liver, 3:Intestines, 4:Pancreas, 5:Thyroid, 6:Spleen, 7:Bladder, 8:OuterKidney, 9:InnerKidney, 10:HeartInside, 11:HeartOutside, 12:WAT Subcutaneous, 13:WAT Visceral, 14:BAT, 15:Muscle TF, 16:Muscle TB, 17:Muscle BB, 18:Muscle BF, 19:Aorta, 20:Lung, 21:Stomach

Each model is designed to provide high-quality segmentation with MOOSE 3.0's optimized algorithms and data-centric AI principles.

Star History ๐Ÿคฉ

Star History Chart

Citations โค๏ธ

  • Ferrara, D., Pires, M., Gutschmayer, S., et al. (2025). Sharing a whole-/total-body [18F]FDG-PET/CT dataset with CT-derived segmentations: An ENHANCE.PET initiative. PREPRINT (Version 1). Research Square. https://doi.org/10.21203/rs.3.rs-7169062/v1
  • Shiyam Sundar, L. K., Yu, J., Muzik, O., Kulterer, O., Fueger, B. J., Kifjak, D., Nakuz, T., Shin, H. M., Sima, A. K., Kitzmantl, D., Badawi, R. D., Nardo, L., Cherry, S. R., Spencer, B. A., Hacker, M., & Beyer, T. (2022). Fully-automated, semantic segmentation of whole-body 18F-FDG PET/CT images based on data-centric artificial intelligence. Journal of Nuclear Medicine. https://doi.org/10.2967/jnumed.122.264063
  • Isensee, F., Jaeger, P.F., Kohl, S.A.A. et al. nnU-Net: a self-configuring method for deep learning-based biomedical image segmentation. Nat Methods 18, 203โ€“211 (2021). https://doi.org/10.1038/s41592-020-01008-z

Requirements โœ…

Before you dive into the incredible world of MOOSE 3.0, here are a few things you need to ensure for an optimal experience:

  • Operating System: We've got you covered whether you're on Windows, Mac, or Linux. MOOSE 3.0 has been tested across these platforms to ensure seamless operation.

  • Memory: MOOSE 3.0 has quite an appetite! Make sure you have at least 16GB of RAM for the smooth running of all tasks.

  • GPU: If speed is your game, an NVIDIA GPU is the name! MOOSE 3.0 leverages GPU acceleration to deliver results fast. Don't worry if you don't have one, though - it will still work, just at a slower pace.

  • Python: Ensure that you have Python 3.10 installed on your system. MOOSE 3.0 likes to keep up with the latest, after all!

So, that's it! Make sure you're geared up with these specifications, and you're all set to explore everything MOOSE 3.0 has to offer. ๐Ÿš€๐ŸŒ

Installation Guide ๐Ÿ› ๏ธ

Available on Windows, Linux, and MacOS, the installation is as simple as it gets. Follow our step-by-step guide below and set sail on your journey with MOOSE 3.0.

For Linux (and Intel x86 Mac)๐Ÿง

  1. First, create a Python environment. You can name it to your liking; for example, 'moose-env'.

    python3.10 -m venv moose-env
    
  2. Activate your newly created environment.

    source moose-env/bin/activate  # for Linux
    
  3. Install MOOSE 3.0.

    pip install moosez
    

Voila! You're all set to explore with MOOSE 3.0.

๐Ÿง  Running MOOSE on Apple Silicon (M1/M2/M3 with MPS Backend)

Yes, it works. But you'll need to follow these steps carefully. Grab a โ˜• or ๐Ÿบ โ€” this may take a few minutes.

  1. Create and activate a virtual environment (We recommend Python 3.10 for stability)

     python3.10 -m venv moose-env
     source moose-env/bin/activate
    
  2. Install MOOSE and the MPS-compatible PyTorch fork

    Youโ€™ll need a special PyTorch build tailored for Appleโ€™s Metal backend (MPS), which doesnโ€™t use CUDA.

     pip install moosez
     pip uninstall torch  # ensures clean install; avoids conflicts with Moose-installed version
     git clone https://github.com/LalithShiyam/pytorch-mps.git
     cd pytorch-mps
    
  3. Fix your CMake version (IMPORTANT โš ๏ธ)

    Do not use CMake 4.x โ€” it will break the build due to compatibility issues with protobuf.

    Check your version:

     cmake --version
    

    If it's 4.0 or higher, downgrade to a compatible version (e.g., 3.29.2):

    pip uninstall cmake -y
    pip install cmake==3.29.2
    
  4. Build the custom PyTorch fork for MPS

    This will build PyTorch without CUDA (which Apple Silicon doesnโ€™t support anyway):

    USE_CUDA=0 python setup.py develop --verbose 2>&1 | tee build.log
    

โœ… This may take some time. If it completes without errors, youโ€™re good to go.

  1. Patch nnUNetTrainer.py (one-time fix)

    Due to differences in PyTorch exports, nnUNet may crash with:

    ImportError: cannot import name 'GradScaler' from 'torch'
    

To fix it:

  1. Open the following file inside your moose-env folder:

    ~/moose-env/lib/python3.10/site-packages/nnunetv2/training/nnUNetTrainer/nnUNetTrainer.py
    
  2. Replace this line 43:

    from torch import GradScaler
    

    with:

    from torch.cuda.amp import GradScaler
    

โœ… Thatโ€™s it!

Now youโ€™re ready to use MOOSE on Apple Silicon with MPS acceleration. ๐ŸŽโšก If anything crashes, blame the silicon godsโ€ฆ or just open an issue. We're here to help.

For Windows ๐ŸชŸ

  1. Create a Python environment. You could name it 'moose-env', or as you wish.

    python3.10 -m venv moose-env
    
  2. Activate your newly created environment.

    .\moose-env\Scripts\activate
    
  3. Go to the PyTorch website and install the appropriate PyTorch version for your system. !DO NOT SKIP THIS!

  4. Finally, install MOOSE 3.0.

    pip install moosez
    

There you have it! You're ready to venture into the world of 3D medical image segmentation with MOOSE 3.0.

Happy exploring! ๐Ÿš€๐Ÿ”ฌ

Usage Guide ๐Ÿ“š

Command-Line Tool for Batch Processing ๐Ÿ–ฅ๏ธ๐Ÿš€

Getting started with MOOSE 3.0 is as easy as slicing through butter ๐Ÿงˆ๐Ÿ”ช. Use the command-line tool to process multiple segmentation models in sequence or in parallel, making your workflow a breeze. ๐ŸŒฌ๏ธ

Running Single/Multiple Models in Sequence ๐Ÿƒโ€โ™‚๏ธ๐ŸŽฏ

You can now run single or several models in sequence with a single command. Just provide the path to your subject images and list the segmentation models you wish to apply:

# For single model inference
moosez -d <path_to_image_dir> -m <model_name>

# For multiple model inference
moosez -d <path_to_image_dir> \
       -m <model_name1> \
          <model_name2> \
          <model_name3> \

For instance, to run clinical CT organ segmentation on a directory of images, you can use the following command:

moosez -d <path_to_image_dir> -m clin_ct_organs

Likewise, to run multiple models e.g. organs, ribs, and vertebrae, you can use the following command:

moosez -d <path_to_image_dir> \
       -m clin_ct_organs \
          clin_ct_ribs \
          clin_ct_vertebrae

MOOSE 3.0 will handle each model one after the otherโ€”no fuss, no hassle. ๐Ÿ™Œโœจ

Herd Mode: Running Parallel Instances ๐ŸฆŒ๐Ÿ’จ๐Ÿ’ป

Got a powerful server or HPC? Let the herd roam! ๐ŸฆŒ๐Ÿš€ Use Herd Mode to run multiple MOOSE instances in parallel. Just add the -herd flag with the number of instances you wish to run simultaneously:

moosez -d <path_to_image_dir> \
       -m clin_ct_organs \
          clin_ct_ribs \
          clin_ct_vertebrae \
       -herd 2

MOOSE will run two instances at the same time, utilizing your compute power like a true multitasking pro. ๐Ÿ’ช๐Ÿ‘จโ€๐Ÿ’ป๐Ÿ‘ฉโ€๐Ÿ’ป

And that's it! MOOSE 3.0 lets you process with ease and speed. โšกโœจ


๐Ÿ“ฆ ENHANCE.PET MOOSE 1.6k Dataset FTW

We have finally done it and thanks a ton to AWS Open Data Sponsorship Program!

An open, multi-center [18F]FDG-PET/CT dataset with 130 CT-derived anatomical segmentations per scan (~250 GB)
Part of the ENHANCE.PET initiative and hosted under the AWS Open Data Sponsorship Program.

Estimated size Primary access method Support contact
~250 GB MOOSE CLI (see below) Lalith.shiyam@med.uni-muenchen.de

๐Ÿ“„ Documentation

๐Ÿš€ Quick Access

Download via MOOSE CLI (recommended):

moosez -dtd -dd /path/to/download/

Need assistance along the way? Don't worry, we've got you covered. Simply type:

moosez -h

This command will provide you with all the help and the information about the available models and the regions it segments.

Using MOOSE 3.0 as a Library ๐Ÿ“ฆ๐Ÿ

MOOSE 3.0 isn't just a command-line powerhouse; itโ€™s also a flexible library for Python projects. Hereโ€™s how to make the most of it:

First, import the moose function from the moosez package in your Python script:

from moosez import moose

Calling the moose Function ๐ŸฆŒ

The moose function is versatile and accepts various input types. It takes four main arguments:

  1. input: The data to process, which can be:
    • A path to an input file or directory (NIfTI, either .nii or .nii.gz).
    • A tuple containing a NumPy array and its spacing (e.g., numpy_array, (spacing_x, spacing_y, spacing_z)).
    • A SimpleITK image object.
  2. model_names: A single model name or a list of model names for segmentation.
  3. output_dir: The directory where the results will be saved.
  4. accelerator: The type of accelerator to use ("cpu", "cuda", or "mps" for Mac).

Examples ๐Ÿ“‚โœ‚๏ธ๐Ÿ’ป

Here are some examples to illustrate different ways to use the moose function:

  1. Using a file path and multiple models:

    moose('/path/to/input/file', ['clin_ct_organs', 'clin_ct_ribs'], '/path/to/save/output', 'cuda')
    
  2. Using a NumPy array with spacing:

    moose((numpy_array, (1.5, 1.5, 1.5)), 'clin_ct_organs', '/path/to/save/output', 'cuda')
    
  3. Using a SimpleITK image:

    moose(simple_itk_image, 'clin_ct_organs', '/path/to/save/output', 'cuda')
    

Usage of moose() in your code

To use the moose() function, ensure that you wrap the function call within a main guard to prevent recursive process creation errors:

from moosez import moose

if __name__ == '__main__':
    input_file = '/path/to/input/file'
    models = ['clin_ct_organs', 'clin_ct_ribs']
    output_directory = '/path/to/save/output'
    accelerator = 'cuda'
    moose(input_file, models, output_directory, accelerator)

Ready, Set, Segment! ๐Ÿš€

That's it! With these flexible inputs, you can use MOOSE 3.0 to fit your workflow perfectlyโ€”whether youโ€™re processing a single image, a stack of files, or leveraging different data formats. ๐Ÿ–ฅ๏ธ๐ŸŽ‰

Happy segmenting with MOOSE 3.0! ๐ŸฆŒ๐Ÿ’ซ

Directory Structure and Naming Conventions for MOOSE ๐Ÿ“‚๐Ÿท๏ธ

Applicable only for batch mode โš ๏ธ

Using MOOSE 3.0 optimally requires your data to be structured according to specific conventions. MOOSE 3.0 supports both DICOM and NIFTI formats. For DICOM files, MOOSE infers the modality from the DICOM tags and checks if the given modality is suitable for the chosen segmentation model. However, for NIFTI files, users need to ensure that the files are named with the correct modality as a suffix.

Required Directory Structure ๐ŸŒณ

Please structure your dataset as follows:

MOOSEv2_data/ ๐Ÿ“
โ”œโ”€โ”€ S1 ๐Ÿ“‚
โ”‚   โ”œโ”€โ”€ AC-CT ๐Ÿ“‚
โ”‚   โ”‚   โ”œโ”€โ”€ WBACCTiDose2_2001_CT001.dcm ๐Ÿ“„
โ”‚   โ”‚   โ”œโ”€โ”€ WBACCTiDose2_2001_CT002.dcm ๐Ÿ“„
โ”‚   โ”‚   โ”œโ”€โ”€ ... ๐Ÿ—‚๏ธ
โ”‚   โ”‚   โ””โ”€โ”€ WBACCTiDose2_2001_CT532.dcm ๐Ÿ“„
โ”‚   โ””โ”€โ”€ AC-PT ๐Ÿ“‚
โ”‚       โ”œโ”€โ”€ DetailWB_CTACWBPT001_PT001.dcm ๐Ÿ“„
โ”‚       โ”œโ”€โ”€ DetailWB_CTACWBPT001_PT002.dcm ๐Ÿ“„
โ”‚       โ”œโ”€โ”€ ... ๐Ÿ—‚๏ธ
โ”‚       โ””โ”€โ”€ DetailWB_CTACWBPT001_PT532.dcm ๐Ÿ“„
โ”œโ”€โ”€ S2 ๐Ÿ“‚
โ”‚   โ””โ”€โ”€ CT_S2.nii ๐Ÿ“„
โ”œโ”€โ”€ S3 ๐Ÿ“‚
โ”‚   โ””โ”€โ”€ CT_S3.nii ๐Ÿ“„
โ”œโ”€โ”€ S4 ๐Ÿ“‚
โ”‚   โ””โ”€โ”€ S4_ULD_FDG_60m_Dynamic_Patlak_HeadNeckThoAbd_20211025075852_2.nii ๐Ÿ“„
โ””โ”€โ”€ S5 ๐Ÿ“‚
    โ””โ”€โ”€ CT_S5.nii ๐Ÿ“„

Note: If the necessary naming conventions are not followed, MOOSE 3.0 will skip the subjects.

Naming Conventions for NIFTI files ๐Ÿ“

When using NIFTI files, you should name the file with the appropriate modality as a suffix.

For instance, if you have chosen the model_name as clin_ct_organs, the CT scan for subject 'S2' in NIFTI format, should have the modality tag 'CT_' attached to the file name, e.g. CT_S2.nii. In the directory shown above, every subject will be processed by moosez except S4.

Remember: Adhering to these file naming and directory structure conventions ensures smooth and efficient processing with MOOSE 3.0. Happy segmenting! ๐Ÿš€

A Note on QIMP Python Packages: The 'Z' Factor ๐Ÿ“š๐Ÿš€

All of our Python packages here at QIMP carry a special signature โ€“ a distinctive 'Z' at the end of their names. The 'Z' is more than just a letter to us; it's a symbol of our forward-thinking approach and commitment to continuous innovation.

Our MOOSE package, for example, is named as 'moosez', pronounced "moose-see". So, why 'Z'?

Well, in the world of mathematics and science, 'Z' often represents the unknown, the variable that's yet to be discovered, or the final destination in a series. We at QIMP believe in always pushing boundaries, venturing into uncharted territories, and staying on the cutting edge of technology. The 'Z' embodies this philosophy. It represents our constant quest to uncover what lies beyond the known, to explore the undiscovered, and to bring you the future of medical imaging.

Each time you see a 'Z' in one of our package names, be reminded of the spirit of exploration and discovery that drives our work. With QIMP, you're not just installing a package; you're joining us on a journey to the frontiers of medical image processing. Here's to exploring the 'Z' dimension together! ๐Ÿš€

๐ŸฆŒ MOOSE: A part of the enhance.pet community

Alt Text

๐Ÿ‘ฅ Contributors

Lalith Kumar Shiyam Sundar
Lalith Kumar Shiyam Sundar

๐Ÿ’ป ๐Ÿ“–
Sebastian Gutschmayer
Sebastian Gutschmayer

๐Ÿ’ป
n7k-dobri
n7k-dobri

๐Ÿ’ป
Manuel Pires
Manuel Pires

๐Ÿ’ป
Zach Chalampalakis
Zach Chalampalakis

๐Ÿ’ป
David Haberl
David Haberl

๐Ÿ’ป
W7ebere
W7ebere

๐Ÿ“–
Kazezaka
Kazezaka

๐Ÿ’ป
Loic Tetrel
Loic Tetrel

๐Ÿ’ป ๐Ÿ“–
Kitware, Inc.
Kitware, Inc.

๐Ÿ’ป ๐Ÿ“–
Khoa Nguyen
Khoa Nguyen

๐Ÿ’ป

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

moosez-3.1.5.tar.gz (60.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

moosez-3.1.5-py3-none-any.whl (54.2 kB view details)

Uploaded Python 3

File details

Details for the file moosez-3.1.5.tar.gz.

File metadata

  • Download URL: moosez-3.1.5.tar.gz
  • Upload date:
  • Size: 60.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.2

File hashes

Hashes for moosez-3.1.5.tar.gz
Algorithm Hash digest
SHA256 fb8954dcd50129362702a52e1c5f4953af811a11f6e2f06000f9136b98b8fabe
MD5 fef9f873da9233381547ce2897bf8113
BLAKE2b-256 2b387d8d0fcecf96792353cccea00064fa7418433ab09d6200bb6e3986018ff8

See more details on using hashes here.

File details

Details for the file moosez-3.1.5-py3-none-any.whl.

File metadata

  • Download URL: moosez-3.1.5-py3-none-any.whl
  • Upload date:
  • Size: 54.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.2

File hashes

Hashes for moosez-3.1.5-py3-none-any.whl
Algorithm Hash digest
SHA256 25fe5020d9bf716b4ba8e0f8bb615e0201337b7e3c6b2bad4177a4d527e28a96
MD5 43dfda253c5283c61a0c06f64093e2df
BLAKE2b-256 0420ec404cc3b5c6187d38c308831cb34cbf959181ba904472e98aacf9743e21

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page