Skip to content

Instantly share code, notes, and snippets.

@passcod
Last active August 6, 2023 00:24
Show Gist options
  • Save passcod/2e1983ce415b32bdf3a0 to your computer and use it in GitHub Desktop.
Save passcod/2e1983ce415b32bdf3a0 to your computer and use it in GitHub Desktop.
License stats for crates on crates.io
/metacrate-*
2015-02-17 2016-04-28 2020-02-04 2020-05-11
    984 MIT
    115 Apache-2.0 OR MIT
     63 Apache-2.0
     43 null
     27 BSD-3-Clause
     25 Unlicense
     20 Zlib
     17 BSD-2-Clause
     11 WTFPL
     11 MPL-2.0
     11 CC0-1.0
      8 non-standard
      8 GPL-3.0+
      7 ISC
      7 GPL-2.0
      6 LGPL-3.0
      5 GPL-3.0
      3 LGPL-2.1+
      2 MIT/BSD-2-Clause
      2 LGPL-3.0+
      2 AGPL-3.0
      1 Libpng OR Zlib
      1 Zed
      1 MIT OR MPL-1.1 OR Unlicense
      1 Apache-2.0 OR Unlicense
      1 Python-2.0
      1 MPL-2.0-no-copyleft-exception
      1 Apache-1.0 OR MIT
      1 LGPL-2.1
      1 LGPL-2.0+
      1 IJG
      1 BSL-1.0
   2614 MIT
    910 Apache-2.0 OR MIT
    266 Apache-2.0
    103 GPL-3.0
    100 BSD-3-Clause
     86 non-standard
     79 MPL-2.0
     69 CC0-1.0
     61 BSD-2-Clause
     40 WTFPL
     38 ISC
     37 Unlicense
     37 null
     37 LGPL-3.0
     30 Zlib
     27 MIT OR Unlicense
     27 GPL-2.0
     20 LGPL-3.0+
     20 AGPL-3.0
     18 LGPL-2.1
     16 GPL-3.0+
     11 GPL-2.0+
     10 LGPL-2.1+
     10 BSL-1.0
      7 zlib-acknowledgement
      5 AML
      3 ISC OR MIT
      2 Python-2.0
      2 MITNFA
      2 AGPL-3.0+ AND GPL-2.0+
      2 Apache-2.0 OR BSL-1.0
      2 BSD-4-Clause
      2 Apache-2.0 OR BSD-3-Clause-Clear OR MIT
      2 AML OR Apache-2.0
      1 Libpng OR Zlib
      1 Zed
      1 MIT OR MPL-1.1 OR Unlicense
      1 Apache-2.0 OR Unlicense
      1 NCSA
      1 MPL-2.0-no-copyleft-exception
      1 BSL-1.0 OR MIT OR WTFPL
      1 BSD-3-Clause OR MIT
      1 BSD-2-Clause OR MIT
      1 Apache-2.0 OR BSD-3-Clause OR MIT
      1 Apache-1.0 OR MIT
      1 AGPL-1.0 OR MIT
      1 MirOS
      1 LGPL-2.0+
      1 LGPL-2.0
      1 IJG
      1 GPL-3.0 OR LGPL-3.0
      1 BSD-3-Clause OR GPL-3.0+
      1 Apache-2.0 OR GPL-2.0 OR GPL-3.0 OR MIT
      1 FTL OR GPL-2.0
      1 CC-BY-SA-4.0 OR MIT
      1 CC-BY-NC-4.0
      1 Apache-2.0 OR GPL-2.0
      1 AGPL-3.0 WITH eCos-exception-2.0
      1 AGPL-3.0+
  15782 MIT
   9451 Apache-2.0 OR MIT
   3044 Apache-2.0
    988 non-standard
    890 GPL-3.0
    720 MPL-2.0
    666 BSD-3-Clause
    360 CC0-1.0
    356 ISC
    345 GPL-3.0-or-later
    306 BSD-2-Clause
    239 AGPL-3.0
    210 Unlicense
    188 WTFPL
    168 LGPL-3.0
    130 GPL-3.0-only
    129 GPL-3.0+
    118 LGPL-2.1
    117 MIT OR Unlicense
    117 0BSD
    101 Zlib
     92 Apache-2.0 WITH LLVM-exception
     89 GPL-2.0
     68 AGPL-3.0-or-later
     55 LGPL-3.0+
     52 LGPL-3.0-or-later
     51 AGPL-3.0+
     40 null
     36 MIT OR BSL-1.0
     36 Apache-2.0 OR MIT OR MPL-2.0
     36 AGPL-3.0-only
     35 GPL-2.0+
     34 BSD-3-Clause OR MIT
     29 MITNFA
     27 GPL-2.0-or-later
     23 GPL-2.0-only
     23 BSL-1.0
     23 BSD-2-Clause OR MIT
     21 LGPL-2.1+
     20 MPL-2.0+
     20 Fair
     18 LGPL-2.1-or-later
     16 Apache-2.0 AND MIT
     15 Apache-2.0 OR MIT OR BSD-3-Clause
     14 LGPL-3.0-only
     14 BSD-4-Clause
     12 zlib-acknowledgement
     11 MIT-0
     10 MIT OR X11 OR Apache-2.0
      9 AML
      8 WTFPL OR Apache-2.0 OR MIT
      8 EPL-1.0
      8 Apache-2.0 OR ISC OR MIT
      7 LGPL-2.1-only
      7 LGPL-2.0-only
      7 BlueOak-1.0.0
      7 Apache-2.0 OR BSD-3-Clause
      6 AFL-3.0
      5 MirOS
      5 MIT OR X11
      5 Apache-2.0 OR BSL-1.0
      4 UPL-1.0
      4 NCSA
      4 MIT-0 OR 0BSD
      4 EPL-2.0
      4 CC-BY-NC-SA-4.0
      4 BSD-2-Clause-FreeBSD
      4 Apache-2.0 OR MIT OR Unlicense
      4 Apache-2.0 OR LGPL-2.1-or-later
      4 AML OR Apache-2.0
      3 Python-2.0
      3 MPL-2.0-no-copyleft-exception
      3 MIT OR Zlib
      3 MIT OR NCSA
      3 MIT OR ISC
      3 LGPL-3.0 OR GPL-2.0 OR GPL-3.0
      3 LGPL-2.0
      3 ISC OR Apache-2.0
      3 GPL-3.0+ OR BSD-3-Clause
      3 GPL-1.0-or-later OR Artistic-1.0-Perl
      3 FTL OR GPL-2.0
      3 CECILL-2.1
      3 CDDL-1.1
      3 CC0-1.0 OR MIT
      3 CC-BY-SA-4.0
      3 CC-BY-NC-4.0
      3 BSD-3-Clause-Attribution
      3 Apache-2.0 OR MIT OR Zlib
      3 Apache-2.0 OR MIT OR BSL-1.0 OR CC0-1.0
      3 Apache-2.0 OR CC0-1.0 OR MIT
      2 X11
      2 UPL-1.0 OR Apache-2.0
      2 PostgreSQL OR MIT
      2 NCSA AND BSD-3-Clause
      2 MIT OR GPL-3.0-or-later
      2 MIT AND Zlib OR Apache-2.0 AND Zlib
      2 MIT AND ODbL-1.0
      2 LGPL-2.1-or-later OR MIT
      2 LGPL-2.1 OR MPL-1.1
      2 LGPL-2.1 OR LGPL-3.0
      2 LGPL-2.1 OR BSD-2-Clause
      2 IJG
      2 GPL-1.0
      2 EPL-2.0 OR Apache-2.0
      2 D-FSL-1.0
      2 CECILL-C
      2 CC0-1.0 OR Apache-2.0
      2 CC-BY-4.0
      2 Beerware
      2 BSD-3-Clause-Clear
      2 BSD-2-Clause-Patent
      2 BSD-2-Clause AND ISC AND MIT
      2 Artistic-2.0
      2 Artistic-1.0 OR GPL-2.0-or-later
      2 Apache-2.0 OR MIT OR Unlicense OR WTFPL
      2 Apache-2.0 OR MIT OR BSL-1.0
      2 Apache-2.0 OR MIT AND BSD-2-Clause
      2 Apache-2.0 OR GPL-2.0+
      2 Apache-2.0 OR BSD-3-Clause-Clear OR MIT
      2 Apache-2.0 AND BSD-3-Clause
      2 Apache-1.0
      2 APSL-2.0 OR MIT
      2 AFL-1.1
      1 Zlib OR MIT OR BSL-1.0
      1 Zed
      1 SimPL-2.0
      1 QPL-1.0 OR LGPL-2.0
      1 Parity-6.0.0 AND Apache-2.0
      1 PDDL-1.0
      1 OSL-3.0 OR AGPL-3.0-or-later
      1 OSL-3.0
      1 OLDAP-2.8
      1 NPOSL-3.0
      1 NLPL
      1 MPL-2.0+ OR LGPL-3.0+
      1 MPL-1.1 OR MIT OR Unlicense
      1 MPL-1.1 OR GPL-2.0 OR LGPL-2.1
      1 MPL-1.1
      1 MIT OR LGPL-3.0
      1 MIT OR LGPL-2.1
      1 MIT OR GPL-3.0+
      1 MIT OR GPL-3.0
      1 MIT OR Apache-1.0
      1 MIT OR AGPL-1.0
      1 MIT AND Zlib
      1 MIT AND LGPL-2.1-or-later
      1 MIT AND LGPL-2.0-or-later
      1 Libpng
      1 LPPL-1.3c
      1 LGPL-3.0 OR MPL-2.0
      1 LGPL-2.1 OR MPL-2.0
      1 LGPL-2.0-or-later
      1 LGPL-2.0+
      1 ISC OR GPL-3.0-or-later
      1 GPL-3.0-or-later OR LGPL-3.0-or-later
      1 GPL-3.0-or-later AND BSD-3-Clause
      1 GPL-3.0-only OR MIT
      1 GPL-3.0+ AND BSD-3-Clause
      1 GPL-3.0 OR MPL-2.0 OR LGPL-3.0
      1 GPL-3.0 OR MPL-2.0
      1 GPL-3.0 OR LGPL-3.0
      1 GPL-3.0 OR GFDL-1.3
      1 GPL-2.0+ AND LGPL-2.1+ AND MPL-1.1
      1 GPL-2.0 OR GPL-3.0 OR Apache-2.0 OR MIT
      1 CECILL-C OR CECILL-2.1
      1 CECILL-B
      1 CDDL-1.0
      1 CC-BY-SA-4.0 OR MIT
      1 CC-BY-NC-SA-2.5
      1 BSD-3-Clause-Clear OR Apache-2.0
      1 BSD-2-Clause AND MIT
      1 Artistic-1.0-Perl
      1 Apache-2.0 WITH LLVM-exception OR MIT
      1 Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT
      1 Apache-2.0 OR Unlicense
      1 Apache-2.0 OR PostgreSQL
      1 Apache-2.0 OR MIT+
      1 Apache-2.0 OR MIT OR NCSA
      1 Apache-2.0 OR MIT OR LGPL-2.1
      1 Apache-2.0 OR MIT OR GPL-3.0-or-later
      1 Apache-2.0 OR MIT OR Beerware
      1 Apache-2.0 OR MIT OR BSD-2-Clause
      1 Apache-2.0 OR GPL-3.0
      1 APL-1.0
      1 AGPL-3.0 WITH eCos-exception-2.0
      1 AGPL-3.0 OR GPL-3.0 OR Apache-2.0 OR MIT
      1 AGPL-1.0
      1 AFL-2.0
      1 0BSD OR Zlib
  17692 MIT
  10678 Apache-2.0 OR MIT
   3466 Apache-2.0
   1205 non-standard
   1105 GPL-3.0
    821 MPL-2.0
    748 BSD-3-Clause
    548 GPL-3.0-or-later
    398 ISC
    391 CC0-1.0
    331 BSD-2-Clause
    257 AGPL-3.0
    239 Unlicense
    199 WTFPL
    177 LGPL-3.0
    167 GPL-3.0-only
    140 AGPL-3.0-or-later
    135 0BSD
    130 MIT OR Unlicense
    129 Zlib
    122 LGPL-2.1
    112 LGPL-3.0-or-later
    112 Apache-2.0 WITH LLVM-exception
    100 GPL-2.0
     66 GPL-2.0-or-later
     43 LGPL-2.1-or-later
     43 AGPL-3.0-only
     40 null
     39 Apache-2.0 OR MIT OR MPL-2.0
     34 GPL-2.0-only
     34 BSL-1.0
     34 BSD-3-Clause OR MIT
     32 BSL-1.0 OR MIT
     29 MITNFA
     27 MPL-2.0-or-later
     23 BSD-2-Clause OR MIT
     22 Apache-2.0 AND MIT
     21 Fair
     18 LGPL-3.0-only
     17 Apache-2.0 OR BSD-3-Clause OR MIT
     16 BSD-4-Clause
     12 zlib-acknowledgement
     11 MIT-0
     11 Apache-2.0 OR MIT OR X11
     10 Apache-2.0 OR BSD-3-Clause
      9 AML
      8 MPL-2.0-no-copyleft-exception
      8 EPL-1.0
      8 BlueOak-1.0.0
      8 Apache-2.0 OR MIT OR WTFPL
      8 Apache-2.0 OR ISC OR MIT
      7 LGPL-2.0-only
      6 EPL-2.0
      6 CC-BY-NC-SA-4.0
      6 BSD-2-Clause-Patent
      6 Apache-2.0 OR Zlib
      6 AFL-3.0
      5 NCSA
      5 MIT OR X11
      5 MIT OR PostgreSQL
      5 MirOS
      5 LGPL-2.1-only
      5 CC-BY-NC-4.0
      5 Apache-2.0 OR MIT OR Zlib
      5 Apache-2.0 OR BSL-1.0
      4 UPL-1.0
      4 MIT OR Zlib
      4 MIT-0 OR 0BSD
      4 EUPL-1.2
      4 CC-BY-SA-4.0
      4 Beerware
      4 Apache-2.0 OR MIT OR Unlicense
      4 Apache-2.0 OR LGPL-2.1-or-later
      4 Apache-2.0 OR BSL-1.0 OR CC0-1.0 OR MIT
      4 AML OR Apache-2.0
      3 WTFPL OR 0BSD
      3 Python-2.0
      3 MIT OR NCSA
      3 LGPL-2.0
      3 ISC OR MIT
      3 GPL-3.0-or-later OR MIT
      3 GPL-2.0 OR GPL-3.0 OR LGPL-3.0
      3 FTL OR GPL-2.0
      3 CECILL-C
      3 CECILL-B
      3 CECILL-2.1
      3 CDDL-1.1
      3 CC-BY-4.0
      3 CC0-1.0 OR MIT
      3 BSD-3-Clause OR GPL-3.0-or-later
      3 BSD-3-Clause-Attribution
      3 BSD-2-Clause-FreeBSD
      3 Artistic-1.0-Perl OR GPL-1.0-or-later
      3 Apache-2.0 OR CC0-1.0 OR MIT
      3 Apache-2.0 AND BSD-2-Clause OR MIT
      2 X11
      2 Sleepycat
      2 RPL-1.5
      2 BSD-3-Clause AND NCSA
      2 MIT AND Zlib
      2 MIT AND ODbL-1.0
      2 LGPL-2.1 OR MPL-1.1
      2 LGPL-2.1 OR LGPL-3.0
      2 LGPL-2.1-or-later OR MIT
      2 LGPL-2.0-or-later
      2 IJG
      2 GPL-3.0 OR MIT
      2 GPL-2.0-or-later WITH Bison-exception-2.2
      2 GPL-1.0
      2 D-FSL-1.0
      2 BSD-3-Clause-Clear
      2 BSD-3-Clause AND GPL-3.0-or-later
      2 BSD-2-Clause OR LGPL-2.1
      2 BSD-2-Clause AND ISC AND MIT
      2 Artistic-2.0
      2 Artistic-1.0 OR GPL-2.0-or-later
      2 APSL-2.0 OR MIT
      2 Apache-2.0 OR UPL-1.0
      2 Apache-2.0 OR MIT OR Unlicense OR WTFPL
      2 Apache-2.0 OR ISC
      2 Apache-2.0 OR GPL-2.0-or-later
      2 Apache-2.0 OR EPL-2.0
      2 Apache-2.0 OR CC0-1.0
      2 Apache-2.0 OR BSL-1.0 OR MIT
      2 Apache-2.0 OR BSD-3-Clause-Clear OR MIT
      2 Apache-2.0 AND Zlib OR MIT AND Zlib
      2 Apache-2.0 AND BSD-3-Clause
      2 Apache-1.0
      2 AFL-1.1
      1 Zlib AND ISC
      1 Zed
      1 SimPL-2.0
      1 PDDL-1.0
      1 Parity-6.0.0
      1 OSL-3.0
      1 OLDAP-2.8
      1 NPOSL-3.0
      1 NLPL
      1 MS-PL
      1 MPL-2.0 AND Python-2.0
      1 MIT OR MPL-1.1 OR Unlicense
      1 MPL-1.1
      1 MIT OR WTFPL
      1 MIT AND WTFPL
      1 MIT AND OFL-1.1
      1 LPPL-1.3c
      1 Libpng
      1 LGPL-3.0 OR MPL-2.0
      1 LGPL-3.0 OR MIT
      1 LGPL-3.0-or-later OR MPL-2.0-or-later
      1 LGPL-2.1 OR MPL-2.0
      1 LGPL-2.1 OR MIT
      1 LGPL-2.1-or-later AND MIT
      1 LGPL-2.0 OR QPL-1.0
      1 LGPL-2.0-or-later AND MIT
      1 GPL-3.0 OR MPL-2.0
      1 GPL-3.0 OR LGPL-3.0 OR MPL-2.0
      1 GPL-3.0 OR LGPL-3.0
      1 GPL-3.0-or-later OR LGPL-3.0-or-later
      1 GPL-3.0-or-later OR ISC
      1 GFDL-1.3 OR GPL-3.0
      1 GPL-3.0-only OR MIT
      1 GPL-2.0 OR LGPL-2.1 OR MPL-1.1
      1 GPL-2.0-or-later AND LGPL-2.1-or-later AND MPL-1.1
      1 CECILL-C OR CECILL-2.1
      1 CDDL-1.0
      1 CC-BY-SA-4.0 OR MIT
      1 CC-BY-NC-SA-2.5
      1 BSD-2-Clause AND MIT
      1 Artistic-1.0-Perl
      1 APL-1.0
      1 Apache-2.0 WITH LLVM-exception OR MIT
      1 Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT
      1 Apache-2.0 OR Unlicense
      1 Apache-2.0 OR PostgreSQL
      1 Apache-2.0 OR MIT OR NCSA
      1 Apache-2.0 OR MIT OR 0BSD
      1 Apache-2.0 OR LGPL-2.1 OR MIT
      1 Apache-2.0-or-later OR MIT
      1 Apache-2.0 OR GPL-3.0-or-later OR MIT
      1 Apache-2.0 OR GPL-3.0
      1 Apache-2.0 OR GPL-2.0 OR GPL-3.0 OR MIT
      1 Apache-2.0 OR GPL-2.0
      1 Apache-2.0 OR BSD-3-Clause-Clear
      1 Apache-2.0 OR BSD-2-Clause OR MIT
      1 Apache-2.0 OR Beerware OR MIT
      1 Apache-2.0 AND Parity-6.0.0
      1 Apache-2.0 AND CC0-1.0
      1 Apache-1.0 OR MIT
      1 AGPL-3.0 WITH eCos-exception-2.0
      1 AGPL-3.0-or-later OR OSL-3.0
      1 AGPL-3.0 OR Apache-2.0 OR GPL-3.0 OR MIT
      1 AGPL-1.0 OR MIT
      1 AGPL-1.0
      1 AFL-2.0
      1 0BSD OR Zlib
