[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
04/05: website: Add post about 'guix pull'.
From: |
Ludovic Courtčs |
Subject: |
04/05: website: Add post about 'guix pull'. |
Date: |
Tue, 24 Jul 2018 08:36:49 -0400 (EDT) |
civodul pushed a commit to branch master
in repository guix-artwork.
commit 7d5e26b9cf845bf3a9f7e8194a95b38653719746
Author: Ludovic Courtès <address@hidden>
Date: Tue Jul 24 14:16:05 2018 +0200
website: Add post about 'guix pull'.
* website/posts/pull.md,
website/static/blog/img/guix-pull1.png,
website/static/blog/img/guix-pull1.svg,
website/static/blog/img/guix-pull2.svg,
website/static/blog/img/guix-pull3.png,
website/static/blog/img/guix-pull3.svg: New files.
---
website/posts/pull.md | 276 +++++++++++++++++++++++++++++++++
website/static/blog/img/guix-pull1.png | Bin 0 -> 53991 bytes
website/static/blog/img/guix-pull1.svg | 68 ++++++++
website/static/blog/img/guix-pull2.svg | 66 ++++++++
website/static/blog/img/guix-pull3.png | Bin 0 -> 53513 bytes
website/static/blog/img/guix-pull3.svg | 74 +++++++++
6 files changed, 484 insertions(+)
diff --git a/website/posts/pull.md b/website/posts/pull.md
new file mode 100644
index 0000000..2416bc6
--- /dev/null
+++ b/website/posts/pull.md
@@ -0,0 +1,276 @@
+title: Multi-dimensional transactions and rollbacks, oh my!
+date: 2018-07-24 14:30
+author: Ludovic Courtès
+tags: Software development, Reproducibility, Programming interfaces, Scheme API
+---
+One of the [highlights of version
+0.15.0](https://www.gnu.org/software/guix/blog/2018/gnu-guix-and-guixsd-0.15.0-released/)
+was the overhaul of [`guix
+pull`](https://www.gnu.org/software/guix/manual/en/html_node/Invoking-guix-pull.html),
+the command that updates Guix and its package collection. In Debian
+terms, you can think of `guix pull` as:
+
+```
+apt-get update && apt-get install apt
+```
+
+Let’s be frank, `guix pull` does not yet run as quickly as this
+`apt-get` command—in the “best case”, when pre-built binaries are
+available, it currently runs in about 1m30s on a recent laptop. More
+about the performance story in a future post…
+
+One of the key features of the new `guix pull` is the ability to _roll
+back_ to previous versions of Guix. That’s a distinguishing feature
+that opens up new possibilities.
+
+# “Profile generations”
+
+Transactional upgrades and rollbacks have been a distinguishing feature
+of Guix since Day 1. They come for free as a consequence of the
+functional package management model inherited from the Nix package
+manager. To many users, this alone is enough to justify using a
+functional package manager: if an upgrade goes wrong, you can always
+roll back. Let’s recap how this all works.
+
+As a user, you install packages in your own _profile_, which defaults to
+`~/.guix-profile`. Then from time to time you update Guix and its
+package collection:
+
+```
+$ guix pull
+```
+
+This updates `~/.config/guix/current`, giving you an updated `guix`
+executable along with an updated set of packages. You can now upgrade
+the packages that are in your profile:
+
+```
+$ guix package -u
+The following packages will be upgraded:
+ diffoscope 93 → 96 /gnu/store/…-diffoscope-96
+ emacs 25.3 → 26.1 /gnu/store/…-emacs-26.1
+ gimp 2.8.22 → 2.10.4 /gnu/store/…-gimp-2.10.4
+ gnupg 2.2.7 → 2.2.9 /gnu/store/…-gnupg-2.2.9
+```
+
+The upgrade creates a new _generation_ of your profile—the previous
+generation of your profile, with diffoscope 93, emacs 25.3, and so on is
+still around. You can list profile generations:
+
+```
+$ guix package --list-generations
+Generation 1 Jun 08 2018 20:06:21
+ diffoscope 93 out /gnu/store/…-diffoscope-93
+ emacs 25.3 out /gnu/store/…-emacs-25.3
+ gimp 2.8.22 out /gnu/store/…-gimp-2.8.22
+ gnupg 2.2.7 out /gnu/store/…-gnupg-2.2.7
+ python 3.6.5 out /gnu/store/…-python-3.6.5
+
+Generation 2 Jul 12 2018 12:42:08 (current)
+- diffoscope 93 out /gnu/store/…-diffoscope-93
+- emacs 25.3 out /gnu/store/…-emacs-25.3
+- gimp 2.8.22 out /gnu/store/…-gimp-2.8.22
+- gnupg 2.2.7 out /gnu/store/…-gnupg-2.2.7
++ diffoscope 96 out /gnu/store/…-diffoscope-96
++ emacs 26.1 out /gnu/store/…-emacs-26.1
++ gimp 2.10.4 out /gnu/store/…-gimp-2.10.4
++ gnupg 2.2.9 out /gnu/store/…-gnupg-2.2.9
+```
+
+That shows our two generations with the diff between Generation 1 and
+Generation 2. We can at any time run `guix package --roll-back` and get
+our previous versions of gimp, emacs, and so on. Each generation is
+just a bunch of symlinks to those packages, so what we have looks like
+this:
+
+
+
+Notice that python was not updated, so it’s shared between both
+generations. And of course, all the dependencies that didn’t change in
+between—e.g., the C library—are shared among all packages.
+
+# `guix pull` generations
+
+Like I wrote above, `guix pull` brings the latest set of package
+definitions from Git `master`. The Guix package collection usually only
+contains only the latest version of each package; for example, current
+`master` only has version 26.1 of Emacs and version 2.10.4 of the GIMP
+(there are notable exceptions such as GCC or Python.) Thus, `guix
+package -i gimp`, from today’s master, can only install gimp 2.10.4.
+Often, that’s not a problem: you can keep old profile generations
+around, so if you really need that older version of Emacs, you can run
+it from your previous generation.
+
+Still, having `guix pull` keep track of the changes to Guix and its
+package collection is useful. Starting from 0.15.0, `guix pull` creates
+a new generation, just like `guix package` does. After you’ve run `guix
+pull`, you can now list Guix generations as well:
+
+```
+$ guix pull -l
+Generation 10 Jul 14 2018 00:02:03
+ guix 27f7cbc
+ repository URL: https://git.savannah.gnu.org/git/guix.git
+ branch: origin/master
+ commit: 27f7cbc91d1963118e44b14d04fcc669c9618176
+Generation 11 Jul 20 2018 10:44:46
+ guix 82549f2
+ repository URL: https://git.savannah.gnu.org/git/guix.git
+ branch: origin/master
+ commit: 82549f2328c59525584b92565846217c288d8e85
+ 14 new packages: bsdiff, electron-cash, emacs-adoc-mode,
+ emacs-markup-faces, emacs-rust-mode, inchi, luakit, monero-gui,
+ nethack, openbabel, qhull, r-txtplot, stb-image, stb-image-write
+ 52 packages upgraded: address@hidden, address@hidden,
+ address@hidden, address@hidden, address@hidden, address@hidden,
+ …
+Generation 12 Jul 23 2018 15:22:52 (current)
+ guix fef7bab
+ repository URL: https://git.savannah.gnu.org/git/guix.git
+ branch: origin/master
+ commit: fef7baba786a96b7a3100c9c7adf8b45782ced37
+ 20 new packages: ccrypt, demlo, emacs-dired-du,
+ emacs-helm-org-contacts, emacs-ztree, ffmpegthumbnailer,
+ go-github-com-aarzilli-golua, go-github-com-kr-text,
+ go-github-com-mattn-go-colorable, go-github-com-mattn-go-isatty,
+ go-github-com-mgutz-ansi, go-github-com-michiwend-golang-pretty,
+ go-github-com-michiwend-gomusicbrainz, go-github-com-stevedonovan-luar,
+ go-github-com-wtolson-go-taglib, go-github-com-yookoala-realpath,
+ go-gitlab-com-ambrevar-damerau, go-gitlab-com-ambrevar-golua-unicode,
+ guile-pfds, u-boot-cubietruck
+ 27 packages upgraded: address@hidden, address@hidden,
+ address@hidden,
+ …
+```
+
+The nice thing here is that `guix pull` provides high-level information
+about the differences between two subsequent generations of Guix.
+
+In the end, Generation 1 of our profile was presumably built with Guix
+Generation 11, while Generation 2 of our profile was built with Guix
+Generation 12. We have a clear mapping between Guix generations as
+created by `guix pull` and profile generations as created with `guix
+package`:
+
+
+
+Each generation created by `guix pull` corresponds to one commit in the
+Guix repo. Thus, if I go to another machine and run:
+
+```
+$ guix pull --commit=fef7bab
+```
+
+then I know that I get the exact same Guix instance as my Generation 12
+above. From there I can install diffoscope, emacs, etc. and I know I’ll
+get the exact same binaries as those I have above, thanks to
+[reproducible builds](https://reproducible-builds.org/docs/definition/).
+
+These are very strong guarantees in terms of reproducibility and
+provenance tracking—properties that are
+[typically](https://github.com/canonical-websites/snapcraft.io/issues/651)
+[missing](https://lwn.net/Articles/752982/) from “applications bundles”
+Ă la Docker.
+
+In addition, you can easily run an older Guix. For instance, this is
+how you would install the version of gimp that was current as of
+Generation 10:
+
+```
+$ ~/.config/guix/current-10-link/bin/guix package -i gimp
+```
+
+At this point your profile contains gimp coming from an old Guix along
+with packages installed from the latest Guix. Past and present coexist
+in the same profile. The historical dimension of the profile no longer
+matches exactly the history of Guix itself.
+
+# Composing Guix revisions
+
+Some people have expressed interest in being able to compose packages
+coming from different revisions of Guix—say to create a profile
+containing old versions of Python and NumPy, but also the latest and
+greatest GCC. It may seem far-fetched but it has very real
+applications: there are large collections of scientific packages and in
+particular bioinformatics packages that don’t move as fast as our
+beloved flagship free software packages, and users may require ancient
+versions of some of the tools.
+
+We could keep old versions of many packages but maintainability costs
+would grow exponentially. Instead, Guix users can take advantage of the
+version control history of Guix itself to mix and match packages coming
+from different revisions of Guix. As shown above, it’s already possible
+to achieve this by running the `guix` program off the generation of
+interest. It does the job, but can we do better?
+
+In the process of enhancing `guix pull` we developed a high-level API
+that allows an instance of Guix to “talk” to a different instance of
+Guix—[an
+“inferior”](https://debbugs.gnu.org/cgi/bugreport.cgi?bug=32115). It’s
+what allows `guix pull` to display the list of packages that were added
+or upgraded between two revisions. The next logical step will be to
+provide seamless integration of packages coming from an inferior. That
+way, users would be able to refer to “past” package graphs right from [a
+profile
+manifest](https://www.gnu.org/software/guix/manual/en/html_node/Invoking-guix-package.html#index-profile-manifest)
+or from the command-line. Future work!
+
+# On coupling
+
+The time traveler in you might be wondering: Why are package definitions
+coupled with the package manager, doesn’t it make it harder to compose
+packages coming from different revisions? Good point!
+
+Tight coupling certainly complicates this kind of composition: we can’t
+just have any revision of Guix load package definitions from any other
+revision; this could fail altogether, or it could provide a different
+build result. Another potential issue is that `guix pull`ing an older
+revision not only gives you an older set of packages, it also gives you
+older tools, bug-for-bug.
+
+The reason for this coupling is that a package definition [like this
+one](https://www.gnu.org/software/guix/manual/en/html_node/Defining-Packages.html)
+doesn’t exist in a vacuum. Its meaning is defined by the implementation
+of [package
+objects](https://www.gnu.org/software/guix/manual/en/html_node/package-Reference.html),
+by
+[`gnu-build-system`](https://www.gnu.org/software/guix/manual/en/html_node/Build-Systems.html),
+by a number of [lower-level](https://arxiv.org/abs/1305.4584)
+[abstractions](https://hal.inria.fr/hal-01580582/en) that are all
+defined as extensions of the Scheme language in Guix itself, and
+ultimately by [Guile](https://www.gnu.org/software/guile/), which
+implements the language Guix is written in. Each instance created by
+`guix pull` brings all these components. Because Guix is implemented as
+a set of programming language extensions and libraries, that package
+definitions depend on all these parts becomes manifest. Instead of
+being frozen, the APIs and package definitions evolve together, which
+gives us developers a lot of freedom on the changes we can make.
+
+[Nix](https://nixos.org/nix/) results from a different design choice.
+Nix-the-package-manager implements the Nix language, which acts as a
+“frozen” interface. Package definitions in Nixpkgs are written in that
+language, and a given version of Nix can _possibly_ interpret both
+current and past package definitions without further ado. The Nix
+language does evolve though, so at one point an old Nix inevitably
+[becomes unable to evaluate a new
+Nixpkgs](https://github.com/NixOS/nixpkgs/blob/master/lib/minver.nix),
+and _vice versa_.
+
+These two approaches make different tradeoffs. Nix’ loose coupling
+simplifies the implementation and makes it easy to compose old and new
+package definitions, to some extent; Guix’ tight coupling makes such
+composition more difficult to implement, but it leaves developers more
+freedom and, we hope, may support “time travels” over longer period of
+times. Time will tell!
+
+# It’s like driving a DeLorean
+
+
+
+That profile generations are kept around already gave users a time
+machine of sorts—you can always roll back to a previous state of your
+software environment. With the addition of roll-back support for `guix
+pull`, this adds another dimension to the time machine: you can
+roll-back to a previous state of Guix itself and from there create
+alternative futures or even mix bits from the past with bits from the
+present. We hope you’ll enjoy it!
diff --git a/website/static/blog/img/guix-pull1.png
b/website/static/blog/img/guix-pull1.png
new file mode 100644
index 0000000..5d64538
Binary files /dev/null and b/website/static/blog/img/guix-pull1.png differ
diff --git a/website/static/blog/img/guix-pull1.svg
b/website/static/blog/img/guix-pull1.svg
new file mode 100644
index 0000000..8d19587
--- /dev/null
+++ b/website/static/blog/img/guix-pull1.svg
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="49.612511mm"
+ height="38.014778mm"
+ viewBox="0 0 49.612511 38.014778"
+ version="1.1"
+ id="svg4555"
+ inkscape:version="0.92.3 (2405546, 2018-03-11)"
+ sodipodi:docname="guix-pull1.svg">
+ <defs
+ id="defs4549" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="1"
+ inkscape:pageshadow="2"
+ inkscape:zoom="3.7810944"
+ inkscape:cx="82.648029"
+ inkscape:cy="71.838953"
+ inkscape:document-units="mm"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ inkscape:window-width="1198"
+ inkscape:window-height="1918"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="0" />
+ <metadata
+ id="metadata4552">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Tavolo 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-68.17583,-113.9511)">
+ <path
+ style="fill:#000080;fill-opacity:1;stroke-width:0.08466666"
+ d="m 96.508898,151.90988 c -0.03105,-0.031 -0.05645,-0.12769
-0.05645,-0.21478 0,-0.11334 0.174463,-0.2411 0.613833,-0.44954
0.529998,-0.25143 0.579144,-0.29238 0.359833,-0.29978 -0.300971,-0.0102
-0.946832,-0.23746 -1.206553,-0.42462 -0.299672,-0.21594 -0.766442,-1.0739
-1.031028,-1.89509 -0.353012,-1.09564 -0.85575,-2.21942 -1.29423,-2.89303
-0.500015,-0.76814 -1.369062,-1.65217 -1.847341,-1.8792 -0.426593,-0.20249
-1.209766,-0.33345 -1.857844,-0.31064 -0.360394,0.0127 -0.425336 [...]
+ id="path4538"
+ inkscape:connector-curvature="0"
+ inkscape:export-xdpi="204.78999"
+ inkscape:export-ydpi="204.78999" />
+ </g>
+</svg>
diff --git a/website/static/blog/img/guix-pull2.svg
b/website/static/blog/img/guix-pull2.svg
new file mode 100644
index 0000000..3f7d513
--- /dev/null
+++ b/website/static/blog/img/guix-pull2.svg
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="37.142097mm"
+ height="27.085258mm"
+ viewBox="0 0 37.142097 27.085258"
+ version="1.1"
+ id="svg834"
+ inkscape:version="0.92.3 (2405546, 2018-03-11)"
+ sodipodi:docname="guix-pull2.svg">
+ <defs
+ id="defs828" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.0505921"
+ inkscape:cx="70.189791"
+ inkscape:cy="51.184742"
+ inkscape:document-units="mm"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ inkscape:window-width="1198"
+ inkscape:window-height="1918"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="0" />
+ <metadata
+ id="metadata831">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Tavolo 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-71.387282,-106.56456)">
+ <path
+ style="fill:#800080;stroke-width:0.08466666;fill-opacity:1"
+ d="m 86.366963,133.46185 c -0.300784,-0.32018 -0.168301,-0.68572
0.137641,-0.37978 0.120086,0.12009 0.129921,-0.0853 0.04642,-0.96943
-0.04992,-0.52853 -0.06897,-0.5715 -0.253398,-0.5715 -0.244236,0
-0.258034,-0.17472 -0.03009,-0.381 0.117451,-0.1063 0.169333,-0.26077
0.169333,-0.50419 0,-0.57284 0.260301,-0.70948 0.635942,-0.33384
0.252787,0.25279 0.270115,0.67634 0.02692,0.65805 -0.08812,-0.007
-0.124461,0.0337 -0.09636,0.10691 0.02481,0.0647 -0.0015,0.17373
-0.05848,0.24238 -0. [...]
+ id="path817"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/website/static/blog/img/guix-pull3.png
b/website/static/blog/img/guix-pull3.png
new file mode 100644
index 0000000..d5f0a8c
Binary files /dev/null and b/website/static/blog/img/guix-pull3.png differ
diff --git a/website/static/blog/img/guix-pull3.svg
b/website/static/blog/img/guix-pull3.svg
new file mode 100644
index 0000000..e820b7a
--- /dev/null
+++ b/website/static/blog/img/guix-pull3.svg
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="77.602425mm"
+ height="37.504372mm"
+ viewBox="0 0 77.602425 37.504372"
+ version="1.1"
+ id="svg1419"
+ inkscape:version="0.92.3 (2405546, 2018-03-11)"
+ sodipodi:docname="guix-pull3.svg">
+ <defs
+ id="defs1413" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1.9032679"
+ inkscape:cx="168.20973"
+ inkscape:cy="80.254816"
+ inkscape:document-units="mm"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ inkscape:window-width="1198"
+ inkscape:window-height="1918"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="0" />
+ <metadata
+ id="metadata1416">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Tavolo 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-36.413582,-114.42019)">
+ <path
+ style="fill:#800080;fill-opacity:1;stroke-width:0.08466666"
+ d="m 51.393263,147.40785 c -0.300784,-0.32018 -0.168301,-0.68572
0.137641,-0.37978 0.120086,0.12009 0.129921,-0.0853 0.04642,-0.96943
-0.04992,-0.52853 -0.06897,-0.5715 -0.253398,-0.5715 -0.244236,0
-0.258034,-0.17472 -0.03009,-0.381 0.117451,-0.1063 0.169333,-0.26077
0.169333,-0.50419 0,-0.57284 0.260301,-0.70948 0.635942,-0.33384
0.252787,0.25279 0.270115,0.67634 0.02692,0.65805 -0.08812,-0.007
-0.124461,0.0337 -0.09636,0.10691 0.02481,0.0647 -0.0015,0.17373
-0.05848,0.24238 -0. [...]
+ id="path817"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#000080;fill-opacity:1;stroke-width:0.08466666"
+ d="m 92.045921,151.86235 c -0.0299,-0.032 -0.05193,-0.12957
-0.0489,-0.21661 0.0039,-0.11327 0.182734,-0.23489 0.629082,-0.42793
0.538418,-0.23286 0.588961,-0.27208 0.370041,-0.2871 -0.300434,-0.0207
-0.938006,-0.27022 -1.191065,-0.46629 -0.291994,-0.22622 -0.728666,-1.09989
-0.964548,-1.92978 -0.31473,-1.10724 -0.778102,-2.24782 -1.192908,-2.93626
-0.473023,-0.78505 -1.310826,-1.69875 -1.780927,-1.94226 -0.419295,-0.21719
-1.197441,-0.37529 -1.845922,-0.37502 -0.360614,1.7e-4 -0. [...]
+ id="path4538"
+ inkscape:connector-curvature="0"
+ inkscape:export-xdpi="204.78999"
+ inkscape:export-ydpi="204.78999"
+
sodipodi:nodetypes="cscccccccsccccccccsccscscccsccsccccccsccccccsccsccccccccccsccscccccscccccccccccsccccssccccccccccscccccscccscccscccccccccccccscccccccccccccccccccccsccccccssccccscccccccccccsccccccccccscccscccscccccccccccscccsccccccccccccccccsccccccccccccccccccccccccscccccccccscccccscscsccccccccccccccccccccccccccsccccsccccccccsccccsccscccccsccccsccccccccccccccccccccccccccscscssssscccccccsccccccccccccccccccccscccscccccccccccccccccccsccscsscsccccccccscsccscccccccccccccccscccccccccc
[...]
+ </g>
+</svg>