Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions .github/workflows/validate-zenodo.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
name: Check zenodo metadata

on:
push:
paths:
- '.zenodo.json'
- '.github/workflows/validate-zenodo.yaml'

jobs:
check-zenodo-metadata:

runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v6
- uses: actions/setup-node@v6
with:
node-version: '24'
- name: Install dependencies
run: npm install zenodraft@0.14.1
- name: Check .zenodo.json file
run: |
npx zenodraft metadata validate .zenodo.json
37 changes: 37 additions & 0 deletions .zenodo.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
{
"creators": [
{
"name": "Stevens, Samuel",
"orcid": "https://orcid.org/0009-0000-9493-7766",
"affiliation": "The Ohio State University"
}
],
"description": "saev is a package for training sparse autoencoders (SAEs) on vision transformers (ViTs) in PyTorch.",
"keywords": [
"imageomics",
"sparse autoencoders",
"interpretability",
"computer vision"
],
"title": "saev: Sparse Autoencoders for Vision Transformers",
"version": "0.1.0",
"license": "MIT",
"publication_date": "2026-06-10",
"grants": [
{
"id": "021nxhr62::2118240"
}
],
"related_identifiers": [
{
"identifier": "10.48550/arXiv.2502.06755",
"relation": "isSupplementTo",
"resource_type": "publication-preprint"
},
{
"identifier": "10.48550/arXiv.2511.17735",
"relation": "isSupplementTo",
"resource_type": "publication-preprint"
}
]
}
19 changes: 13 additions & 6 deletions CITATION.cff
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ authors:
email: samuel.robert.stevens@gmail.com
orcid: 'https://orcid.org/0009-0000-9493-7766'
affiliation: The Ohio State University
repository-code: 'https://github.com/OSU-NLP-Group/saev'
url: 'https://osu-nlp-group.github.io/saev/'
repository-code: 'https://github.com/Imageomics/saev'
url: 'https://imageomics.github.io/saev/'
repository-artifact: 'https://pypi.org/project/saev/'
abstract: >-
saev is a package for training sparse autoencoders (SAEs)
Expand All @@ -23,7 +23,14 @@ keywords:
- sparse autoencoders
- interpretability
- computer vision
license: CC-BY-4.0
commit: 6a34b6916fda7b04cc2d89749b3ad6425a8f39e6
date-released: '2025-11-16'

license: MIT
date-released: '2026-06-10'
identifiers:
- description: "The GitHub release URL of tag v0.1.0."
type: url
value: "https://github.com/Imageomics/saev/releases/tag/v0.1.0"
- description: "The GitHub URL of the commit tagged with v0.1.0."
type: url
value: "https://github.com/Imageomics/saev/tree/<commit-hash>" # Update on release
version: 0.1.0
#doi: <version-agnostic DOI from Zenodo>
2 changes: 2 additions & 0 deletions LICENSE
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
MIT License

Copyright (c) 2024-2026 Samuel Stevens

Copyright (c) 2023 Joseph Bloom

Permission is hereby granted, free of charge, to any person obtaining a copy
Expand Down
24 changes: 7 additions & 17 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,16 @@

![PyPI Downloads](https://static.pepy.tech/badge/saev)
![MIT License](https://img.shields.io/badge/License-MIT-efefef)
![GitHub Repo stars](https://img.shields.io/github/stars/OSU-NLP-group/saev?style=flat&label=GitHub%20%E2%AD%90)
![GitHub Repo stars](https://img.shields.io/github/stars/Imageomics/saev?style=flat&label=GitHub%20%E2%AD%90)

Training sparse autoencoders (SAEs) on vision transformers (ViTs), implemented in PyTorch.

## Docs

- [Docs](https://osu-nlp-group.github.io/saev/api)
- [Colab Notebook for SAE Inference](https://colab.research.google.com/github/OSU-NLP-Group/saev/blob/main/examples/inference.ipynb)
- [User guide](https://osu-nlp-group.github.io/saev/api/users/guide)
- [API reference](https://osu-nlp-group.github.io/saev/api/api/saev/)
- [Docs](https://imageomics.github.io/saev/api)
- [Colab Notebook for SAE Inference](https://colab.research.google.com/github/Imageomics/saev/blob/main/examples/inference.ipynb)
- [User guide](https://imageomics.github.io/saev/api/users/guide)
- [API reference](https://imageomics.github.io/saev/api/api/saev/)

## Research

Expand All @@ -24,16 +24,6 @@ Trained SAE checkpoints are available at:

- [Huggingface Models](https://huggingface.co/collections/osunlp/sae-v-67ab8c4fdf179d117db28195)

If you want to cite the software, please cite it as:

```bib
@software{stevens2025saev,
author = {Stevens, Samuel},
license = {CC-BY-4.0},
month = apr,
title = {{saev}},
url = {https://github.com/OSU-NLP-Group/saev},
year = {2025}
}
```
## Citation

If you want to cite the software, please use the "Cite this repository" link on the GitHub page, which will provide you with the appropriate citation format.
3 changes: 2 additions & 1 deletion contrib/birdsong/notebooks/001_explore.py
Original file line number Diff line number Diff line change
Expand Up @@ -270,7 +270,8 @@ def _finalize_df(rows: list[dict[str, object]]):
)

df = (
df.unnest("config/sae", "config/train_data/metadata", separator="/")
df
.unnest("config/sae", "config/train_data/metadata", separator="/")
.unnest("config/sae/activation", separator="/")
.unnest(
"config/sae/activation/aux",
Expand Down
6 changes: 4 additions & 2 deletions contrib/birdsong/notebooks/clips.py
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,8 @@ def add_target(obs: pl.DataFrame, fields: list[str]) -> pl.DataFrame:
obs = obs.with_columns([pl.col(field).fill_null("unknown") for field in fields])

combos = (
obs.select(fields)
obs
.select(fields)
.unique(maintain_order=True) # first-seen ordering
.with_columns(pl.arange(0, pl.len(), dtype=pl.Int32).alias("target"))
)
Expand All @@ -101,7 +102,8 @@ def add_target(obs: pl.DataFrame, fields: list[str]) -> pl.DataFrame:

target2fields = {
target: tuple(rest)
for target, *rest in obs.unique(pl.col("target"))
for target, *rest in obs
.unique(pl.col("target"))
.select("target", *fields)
.iter_rows()
}
Expand Down
59 changes: 47 additions & 12 deletions contrib/freshwater_fish/scripts/make_gallery.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,9 +74,7 @@ def build_features(
"""Collect features that have pre-rendered images on disk."""
features = []
available = {
int(d.name)
for d in images_dpath.iterdir()
if d.is_dir() and d.name.isdigit()
int(d.name) for d in images_dpath.iterdir() if d.is_dir() and d.name.isdigit()
}

for row in var_df.iter_rows(named=True):
Expand Down Expand Up @@ -275,15 +273,49 @@ def build_features(

def main():
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--run", type=pathlib.Path, required=True, help="Run directory (e.g. /fs/ess/.../runs/um6hbn05)")
parser.add_argument("--shard", type=str, required=True, help="Shard ID (e.g. 8692dfa9)")
parser.add_argument("--dataset", type=pathlib.Path, default=None, help="Dataset root (segfolder with images/ dir, for label ordering)")
parser.add_argument("--split", type=str, default="validation", help="Dataset split name (default: validation)")
parser.add_argument("--hf-config", type=str, default="trait_segmentation", help="HuggingFace FishVista config name")
parser.add_argument("--hf-split", type=str, default="val", help="HuggingFace split name (default: val)")
parser.add_argument("--out", type=pathlib.Path, default=pathlib.Path("gallery.html"), help="Output HTML path")
parser.add_argument(
"--run",
type=pathlib.Path,
required=True,
help="Run directory (e.g. /fs/ess/.../runs/um6hbn05)",
)
parser.add_argument(
"--shard", type=str, required=True, help="Shard ID (e.g. 8692dfa9)"
)
parser.add_argument(
"--dataset",
type=pathlib.Path,
default=None,
help="Dataset root (segfolder with images/ dir, for label ordering)",
)
parser.add_argument(
"--split",
type=str,
default="validation",
help="Dataset split name (default: validation)",
)
parser.add_argument(
"--hf-config",
type=str,
default="trait_segmentation",
help="HuggingFace FishVista config name",
)
parser.add_argument(
"--hf-split",
type=str,
default="val",
help="HuggingFace split name (default: val)",
)
parser.add_argument(
"--out",
type=pathlib.Path,
default=pathlib.Path("gallery.html"),
help="Output HTML path",
)
parser.add_argument("--quality", type=int, default=80, help="JPEG quality (0-100)")
parser.add_argument("--title", type=str, default="", help="Gallery subtitle/description")
parser.add_argument(
"--title", type=str, default="", help="Gallery subtitle/description"
)
args = parser.parse_args()

inference_dpath = args.run / "inference" / args.shard
Expand Down Expand Up @@ -313,7 +345,10 @@ def main():
n_imgs = sum(len(f["images"]) for f in features)
logger.info("Total images: %d", n_imgs)

title = args.title or f"SAE run {args.run.name}, shard {args.shard} | {len(features)} features, {n_imgs} images"
title = (
args.title
or f"SAE run {args.run.name}, shard {args.shard} | {len(features)} features, {n_imgs} images"
)
html = HTML_TEMPLATE.replace("FEATURES_JSON", json.dumps(features))
html = html.replace("TITLE_PLACEHOLDER", title)
html = html.replace("RUN_ID_PLACEHOLDER", args.run.name)
Expand Down
3 changes: 2 additions & 1 deletion contrib/interactive_interp/semseg/interactive.py
Original file line number Diff line number Diff line change
Expand Up @@ -570,7 +570,8 @@ def make_upsampled_pred(
logits_WHC: Float[Tensor, "width height classes"],
) -> Uint8[Tensor, "width height"]:
return (
torch.nn.functional.interpolate(
torch.nn.functional
.interpolate(
logits_WHC.max(axis=-1).indices.view((1, 1, 16, 16)).float(),
scale_factor=14,
)
Expand Down
3 changes: 2 additions & 1 deletion contrib/interactive_interp/semseg/training.py
Original file line number Diff line number Diff line change
Expand Up @@ -358,7 +358,8 @@ def __getitem__(self, i: int) -> dict[str, object]:

pw, ph = self.patch_size_px
patch_labels = (
einops.rearrange(pixel_labels, "(w pw) (h ph) -> w h (pw ph)", pw=pw, ph=ph)
einops
.rearrange(pixel_labels, "(w pw) (h ph) -> w h (pw ph)", pw=pw, ph=ph)
.mode(axis=-1)
.values
)
Expand Down
4 changes: 2 additions & 2 deletions contrib/trait_discovery/CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ This project aims to use sparse autoencoders (SAEs) on vision transformers like

Sparse autoencoders were recently applied to interpreting large language models by many groups.
[Anthropic's work](https://transformer-circuits.pub/2024/scaling-monosemanticity/index.html) is probably the most well known, but [OpenAI has some work](https://cdn.openai.com/papers/sparse-autoencoders.pdf) and [Google does too](https://arxiv.org/abs/2408.05147).
I have some prior work ([website](https://osu-nlp-group.github.io/saev/), [arxiv](https://arxiv.org/abs/2502.06755)) that shows that sparse autoencoders can also be applied to vision transformer activations and nice-looking qualitative examples are discovered in ViT activations.
I have some prior work ([website](https://imageomics.github.io/saev/), [arxiv](https://arxiv.org/abs/2502.06755)) that shows that sparse autoencoders can also be applied to vision transformer activations and nice-looking qualitative examples are discovered in ViT activations.

**"Interesting and scientifically meaningful"**

Expand Down Expand Up @@ -75,7 +75,7 @@ train_baseline.py
## Environment

```sh
git clone https://github.com/OSU-NLP-Group/saev
git clone https://github.com/Imageomics/saev
git checkout ring-buffer

# Check that saev/ installed okay.
Expand Down
8 changes: 4 additions & 4 deletions contrib/trait_discovery/scripts/push_dinov3.py
Original file line number Diff line number Diff line change
Expand Up @@ -251,10 +251,10 @@ def make_readme(repo: Repo, staged: list[StagedRun]) -> str:

# SAE for Meta's {repo.title} trained on ImageNet-1K Activations

* **Homepage:** https://osu-nlp-group.github.io/saev
* **Code:** https://github.com/OSU-NLP-Group/saev
* **Homepage:** https://imageomics.github.io/saev
* **Code:** https://github.com/Imageomics/saev
* **Preprint:** https://arxiv.org/abs/2511.17735
* **Demos:** https://osu-nlp-group.github.io/saev#demos
* **Demos:** https://imageomics.github.io/saev#demos
* **Point of Contact:** [Sam Stevens](mailto:stevens.994@buckeyemail.osu.edu)

## Checkpoints
Expand All @@ -280,7 +280,7 @@ def make_readme(repo: Repo, staged: list[StagedRun]) -> str:

## Inference Instructions

Follow the instructions [here](https://osu-nlp-group.github.io/saev/api/saev/#inference-instructions).
Follow the instructions [here](https://imageomics.github.io/saev/api/saev/#inference-instructions).
"""


Expand Down
2 changes: 1 addition & 1 deletion docs/api/404.html
Original file line number Diff line number Diff line change
Expand Up @@ -1910,7 +1910,7 @@ <h1>404 - Not found</h1>



<a href="https://github.com/OSU-NLP-Group/saev" target="_blank" rel="noopener" title="github.com" class="md-social__link">
<a href="https://github.com/Imageomics/saev" target="_blank" rel="noopener" title="github.com" class="md-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
</a>

Expand Down
4 changes: 2 additions & 2 deletions docs/api/api/colors/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@



<link rel="canonical" href="https://osu-nlp-group.github.io/saev/api/api/colors/">
<link rel="canonical" href="https://imageomics.github.io/saev/api/api/colors/">


<link rel="prev" href="../saev/">
Expand Down Expand Up @@ -2111,7 +2111,7 @@ <h1>saev.colors</h1>



<a href="https://github.com/OSU-NLP-Group/saev" target="_blank" rel="noopener" title="github.com" class="md-social__link">
<a href="https://github.com/Imageomics/saev" target="_blank" rel="noopener" title="github.com" class="md-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
</a>

Expand Down
4 changes: 2 additions & 2 deletions docs/api/api/configs/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@



<link rel="canonical" href="https://osu-nlp-group.github.io/saev/api/api/configs/">
<link rel="canonical" href="https://imageomics.github.io/saev/api/api/configs/">


<link rel="prev" href="../colors/">
Expand Down Expand Up @@ -2717,7 +2717,7 @@ <h2 id="saev.configs.load_sweep" class="doc doc-heading">



<a href="https://github.com/OSU-NLP-Group/saev" target="_blank" rel="noopener" title="github.com" class="md-social__link">
<a href="https://github.com/Imageomics/saev" target="_blank" rel="noopener" title="github.com" class="md-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
</a>

Expand Down
Loading