From f26c2216802f016f6046856d1cb5aae93f06141c Mon Sep 17 00:00:00 2001 From: Wojtek Kosior Date: Tue, 14 Nov 2023 09:23:23 +0100 Subject: Initial commit --- .reuse/dep5 | 4 + LICENSES/CC0-1.0.txt | 121 ++ README.md | 52 + README.md.license | 3 + cup-of-passion.svg | 1977 +++++++++++++++++++ cup-of-passion.svg.license | 3 + empty-grave.svg | 3803 ++++++++++++++++++++++++++++++++++++ empty-grave.svg.license | 3 + make-points.scm | 248 +++ wine-from-water.svg | 4516 +++++++++++++++++++++++++++++++++++++++++++ wine-from-water.svg.license | 3 + 11 files changed, 10733 insertions(+) create mode 100644 .reuse/dep5 create mode 100644 LICENSES/CC0-1.0.txt create mode 100644 README.md create mode 100644 README.md.license create mode 100644 cup-of-passion.svg create mode 100644 cup-of-passion.svg.license create mode 100644 empty-grave.svg create mode 100644 empty-grave.svg.license create mode 100755 make-points.scm create mode 100644 wine-from-water.svg create mode 100644 wine-from-water.svg.license diff --git a/.reuse/dep5 b/.reuse/dep5 new file mode 100644 index 0000000..c61c840 --- /dev/null +++ b/.reuse/dep5 @@ -0,0 +1,4 @@ +Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: Connect the dots +Upstream-Contact: Wojtek Kosior +Source: https://git.happyhacking.pl/connect-the-dots diff --git a/LICENSES/CC0-1.0.txt b/LICENSES/CC0-1.0.txt new file mode 100644 index 0000000..0e259d4 --- /dev/null +++ b/LICENSES/CC0-1.0.txt @@ -0,0 +1,121 @@ +Creative Commons Legal Code + +CC0 1.0 Universal + + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE + LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN + ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS + INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES + REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS + PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM + THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED + HEREUNDER. + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator +and subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for +the purpose of contributing to a commons of creative, cultural and +scientific works ("Commons") that the public can reliably and without fear +of later claims of infringement build upon, modify, incorporate in other +works, reuse and redistribute as freely as possible in any form whatsoever +and for any purposes, including without limitation commercial purposes. +These owners may contribute to the Commons to promote the ideal of a free +culture and the further production of creative, cultural and scientific +works, or to gain reputation or greater distribution for their Work in +part through the use and efforts of others. + +For these and/or other purposes and motivations, and without any +expectation of additional consideration or compensation, the person +associating CC0 with a Work (the "Affirmer"), to the extent that he or she +is an owner of Copyright and Related Rights in the Work, voluntarily +elects to apply CC0 to the Work and publicly distribute the Work under its +terms, with knowledge of his or her Copyright and Related Rights in the +Work and the meaning and intended legal effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not +limited to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, + communicate, and translate a Work; + ii. moral rights retained by the original author(s) and/or performer(s); +iii. publicity and privacy rights pertaining to a person's image or + likeness depicted in a Work; + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + v. rights protecting the extraction, dissemination, use and reuse of data + in a Work; + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation + thereof, including any amended or successor version of such + directive); and +vii. other similar, equivalent or corresponding rights throughout the + world based on applicable law or treaty, and any national + implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention +of, applicable law, Affirmer hereby overtly, fully, permanently, +irrevocably and unconditionally waives, abandons, and surrenders all of +Affirmer's Copyright and Related Rights and associated claims and causes +of action, whether now known or unknown (including existing as well as +future claims and causes of action), in the Work (i) in all territories +worldwide, (ii) for the maximum duration provided by applicable law or +treaty (including future time extensions), (iii) in any current or future +medium and for any number of copies, and (iv) for any purpose whatsoever, +including without limitation commercial, advertising or promotional +purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each +member of the public at large and to the detriment of Affirmer's heirs and +successors, fully intending that such Waiver shall not be subject to +revocation, rescission, cancellation, termination, or any other legal or +equitable action to disrupt the quiet enjoyment of the Work by the public +as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason +be judged legally invalid or ineffective under applicable law, then the +Waiver shall be preserved to the maximum extent permitted taking into +account Affirmer's express Statement of Purpose. In addition, to the +extent the Waiver is so judged Affirmer hereby grants to each affected +person a royalty-free, non transferable, non sublicensable, non exclusive, +irrevocable and unconditional license to exercise Affirmer's Copyright and +Related Rights in the Work (i) in all territories worldwide, (ii) for the +maximum duration provided by applicable law or treaty (including future +time extensions), (iii) in any current or future medium and for any number +of copies, and (iv) for any purpose whatsoever, including without +limitation commercial, advertising or promotional purposes (the +"License"). The License shall be deemed effective as of the date CC0 was +applied by Affirmer to the Work. Should any part of the License for any +reason be judged legally invalid or ineffective under applicable law, such +partial invalidity or ineffectiveness shall not invalidate the remainder +of the License, and in such case Affirmer hereby affirms that he or she +will not (i) exercise any of his or her remaining Copyright and Related +Rights in the Work or (ii) assert any associated claims and causes of +action with respect to the Work, in either case contrary to Affirmer's +express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + b. Affirmer offers the Work as-is and makes no representations or + warranties of any kind concerning the Work, express, implied, + statutory or otherwise, including without limitation warranties of + title, merchantability, fitness for a particular purpose, non + infringement, or the absence of latent or other defects, accuracy, or + the present or absence of errors, whether or not discoverable, all to + the greatest extent permissible under applicable law. + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without + limitation any person's Copyright and Related Rights in the Work. + Further, Affirmer disclaims responsibility for obtaining any necessary + consents, permissions or other rights required for any use of the + Work. + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to + this CC0 or use of the Work. diff --git a/README.md b/README.md new file mode 100644 index 0000000..0728607 --- /dev/null +++ b/README.md @@ -0,0 +1,52 @@ +# Connect the dots + +This repository houses some "connect the dots" pictures with Christian themes. + +## Downloading + +If you try to download the SVG files using a web browser, they can break due to +the way browser handles them. In this case, you should instead download the ZIP +archive with all the files in it or use a command line tool, e.g. + +```shell-script + wget 'https://git.koszko.org/connect-the-dots/plain/cup-of-passion.svg' \ + -O ./cup-of-passion.svg +``` + +## Drawing workflow + +Pictures here are initially sketched with pencil and paper. They are then +scanned and opened with [Inkscape](https://inkscape.org/). The actual vector +image gets drawn over the initial sketch (in a separate Inkscape layer). + +Every drawing includes a line (an open sequence of connected segments, without +curves) named (inside Inkscape) as "connect-the-dots". This repository contains +a [GNU Guile](https://www.gnu.org/software/guile/) script `make-points.scm` +which is then used to add dots with labels on the corners of the line. Sample +invokation of the script (under a UNIX-like system with Guile installed) looks +like this: + +```shell-script + ./make-points.scm \ + --input=cup-of-passion.svg \ + --output=cup-of-passion-work.svg \ + --font-size=12.5 +``` + +The modified image is then opened in Inkscape again and the labels are manually +rearranged to collide with each other and with other picture elements as little +as possible. It is still possible to remove a corner and its label at this +point. Subsequent invokation of `make-points.scm` on the modified picture +replaces the dots with new ones and renumbers those labels that have not been +removed. The labels remain in the positions they were moved to by the designer. + +The final picture can be exported (e.g. to a PDF) after setting sketch and line +layers to invisible in Inkscape. + +## Copying + +(Ć) All rights reversed + +The contents of this repository are available under the [Creative Commos Zero +v1.0](https://creativecommons.org/publicdomain/zero/1.0/legalcode.pl) license. +The repository follows the [REUSE](https://reuse.software/) v3.0 specification. diff --git a/README.md.license b/README.md.license new file mode 100644 index 0000000..e54bf4d --- /dev/null +++ b/README.md.license @@ -0,0 +1,3 @@ +SPDX-License-Identifier: CC0-1.0 + +Copyright (C) 2023 Wojtek Kosior diff --git a/cup-of-passion.svg b/cup-of-passion.svg new file mode 100644 index 0000000..6216047 --- /dev/null +++ b/cup-of-passion.svg @@ -0,0 +1,1977 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 + 32 + 33 + 34 + 35 + 36 + 37 + 38 + 39 + 40 + 41 + 42 + 43 + 44 + 45 + 46 + 47 + 48 + 49 + 50 + 51 + 52 + 53 + 54 + 55 + 56 + 57 + 58 + 59 + 60 + 61 + 62 + 63 + 64 + 65 + 66 + 67 + 68 + 69 + 70 + 71 + 72 + 73 + 74 + 75 + 76 + 77 + 78 + 79 + 80 + 81 + 82 + 83 + 84 + 85 + 86 + 87 + 88 + 89 + 90 + 91 + 92 + + + diff --git a/cup-of-passion.svg.license b/cup-of-passion.svg.license new file mode 100644 index 0000000..e54bf4d --- /dev/null +++ b/cup-of-passion.svg.license @@ -0,0 +1,3 @@ +SPDX-License-Identifier: CC0-1.0 + +Copyright (C) 2023 Wojtek Kosior diff --git a/empty-grave.svg b/empty-grave.svg new file mode 100644 index 0000000..d0bf25b --- /dev/null +++ b/empty-grave.svg @@ -0,0 +1,3803 @@ + + + Połącz kropki — pusty grób + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Połącz kropki — pusty grób + 2023-10-14 + + + Wojtek Kosior + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 + 32 + 33 + 34 + 35 + 36 + 37 + 38 + 39 + 40 + 41 + 42 + 43 + 44 + 45 + 46 + 47 + 48 + 49 + 50 + 51 + 52 + 53 + 54 + 55 + 56 + 57 + 58 + 59 + 60 + 61 + 62 + 63 + 64 + 65 + 66 + 67 + 68 + 69 + 70 + 71 + 72 + 73 + 74 + 75 + 76 + 77 + 78 + 79 + 80 + 81 + 82 + 83 + 84 + 85 + 86 + 87 + 88 + 89 + 90 + 91 + 92 + 93 + 94 + 95 + 96 + 97 + 98 + 99 + 100 + 101 + 102 + 103 + 104 + 105 + 106 + 107 + 108 + 109 + 110 + 111 + 112 + 113 + 114 + 115 + 116 + 117 + 118 + 119 + 120 + 121 + 122 + 123 + 124 + 125 + 126 + 127 + 128 + 129 + 130 + 131 + 132 + 133 + 134 + 135 + 136 + 137 + 138 + 139 + 140 + 141 + 142 + 143 + 144 + 145 + 146 + 147 + 148 + 149 + 150 + 151 + 152 + 153 + 154 + 155 + 156 + 157 + 158 + 159 + 160 + 161 + 162 + 163 + 164 + 165 + 166 + 167 + 168 + 169 + 170 + 171 + 172 + 173 + 174 + 175 + 176 + 177 + 178 + 179 + 180 + 181 + 182 + 183 + 184 + 185 + 186 + 187 + 188 + 189 + 190 + 191 + 192 + 193 + 194 + 195 + 196 + 197 + 198 + 199 + 200 + 201 + 202 + 203 + 204 + 205 + 206 + 207 + 208 + 209 + 210 + 211 + 212 + 213 + 214 + 215 + 216 + 217 + 218 + 219 + 220 + 221 + 222 + 223 + 224 + 225 + 226 + 227 + 228 + 229 + 230 + 231 + 232 + 233 + 234 + 235 + 236 + + + diff --git a/empty-grave.svg.license b/empty-grave.svg.license new file mode 100644 index 0000000..e54bf4d --- /dev/null +++ b/empty-grave.svg.license @@ -0,0 +1,3 @@ +SPDX-License-Identifier: CC0-1.0 + +Copyright (C) 2023 Wojtek Kosior diff --git a/make-points.scm b/make-points.scm new file mode 100755 index 0000000..56c711f --- /dev/null +++ b/make-points.scm @@ -0,0 +1,248 @@ +#! /usr/bin/env guile +SPDX-License-Identifier: CC0-1.0 + +Copyright (C) 2023 Wojtek Kosior +!# + +(use-modules ((ice-9 getopt-long) #:select (getopt-long option-ref)) + ((ice-9 format) #:select (format)) + ((ice-9 match) #:select (match match-lambda match-lambda*)) + ((ice-9 regex) #:select (regexp-substitute string-match)) + ((ice-9 peg) #:select (define-peg-string-patterns + match-pattern + peg:tree + keyword-flatten)) + ((srfi srfi-26) #:select (cut)) + ((sxml simple) #:select (xml->sxml sxml->xml)) + ((sxml xpath) #:select (sxpath))) + +(define %option-spec + '((input (single-char #\i) (value #t)) + (output (single-char #\o) (value #t)) + (reverse-order (single-char #\r) (value #f)) + (font-size (single-char #\s) (value #t)))) + +(define %options + (getopt-long (command-line) %option-spec)) + +(define %known-namespaces + '((cc . "http://creativecommons.org/ns#") + (dc . "http://purl.org/dc/elements/1.1/") + (inkscape . "http://www.inkscape.org/namespaces/inkscape") + (rdf . "http://www.w3.org/1999/02/22-rdf-syntax-ns#") + (sodipodi . "http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd") + (svg . "http://www.w3.org/2000/svg") + (xlink . "http://www.w3.org/1999/xlink"))) + +(define* (load-inkscape-svg #:rest args) + (match args + ((or () (#f)) + (load-inkscape-svg (current-input-port))) + (((? port? port)) + (xml->sxml port #:namespaces %known-namespaces)) + (((? string? filename)) + (call-with-input-file filename + (cut load-inkscape-svg <>))))) + +(define sxml + (load-inkscape-svg (option-ref %options 'input #f))) + +(define (extract-path-node svg-sxml) + (match ((sxpath '(// (svg:path (@ (inkscape:label + ((equal? "connect-the-dots"))))))) + sxml) + ((path) + path) + (() + (throw '&exception + "Cannot extract object with \"connect-the-dots\" label.")))) + +(define main-drawing-path-node + (extract-path-node sxml)) + +(define (extract-path-text node) + (match ((sxpath '(@ d *text*)) node) + ((text) + text) + (() + (throw '&exception + "Cannot extract \"d\" attribute of the path.")))) + +(define point-coords-text + (extract-path-text main-drawing-path-node)) + +(define-peg-string-patterns + "Pinkscape-svg-path <- Pwhitespace? Pcommand + (Pseparator? Pcommand Parg / + Pseparator? Pcommand / + Pseparator Parg)+ + Pwhitespace? !. + Pcommand <-- [MmLlHhVvZzCcSsAaRrBb] + Parg <-- '-'? ([0-9]+ ('.' [0-9]*)? / '.' [0-9]+) ([eE] '-'? [0-9]+)? + Pwhitespace < [ \t\n]+ + Pseparator < (',' Pwhitespace? / Pwhitespace)") + +(define %forbidden-command-regex + (make-regexp "^[ZzCcSsAaRrBb]$")) + +(define (parse-path path-string) + (define peg-tree + (match (match-pattern Pinkscape-svg-path path-string) + (#f + (throw '&exception "The path is of wrong format.")) + (peg-struct + (keyword-flatten '(Parg Pcommand) (peg:tree peg-struct))))) + + (let loop ((position '(0 0)) + (last-commmand #f) + (path-points '()) + (to-process peg-tree)) + (match (cons last-commmand to-process) + ((_) + (reverse path-points)) + + ((_ ('Pcommand (? (cut regexp-exec %forbidden-command-regex <>) + command)) + . _) + (throw '&exception + (format #f "The path uses forbidden command \"~a\"." command))) + + ((#f (not ('Pcommand (or "m" "M"))) + . _) + (throw '&exception + "The path starts with neither \"m\" nor \"M\" command.")) + + (((not #f) ('Pcommand (or "m" "M")) + . _) + (throw '&exception "The path is composite.")) + + ((or (_ ('Pcommand (and (or "m" "M" "L") command)) + ('Parg coord1) ('Parg coord2) + . rest) + ((and (or "M" "L") command) ('Parg coord1) ('Parg coord2) + . rest)) + (let ((position* (map string->number (list coord1 coord2)))) + (loop position* command (cons position* path-points) rest))) + + ((or (_ ('Pcommand (and "l" command)) ('Parg coord1) ('Parg coord2) + . rest) + ((and (or "m" "l") command) ('Parg coord1) ('Parg coord2) + . rest)) + (let* ((relative-coords (map string->number (list coord1 coord2))) + (position* (map + position relative-coords))) + (loop position* command (cons position* path-points) rest)))))) + +(define point-coords + (parse-path point-coords-text)) + +(define points-count + (length point-coords)) + +(define label-coords + (match ((sxpath '(// (svg:g (@ (inkscape:label + ((equal? "dots-and-numbers"))))) + // svg:tspan @)) + sxml) + (() + (map (lambda (coords) + (map + coords '(1 -1))) + point-coords)) + (((@ attrs ...) ...) + (unless (= (length attrs) points-count) + (throw '&exception + (format #f "Number of labels (~a) different from number of points (~a)." + (length attrs) points-count))) + (map (lambda (tspan-attrs) + (map (lambda (coord-name) + (string->number (car (assq-ref tspan-attrs coord-name)))) + '(x y))) + attrs)))) + +(define %dot-style + "fill:#777777;fill-opacity:1;stroke:none;") + +(define %font-size (option-ref %options 'font-size "7.8373")) + +(define %text-style + (format #f "font-size:~apx;font-family:FreeSans;fill:#777777;fill-opacity:1;stroke:none" + %font-size)) + +(define dots-group-sxml + `(g (@ (inkscape:label "dots")) + ,@(map (match-lambda ((x y) + `(circle (@ (style ,%dot-style) + (cx ,x) + (cy ,y) + (r 1.742))))) + point-coords))) + +(define labels-group-sxml + `(g (@ (inkscape:label "labels")) + ,@(map (match-lambda* ((number (x y)) + `(text (@ (xml:space "preserve") + (style ,%text-style) + (x ,x) + (y ,y)) + (tspan (@ (x ,x) + (y ,y)) + ,number)))) + (iota (length point-coords) 1) + label-coords))) + +(define dots-and-numbers-layer-sxml + `(g (@ (inkscape:groupmode "layer") + (inkscape:label "dots-and-numbers")) + ,dots-group-sxml + ,labels-group-sxml)) + +(define %known-namespaces-xmlns-attrs + `((xmlns ,(assoc-ref %known-namespaces 'svg)) + . ,(map (match-lambda + ((ns-name . ns-url) + (list (string->symbol (format #f "xmlns:~a" ns-name)) ns-url))) + %known-namespaces))) + +(define* (transform-svg sxml #:rest layers-to-add) + (let transform ((node sxml)) + (match node + ;; Process lists starting with '*SOMETHING* without normalization + (((? symbol? sym (= symbol->string (? (cut string-prefix? "*" <>)))) + . rest) + `(,sym . ,(map transform rest))) + ;; Don't alter attributes by themselves + ((and ('@ . _) attr-list) + attr-list) + ;; Normalize sxml by adding empty attr lists + (((? symbol? sym) + . (and (not (('@ . _) . _)) + rest)) + (transform `(,sym (@) . ,rest))) + ;; Add xmlns attributes and new svg layers + (('svg:svg attrs . children) + `(svg:svg (,@attrs . ,%known-namespaces-xmlns-attrs) + ,@(map transform children) + . ,layers-to-add)) + ;; Remove previously existing \"dots-and-numbers\" layer + (('svg:g ('@ . (= (cut assoc-ref <> 'inkscape:label) + ("dots-and-numbers"))) + . _) + "") + ;; Recursively process all ordinary nodes' children + ((? list? list) + (map transform list)) + ;; Don't alter strings and symbols by themselves + (something-else + something-else)))) + +(define* (save-inkscape-svg svg-sxml #:rest args) + (match args + ((or () (#f)) + (save-inkscape-svg svg-sxml (current-output-port))) + (((? port? port)) + (sxml->xml svg-sxml port)) + (((? string? filename)) + (call-with-output-file filename + (cut save-inkscape-svg svg-sxml <>))))) + +(save-inkscape-svg (transform-svg sxml dots-and-numbers-layer-sxml) + (option-ref %options 'output #f)) diff --git a/wine-from-water.svg b/wine-from-water.svg new file mode 100644 index 0000000..fdfe5eb --- /dev/null +++ b/wine-from-water.svg @@ -0,0 +1,4516 @@ + +123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320 diff --git a/wine-from-water.svg.license b/wine-from-water.svg.license new file mode 100644 index 0000000..e54bf4d --- /dev/null +++ b/wine-from-water.svg.license @@ -0,0 +1,3 @@ +SPDX-License-Identifier: CC0-1.0 + +Copyright (C) 2023 Wojtek Kosior -- cgit v1.2.3