#!/usr/bin/bash
# Generator script for the raw summary
# Obviously DO NOT run all the time, don't want to overload Crates.io
# Félix Saparelli, Public Domain (CC0)
# Dependencies: bash, ls, sort, sed, uniq, grep, wc, xargs, aria2c
# And jq which is available at: https://stedolan.github.io/jq/
# The entire script takes about 20 minutes to run (lots of crates!)
folder="metacrate-$(date +"%Y.%m.%d-%H-%M-%S")"
echo "---> Create unique folder $folder"
mkdir $folder
cd $folder
echo "---> Fetch the current state of the registry"
git clone --depth=1 git://github.com/rust-lang/crates.io-index.git index
echo "---> Compile a list of every crate indexed"
cd index
ls -1F ** | grep -E '[^/:*@=>|]$' > ../index.tmp
ls -1F **/** | grep -E '[^/:*@=>|]$' >> ../index.tmp
cd ..
grep -oP '(?<=/)?[^/]+$' index.tmp | sort | uniq > index.list
rm index.tmp
echo "---> Got a total of $(wc -l index.list | cut -d\ -f1) crates"
echo "---> Fetch JSON description of every crate (takes a long time)"
xargs -a index.list -n1 -I% echo https://crates.io/api/v1/crates/% > index.urls
mkdir crates
aria2c -j 50 -d crates -i index.urls
echo "---> Extract license information of every crate"
find crates/* -exec cat {} \; | jq -r '.versions[0].license' > licenses.list
echo "---> Compile summary of license usage"
cat <<'SORTER' > sorter
#!/bin/sh
sed -E \
-e 's#^# #' \
-e 's#$# #' \
-e 's#\s+# #g' \
-e 's#\s*/\s*# OR #g' \
-e 's#\s+WITH\s+#-WITH-#g' \
-e 's#\s+AND\s+#-AND-#g' \
-e 's#^\s*$#null#' \
-e 's#\+\s?#-or-later #g' \
\
-e 's# ([B-Z][A-Z0-9.-]+) OR (A[A-Z0-9.-]+) # \2 OR \1 #ig' \
-e 's# ([B-Z][A-Z0-9.-]+) OR (A[A-Z0-9.-]+) # \2 OR \1 #ig' \
-e 's# ([B-Z][A-Z0-9.-]+)-AND-(A[A-Z0-9.-]+) # \2-AND-\1 #ig' \
\
-e 's# (G[A-Z0-9.-]+) OR ([A-F][A-Z0-9.-]+) # \2 OR \1 #ig' \
-e 's# (G[A-Z0-9.-]+)-AND-([A-F][A-Z0-9.-]+) # \2-AND-\1 #ig' \
-e 's# ([H-Z][A-Z0-9.-]+) OR (G[A-Z0-9.-]+) # \2 OR \1 #ig' \
-e 's# ([H-Z][A-Z0-9.-]+)-AND-(G[A-Z0-9.-]+) # \2-AND-\1 #ig' \
\
-e 's# (L[A-Z0-9.-]+) OR ([A-K][A-Z0-9.-]+) # \2 OR \1 #ig' \
-e 's# (L[A-Z0-9.-]+)-AND-([A-K][A-Z0-9.-]+) # \2-AND-\1 #ig' \
-e 's# ([M-Z][A-Z0-9.-]+) OR (L[A-Z0-9.-]+) # \2 OR \1 #ig' \
-e 's# ([M-Z][A-Z0-9.-]+)-AND-(L[A-Z0-9.-]+) # \2-AND-\1 #ig' \
\
-e 's# (M[A-Z0-9.-]+) OR ([A-L][A-Z0-9.-]+) # \2 OR \1 #ig' \
-e 's# (M[A-Z0-9.-]+)-AND-([A-L][A-Z0-9.-]+) # \2-AND-\1 #ig' \
-e 's# ([N-Z][A-Z0-9.-]+) OR (M[A-Z0-9.-]+) # \2 OR \1 #ig' \
-e 's# ([N-Z][A-Z0-9.-]+)-AND-(M[A-Z0-9.-]+) # \2-AND-\1 #ig' \
\
-e 's# (M[J-Z][A-Z0-9.-]*) OR MIT # MIT OR \1 #ig' \
\
-e 's#-AND-# AND #g' \
-e 's#-WITH-# WITH #g' \
-e 's#\s+# #g' \
-e 's#^\s+##' \
-e 's#\s+$##' \
licenses.list \
| sort \
| uniq -c \
| sort -nr
SORTER
chmod +x sorter
./sorter > summary
echo "---> Here's the summary:"
cat summary
@passcod
Copy link
Author

passcod commented Feb 4, 2020

Updated the gist with your changes plus some more, thanks

@vmx
Copy link

vmx commented Feb 4, 2020

@passcod: the "Compile a list of every crate indexed" step creates a lot of duplicated entries. The sorting needs to be done after the grep:

$ sort index.tmp | uniq | grep -oP '(?<=/)?[^/]+$' | wc -l
70579
$ grep -oP '(?<=/)?[^/]+$' index.tmp | sort | uniq | wc -l
35290

@passcod
Copy link
Author

passcod commented Feb 4, 2020

Ahhh, I didn't catch that while reading through

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment