Fossil SCM

Updated the "Image Format vs Fossil Repo Size" doc and its associated notebook and SVG file: smarter initial repo size handling so we don't have to throw away the first 3 rows of data; now works with Anaconda, allowing simpler local replication of results; using /tmp for the test instead of relying on "open --nested" to protect us from running the experiment in-tree; clarified discussion of results.

wyoung 2020-06-26 21:49 trunk
Commit f281b3dfb794f0b9695dfaa19a98f92030864992994e8393ce789d1842e8e46b
--- www/image-format-vs-repo-size.ipynb
+++ www/image-format-vs-repo-size.ipynb
@@ -6,28 +6,32 @@
66
"source": [
77
"# Image Format vs Fossil Repository Size\n",
88
"\n",
99
"## Prerequisites\n",
1010
"\n",
11
- "This notebook was developed with [JupyterLab][jl]. To follow in my footsteps, install that and the needed Python packages:\n",
12
- "\n",
13
- " $ pip install jupyterlab matplotlib pandas wand\n",
14
- "\n",
15
- "In principle, it should also work with [Anaconda Navigator][an], but because [Wand][wp] is not currently in the Anaconda base package set, you may run into difficulties making it work, as we did on macOS. There seems to be some sandboxing that causes problems with OS interaction in that environment. Therefore, we recommend using straight JupyterLab.\n",
16
- "\n",
17
- "This notebook was originally written for the Python 2 kernel because macOS does not include Python 3, but it was later updated for Python 3. It should still be compatible with Python 2, though.\n",
18
- "\n",
19
- "[an]: https://www.anaconda.com/distribution/\n",
20
- "[jl]: https://github.com/jupyterlab/\n",
21
- "[wp]: http://wand-py.org/\n",
11
+ "This notebook was originally developed with standalone [JupyterLab] and Python 2 but was later moved to JupyterLab under [Anaconda] with Python 3. Backporting to Python 2 may require manual adjustment. Getting it running under stock JupyterLab or plain-old-Jupyter should be straightforward for one familiar with the tools. We will assume you're following in my footsteps, using Anaconda.\n",
12
+ "\n",
13
+ "One of the reasons we switched to Anaconda is that it comes with all but one of this notebook's prerequisites, that last remaining one of which you install so:\n",
14
+ "\n",
15
+ " $ pip install wand\n",
16
+ "\n",
17
+ "That should be done in a shell where \"`pip`\" is the version that came with Anaconda. Otherwise, the package will likely end up in some *other* Python package tree, which Anaconda's Python kernel may not be smart enough to find on its own.\n",
18
+ "\n",
19
+ "Note that you do *not* use `conda` for this: as of this writing, [Wand] is not available in a form that installs via `conda`.\n",
20
+ "\n",
21
+ "This notebook was written and tested on a macOS system where `/tmp` exists. Other platforms may require adjustments to the scripts below.\n",
22
+ "\n",
23
+ "[Anaconda]: https://www.anaconda.com/distribution/\n",
24
+ "[JupyterLab]: https://github.com/jupyterlab/\n",
25
+ "[Wand]: http://wand-py.org/\n",
2226
"\n",
2327
"\n",
2428
"## Running\n",
2529
"\n",
26
- "The next cell generates the test repositories. This takes about 45 seconds to run, primarily due to the `sleep 1` synchronization call, made 40 times in the main test loop.\n",
30
+ "The next cell generates the test repositories. This takes about 3 seconds to run on my machine. If you have to uncomment the \"`sleep`\" call in the inner loop, this will go up to about 45 seconds.\n",
2731
"\n",
28
- "The one after that produces the bar chart from the collected data, all but instantaneously.\n",
32
+ "The next cell produces the bar chart from the collected data, all but instantaneously.\n",
2933
"\n",
3034
"This split allows you to generate the expensive experimental data in a single pass, then play as many games as you like with the generated data.\n",
3135
"\n",
3236
"\n",
3337
"## Discussion\n",
@@ -42,17 +46,23 @@
4246
"outputs": [
4347
{
4448
"name": "stdout",
4549
"output_type": "stream",
4650
"text": [
47
- "Experiment completed in 44.186978816986084 seconds.\n"
51
+ "Created test directory /tmp/image-format-vs-repo-size\n",
52
+ "Created ../test-jpeg.fossil for format JPEG.\n",
53
+ "Created ../test-bmp.fossil for format BMP.\n",
54
+ "Created ../test-tiff.fossil for format TIFF.\n",
55
+ "Created ../test-png.fossil for format PNG.\n",
56
+ "Experiment completed in 3.0627901554107666 seconds.\n"
4857
]
4958
}
5059
],
5160
"source": [
5261
"import os\n",
5362
"import random\n",
63
+ "import subprocess\n",
5464
"import time\n",
5565
"\n",
5666
"from wand.color import Color\n",
5767
"from wand.drawing import Drawing\n",
5868
"from wand.image import Image\n",
@@ -61,50 +71,67 @@
6171
"\n",
6272
"size = 256\n",
6373
"iterations = 10\n",
6474
"start = time.time()\n",
6575
"repo_sizes = []\n",
76
+ "fossil = '/usr/local/bin/fossil'\n",
77
+ "\n",
78
+ "if not os.path.isfile(fossil): raise RuntimeError(\"No such executable \" + fossil)\n",
79
+ "if not os.access(fossil, os.X_OK): raise RuntimeError(\"Cannot execute \" + fossil)\n",
6680
"\n",
81
+ "tdir = os.path.join('/tmp', 'image-format-vs-repo-size')\n",
82
+ "if not os.path.isdir(tdir): os.mkdir(tdir, 0o700)\n",
83
+ "print(\"Created test directory \" + tdir)\n",
84
+ " \n",
6785
"formats = ['JPEG', 'BMP', 'TIFF', 'PNG']\n",
6886
"for f in formats:\n",
6987
" ext = f.lower()\n",
70
- " tdir = 'test' + '-' + ext\n",
71
- " repo = tdir + '.fossil'\n",
88
+ " wdir = os.path.join(tdir, 'work-' + ext)\n",
89
+ " if not os.path.isdir(wdir): os.mkdir(wdir, 0o700)\n",
90
+ " os.chdir(wdir)\n",
91
+ " repo = '../test-' + ext + '.fossil'\n",
7292
" ifn = 'test.' + ext\n",
73
- " ipath = os.path.join(tdir, ifn)\n",
93
+ " ipath = os.path.join(wdir, ifn)\n",
7494
" rs = []\n",
7595
" \n",
7696
" def add_repo_size():\n",
7797
" rs.append(os.path.getsize(repo) / 1024.0 / 1024.0)\n",
98
+ " \n",
99
+ " def set_repo_page_size(n):\n",
100
+ " subprocess.run([\n",
101
+ " fossil,\n",
102
+ " 'rebuild',\n",
103
+ " '--compress',\n",
104
+ " '--pagesize',\n",
105
+ " str(n),\n",
106
+ " '--vacuum'\n",
107
+ " ])\n",
78108
"\n",
79109
" try:\n",
80110
" # Create test repo\n",
81
- " if not os.path.exists(tdir): os.mkdir(tdir, 0o700)\n",
82
- " cmd = 'cd {0} ; fossil init ../{1} && fossil open --nested ../{1} && fossil set binary-glob \"*.{2}\"'.format(\n",
83
- " tdir, repo, ext\n",
84
- " )\n",
85
- " if os.system(cmd) != 0:\n",
86
- " raise RuntimeError('Failed to create test repo ' + repo)\n",
111
+ " subprocess.run([fossil, 'init', repo])\n",
112
+ " subprocess.run([fossil, 'open', repo])\n",
113
+ " subprocess.run([fossil, 'set', 'binary-glob', \"*.{0}\".format(ext)])\n",
114
+ " set_repo_page_size(512) # minimum\n",
87115
" add_repo_size()\n",
116
+ " set_repo_page_size(8192) # default\n",
117
+ " print(\"Created \" + repo + \" for format \" + f + \".\")\n",
88118
"\n",
89119
" # Create test image and add it to the repo\n",
90120
" img = Image(width = size, height = size, depth = 8,\n",
91121
" background = 'white')\n",
92122
" img.alpha_channel = 'remove'\n",
93123
" img.evaluate('gaussiannoise', 1.0)\n",
94124
" img.save(filename = ipath)\n",
95
- " cmd = 'cd {0} ; fossil add {1} && fossil ci -m \"initial\"'.format(\n",
96
- " tdir, ifn\n",
97
- " )\n",
98
- " if os.system(cmd) != 0:\n",
99
- " raise RuntimeError('Failed to add ' + ifn + ' to test repo')\n",
100
- " #print \"Created test repo \" + repo + \" for format \" + f + \".\"\n",
125
+ " subprocess.run([fossil, 'add', ifn])\n",
126
+ " subprocess.run([fossil, 'ci', '-m', 'initial'])\n",
127
+ " #print(\"Added initial \" + f + \" image.\")\n",
101128
" add_repo_size()\n",
102129
"\n",
103130
" # Change a random pixel to a random RGB value and check it in\n",
104131
" # $iterations times.\n",
105
- " for i in range(iterations):\n",
132
+ " for i in range(iterations - 1):\n",
106133
" with Drawing() as draw:\n",
107134
" x = random.randint(0, size - 1)\n",
108135
" y = random.randint(0, size - 1)\n",
109136
"\n",
110137
" r = random.randint(0, 255)\n",
@@ -116,372 +143,474 @@
116143
" ))\n",
117144
" draw.color(x, y, 'point')\n",
118145
" draw(img)\n",
119146
" img.save(filename = ipath)\n",
120147
" \n",
121
- " # ImageMagick appears to use some kind of asynchronous\n",
122
- " # file saving mechanism, so we have to give it time to\n",
123
- " # complete.\n",
124
- " time.sleep(1.0)\n",
148
+ " # You might need to uncomment the next line if you find that\n",
149
+ " # the repo size doesn't change as expected. In some versions\n",
150
+ " # of Wand (or is it the ImageMagick underneath?) we have seen\n",
151
+ " # what appear to be asynchronous saves, with a zero-length file\n",
152
+ " # here if you don't wait for the save to complete.\n",
153
+ " #time.sleep(1.0)\n",
125154
" \n",
126
- " cmd = 'cd {0} ; fossil ci -m \"change {1} step {2}\"'.format(\n",
127
- " tdir, f, i\n",
128
- " )\n",
129
- " if os.system(cmd) != 0:\n",
130
- " raise RuntimeError('Failed to change ' + f + ' image, step ' + str(i))\n",
155
+ " subprocess.run([fossil, 'ci', '-m', '\"change {0} step {1}'.format(\n",
156
+ " f, i\n",
157
+ " )])\n",
131158
" add_repo_size()\n",
132159
" \n",
133160
" # Repo complete for this format\n",
134161
" repo_sizes.append(pd.Series(rs, name=f))\n",
135162
"\n",
136163
" finally:\n",
137164
" if os.path.exists(ipath): os.remove(ipath)\n",
138165
" if os.path.exists(tdir):\n",
139
- " os.system('cd ' + tdir + ' ; fossil close -f')\n",
140
- " os.rmdir(tdir)\n",
166
+ " if os.path.isfile(repo):\n",
167
+ " subprocess.run([fossil, 'close', '-f'])\n",
168
+ " os.unlink(repo)\n",
169
+ " os.chdir(tdir);\n",
170
+ " os.rmdir(wdir)\n",
141171
" if os.path.exists(repo): os.remove(repo)\n",
142172
" \n",
143173
"print(\"Experiment completed in \" + str(time.time() - start) + \" seconds.\")"
144174
]
145175
},
146176
{
147177
"cell_type": "code",
148
- "execution_count": 2,
178
+ "execution_count": 1,
149179
"metadata": {},
150180
"outputs": [
151181
{
152182
"data": {
153183
"image/svg+xml": [
154184
"<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\n",
155185
"<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
156186
" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
157187
"<!-- Created with matplotlib (https://matplotlib.org/) -->\n",
158
- "<svg height=\"268.743125pt\" version=\"1.1\" viewBox=\"0 0 389.28125 268.743125\" width=\"389.28125pt\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
188
+ "<svg height=\"265.243125pt\" version=\"1.1\" viewBox=\"0 0 385.78125 265.243125\" width=\"385.78125pt\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
159189
" <defs>\n",
160190
" <style type=\"text/css\">\n",
161191
"*{stroke-linecap:butt;stroke-linejoin:round;}\n",
162192
" </style>\n",
163193
" </defs>\n",
164194
" <g id=\"figure_1\">\n",
165195
" <g id=\"patch_1\">\n",
166
- " <path d=\"M 0 268.743125 \n",
167
- "L 389.28125 268.743125 \n",
168
- "L 389.28125 0 \n",
196
+ " <path d=\"M 0 265.243125 \n",
197
+ "L 385.78125 265.243125 \n",
198
+ "L 385.78125 0 \n",
169199
"L 0 0 \n",
170200
"z\n",
171201
"\" style=\"fill:none;\"/>\n",
172202
" </g>\n",
173203
" <g id=\"axes_1\">\n",
174204
" <g id=\"patch_2\">\n",
175
- " <path d=\"M 43.78125 228.14 \n",
176
- "L 378.58125 228.14 \n",
177
- "L 378.58125 10.7 \n",
178
- "L 43.78125 10.7 \n",
205
+ " <path d=\"M 43.78125 224.64 \n",
206
+ "L 378.58125 224.64 \n",
207
+ "L 378.58125 7.2 \n",
208
+ "L 43.78125 7.2 \n",
179209
"z\n",
180210
"\" style=\"fill:#ffffff;\"/>\n",
181211
" </g>\n",
182212
" <g id=\"patch_3\">\n",
183
- " <path clip-path=\"url(#p836f19e185)\" d=\"M 52.78125 228.14 \n",
184
- "L 59.98125 228.14 \n",
185
- "L 59.98125 154.732751 \n",
186
- "L 52.78125 154.732751 \n",
213
+ " <path clip-path=\"url(#p70301a0bed)\" d=\"M 51.907464 224.64 \n",
214
+ "L 58.408434 224.64 \n",
215
+ "L 58.408434 138.354286 \n",
216
+ "L 51.907464 138.354286 \n",
187217
"z\n",
188218
"\" style=\"fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
189219
" </g>\n",
190220
" <g id=\"patch_4\">\n",
191
- " <path clip-path=\"url(#p836f19e185)\" d=\"M 88.78125 228.14 \n",
192
- "L 95.98125 228.14 \n",
193
- "L 95.98125 154.732751 \n",
194
- "L 88.78125 154.732751 \n",
221
+ " <path clip-path=\"url(#p70301a0bed)\" d=\"M 84.412318 224.64 \n",
222
+ "L 90.913289 224.64 \n",
223
+ "L 90.913289 126.849524 \n",
224
+ "L 84.412318 126.849524 \n",
195225
"z\n",
196226
"\" style=\"fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
197227
" </g>\n",
198228
" <g id=\"patch_5\">\n",
199
- " <path clip-path=\"url(#p836f19e185)\" d=\"M 124.78125 228.14 \n",
200
- "L 131.98125 228.14 \n",
201
- "L 131.98125 144.687548 \n",
202
- "L 124.78125 144.687548 \n",
229
+ " <path clip-path=\"url(#p70301a0bed)\" d=\"M 116.917172 224.64 \n",
230
+ "L 123.418143 224.64 \n",
231
+ "L 123.418143 118.220952 \n",
232
+ "L 116.917172 118.220952 \n",
203233
"z\n",
204234
"\" style=\"fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
205235
" </g>\n",
206236
" <g id=\"patch_6\">\n",
207
- " <path clip-path=\"url(#p836f19e185)\" d=\"M 160.78125 228.14 \n",
208
- "L 167.98125 228.14 \n",
209
- "L 167.98125 130.006098 \n",
210
- "L 160.78125 130.006098 \n",
237
+ " <path clip-path=\"url(#p70301a0bed)\" d=\"M 149.422027 224.64 \n",
238
+ "L 155.922998 224.64 \n",
239
+ "L 155.922998 112.468571 \n",
240
+ "L 149.422027 112.468571 \n",
211241
"z\n",
212242
"\" style=\"fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
213243
" </g>\n",
214244
" <g id=\"patch_7\">\n",
215
- " <path clip-path=\"url(#p836f19e185)\" d=\"M 196.78125 228.14 \n",
216
- "L 203.98125 228.14 \n",
217
- "L 203.98125 128.460682 \n",
218
- "L 196.78125 128.460682 \n",
245
+ " <path clip-path=\"url(#p70301a0bed)\" d=\"M 181.926881 224.64 \n",
246
+ "L 188.427852 224.64 \n",
247
+ "L 188.427852 109.592381 \n",
248
+ "L 181.926881 109.592381 \n",
219249
"z\n",
220250
"\" style=\"fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
221251
" </g>\n",
222252
" <g id=\"patch_8\">\n",
223
- " <path clip-path=\"url(#p836f19e185)\" d=\"M 232.78125 228.14 \n",
224
- "L 239.98125 228.14 \n",
225
- "L 239.98125 126.915267 \n",
226
- "L 232.78125 126.915267 \n",
253
+ " <path clip-path=\"url(#p70301a0bed)\" d=\"M 214.431735 224.64 \n",
254
+ "L 220.932706 224.64 \n",
255
+ "L 220.932706 103.84 \n",
256
+ "L 214.431735 103.84 \n",
227257
"z\n",
228258
"\" style=\"fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
229259
" </g>\n",
230260
" <g id=\"patch_9\">\n",
231
- " <path clip-path=\"url(#p836f19e185)\" d=\"M 268.78125 228.14 \n",
232
- "L 275.98125 228.14 \n",
233
- "L 275.98125 126.915267 \n",
234
- "L 268.78125 126.915267 \n",
261
+ " <path clip-path=\"url(#p70301a0bed)\" d=\"M 246.93659 224.64 \n",
262
+ "L 253.437561 224.64 \n",
263
+ "L 253.437561 98.087619 \n",
264
+ "L 246.93659 98.087619 \n",
235265
"z\n",
236266
"\" style=\"fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
237267
" </g>\n",
238268
" <g id=\"patch_10\">\n",
239
- " <path clip-path=\"url(#p836f19e185)\" d=\"M 304.78125 228.14 \n",
240
- "L 311.98125 228.14 \n",
241
- "L 311.98125 116.870064 \n",
242
- "L 304.78125 116.870064 \n",
269
+ " <path clip-path=\"url(#p70301a0bed)\" d=\"M 279.441444 224.64 \n",
270
+ "L 285.942415 224.64 \n",
271
+ "L 285.942415 98.087619 \n",
272
+ "L 279.441444 98.087619 \n",
243273
"z\n",
244274
"\" style=\"fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
245275
" </g>\n",
246276
" <g id=\"patch_11\">\n",
247
- " <path clip-path=\"url(#p836f19e185)\" d=\"M 340.78125 228.14 \n",
248
- "L 347.98125 228.14 \n",
249
- "L 347.98125 110.688401 \n",
250
- "L 340.78125 110.688401 \n",
277
+ " <path clip-path=\"url(#p70301a0bed)\" d=\"M 311.946299 224.64 \n",
278
+ "L 318.447269 224.64 \n",
279
+ "L 318.447269 82.268571 \n",
280
+ "L 311.946299 82.268571 \n",
251281
"z\n",
252282
"\" style=\"fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
253283
" </g>\n",
254284
" <g id=\"patch_12\">\n",
255
- " <path clip-path=\"url(#p836f19e185)\" d=\"M 59.98125 228.14 \n",
256
- "L 67.18125 228.14 \n",
257
- "L 67.18125 118.41548 \n",
258
- "L 59.98125 118.41548 \n",
285
+ " <path clip-path=\"url(#p70301a0bed)\" d=\"M 344.451153 224.64 \n",
286
+ "L 350.952124 224.64 \n",
287
+ "L 350.952124 77.954286 \n",
288
+ "L 344.451153 77.954286 \n",
259289
"z\n",
260
- "\" style=\"fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
290
+ "\" style=\"fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
261291
" </g>\n",
262292
" <g id=\"patch_13\">\n",
263
- " <path clip-path=\"url(#p836f19e185)\" d=\"M 95.98125 228.14 \n",
264
- "L 103.18125 228.14 \n",
265
- "L 103.18125 118.41548 \n",
266
- "L 95.98125 118.41548 \n",
293
+ " <path clip-path=\"url(#p70301a0bed)\" d=\"M 58.408434 224.64 \n",
294
+ "L 64.909405 224.64 \n",
295
+ "L 64.909405 125.411429 \n",
296
+ "L 58.408434 125.411429 \n",
267297
"z\n",
268298
"\" style=\"fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
269299
" </g>\n",
270300
" <g id=\"patch_14\">\n",
271
- " <path clip-path=\"url(#p836f19e185)\" d=\"M 131.98125 228.14 \n",
272
- "L 139.18125 228.14 \n",
273
- "L 139.18125 118.41548 \n",
274
- "L 131.98125 118.41548 \n",
301
+ " <path clip-path=\"url(#p70301a0bed)\" d=\"M 90.913289 224.64 \n",
302
+ "L 97.41426 224.64 \n",
303
+ "L 97.41426 105.278095 \n",
304
+ "L 90.913289 105.278095 \n",
275305
"z\n",
276306
"\" style=\"fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
277307
" </g>\n",
278308
" <g id=\"patch_15\">\n",
279
- " <path clip-path=\"url(#p836f19e185)\" d=\"M 167.98125 228.14 \n",
280
- "L 175.18125 228.14 \n",
281
- "L 175.18125 118.41548 \n",
282
- "L 167.98125 118.41548 \n",
309
+ " <path clip-path=\"url(#p70301a0bed)\" d=\"M 123.418143 224.64 \n",
310
+ "L 129.919114 224.64 \n",
311
+ "L 129.919114 105.278095 \n",
312
+ "L 123.418143 105.278095 \n",
283313
"z\n",
284314
"\" style=\"fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
285315
" </g>\n",
286316
" <g id=\"patch_16\">\n",
287
- " <path clip-path=\"url(#p836f19e185)\" d=\"M 203.98125 228.14 \n",
288
- "L 211.18125 228.14 \n",
289
- "L 211.18125 118.41548 \n",
290
- "L 203.98125 118.41548 \n",
317
+ " <path clip-path=\"url(#p70301a0bed)\" d=\"M 155.922998 224.64 \n",
318
+ "L 162.423968 224.64 \n",
319
+ "L 162.423968 105.278095 \n",
320
+ "L 155.922998 105.278095 \n",
291321
"z\n",
292322
"\" style=\"fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
293323
" </g>\n",
294324
" <g id=\"patch_17\">\n",
295
- " <path clip-path=\"url(#p836f19e185)\" d=\"M 239.98125 228.14 \n",
296
- "L 247.18125 228.14 \n",
297
- "L 247.18125 118.41548 \n",
298
- "L 239.98125 118.41548 \n",
325
+ " <path clip-path=\"url(#p70301a0bed)\" d=\"M 188.427852 224.64 \n",
326
+ "L 194.928823 224.64 \n",
327
+ "L 194.928823 105.278095 \n",
328
+ "L 188.427852 105.278095 \n",
299329
"z\n",
300330
"\" style=\"fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
301331
" </g>\n",
302332
" <g id=\"patch_18\">\n",
303
- " <path clip-path=\"url(#p836f19e185)\" d=\"M 275.98125 228.14 \n",
304
- "L 283.18125 228.14 \n",
305
- "L 283.18125 118.41548 \n",
306
- "L 275.98125 118.41548 \n",
333
+ " <path clip-path=\"url(#p70301a0bed)\" d=\"M 220.932706 224.64 \n",
334
+ "L 227.433677 224.64 \n",
335
+ "L 227.433677 105.278095 \n",
336
+ "L 220.932706 105.278095 \n",
307337
"z\n",
308338
"\" style=\"fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
309339
" </g>\n",
310340
" <g id=\"patch_19\">\n",
311
- " <path clip-path=\"url(#p836f19e185)\" d=\"M 311.98125 228.14 \n",
312
- "L 319.18125 228.14 \n",
313
- "L 319.18125 117.642772 \n",
314
- "L 311.98125 117.642772 \n",
341
+ " <path clip-path=\"url(#p70301a0bed)\" d=\"M 253.437561 224.64 \n",
342
+ "L 259.938532 224.64 \n",
343
+ "L 259.938532 105.278095 \n",
344
+ "L 253.437561 105.278095 \n",
315345
"z\n",
316346
"\" style=\"fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
317347
" </g>\n",
318348
" <g id=\"patch_20\">\n",
319
- " <path clip-path=\"url(#p836f19e185)\" d=\"M 347.98125 228.14 \n",
320
- "L 355.18125 228.14 \n",
321
- "L 355.18125 117.642772 \n",
322
- "L 347.98125 117.642772 \n",
349
+ " <path clip-path=\"url(#p70301a0bed)\" d=\"M 285.942415 224.64 \n",
350
+ "L 292.443386 224.64 \n",
351
+ "L 292.443386 105.278095 \n",
352
+ "L 285.942415 105.278095 \n",
323353
"z\n",
324354
"\" style=\"fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
325355
" </g>\n",
326356
" <g id=\"patch_21\">\n",
327
- " <path clip-path=\"url(#p836f19e185)\" d=\"M 67.18125 228.14 \n",
328
- "L 74.38125 228.14 \n",
329
- "L 74.38125 118.41548 \n",
330
- "L 67.18125 118.41548 \n",
357
+ " <path clip-path=\"url(#p70301a0bed)\" d=\"M 318.447269 224.64 \n",
358
+ "L 324.94824 224.64 \n",
359
+ "L 324.94824 105.278095 \n",
360
+ "L 318.447269 105.278095 \n",
331361
"z\n",
332
- "\" style=\"fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
362
+ "\" style=\"fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
333363
" </g>\n",
334364
" <g id=\"patch_22\">\n",
335
- " <path clip-path=\"url(#p836f19e185)\" d=\"M 103.18125 228.14 \n",
336
- "L 110.38125 228.14 \n",
337
- "L 110.38125 118.41548 \n",
338
- "L 103.18125 118.41548 \n",
365
+ " <path clip-path=\"url(#p70301a0bed)\" d=\"M 350.952124 224.64 \n",
366
+ "L 357.453095 224.64 \n",
367
+ "L 357.453095 105.278095 \n",
368
+ "L 350.952124 105.278095 \n",
339369
"z\n",
340
- "\" style=\"fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
370
+ "\" style=\"fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
341371
" </g>\n",
342372
" <g id=\"patch_23\">\n",
343
- " <path clip-path=\"url(#p836f19e185)\" d=\"M 139.18125 228.14 \n",
344
- "L 146.38125 228.14 \n",
345
- "L 146.38125 118.41548 \n",
346
- "L 139.18125 118.41548 \n",
373
+ " <path clip-path=\"url(#p70301a0bed)\" d=\"M 64.909405 224.64 \n",
374
+ "L 71.410376 224.64 \n",
375
+ "L 71.410376 128.287619 \n",
376
+ "L 64.909405 128.287619 \n",
347377
"z\n",
348378
"\" style=\"fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
349379
" </g>\n",
350380
" <g id=\"patch_24\">\n",
351
- " <path clip-path=\"url(#p836f19e185)\" d=\"M 175.18125 228.14 \n",
352
- "L 182.38125 228.14 \n",
353
- "L 182.38125 118.41548 \n",
354
- "L 175.18125 118.41548 \n",
381
+ " <path clip-path=\"url(#p70301a0bed)\" d=\"M 97.41426 224.64 \n",
382
+ "L 103.915231 224.64 \n",
383
+ "L 103.915231 108.154286 \n",
384
+ "L 97.41426 108.154286 \n",
355385
"z\n",
356386
"\" style=\"fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
357387
" </g>\n",
358388
" <g id=\"patch_25\">\n",
359
- " <path clip-path=\"url(#p836f19e185)\" d=\"M 211.18125 228.14 \n",
360
- "L 218.38125 228.14 \n",
361
- "L 218.38125 118.41548 \n",
362
- "L 211.18125 118.41548 \n",
389
+ " <path clip-path=\"url(#p70301a0bed)\" d=\"M 129.919114 224.64 \n",
390
+ "L 136.420085 224.64 \n",
391
+ "L 136.420085 108.154286 \n",
392
+ "L 129.919114 108.154286 \n",
363393
"z\n",
364394
"\" style=\"fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
365395
" </g>\n",
366396
" <g id=\"patch_26\">\n",
367
- " <path clip-path=\"url(#p836f19e185)\" d=\"M 247.18125 228.14 \n",
368
- "L 254.38125 228.14 \n",
369
- "L 254.38125 118.41548 \n",
370
- "L 247.18125 118.41548 \n",
397
+ " <path clip-path=\"url(#p70301a0bed)\" d=\"M 162.423968 224.64 \n",
398
+ "L 168.924939 224.64 \n",
399
+ "L 168.924939 108.154286 \n",
400
+ "L 162.423968 108.154286 \n",
371401
"z\n",
372402
"\" style=\"fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
373403
" </g>\n",
374404
" <g id=\"patch_27\">\n",
375
- " <path clip-path=\"url(#p836f19e185)\" d=\"M 283.18125 228.14 \n",
376
- "L 290.38125 228.14 \n",
377
- "L 290.38125 118.41548 \n",
378
- "L 283.18125 118.41548 \n",
405
+ " <path clip-path=\"url(#p70301a0bed)\" d=\"M 194.928823 224.64 \n",
406
+ "L 201.429794 224.64 \n",
407
+ "L 201.429794 108.154286 \n",
408
+ "L 194.928823 108.154286 \n",
379409
"z\n",
380410
"\" style=\"fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
381411
" </g>\n",
382412
" <g id=\"patch_28\">\n",
383
- " <path clip-path=\"url(#p836f19e185)\" d=\"M 319.18125 228.14 \n",
384
- "L 326.38125 228.14 \n",
385
- "L 326.38125 117.642772 \n",
386
- "L 319.18125 117.642772 \n",
413
+ " <path clip-path=\"url(#p70301a0bed)\" d=\"M 227.433677 224.64 \n",
414
+ "L 233.934648 224.64 \n",
415
+ "L 233.934648 108.154286 \n",
416
+ "L 227.433677 108.154286 \n",
387417
"z\n",
388418
"\" style=\"fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
389419
" </g>\n",
390420
" <g id=\"patch_29\">\n",
391
- " <path clip-path=\"url(#p836f19e185)\" d=\"M 355.18125 228.14 \n",
392
- "L 362.38125 228.14 \n",
393
- "L 362.38125 117.642772 \n",
394
- "L 355.18125 117.642772 \n",
421
+ " <path clip-path=\"url(#p70301a0bed)\" d=\"M 259.938532 224.64 \n",
422
+ "L 266.439502 224.64 \n",
423
+ "L 266.439502 108.154286 \n",
424
+ "L 259.938532 108.154286 \n",
395425
"z\n",
396426
"\" style=\"fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
397427
" </g>\n",
398428
" <g id=\"patch_30\">\n",
399
- " <path clip-path=\"url(#p836f19e185)\" d=\"M 74.38125 228.14 \n",
400
- "L 81.58125 228.14 \n",
401
- "L 81.58125 119.188188 \n",
402
- "L 74.38125 119.188188 \n",
429
+ " <path clip-path=\"url(#p70301a0bed)\" d=\"M 292.443386 224.64 \n",
430
+ "L 298.944357 224.64 \n",
431
+ "L 298.944357 108.154286 \n",
432
+ "L 292.443386 108.154286 \n",
403433
"z\n",
404
- "\" style=\"fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
434
+ "\" style=\"fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
405435
" </g>\n",
406436
" <g id=\"patch_31\">\n",
407
- " <path clip-path=\"url(#p836f19e185)\" d=\"M 110.38125 228.14 \n",
408
- "L 117.58125 228.14 \n",
409
- "L 117.58125 104.506738 \n",
410
- "L 110.38125 104.506738 \n",
437
+ " <path clip-path=\"url(#p70301a0bed)\" d=\"M 324.94824 224.64 \n",
438
+ "L 331.449211 224.64 \n",
439
+ "L 331.449211 108.154286 \n",
440
+ "L 324.94824 108.154286 \n",
411441
"z\n",
412
- "\" style=\"fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
442
+ "\" style=\"fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
413443
" </g>\n",
414444
" <g id=\"patch_32\">\n",
415
- " <path clip-path=\"url(#p836f19e185)\" d=\"M 146.38125 228.14 \n",
416
- "L 153.58125 228.14 \n",
417
- "L 153.58125 88.279872 \n",
418
- "L 146.38125 88.279872 \n",
445
+ " <path clip-path=\"url(#p70301a0bed)\" d=\"M 357.453095 224.64 \n",
446
+ "L 363.954066 224.64 \n",
447
+ "L 363.954066 108.154286 \n",
448
+ "L 357.453095 108.154286 \n",
419449
"z\n",
420
- "\" style=\"fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
450
+ "\" style=\"fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
421451
" </g>\n",
422452
" <g id=\"patch_33\">\n",
423
- " <path clip-path=\"url(#p836f19e185)\" d=\"M 182.38125 228.14 \n",
424
- "L 189.58125 228.14 \n",
425
- "L 189.58125 77.461962 \n",
426
- "L 182.38125 77.461962 \n",
453
+ " <path clip-path=\"url(#p70301a0bed)\" d=\"M 71.410376 224.64 \n",
454
+ "L 77.911347 224.64 \n",
455
+ "L 77.911347 129.725714 \n",
456
+ "L 71.410376 129.725714 \n",
427457
"z\n",
428458
"\" style=\"fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
429459
" </g>\n",
430460
" <g id=\"patch_34\">\n",
431
- " <path clip-path=\"url(#p836f19e185)\" d=\"M 218.38125 228.14 \n",
432
- "L 225.58125 228.14 \n",
433
- "L 225.58125 73.598422 \n",
434
- "L 218.38125 73.598422 \n",
461
+ " <path clip-path=\"url(#p70301a0bed)\" d=\"M 103.915231 224.64 \n",
462
+ "L 110.416201 224.64 \n",
463
+ "L 110.416201 111.030476 \n",
464
+ "L 103.915231 111.030476 \n",
435465
"z\n",
436466
"\" style=\"fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
437467
" </g>\n",
438468
" <g id=\"patch_35\">\n",
439
- " <path clip-path=\"url(#p836f19e185)\" d=\"M 254.38125 228.14 \n",
440
- "L 261.58125 228.14 \n",
441
- "L 261.58125 57.371557 \n",
442
- "L 254.38125 57.371557 \n",
469
+ " <path clip-path=\"url(#p70301a0bed)\" d=\"M 136.420085 224.64 \n",
470
+ "L 142.921056 224.64 \n",
471
+ "L 142.921056 80.830476 \n",
472
+ "L 136.420085 80.830476 \n",
443473
"z\n",
444474
"\" style=\"fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
445475
" </g>\n",
446476
" <g id=\"patch_36\">\n",
447
- " <path clip-path=\"url(#p836f19e185)\" d=\"M 290.38125 228.14 \n",
448
- "L 297.58125 228.14 \n",
449
- "L 297.58125 57.371557 \n",
450
- "L 290.38125 57.371557 \n",
477
+ " <path clip-path=\"url(#p70301a0bed)\" d=\"M 168.924939 224.64 \n",
478
+ "L 175.42591 224.64 \n",
479
+ "L 175.42591 75.078095 \n",
480
+ "L 168.924939 75.078095 \n",
451481
"z\n",
452482
"\" style=\"fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
453483
" </g>\n",
454484
" <g id=\"patch_37\">\n",
455
- " <path clip-path=\"url(#p836f19e185)\" d=\"M 326.38125 228.14 \n",
456
- "L 333.58125 228.14 \n",
457
- "L 333.58125 31.872196 \n",
458
- "L 326.38125 31.872196 \n",
485
+ " <path clip-path=\"url(#p70301a0bed)\" d=\"M 201.429794 224.64 \n",
486
+ "L 207.930765 224.64 \n",
487
+ "L 207.930765 70.76381 \n",
488
+ "L 201.429794 70.76381 \n",
459489
"z\n",
460490
"\" style=\"fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
461491
" </g>\n",
462492
" <g id=\"patch_38\">\n",
463
- " <path clip-path=\"url(#p836f19e185)\" d=\"M 362.38125 228.14 \n",
464
- "L 369.58125 228.14 \n",
465
- "L 369.58125 21.054286 \n",
466
- "L 362.38125 21.054286 \n",
493
+ " <path clip-path=\"url(#p70301a0bed)\" d=\"M 233.934648 224.64 \n",
494
+ "L 240.435619 224.64 \n",
495
+ "L 240.435619 56.382857 \n",
496
+ "L 233.934648 56.382857 \n",
497
+ "z\n",
498
+ "\" style=\"fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
499
+ " </g>\n",
500
+ " <g id=\"patch_39\">\n",
501
+ " <path clip-path=\"url(#p70301a0bed)\" d=\"M 266.439502 224.64 \n",
502
+ "L 272.940473 224.64 \n",
503
+ "L 272.940473 40.56381 \n",
504
+ "L 266.439502 40.56381 \n",
505
+ "z\n",
506
+ "\" style=\"fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
507
+ " </g>\n",
508
+ " <g id=\"patch_40\">\n",
509
+ " <path clip-path=\"url(#p70301a0bed)\" d=\"M 298.944357 224.64 \n",
510
+ "L 305.445328 224.64 \n",
511
+ "L 305.445328 30.497143 \n",
512
+ "L 298.944357 30.497143 \n",
513
+ "z\n",
514
+ "\" style=\"fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
515
+ " </g>\n",
516
+ " <g id=\"patch_41\">\n",
517
+ " <path clip-path=\"url(#p70301a0bed)\" d=\"M 331.449211 224.64 \n",
518
+ "L 337.950182 224.64 \n",
519
+ "L 337.950182 26.182857 \n",
520
+ "L 331.449211 26.182857 \n",
521
+ "z\n",
522
+ "\" style=\"fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
523
+ " </g>\n",
524
+ " <g id=\"patch_42\">\n",
525
+ " <path clip-path=\"url(#p70301a0bed)\" d=\"M 363.954066 224.64 \n",
526
+ "L 370.455036 224.64 \n",
527
+ "L 370.455036 17.554286 \n",
528
+ "L 363.954066 17.554286 \n",
467529
"z\n",
468530
"\" style=\"fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
469531
" </g>\n",
470532
" <g id=\"matplotlib.axis_1\">\n",
471533
" <g id=\"xtick_1\">\n",
472534
" <g id=\"line2d_1\">\n",
473535
" <defs>\n",
474536
" <path d=\"M 0 0 \n",
475537
"L 0 3.5 \n",
476
- "\" id=\"m1f6b1ebb34\" style=\"stroke:#000000;stroke-width:0.8;\"/>\n",
538
+ "\" id=\"m639e59548b\" style=\"stroke:#000000;stroke-width:0.8;\"/>\n",
477539
" </defs>\n",
478540
" <g>\n",
479
- " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"67.18125\" xlink:href=\"#m1f6b1ebb34\" y=\"228.14\"/>\n",
541
+ " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"64.909405\" xlink:href=\"#m639e59548b\" y=\"224.64\"/>\n",
480542
" </g>\n",
481543
" </g>\n",
482544
" <g id=\"text_1\">\n",
545
+ " <!-- 1 -->\n",
546
+ " <defs>\n",
547
+ " <path d=\"M 12.40625 8.296875 \n",
548
+ "L 28.515625 8.296875 \n",
549
+ "L 28.515625 63.921875 \n",
550
+ "L 10.984375 60.40625 \n",
551
+ "L 10.984375 69.390625 \n",
552
+ "L 28.421875 72.90625 \n",
553
+ "L 38.28125 72.90625 \n",
554
+ "L 38.28125 8.296875 \n",
555
+ "L 54.390625 8.296875 \n",
556
+ "L 54.390625 0 \n",
557
+ "L 12.40625 0 \n",
558
+ "z\n",
559
+ "\" id=\"DejaVuSans-49\"/>\n",
560
+ " </defs>\n",
561
+ " <g transform=\"translate(67.66878 238.0025)rotate(-90)scale(0.1 -0.1)\">\n",
562
+ " <use xlink:href=\"#DejaVuSans-49\"/>\n",
563
+ " </g>\n",
564
+ " </g>\n",
565
+ " </g>\n",
566
+ " <g id=\"xtick_2\">\n",
567
+ " <g id=\"line2d_2\">\n",
568
+ " <g>\n",
569
+ " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"97.41426\" xlink:href=\"#m639e59548b\" y=\"224.64\"/>\n",
570
+ " </g>\n",
571
+ " </g>\n",
572
+ " <g id=\"text_2\">\n",
573
+ " <!-- 2 -->\n",
574
+ " <defs>\n",
575
+ " <path d=\"M 19.1875 8.296875 \n",
576
+ "L 53.609375 8.296875 \n",
577
+ "L 53.609375 0 \n",
578
+ "L 7.328125 0 \n",
579
+ "L 7.328125 8.296875 \n",
580
+ "Q 12.9375 14.109375 22.625 23.890625 \n",
581
+ "Q 32.328125 33.6875 34.8125 36.53125 \n",
582
+ "Q 39.546875 41.84375 41.421875 45.53125 \n",
583
+ "Q 43.3125 49.21875 43.3125 52.78125 \n",
584
+ "Q 43.3125 58.59375 39.234375 62.25 \n",
585
+ "Q 35.15625 65.921875 28.609375 65.921875 \n",
586
+ "Q 23.96875 65.921875 18.8125 64.3125 \n",
587
+ "Q 13.671875 62.703125 7.8125 59.421875 \n",
588
+ "L 7.8125 69.390625 \n",
589
+ "Q 13.765625 71.78125 18.9375 73 \n",
590
+ "Q 24.125 74.21875 28.421875 74.21875 \n",
591
+ "Q 39.75 74.21875 46.484375 68.546875 \n",
592
+ "Q 53.21875 62.890625 53.21875 53.421875 \n",
593
+ "Q 53.21875 48.921875 51.53125 44.890625 \n",
594
+ "Q 49.859375 40.875 45.40625 35.40625 \n",
595
+ "Q 44.1875 33.984375 37.640625 27.21875 \n",
596
+ "Q 31.109375 20.453125 19.1875 8.296875 \n",
597
+ "z\n",
598
+ "\" id=\"DejaVuSans-50\"/>\n",
599
+ " </defs>\n",
600
+ " <g transform=\"translate(100.173635 238.0025)rotate(-90)scale(0.1 -0.1)\">\n",
601
+ " <use xlink:href=\"#DejaVuSans-50\"/>\n",
602
+ " </g>\n",
603
+ " </g>\n",
604
+ " </g>\n",
605
+ " <g id=\"xtick_3\">\n",
606
+ " <g id=\"line2d_3\">\n",
607
+ " <g>\n",
608
+ " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"129.919114\" xlink:href=\"#m639e59548b\" y=\"224.64\"/>\n",
609
+ " </g>\n",
610
+ " </g>\n",
611
+ " <g id=\"text_3\">\n",
483612
" <!-- 3 -->\n",
484613
" <defs>\n",
485614
" <path d=\"M 40.578125 39.3125 \n",
486615
"Q 47.65625 37.796875 51.625 33 \n",
487616
"Q 55.609375 28.21875 55.609375 21.1875 \n",
@@ -513,22 +642,22 @@
513642
"Q 53.90625 49.265625 50.4375 45.09375 \n",
514643
"Q 46.96875 40.921875 40.578125 39.3125 \n",
515644
"z\n",
516645
"\" id=\"DejaVuSans-51\"/>\n",
517646
" </defs>\n",
518
- " <g transform=\"translate(69.940625 241.5025)rotate(-90)scale(0.1 -0.1)\">\n",
647
+ " <g transform=\"translate(132.678489 238.0025)rotate(-90)scale(0.1 -0.1)\">\n",
519648
" <use xlink:href=\"#DejaVuSans-51\"/>\n",
520649
" </g>\n",
521650
" </g>\n",
522651
" </g>\n",
523
- " <g id=\"xtick_2\">\n",
524
- " <g id=\"line2d_2\">\n",
652
+ " <g id=\"xtick_4\">\n",
653
+ " <g id=\"line2d_4\">\n",
525654
" <g>\n",
526
- " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"103.18125\" xlink:href=\"#m1f6b1ebb34\" y=\"228.14\"/>\n",
655
+ " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"162.423968\" xlink:href=\"#m639e59548b\" y=\"224.64\"/>\n",
527656
" </g>\n",
528657
" </g>\n",
529
- " <g id=\"text_2\">\n",
658
+ " <g id=\"text_4\">\n",
530659
" <!-- 4 -->\n",
531660
" <defs>\n",
532661
" <path d=\"M 37.796875 64.3125 \n",
533662
"L 12.890625 25.390625 \n",
534663
"L 37.796875 25.390625 \n",
@@ -545,22 +674,22 @@
545674
"L 4.890625 17.1875 \n",
546675
"L 4.890625 26.703125 \n",
547676
"z\n",
548677
"\" id=\"DejaVuSans-52\"/>\n",
549678
" </defs>\n",
550
- " <g transform=\"translate(105.940625 241.5025)rotate(-90)scale(0.1 -0.1)\">\n",
679
+ " <g transform=\"translate(165.183343 238.0025)rotate(-90)scale(0.1 -0.1)\">\n",
551680
" <use xlink:href=\"#DejaVuSans-52\"/>\n",
552681
" </g>\n",
553682
" </g>\n",
554683
" </g>\n",
555
- " <g id=\"xtick_3\">\n",
556
- " <g id=\"line2d_3\">\n",
684
+ " <g id=\"xtick_5\">\n",
685
+ " <g id=\"line2d_5\">\n",
557686
" <g>\n",
558
- " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"139.18125\" xlink:href=\"#m1f6b1ebb34\" y=\"228.14\"/>\n",
687
+ " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"194.928823\" xlink:href=\"#m639e59548b\" y=\"224.64\"/>\n",
559688
" </g>\n",
560689
" </g>\n",
561
- " <g id=\"text_3\">\n",
690
+ " <g id=\"text_5\">\n",
562691
" <!-- 5 -->\n",
563692
" <defs>\n",
564693
" <path d=\"M 10.796875 72.90625 \n",
565694
"L 49.515625 72.90625 \n",
566695
"L 49.515625 64.59375 \n",
@@ -584,22 +713,22 @@
584713
"Q 22.75 39.890625 18.8125 39.015625 \n",
585714
"Q 14.890625 38.140625 10.796875 36.28125 \n",
586715
"z\n",
587716
"\" id=\"DejaVuSans-53\"/>\n",
588717
" </defs>\n",
589
- " <g transform=\"translate(141.940625 241.5025)rotate(-90)scale(0.1 -0.1)\">\n",
718
+ " <g transform=\"translate(197.688198 238.0025)rotate(-90)scale(0.1 -0.1)\">\n",
590719
" <use xlink:href=\"#DejaVuSans-53\"/>\n",
591720
" </g>\n",
592721
" </g>\n",
593722
" </g>\n",
594
- " <g id=\"xtick_4\">\n",
595
- " <g id=\"line2d_4\">\n",
723
+ " <g id=\"xtick_6\">\n",
724
+ " <g id=\"line2d_6\">\n",
596725
" <g>\n",
597
- " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"175.18125\" xlink:href=\"#m1f6b1ebb34\" y=\"228.14\"/>\n",
726
+ " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"227.433677\" xlink:href=\"#m639e59548b\" y=\"224.64\"/>\n",
598727
" </g>\n",
599728
" </g>\n",
600
- " <g id=\"text_4\">\n",
729
+ " <g id=\"text_6\">\n",
601730
" <!-- 6 -->\n",
602731
" <defs>\n",
603732
" <path d=\"M 33.015625 40.375 \n",
604733
"Q 26.375 40.375 22.484375 35.828125 \n",
605734
"Q 18.609375 31.296875 18.609375 23.390625 \n",
@@ -629,22 +758,22 @@
629758
"Q 40.921875 74.21875 44.703125 73.484375 \n",
630759
"Q 48.484375 72.75 52.59375 71.296875 \n",
631760
"z\n",
632761
"\" id=\"DejaVuSans-54\"/>\n",
633762
" </defs>\n",
634
- " <g transform=\"translate(177.940625 241.5025)rotate(-90)scale(0.1 -0.1)\">\n",
763
+ " <g transform=\"translate(230.193052 238.0025)rotate(-90)scale(0.1 -0.1)\">\n",
635764
" <use xlink:href=\"#DejaVuSans-54\"/>\n",
636765
" </g>\n",
637766
" </g>\n",
638767
" </g>\n",
639
- " <g id=\"xtick_5\">\n",
640
- " <g id=\"line2d_5\">\n",
768
+ " <g id=\"xtick_7\">\n",
769
+ " <g id=\"line2d_7\">\n",
641770
" <g>\n",
642
- " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"211.18125\" xlink:href=\"#m1f6b1ebb34\" y=\"228.14\"/>\n",
771
+ " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"259.938532\" xlink:href=\"#m639e59548b\" y=\"224.64\"/>\n",
643772
" </g>\n",
644773
" </g>\n",
645
- " <g id=\"text_5\">\n",
774
+ " <g id=\"text_7\">\n",
646775
" <!-- 7 -->\n",
647776
" <defs>\n",
648777
" <path d=\"M 8.203125 72.90625 \n",
649778
"L 55.078125 72.90625 \n",
650779
"L 55.078125 68.703125 \n",
@@ -653,22 +782,22 @@
653782
"L 43.21875 64.59375 \n",
654783
"L 8.203125 64.59375 \n",
655784
"z\n",
656785
"\" id=\"DejaVuSans-55\"/>\n",
657786
" </defs>\n",
658
- " <g transform=\"translate(213.940625 241.5025)rotate(-90)scale(0.1 -0.1)\">\n",
787
+ " <g transform=\"translate(262.697907 238.0025)rotate(-90)scale(0.1 -0.1)\">\n",
659788
" <use xlink:href=\"#DejaVuSans-55\"/>\n",
660789
" </g>\n",
661790
" </g>\n",
662791
" </g>\n",
663
- " <g id=\"xtick_6\">\n",
664
- " <g id=\"line2d_6\">\n",
792
+ " <g id=\"xtick_8\">\n",
793
+ " <g id=\"line2d_8\">\n",
665794
" <g>\n",
666
- " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"247.18125\" xlink:href=\"#m1f6b1ebb34\" y=\"228.14\"/>\n",
795
+ " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"292.443386\" xlink:href=\"#m639e59548b\" y=\"224.64\"/>\n",
667796
" </g>\n",
668797
" </g>\n",
669
- " <g id=\"text_6\">\n",
798
+ " <g id=\"text_8\">\n",
670799
" <!-- 8 -->\n",
671800
" <defs>\n",
672801
" <path d=\"M 31.78125 34.625 \n",
673802
"Q 24.75 34.625 20.71875 30.859375 \n",
674803
"Q 16.703125 27.09375 16.703125 20.515625 \n",
@@ -707,22 +836,22 @@
707836
"Q 25.390625 66.40625 21.84375 63.234375 \n",
708837
"Q 18.3125 60.0625 18.3125 54.390625 \n",
709838
"z\n",
710839
"\" id=\"DejaVuSans-56\"/>\n",
711840
" </defs>\n",
712
- " <g transform=\"translate(249.940625 241.5025)rotate(-90)scale(0.1 -0.1)\">\n",
841
+ " <g transform=\"translate(295.202761 238.0025)rotate(-90)scale(0.1 -0.1)\">\n",
713842
" <use xlink:href=\"#DejaVuSans-56\"/>\n",
714843
" </g>\n",
715844
" </g>\n",
716845
" </g>\n",
717
- " <g id=\"xtick_7\">\n",
718
- " <g id=\"line2d_7\">\n",
846
+ " <g id=\"xtick_9\">\n",
847
+ " <g id=\"line2d_9\">\n",
719848
" <g>\n",
720
- " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"283.18125\" xlink:href=\"#m1f6b1ebb34\" y=\"228.14\"/>\n",
849
+ " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"324.94824\" xlink:href=\"#m639e59548b\" y=\"224.64\"/>\n",
721850
" </g>\n",
722851
" </g>\n",
723
- " <g id=\"text_7\">\n",
852
+ " <g id=\"text_9\">\n",
724853
" <!-- 9 -->\n",
725854
" <defs>\n",
726855
" <path d=\"M 10.984375 1.515625 \n",
727856
"L 10.984375 10.5 \n",
728857
"Q 14.703125 8.734375 18.5 7.8125 \n",
@@ -752,37 +881,24 @@
752881
"Q 16.21875 41.5 20.09375 36.953125 \n",
753882
"Q 23.96875 32.421875 30.609375 32.421875 \n",
754883
"z\n",
755884
"\" id=\"DejaVuSans-57\"/>\n",
756885
" </defs>\n",
757
- " <g transform=\"translate(285.940625 241.5025)rotate(-90)scale(0.1 -0.1)\">\n",
886
+ " <g transform=\"translate(327.707615 238.0025)rotate(-90)scale(0.1 -0.1)\">\n",
758887
" <use xlink:href=\"#DejaVuSans-57\"/>\n",
759888
" </g>\n",
760889
" </g>\n",
761890
" </g>\n",
762
- " <g id=\"xtick_8\">\n",
763
- " <g id=\"line2d_8\">\n",
891
+ " <g id=\"xtick_10\">\n",
892
+ " <g id=\"line2d_10\">\n",
764893
" <g>\n",
765
- " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"319.18125\" xlink:href=\"#m1f6b1ebb34\" y=\"228.14\"/>\n",
894
+ " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"357.453095\" xlink:href=\"#m639e59548b\" y=\"224.64\"/>\n",
766895
" </g>\n",
767896
" </g>\n",
768
- " <g id=\"text_8\">\n",
897
+ " <g id=\"text_10\">\n",
769898
" <!-- 10 -->\n",
770899
" <defs>\n",
771
- " <path d=\"M 12.40625 8.296875 \n",
772
- "L 28.515625 8.296875 \n",
773
- "L 28.515625 63.921875 \n",
774
- "L 10.984375 60.40625 \n",
775
- "L 10.984375 69.390625 \n",
776
- "L 28.421875 72.90625 \n",
777
- "L 38.28125 72.90625 \n",
778
- "L 38.28125 8.296875 \n",
779
- "L 54.390625 8.296875 \n",
780
- "L 54.390625 0 \n",
781
- "L 12.40625 0 \n",
782
- "z\n",
783
- "\" id=\"DejaVuSans-49\"/>\n",
784900
" <path d=\"M 31.78125 66.40625 \n",
785901
"Q 24.171875 66.40625 20.328125 58.90625 \n",
786902
"Q 16.5 51.421875 16.5 36.375 \n",
787903
"Q 16.5 21.390625 20.328125 13.890625 \n",
788904
"Q 24.171875 6.390625 31.78125 6.390625 \n",
@@ -801,31 +917,17 @@
801917
"Q 6.59375 54.828125 13.0625 64.515625 \n",
802918
"Q 19.53125 74.21875 31.78125 74.21875 \n",
803919
"z\n",
804920
"\" id=\"DejaVuSans-48\"/>\n",
805921
" </defs>\n",
806
- " <g transform=\"translate(321.940625 247.865)rotate(-90)scale(0.1 -0.1)\">\n",
922
+ " <g transform=\"translate(360.21247 244.365)rotate(-90)scale(0.1 -0.1)\">\n",
807923
" <use xlink:href=\"#DejaVuSans-49\"/>\n",
808924
" <use x=\"63.623047\" xlink:href=\"#DejaVuSans-48\"/>\n",
809925
" </g>\n",
810926
" </g>\n",
811927
" </g>\n",
812
- " <g id=\"xtick_9\">\n",
813
- " <g id=\"line2d_9\">\n",
814
- " <g>\n",
815
- " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"355.18125\" xlink:href=\"#m1f6b1ebb34\" y=\"228.14\"/>\n",
816
- " </g>\n",
817
- " </g>\n",
818
- " <g id=\"text_9\">\n",
819
- " <!-- 11 -->\n",
820
- " <g transform=\"translate(357.940625 247.865)rotate(-90)scale(0.1 -0.1)\">\n",
821
- " <use xlink:href=\"#DejaVuSans-49\"/>\n",
822
- " <use x=\"63.623047\" xlink:href=\"#DejaVuSans-49\"/>\n",
823
- " </g>\n",
824
- " </g>\n",
825
- " </g>\n",
826
- " <g id=\"text_10\">\n",
928
+ " <g id=\"text_11\">\n",
827929
" <!-- Checkin index -->\n",
828930
" <defs>\n",
829931
" <path d=\"M 64.40625 67.28125 \n",
830932
"L 64.40625 56.890625 \n",
831933
"Q 59.421875 61.53125 53.78125 63.8125 \n",
@@ -994,11 +1096,11 @@
9941096
"L 29.78125 35.203125 \n",
9951097
"L 44.28125 54.6875 \n",
9961098
"z\n",
9971099
"\" id=\"DejaVuSans-120\"/>\n",
9981100
" </defs>\n",
999
- " <g transform=\"translate(175.885938 259.463437)scale(0.1 -0.1)\">\n",
1101
+ " <g transform=\"translate(175.885938 255.963437)scale(0.1 -0.1)\">\n",
10001102
" <use xlink:href=\"#DejaVuSans-67\"/>\n",
10011103
" <use x=\"69.824219\" xlink:href=\"#DejaVuSans-104\"/>\n",
10021104
" <use x=\"133.203125\" xlink:href=\"#DejaVuSans-101\"/>\n",
10031105
" <use x=\"194.726562\" xlink:href=\"#DejaVuSans-99\"/>\n",
10041106
" <use x=\"249.707031\" xlink:href=\"#DejaVuSans-107\"/>\n",
@@ -1013,139 +1115,113 @@
10131115
" </g>\n",
10141116
" </g>\n",
10151117
" </g>\n",
10161118
" <g id=\"matplotlib.axis_2\">\n",
10171119
" <g id=\"ytick_1\">\n",
1018
- " <g id=\"line2d_10\">\n",
1120
+ " <g id=\"line2d_11\">\n",
10191121
" <defs>\n",
10201122
" <path d=\"M 0 0 \n",
10211123
"L -3.5 0 \n",
1022
- "\" id=\"mc174bd9713\" style=\"stroke:#000000;stroke-width:0.8;\"/>\n",
1124
+ "\" id=\"m7e5aed6441\" style=\"stroke:#000000;stroke-width:0.8;\"/>\n",
10231125
" </defs>\n",
10241126
" <g>\n",
1025
- " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"43.78125\" xlink:href=\"#mc174bd9713\" y=\"228.14\"/>\n",
1127
+ " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"43.78125\" xlink:href=\"#m7e5aed6441\" y=\"224.64\"/>\n",
10261128
" </g>\n",
10271129
" </g>\n",
1028
- " <g id=\"text_11\">\n",
1130
+ " <g id=\"text_12\">\n",
10291131
" <!-- 0.0 -->\n",
10301132
" <defs>\n",
10311133
" <path d=\"M 10.6875 12.40625 \n",
10321134
"L 21 12.40625 \n",
10331135
"L 21 0 \n",
10341136
"L 10.6875 0 \n",
10351137
"z\n",
10361138
"\" id=\"DejaVuSans-46\"/>\n",
10371139
" </defs>\n",
1038
- " <g transform=\"translate(20.878125 231.939219)scale(0.1 -0.1)\">\n",
1140
+ " <g transform=\"translate(20.878125 228.439219)scale(0.1 -0.1)\">\n",
10391141
" <use xlink:href=\"#DejaVuSans-48\"/>\n",
10401142
" <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
10411143
" <use x=\"95.410156\" xlink:href=\"#DejaVuSans-48\"/>\n",
10421144
" </g>\n",
10431145
" </g>\n",
10441146
" </g>\n",
10451147
" <g id=\"ytick_2\">\n",
1046
- " <g id=\"line2d_11\">\n",
1148
+ " <g id=\"line2d_12\">\n",
10471149
" <g>\n",
1048
- " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"43.78125\" xlink:href=\"#mc174bd9713\" y=\"188.577356\"/>\n",
1150
+ " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"43.78125\" xlink:href=\"#m7e5aed6441\" y=\"187.824762\"/>\n",
10491151
" </g>\n",
10501152
" </g>\n",
1051
- " <g id=\"text_12\">\n",
1153
+ " <g id=\"text_13\">\n",
10521154
" <!-- 0.2 -->\n",
1053
- " <defs>\n",
1054
- " <path d=\"M 19.1875 8.296875 \n",
1055
- "L 53.609375 8.296875 \n",
1056
- "L 53.609375 0 \n",
1057
- "L 7.328125 0 \n",
1058
- "L 7.328125 8.296875 \n",
1059
- "Q 12.9375 14.109375 22.625 23.890625 \n",
1060
- "Q 32.328125 33.6875 34.8125 36.53125 \n",
1061
- "Q 39.546875 41.84375 41.421875 45.53125 \n",
1062
- "Q 43.3125 49.21875 43.3125 52.78125 \n",
1063
- "Q 43.3125 58.59375 39.234375 62.25 \n",
1064
- "Q 35.15625 65.921875 28.609375 65.921875 \n",
1065
- "Q 23.96875 65.921875 18.8125 64.3125 \n",
1066
- "Q 13.671875 62.703125 7.8125 59.421875 \n",
1067
- "L 7.8125 69.390625 \n",
1068
- "Q 13.765625 71.78125 18.9375 73 \n",
1069
- "Q 24.125 74.21875 28.421875 74.21875 \n",
1070
- "Q 39.75 74.21875 46.484375 68.546875 \n",
1071
- "Q 53.21875 62.890625 53.21875 53.421875 \n",
1072
- "Q 53.21875 48.921875 51.53125 44.890625 \n",
1073
- "Q 49.859375 40.875 45.40625 35.40625 \n",
1074
- "Q 44.1875 33.984375 37.640625 27.21875 \n",
1075
- "Q 31.109375 20.453125 19.1875 8.296875 \n",
1076
- "z\n",
1077
- "\" id=\"DejaVuSans-50\"/>\n",
1078
- " </defs>\n",
1079
- " <g transform=\"translate(20.878125 192.376575)scale(0.1 -0.1)\">\n",
1155
+ " <g transform=\"translate(20.878125 191.623981)scale(0.1 -0.1)\">\n",
10801156
" <use xlink:href=\"#DejaVuSans-48\"/>\n",
10811157
" <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
10821158
" <use x=\"95.410156\" xlink:href=\"#DejaVuSans-50\"/>\n",
10831159
" </g>\n",
10841160
" </g>\n",
10851161
" </g>\n",
10861162
" <g id=\"ytick_3\">\n",
1087
- " <g id=\"line2d_12\">\n",
1163
+ " <g id=\"line2d_13\">\n",
10881164
" <g>\n",
1089
- " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"43.78125\" xlink:href=\"#mc174bd9713\" y=\"149.014712\"/>\n",
1165
+ " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"43.78125\" xlink:href=\"#m7e5aed6441\" y=\"151.009524\"/>\n",
10901166
" </g>\n",
10911167
" </g>\n",
1092
- " <g id=\"text_13\">\n",
1168
+ " <g id=\"text_14\">\n",
10931169
" <!-- 0.4 -->\n",
1094
- " <g transform=\"translate(20.878125 152.813931)scale(0.1 -0.1)\">\n",
1170
+ " <g transform=\"translate(20.878125 154.808743)scale(0.1 -0.1)\">\n",
10951171
" <use xlink:href=\"#DejaVuSans-48\"/>\n",
10961172
" <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
10971173
" <use x=\"95.410156\" xlink:href=\"#DejaVuSans-52\"/>\n",
10981174
" </g>\n",
10991175
" </g>\n",
11001176
" </g>\n",
11011177
" <g id=\"ytick_4\">\n",
1102
- " <g id=\"line2d_13\">\n",
1178
+ " <g id=\"line2d_14\">\n",
11031179
" <g>\n",
1104
- " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"43.78125\" xlink:href=\"#mc174bd9713\" y=\"109.452068\"/>\n",
1180
+ " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"43.78125\" xlink:href=\"#m7e5aed6441\" y=\"114.194286\"/>\n",
11051181
" </g>\n",
11061182
" </g>\n",
1107
- " <g id=\"text_14\">\n",
1183
+ " <g id=\"text_15\">\n",
11081184
" <!-- 0.6 -->\n",
1109
- " <g transform=\"translate(20.878125 113.251287)scale(0.1 -0.1)\">\n",
1185
+ " <g transform=\"translate(20.878125 117.993504)scale(0.1 -0.1)\">\n",
11101186
" <use xlink:href=\"#DejaVuSans-48\"/>\n",
11111187
" <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
11121188
" <use x=\"95.410156\" xlink:href=\"#DejaVuSans-54\"/>\n",
11131189
" </g>\n",
11141190
" </g>\n",
11151191
" </g>\n",
11161192
" <g id=\"ytick_5\">\n",
1117
- " <g id=\"line2d_14\">\n",
1193
+ " <g id=\"line2d_15\">\n",
11181194
" <g>\n",
1119
- " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"43.78125\" xlink:href=\"#mc174bd9713\" y=\"69.889424\"/>\n",
1195
+ " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"43.78125\" xlink:href=\"#m7e5aed6441\" y=\"77.379048\"/>\n",
11201196
" </g>\n",
11211197
" </g>\n",
1122
- " <g id=\"text_15\">\n",
1198
+ " <g id=\"text_16\">\n",
11231199
" <!-- 0.8 -->\n",
1124
- " <g transform=\"translate(20.878125 73.688643)scale(0.1 -0.1)\">\n",
1200
+ " <g transform=\"translate(20.878125 81.178266)scale(0.1 -0.1)\">\n",
11251201
" <use xlink:href=\"#DejaVuSans-48\"/>\n",
11261202
" <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
11271203
" <use x=\"95.410156\" xlink:href=\"#DejaVuSans-56\"/>\n",
11281204
" </g>\n",
11291205
" </g>\n",
11301206
" </g>\n",
11311207
" <g id=\"ytick_6\">\n",
1132
- " <g id=\"line2d_15\">\n",
1208
+ " <g id=\"line2d_16\">\n",
11331209
" <g>\n",
1134
- " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"43.78125\" xlink:href=\"#mc174bd9713\" y=\"30.32678\"/>\n",
1210
+ " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"43.78125\" xlink:href=\"#m7e5aed6441\" y=\"40.56381\"/>\n",
11351211
" </g>\n",
11361212
" </g>\n",
1137
- " <g id=\"text_16\">\n",
1213
+ " <g id=\"text_17\">\n",
11381214
" <!-- 1.0 -->\n",
1139
- " <g transform=\"translate(20.878125 34.125999)scale(0.1 -0.1)\">\n",
1215
+ " <g transform=\"translate(20.878125 44.363028)scale(0.1 -0.1)\">\n",
11401216
" <use xlink:href=\"#DejaVuSans-49\"/>\n",
11411217
" <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
11421218
" <use x=\"95.410156\" xlink:href=\"#DejaVuSans-48\"/>\n",
11431219
" </g>\n",
11441220
" </g>\n",
11451221
" </g>\n",
1146
- " <g id=\"text_17\">\n",
1222
+ " <g id=\"text_18\">\n",
11471223
" <!-- Repo size (MiB) -->\n",
11481224
" <defs>\n",
11491225
" <path d=\"M 44.390625 34.1875 \n",
11501226
"Q 47.5625 33.109375 50.5625 29.59375 \n",
11511227
"Q 53.5625 26.078125 56.59375 19.921875 \n",
@@ -1331,11 +1407,11 @@
13311407
"Q 20.90625 42.671875 17.703125 53.65625 \n",
13321408
"Q 14.5 64.65625 8.015625 75.875 \n",
13331409
"z\n",
13341410
"\" id=\"DejaVuSans-41\"/>\n",
13351411
" </defs>\n",
1336
- " <g transform=\"translate(14.798438 158.109062)rotate(-90)scale(0.1 -0.1)\">\n",
1412
+ " <g transform=\"translate(14.798438 154.609062)rotate(-90)scale(0.1 -0.1)\">\n",
13371413
" <use xlink:href=\"#DejaVuSans-82\"/>\n",
13381414
" <use x=\"69.419922\" xlink:href=\"#DejaVuSans-101\"/>\n",
13391415
" <use x=\"130.943359\" xlink:href=\"#DejaVuSans-112\"/>\n",
13401416
" <use x=\"194.419922\" xlink:href=\"#DejaVuSans-111\"/>\n",
13411417
" <use x=\"255.601562\" xlink:href=\"#DejaVuSans-32\"/>\n",
@@ -1350,53 +1426,53 @@
13501426
" <use x=\"666.148438\" xlink:href=\"#DejaVuSans-66\"/>\n",
13511427
" <use x=\"734.751953\" xlink:href=\"#DejaVuSans-41\"/>\n",
13521428
" </g>\n",
13531429
" </g>\n",
13541430
" </g>\n",
1355
- " <g id=\"patch_39\">\n",
1356
- " <path d=\"M 43.78125 228.14 \n",
1357
- "L 43.78125 10.7 \n",
1358
- "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
1359
- " </g>\n",
1360
- " <g id=\"patch_40\">\n",
1361
- " <path d=\"M 378.58125 228.14 \n",
1362
- "L 378.58125 10.7 \n",
1363
- "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
1364
- " </g>\n",
1365
- " <g id=\"patch_41\">\n",
1366
- " <path d=\"M 43.78125 228.14 \n",
1367
- "L 378.58125 228.14 \n",
1368
- "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
1369
- " </g>\n",
1370
- " <g id=\"patch_42\">\n",
1371
- " <path d=\"M 43.78125 10.7 \n",
1372
- "L 378.58125 10.7 \n",
1431
+ " <g id=\"patch_43\">\n",
1432
+ " <path d=\"M 43.78125 224.64 \n",
1433
+ "L 43.78125 7.2 \n",
1434
+ "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
1435
+ " </g>\n",
1436
+ " <g id=\"patch_44\">\n",
1437
+ " <path d=\"M 378.58125 224.64 \n",
1438
+ "L 378.58125 7.2 \n",
1439
+ "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
1440
+ " </g>\n",
1441
+ " <g id=\"patch_45\">\n",
1442
+ " <path d=\"M 43.78125 224.64 \n",
1443
+ "L 378.58125 224.64 \n",
1444
+ "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
1445
+ " </g>\n",
1446
+ " <g id=\"patch_46\">\n",
1447
+ " <path d=\"M 43.78125 7.2 \n",
1448
+ "L 378.58125 7.2 \n",
13731449
"\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
13741450
" </g>\n",
13751451
" <g id=\"legend_1\">\n",
1376
- " <g id=\"patch_43\">\n",
1377
- " <path d=\"M 50.78125 77.4125 \n",
1378
- "L 105.828125 77.4125 \n",
1379
- "Q 107.828125 77.4125 107.828125 75.4125 \n",
1380
- "L 107.828125 17.7 \n",
1381
- "Q 107.828125 15.7 105.828125 15.7 \n",
1382
- "L 50.78125 15.7 \n",
1383
- "Q 48.78125 15.7 48.78125 17.7 \n",
1384
- "L 48.78125 75.4125 \n",
1385
- "Q 48.78125 77.4125 50.78125 77.4125 \n",
1452
+ " <g id=\"patch_47\">\n",
1453
+ " <path d=\"M 50.78125 73.9125 \n",
1454
+ "L 105.828125 73.9125 \n",
1455
+ "Q 107.828125 73.9125 107.828125 71.9125 \n",
1456
+ "L 107.828125 14.2 \n",
1457
+ "Q 107.828125 12.2 105.828125 12.2 \n",
1458
+ "L 50.78125 12.2 \n",
1459
+ "Q 48.78125 12.2 48.78125 14.2 \n",
1460
+ "L 48.78125 71.9125 \n",
1461
+ "Q 48.78125 73.9125 50.78125 73.9125 \n",
13861462
"z\n",
13871463
"\" style=\"fill:#ffffff;opacity:0.8;stroke:#cccccc;stroke-linejoin:miter;\"/>\n",
13881464
" </g>\n",
1389
- " <g id=\"patch_44\">\n",
1390
- " <path d=\"M 52.78125 27.298437 \n",
1391
- "L 72.78125 27.298437 \n",
1392
- "L 72.78125 20.298437 \n",
1393
- "L 52.78125 20.298437 \n",
1465
+ " <g id=\"patch_48\">\n",
1466
+ " <path d=\"M 52.78125 23.798437 \n",
1467
+ "L 72.78125 23.798437 \n",
1468
+ "L 72.78125 16.798437 \n",
1469
+ "L 52.78125 16.798437 \n",
13941470
"z\n",
13951471
"\" style=\"fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
13961472
" </g>\n",
1397
- " <g id=\"text_18\">\n",
1473
+ " <g id=\"text_19\">\n",
13981474
" <!-- JPEG -->\n",
13991475
" <defs>\n",
14001476
" <path d=\"M 9.8125 72.90625 \n",
14011477
"L 19.671875 72.90625 \n",
14021478
"L 19.671875 5.078125 \n",
@@ -1466,42 +1542,42 @@
14661542
"Q 48.046875 6.6875 52.140625 7.59375 \n",
14671543
"Q 56.25 8.5 59.515625 10.40625 \n",
14681544
"z\n",
14691545
"\" id=\"DejaVuSans-71\"/>\n",
14701546
" </defs>\n",
1471
- " <g transform=\"translate(80.78125 27.298437)scale(0.1 -0.1)\">\n",
1547
+ " <g transform=\"translate(80.78125 23.798437)scale(0.1 -0.1)\">\n",
14721548
" <use xlink:href=\"#DejaVuSans-74\"/>\n",
14731549
" <use x=\"29.492188\" xlink:href=\"#DejaVuSans-80\"/>\n",
14741550
" <use x=\"89.794922\" xlink:href=\"#DejaVuSans-69\"/>\n",
14751551
" <use x=\"152.978516\" xlink:href=\"#DejaVuSans-71\"/>\n",
14761552
" </g>\n",
14771553
" </g>\n",
1478
- " <g id=\"patch_45\">\n",
1479
- " <path d=\"M 52.78125 41.976562 \n",
1480
- "L 72.78125 41.976562 \n",
1481
- "L 72.78125 34.976562 \n",
1482
- "L 52.78125 34.976562 \n",
1554
+ " <g id=\"patch_49\">\n",
1555
+ " <path d=\"M 52.78125 38.476562 \n",
1556
+ "L 72.78125 38.476562 \n",
1557
+ "L 72.78125 31.476562 \n",
1558
+ "L 52.78125 31.476562 \n",
14831559
"z\n",
14841560
"\" style=\"fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
14851561
" </g>\n",
1486
- " <g id=\"text_19\">\n",
1562
+ " <g id=\"text_20\">\n",
14871563
" <!-- BMP -->\n",
1488
- " <g transform=\"translate(80.78125 41.976562)scale(0.1 -0.1)\">\n",
1564
+ " <g transform=\"translate(80.78125 38.476562)scale(0.1 -0.1)\">\n",
14891565
" <use xlink:href=\"#DejaVuSans-66\"/>\n",
14901566
" <use x=\"68.603516\" xlink:href=\"#DejaVuSans-77\"/>\n",
14911567
" <use x=\"154.882812\" xlink:href=\"#DejaVuSans-80\"/>\n",
14921568
" </g>\n",
14931569
" </g>\n",
1494
- " <g id=\"patch_46\">\n",
1495
- " <path d=\"M 52.78125 56.654687 \n",
1496
- "L 72.78125 56.654687 \n",
1497
- "L 72.78125 49.654687 \n",
1498
- "L 52.78125 49.654687 \n",
1570
+ " <g id=\"patch_50\">\n",
1571
+ " <path d=\"M 52.78125 53.154687 \n",
1572
+ "L 72.78125 53.154687 \n",
1573
+ "L 72.78125 46.154687 \n",
1574
+ "L 52.78125 46.154687 \n",
14991575
"z\n",
15001576
"\" style=\"fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
15011577
" </g>\n",
1502
- " <g id=\"text_20\">\n",
1578
+ " <g id=\"text_21\">\n",
15031579
" <!-- TIFF -->\n",
15041580
" <defs>\n",
15051581
" <path d=\"M -0.296875 72.90625 \n",
15061582
"L 61.375 72.90625 \n",
15071583
"L 61.375 64.59375 \n",
@@ -1529,26 +1605,26 @@
15291605
"L 19.671875 0 \n",
15301606
"L 9.8125 0 \n",
15311607
"z\n",
15321608
"\" id=\"DejaVuSans-70\"/>\n",
15331609
" </defs>\n",
1534
- " <g transform=\"translate(80.78125 56.654687)scale(0.1 -0.1)\">\n",
1610
+ " <g transform=\"translate(80.78125 53.154687)scale(0.1 -0.1)\">\n",
15351611
" <use xlink:href=\"#DejaVuSans-84\"/>\n",
15361612
" <use x=\"61.083984\" xlink:href=\"#DejaVuSans-73\"/>\n",
15371613
" <use x=\"90.576172\" xlink:href=\"#DejaVuSans-70\"/>\n",
15381614
" <use x=\"148.095703\" xlink:href=\"#DejaVuSans-70\"/>\n",
15391615
" </g>\n",
15401616
" </g>\n",
1541
- " <g id=\"patch_47\">\n",
1542
- " <path d=\"M 52.78125 71.332812 \n",
1543
- "L 72.78125 71.332812 \n",
1544
- "L 72.78125 64.332812 \n",
1545
- "L 52.78125 64.332812 \n",
1617
+ " <g id=\"patch_51\">\n",
1618
+ " <path d=\"M 52.78125 67.832812 \n",
1619
+ "L 72.78125 67.832812 \n",
1620
+ "L 72.78125 60.832812 \n",
1621
+ "L 52.78125 60.832812 \n",
15461622
"z\n",
15471623
"\" style=\"fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
15481624
" </g>\n",
1549
- " <g id=\"text_21\">\n",
1625
+ " <g id=\"text_22\">\n",
15501626
" <!-- PNG -->\n",
15511627
" <defs>\n",
15521628
" <path d=\"M 9.8125 72.90625 \n",
15531629
"L 23.09375 72.90625 \n",
15541630
"L 55.421875 11.921875 \n",
@@ -1560,22 +1636,22 @@
15601636
"L 19.390625 0 \n",
15611637
"L 9.8125 0 \n",
15621638
"z\n",
15631639
"\" id=\"DejaVuSans-78\"/>\n",
15641640
" </defs>\n",
1565
- " <g transform=\"translate(80.78125 71.332812)scale(0.1 -0.1)\">\n",
1641
+ " <g transform=\"translate(80.78125 67.832812)scale(0.1 -0.1)\">\n",
15661642
" <use xlink:href=\"#DejaVuSans-80\"/>\n",
15671643
" <use x=\"60.302734\" xlink:href=\"#DejaVuSans-78\"/>\n",
15681644
" <use x=\"135.107422\" xlink:href=\"#DejaVuSans-71\"/>\n",
15691645
" </g>\n",
15701646
" </g>\n",
15711647
" </g>\n",
15721648
" </g>\n",
15731649
" </g>\n",
15741650
" <defs>\n",
1575
- " <clipPath id=\"p836f19e185\">\n",
1576
- " <rect height=\"217.44\" width=\"334.8\" x=\"43.78125\" y=\"10.7\"/>\n",
1651
+ " <clipPath id=\"p70301a0bed\">\n",
1652
+ " <rect height=\"217.44\" width=\"334.8\" x=\"43.78125\" y=\"7.2\"/>\n",
15771653
" </clipPath>\n",
15781654
" </defs>\n",
15791655
"</svg>\n"
15801656
],
15811657
"text/plain": [
@@ -1591,15 +1667,17 @@
15911667
"source": [
15921668
"%config InlineBackend.figure_formats = ['svg']\n",
15931669
"\n",
15941670
"import matplotlib as mpl\n",
15951671
"import matplotlib.pyplot as plt\n",
1672
+ "import pandas as pd\n",
1673
+ "\n",
1674
+ "os.chdir(tdir)\n",
15961675
"\n",
15971676
"# Merge per-format test data into a single DataFrame without the first\n",
1598
- "# first 3 rows: the initial empty repo state (boring) and the repo DB\n",
1599
- "# size as it \"settles\" in its first few checkins.\n",
1600
- "data = pd.concat(repo_sizes, axis=1).drop(range(3))\n",
1677
+ "# first row, being the boring initial empty repo state.\n",
1678
+ "data = pd.concat(repo_sizes, axis=1).drop(range(1))\n",
16011679
"\n",
16021680
"mpl.rcParams['figure.figsize'] = (6, 4)\n",
16031681
"ax = data.plot(kind = 'bar', colormap = 'coolwarm',\n",
16041682
" grid = False, width = 0.8,\n",
16051683
" edgecolor = 'white', linewidth = 2)\n",
@@ -1631,11 +1709,11 @@
16311709
"file_extension": ".py",
16321710
"mimetype": "text/x-python",
16331711
"name": "python",
16341712
"nbconvert_exporter": "python",
16351713
"pygments_lexer": "ipython3",
1636
- "version": "3.7.1"
1714
+ "version": "3.7.6"
16371715
}
16381716
},
16391717
"nbformat": 4,
1640
- "nbformat_minor": 2
1718
+ "nbformat_minor": 4
16411719
}
16421720
--- www/image-format-vs-repo-size.ipynb
+++ www/image-format-vs-repo-size.ipynb
@@ -6,28 +6,32 @@
6 "source": [
7 "# Image Format vs Fossil Repository Size\n",
8 "\n",
9 "## Prerequisites\n",
10 "\n",
11 "This notebook was developed with [JupyterLab][jl]. To follow in my footsteps, install that and the needed Python packages:\n",
12 "\n",
13 " $ pip install jupyterlab matplotlib pandas wand\n",
14 "\n",
15 "In principle, it should also work with [Anaconda Navigator][an], but because [Wand][wp] is not currently in the Anaconda base package set, you may run into difficulties making it work, as we did on macOS. There seems to be some sandboxing that causes problems with OS interaction in that environment. Therefore, we recommend using straight JupyterLab.\n",
16 "\n",
17 "This notebook was originally written for the Python 2 kernel because macOS does not include Python 3, but it was later updated for Python 3. It should still be compatible with Python 2, though.\n",
18 "\n",
19 "[an]: https://www.anaconda.com/distribution/\n",
20 "[jl]: https://github.com/jupyterlab/\n",
21 "[wp]: http://wand-py.org/\n",
 
 
 
 
22 "\n",
23 "\n",
24 "## Running\n",
25 "\n",
26 "The next cell generates the test repositories. This takes about 45 seconds to run, primarily due to the `sleep 1` synchronization call, made 40 times in the main test loop.\n",
27 "\n",
28 "The one after that produces the bar chart from the collected data, all but instantaneously.\n",
29 "\n",
30 "This split allows you to generate the expensive experimental data in a single pass, then play as many games as you like with the generated data.\n",
31 "\n",
32 "\n",
33 "## Discussion\n",
@@ -42,17 +46,23 @@
42 "outputs": [
43 {
44 "name": "stdout",
45 "output_type": "stream",
46 "text": [
47 "Experiment completed in 44.186978816986084 seconds.\n"
 
 
 
 
 
48 ]
49 }
50 ],
51 "source": [
52 "import os\n",
53 "import random\n",
 
54 "import time\n",
55 "\n",
56 "from wand.color import Color\n",
57 "from wand.drawing import Drawing\n",
58 "from wand.image import Image\n",
@@ -61,50 +71,67 @@
61 "\n",
62 "size = 256\n",
63 "iterations = 10\n",
64 "start = time.time()\n",
65 "repo_sizes = []\n",
 
 
 
 
66 "\n",
 
 
 
 
67 "formats = ['JPEG', 'BMP', 'TIFF', 'PNG']\n",
68 "for f in formats:\n",
69 " ext = f.lower()\n",
70 " tdir = 'test' + '-' + ext\n",
71 " repo = tdir + '.fossil'\n",
 
 
72 " ifn = 'test.' + ext\n",
73 " ipath = os.path.join(tdir, ifn)\n",
74 " rs = []\n",
75 " \n",
76 " def add_repo_size():\n",
77 " rs.append(os.path.getsize(repo) / 1024.0 / 1024.0)\n",
 
 
 
 
 
 
 
 
 
 
78 "\n",
79 " try:\n",
80 " # Create test repo\n",
81 " if not os.path.exists(tdir): os.mkdir(tdir, 0o700)\n",
82 " cmd = 'cd {0} ; fossil init ../{1} && fossil open --nested ../{1} && fossil set binary-glob \"*.{2}\"'.format(\n",
83 " tdir, repo, ext\n",
84 " )\n",
85 " if os.system(cmd) != 0:\n",
86 " raise RuntimeError('Failed to create test repo ' + repo)\n",
87 " add_repo_size()\n",
 
 
88 "\n",
89 " # Create test image and add it to the repo\n",
90 " img = Image(width = size, height = size, depth = 8,\n",
91 " background = 'white')\n",
92 " img.alpha_channel = 'remove'\n",
93 " img.evaluate('gaussiannoise', 1.0)\n",
94 " img.save(filename = ipath)\n",
95 " cmd = 'cd {0} ; fossil add {1} && fossil ci -m \"initial\"'.format(\n",
96 " tdir, ifn\n",
97 " )\n",
98 " if os.system(cmd) != 0:\n",
99 " raise RuntimeError('Failed to add ' + ifn + ' to test repo')\n",
100 " #print \"Created test repo \" + repo + \" for format \" + f + \".\"\n",
101 " add_repo_size()\n",
102 "\n",
103 " # Change a random pixel to a random RGB value and check it in\n",
104 " # $iterations times.\n",
105 " for i in range(iterations):\n",
106 " with Drawing() as draw:\n",
107 " x = random.randint(0, size - 1)\n",
108 " y = random.randint(0, size - 1)\n",
109 "\n",
110 " r = random.randint(0, 255)\n",
@@ -116,372 +143,474 @@
116 " ))\n",
117 " draw.color(x, y, 'point')\n",
118 " draw(img)\n",
119 " img.save(filename = ipath)\n",
120 " \n",
121 " # ImageMagick appears to use some kind of asynchronous\n",
122 " # file saving mechanism, so we have to give it time to\n",
123 " # complete.\n",
124 " time.sleep(1.0)\n",
 
 
125 " \n",
126 " cmd = 'cd {0} ; fossil ci -m \"change {1} step {2}\"'.format(\n",
127 " tdir, f, i\n",
128 " )\n",
129 " if os.system(cmd) != 0:\n",
130 " raise RuntimeError('Failed to change ' + f + ' image, step ' + str(i))\n",
131 " add_repo_size()\n",
132 " \n",
133 " # Repo complete for this format\n",
134 " repo_sizes.append(pd.Series(rs, name=f))\n",
135 "\n",
136 " finally:\n",
137 " if os.path.exists(ipath): os.remove(ipath)\n",
138 " if os.path.exists(tdir):\n",
139 " os.system('cd ' + tdir + ' ; fossil close -f')\n",
140 " os.rmdir(tdir)\n",
 
 
 
141 " if os.path.exists(repo): os.remove(repo)\n",
142 " \n",
143 "print(\"Experiment completed in \" + str(time.time() - start) + \" seconds.\")"
144 ]
145 },
146 {
147 "cell_type": "code",
148 "execution_count": 2,
149 "metadata": {},
150 "outputs": [
151 {
152 "data": {
153 "image/svg+xml": [
154 "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\n",
155 "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
156 " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
157 "<!-- Created with matplotlib (https://matplotlib.org/) -->\n",
158 "<svg height=\"268.743125pt\" version=\"1.1\" viewBox=\"0 0 389.28125 268.743125\" width=\"389.28125pt\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
159 " <defs>\n",
160 " <style type=\"text/css\">\n",
161 "*{stroke-linecap:butt;stroke-linejoin:round;}\n",
162 " </style>\n",
163 " </defs>\n",
164 " <g id=\"figure_1\">\n",
165 " <g id=\"patch_1\">\n",
166 " <path d=\"M 0 268.743125 \n",
167 "L 389.28125 268.743125 \n",
168 "L 389.28125 0 \n",
169 "L 0 0 \n",
170 "z\n",
171 "\" style=\"fill:none;\"/>\n",
172 " </g>\n",
173 " <g id=\"axes_1\">\n",
174 " <g id=\"patch_2\">\n",
175 " <path d=\"M 43.78125 228.14 \n",
176 "L 378.58125 228.14 \n",
177 "L 378.58125 10.7 \n",
178 "L 43.78125 10.7 \n",
179 "z\n",
180 "\" style=\"fill:#ffffff;\"/>\n",
181 " </g>\n",
182 " <g id=\"patch_3\">\n",
183 " <path clip-path=\"url(#p836f19e185)\" d=\"M 52.78125 228.14 \n",
184 "L 59.98125 228.14 \n",
185 "L 59.98125 154.732751 \n",
186 "L 52.78125 154.732751 \n",
187 "z\n",
188 "\" style=\"fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
189 " </g>\n",
190 " <g id=\"patch_4\">\n",
191 " <path clip-path=\"url(#p836f19e185)\" d=\"M 88.78125 228.14 \n",
192 "L 95.98125 228.14 \n",
193 "L 95.98125 154.732751 \n",
194 "L 88.78125 154.732751 \n",
195 "z\n",
196 "\" style=\"fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
197 " </g>\n",
198 " <g id=\"patch_5\">\n",
199 " <path clip-path=\"url(#p836f19e185)\" d=\"M 124.78125 228.14 \n",
200 "L 131.98125 228.14 \n",
201 "L 131.98125 144.687548 \n",
202 "L 124.78125 144.687548 \n",
203 "z\n",
204 "\" style=\"fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
205 " </g>\n",
206 " <g id=\"patch_6\">\n",
207 " <path clip-path=\"url(#p836f19e185)\" d=\"M 160.78125 228.14 \n",
208 "L 167.98125 228.14 \n",
209 "L 167.98125 130.006098 \n",
210 "L 160.78125 130.006098 \n",
211 "z\n",
212 "\" style=\"fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
213 " </g>\n",
214 " <g id=\"patch_7\">\n",
215 " <path clip-path=\"url(#p836f19e185)\" d=\"M 196.78125 228.14 \n",
216 "L 203.98125 228.14 \n",
217 "L 203.98125 128.460682 \n",
218 "L 196.78125 128.460682 \n",
219 "z\n",
220 "\" style=\"fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
221 " </g>\n",
222 " <g id=\"patch_8\">\n",
223 " <path clip-path=\"url(#p836f19e185)\" d=\"M 232.78125 228.14 \n",
224 "L 239.98125 228.14 \n",
225 "L 239.98125 126.915267 \n",
226 "L 232.78125 126.915267 \n",
227 "z\n",
228 "\" style=\"fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
229 " </g>\n",
230 " <g id=\"patch_9\">\n",
231 " <path clip-path=\"url(#p836f19e185)\" d=\"M 268.78125 228.14 \n",
232 "L 275.98125 228.14 \n",
233 "L 275.98125 126.915267 \n",
234 "L 268.78125 126.915267 \n",
235 "z\n",
236 "\" style=\"fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
237 " </g>\n",
238 " <g id=\"patch_10\">\n",
239 " <path clip-path=\"url(#p836f19e185)\" d=\"M 304.78125 228.14 \n",
240 "L 311.98125 228.14 \n",
241 "L 311.98125 116.870064 \n",
242 "L 304.78125 116.870064 \n",
243 "z\n",
244 "\" style=\"fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
245 " </g>\n",
246 " <g id=\"patch_11\">\n",
247 " <path clip-path=\"url(#p836f19e185)\" d=\"M 340.78125 228.14 \n",
248 "L 347.98125 228.14 \n",
249 "L 347.98125 110.688401 \n",
250 "L 340.78125 110.688401 \n",
251 "z\n",
252 "\" style=\"fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
253 " </g>\n",
254 " <g id=\"patch_12\">\n",
255 " <path clip-path=\"url(#p836f19e185)\" d=\"M 59.98125 228.14 \n",
256 "L 67.18125 228.14 \n",
257 "L 67.18125 118.41548 \n",
258 "L 59.98125 118.41548 \n",
259 "z\n",
260 "\" style=\"fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
261 " </g>\n",
262 " <g id=\"patch_13\">\n",
263 " <path clip-path=\"url(#p836f19e185)\" d=\"M 95.98125 228.14 \n",
264 "L 103.18125 228.14 \n",
265 "L 103.18125 118.41548 \n",
266 "L 95.98125 118.41548 \n",
267 "z\n",
268 "\" style=\"fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
269 " </g>\n",
270 " <g id=\"patch_14\">\n",
271 " <path clip-path=\"url(#p836f19e185)\" d=\"M 131.98125 228.14 \n",
272 "L 139.18125 228.14 \n",
273 "L 139.18125 118.41548 \n",
274 "L 131.98125 118.41548 \n",
275 "z\n",
276 "\" style=\"fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
277 " </g>\n",
278 " <g id=\"patch_15\">\n",
279 " <path clip-path=\"url(#p836f19e185)\" d=\"M 167.98125 228.14 \n",
280 "L 175.18125 228.14 \n",
281 "L 175.18125 118.41548 \n",
282 "L 167.98125 118.41548 \n",
283 "z\n",
284 "\" style=\"fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
285 " </g>\n",
286 " <g id=\"patch_16\">\n",
287 " <path clip-path=\"url(#p836f19e185)\" d=\"M 203.98125 228.14 \n",
288 "L 211.18125 228.14 \n",
289 "L 211.18125 118.41548 \n",
290 "L 203.98125 118.41548 \n",
291 "z\n",
292 "\" style=\"fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
293 " </g>\n",
294 " <g id=\"patch_17\">\n",
295 " <path clip-path=\"url(#p836f19e185)\" d=\"M 239.98125 228.14 \n",
296 "L 247.18125 228.14 \n",
297 "L 247.18125 118.41548 \n",
298 "L 239.98125 118.41548 \n",
299 "z\n",
300 "\" style=\"fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
301 " </g>\n",
302 " <g id=\"patch_18\">\n",
303 " <path clip-path=\"url(#p836f19e185)\" d=\"M 275.98125 228.14 \n",
304 "L 283.18125 228.14 \n",
305 "L 283.18125 118.41548 \n",
306 "L 275.98125 118.41548 \n",
307 "z\n",
308 "\" style=\"fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
309 " </g>\n",
310 " <g id=\"patch_19\">\n",
311 " <path clip-path=\"url(#p836f19e185)\" d=\"M 311.98125 228.14 \n",
312 "L 319.18125 228.14 \n",
313 "L 319.18125 117.642772 \n",
314 "L 311.98125 117.642772 \n",
315 "z\n",
316 "\" style=\"fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
317 " </g>\n",
318 " <g id=\"patch_20\">\n",
319 " <path clip-path=\"url(#p836f19e185)\" d=\"M 347.98125 228.14 \n",
320 "L 355.18125 228.14 \n",
321 "L 355.18125 117.642772 \n",
322 "L 347.98125 117.642772 \n",
323 "z\n",
324 "\" style=\"fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
325 " </g>\n",
326 " <g id=\"patch_21\">\n",
327 " <path clip-path=\"url(#p836f19e185)\" d=\"M 67.18125 228.14 \n",
328 "L 74.38125 228.14 \n",
329 "L 74.38125 118.41548 \n",
330 "L 67.18125 118.41548 \n",
331 "z\n",
332 "\" style=\"fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
333 " </g>\n",
334 " <g id=\"patch_22\">\n",
335 " <path clip-path=\"url(#p836f19e185)\" d=\"M 103.18125 228.14 \n",
336 "L 110.38125 228.14 \n",
337 "L 110.38125 118.41548 \n",
338 "L 103.18125 118.41548 \n",
339 "z\n",
340 "\" style=\"fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
341 " </g>\n",
342 " <g id=\"patch_23\">\n",
343 " <path clip-path=\"url(#p836f19e185)\" d=\"M 139.18125 228.14 \n",
344 "L 146.38125 228.14 \n",
345 "L 146.38125 118.41548 \n",
346 "L 139.18125 118.41548 \n",
347 "z\n",
348 "\" style=\"fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
349 " </g>\n",
350 " <g id=\"patch_24\">\n",
351 " <path clip-path=\"url(#p836f19e185)\" d=\"M 175.18125 228.14 \n",
352 "L 182.38125 228.14 \n",
353 "L 182.38125 118.41548 \n",
354 "L 175.18125 118.41548 \n",
355 "z\n",
356 "\" style=\"fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
357 " </g>\n",
358 " <g id=\"patch_25\">\n",
359 " <path clip-path=\"url(#p836f19e185)\" d=\"M 211.18125 228.14 \n",
360 "L 218.38125 228.14 \n",
361 "L 218.38125 118.41548 \n",
362 "L 211.18125 118.41548 \n",
363 "z\n",
364 "\" style=\"fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
365 " </g>\n",
366 " <g id=\"patch_26\">\n",
367 " <path clip-path=\"url(#p836f19e185)\" d=\"M 247.18125 228.14 \n",
368 "L 254.38125 228.14 \n",
369 "L 254.38125 118.41548 \n",
370 "L 247.18125 118.41548 \n",
371 "z\n",
372 "\" style=\"fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
373 " </g>\n",
374 " <g id=\"patch_27\">\n",
375 " <path clip-path=\"url(#p836f19e185)\" d=\"M 283.18125 228.14 \n",
376 "L 290.38125 228.14 \n",
377 "L 290.38125 118.41548 \n",
378 "L 283.18125 118.41548 \n",
379 "z\n",
380 "\" style=\"fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
381 " </g>\n",
382 " <g id=\"patch_28\">\n",
383 " <path clip-path=\"url(#p836f19e185)\" d=\"M 319.18125 228.14 \n",
384 "L 326.38125 228.14 \n",
385 "L 326.38125 117.642772 \n",
386 "L 319.18125 117.642772 \n",
387 "z\n",
388 "\" style=\"fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
389 " </g>\n",
390 " <g id=\"patch_29\">\n",
391 " <path clip-path=\"url(#p836f19e185)\" d=\"M 355.18125 228.14 \n",
392 "L 362.38125 228.14 \n",
393 "L 362.38125 117.642772 \n",
394 "L 355.18125 117.642772 \n",
395 "z\n",
396 "\" style=\"fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
397 " </g>\n",
398 " <g id=\"patch_30\">\n",
399 " <path clip-path=\"url(#p836f19e185)\" d=\"M 74.38125 228.14 \n",
400 "L 81.58125 228.14 \n",
401 "L 81.58125 119.188188 \n",
402 "L 74.38125 119.188188 \n",
403 "z\n",
404 "\" style=\"fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
405 " </g>\n",
406 " <g id=\"patch_31\">\n",
407 " <path clip-path=\"url(#p836f19e185)\" d=\"M 110.38125 228.14 \n",
408 "L 117.58125 228.14 \n",
409 "L 117.58125 104.506738 \n",
410 "L 110.38125 104.506738 \n",
411 "z\n",
412 "\" style=\"fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
413 " </g>\n",
414 " <g id=\"patch_32\">\n",
415 " <path clip-path=\"url(#p836f19e185)\" d=\"M 146.38125 228.14 \n",
416 "L 153.58125 228.14 \n",
417 "L 153.58125 88.279872 \n",
418 "L 146.38125 88.279872 \n",
419 "z\n",
420 "\" style=\"fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
421 " </g>\n",
422 " <g id=\"patch_33\">\n",
423 " <path clip-path=\"url(#p836f19e185)\" d=\"M 182.38125 228.14 \n",
424 "L 189.58125 228.14 \n",
425 "L 189.58125 77.461962 \n",
426 "L 182.38125 77.461962 \n",
427 "z\n",
428 "\" style=\"fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
429 " </g>\n",
430 " <g id=\"patch_34\">\n",
431 " <path clip-path=\"url(#p836f19e185)\" d=\"M 218.38125 228.14 \n",
432 "L 225.58125 228.14 \n",
433 "L 225.58125 73.598422 \n",
434 "L 218.38125 73.598422 \n",
435 "z\n",
436 "\" style=\"fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
437 " </g>\n",
438 " <g id=\"patch_35\">\n",
439 " <path clip-path=\"url(#p836f19e185)\" d=\"M 254.38125 228.14 \n",
440 "L 261.58125 228.14 \n",
441 "L 261.58125 57.371557 \n",
442 "L 254.38125 57.371557 \n",
443 "z\n",
444 "\" style=\"fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
445 " </g>\n",
446 " <g id=\"patch_36\">\n",
447 " <path clip-path=\"url(#p836f19e185)\" d=\"M 290.38125 228.14 \n",
448 "L 297.58125 228.14 \n",
449 "L 297.58125 57.371557 \n",
450 "L 290.38125 57.371557 \n",
451 "z\n",
452 "\" style=\"fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
453 " </g>\n",
454 " <g id=\"patch_37\">\n",
455 " <path clip-path=\"url(#p836f19e185)\" d=\"M 326.38125 228.14 \n",
456 "L 333.58125 228.14 \n",
457 "L 333.58125 31.872196 \n",
458 "L 326.38125 31.872196 \n",
459 "z\n",
460 "\" style=\"fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
461 " </g>\n",
462 " <g id=\"patch_38\">\n",
463 " <path clip-path=\"url(#p836f19e185)\" d=\"M 362.38125 228.14 \n",
464 "L 369.58125 228.14 \n",
465 "L 369.58125 21.054286 \n",
466 "L 362.38125 21.054286 \n",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
467 "z\n",
468 "\" style=\"fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
469 " </g>\n",
470 " <g id=\"matplotlib.axis_1\">\n",
471 " <g id=\"xtick_1\">\n",
472 " <g id=\"line2d_1\">\n",
473 " <defs>\n",
474 " <path d=\"M 0 0 \n",
475 "L 0 3.5 \n",
476 "\" id=\"m1f6b1ebb34\" style=\"stroke:#000000;stroke-width:0.8;\"/>\n",
477 " </defs>\n",
478 " <g>\n",
479 " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"67.18125\" xlink:href=\"#m1f6b1ebb34\" y=\"228.14\"/>\n",
480 " </g>\n",
481 " </g>\n",
482 " <g id=\"text_1\">\n",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
483 " <!-- 3 -->\n",
484 " <defs>\n",
485 " <path d=\"M 40.578125 39.3125 \n",
486 "Q 47.65625 37.796875 51.625 33 \n",
487 "Q 55.609375 28.21875 55.609375 21.1875 \n",
@@ -513,22 +642,22 @@
513 "Q 53.90625 49.265625 50.4375 45.09375 \n",
514 "Q 46.96875 40.921875 40.578125 39.3125 \n",
515 "z\n",
516 "\" id=\"DejaVuSans-51\"/>\n",
517 " </defs>\n",
518 " <g transform=\"translate(69.940625 241.5025)rotate(-90)scale(0.1 -0.1)\">\n",
519 " <use xlink:href=\"#DejaVuSans-51\"/>\n",
520 " </g>\n",
521 " </g>\n",
522 " </g>\n",
523 " <g id=\"xtick_2\">\n",
524 " <g id=\"line2d_2\">\n",
525 " <g>\n",
526 " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"103.18125\" xlink:href=\"#m1f6b1ebb34\" y=\"228.14\"/>\n",
527 " </g>\n",
528 " </g>\n",
529 " <g id=\"text_2\">\n",
530 " <!-- 4 -->\n",
531 " <defs>\n",
532 " <path d=\"M 37.796875 64.3125 \n",
533 "L 12.890625 25.390625 \n",
534 "L 37.796875 25.390625 \n",
@@ -545,22 +674,22 @@
545 "L 4.890625 17.1875 \n",
546 "L 4.890625 26.703125 \n",
547 "z\n",
548 "\" id=\"DejaVuSans-52\"/>\n",
549 " </defs>\n",
550 " <g transform=\"translate(105.940625 241.5025)rotate(-90)scale(0.1 -0.1)\">\n",
551 " <use xlink:href=\"#DejaVuSans-52\"/>\n",
552 " </g>\n",
553 " </g>\n",
554 " </g>\n",
555 " <g id=\"xtick_3\">\n",
556 " <g id=\"line2d_3\">\n",
557 " <g>\n",
558 " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"139.18125\" xlink:href=\"#m1f6b1ebb34\" y=\"228.14\"/>\n",
559 " </g>\n",
560 " </g>\n",
561 " <g id=\"text_3\">\n",
562 " <!-- 5 -->\n",
563 " <defs>\n",
564 " <path d=\"M 10.796875 72.90625 \n",
565 "L 49.515625 72.90625 \n",
566 "L 49.515625 64.59375 \n",
@@ -584,22 +713,22 @@
584 "Q 22.75 39.890625 18.8125 39.015625 \n",
585 "Q 14.890625 38.140625 10.796875 36.28125 \n",
586 "z\n",
587 "\" id=\"DejaVuSans-53\"/>\n",
588 " </defs>\n",
589 " <g transform=\"translate(141.940625 241.5025)rotate(-90)scale(0.1 -0.1)\">\n",
590 " <use xlink:href=\"#DejaVuSans-53\"/>\n",
591 " </g>\n",
592 " </g>\n",
593 " </g>\n",
594 " <g id=\"xtick_4\">\n",
595 " <g id=\"line2d_4\">\n",
596 " <g>\n",
597 " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"175.18125\" xlink:href=\"#m1f6b1ebb34\" y=\"228.14\"/>\n",
598 " </g>\n",
599 " </g>\n",
600 " <g id=\"text_4\">\n",
601 " <!-- 6 -->\n",
602 " <defs>\n",
603 " <path d=\"M 33.015625 40.375 \n",
604 "Q 26.375 40.375 22.484375 35.828125 \n",
605 "Q 18.609375 31.296875 18.609375 23.390625 \n",
@@ -629,22 +758,22 @@
629 "Q 40.921875 74.21875 44.703125 73.484375 \n",
630 "Q 48.484375 72.75 52.59375 71.296875 \n",
631 "z\n",
632 "\" id=\"DejaVuSans-54\"/>\n",
633 " </defs>\n",
634 " <g transform=\"translate(177.940625 241.5025)rotate(-90)scale(0.1 -0.1)\">\n",
635 " <use xlink:href=\"#DejaVuSans-54\"/>\n",
636 " </g>\n",
637 " </g>\n",
638 " </g>\n",
639 " <g id=\"xtick_5\">\n",
640 " <g id=\"line2d_5\">\n",
641 " <g>\n",
642 " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"211.18125\" xlink:href=\"#m1f6b1ebb34\" y=\"228.14\"/>\n",
643 " </g>\n",
644 " </g>\n",
645 " <g id=\"text_5\">\n",
646 " <!-- 7 -->\n",
647 " <defs>\n",
648 " <path d=\"M 8.203125 72.90625 \n",
649 "L 55.078125 72.90625 \n",
650 "L 55.078125 68.703125 \n",
@@ -653,22 +782,22 @@
653 "L 43.21875 64.59375 \n",
654 "L 8.203125 64.59375 \n",
655 "z\n",
656 "\" id=\"DejaVuSans-55\"/>\n",
657 " </defs>\n",
658 " <g transform=\"translate(213.940625 241.5025)rotate(-90)scale(0.1 -0.1)\">\n",
659 " <use xlink:href=\"#DejaVuSans-55\"/>\n",
660 " </g>\n",
661 " </g>\n",
662 " </g>\n",
663 " <g id=\"xtick_6\">\n",
664 " <g id=\"line2d_6\">\n",
665 " <g>\n",
666 " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"247.18125\" xlink:href=\"#m1f6b1ebb34\" y=\"228.14\"/>\n",
667 " </g>\n",
668 " </g>\n",
669 " <g id=\"text_6\">\n",
670 " <!-- 8 -->\n",
671 " <defs>\n",
672 " <path d=\"M 31.78125 34.625 \n",
673 "Q 24.75 34.625 20.71875 30.859375 \n",
674 "Q 16.703125 27.09375 16.703125 20.515625 \n",
@@ -707,22 +836,22 @@
707 "Q 25.390625 66.40625 21.84375 63.234375 \n",
708 "Q 18.3125 60.0625 18.3125 54.390625 \n",
709 "z\n",
710 "\" id=\"DejaVuSans-56\"/>\n",
711 " </defs>\n",
712 " <g transform=\"translate(249.940625 241.5025)rotate(-90)scale(0.1 -0.1)\">\n",
713 " <use xlink:href=\"#DejaVuSans-56\"/>\n",
714 " </g>\n",
715 " </g>\n",
716 " </g>\n",
717 " <g id=\"xtick_7\">\n",
718 " <g id=\"line2d_7\">\n",
719 " <g>\n",
720 " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"283.18125\" xlink:href=\"#m1f6b1ebb34\" y=\"228.14\"/>\n",
721 " </g>\n",
722 " </g>\n",
723 " <g id=\"text_7\">\n",
724 " <!-- 9 -->\n",
725 " <defs>\n",
726 " <path d=\"M 10.984375 1.515625 \n",
727 "L 10.984375 10.5 \n",
728 "Q 14.703125 8.734375 18.5 7.8125 \n",
@@ -752,37 +881,24 @@
752 "Q 16.21875 41.5 20.09375 36.953125 \n",
753 "Q 23.96875 32.421875 30.609375 32.421875 \n",
754 "z\n",
755 "\" id=\"DejaVuSans-57\"/>\n",
756 " </defs>\n",
757 " <g transform=\"translate(285.940625 241.5025)rotate(-90)scale(0.1 -0.1)\">\n",
758 " <use xlink:href=\"#DejaVuSans-57\"/>\n",
759 " </g>\n",
760 " </g>\n",
761 " </g>\n",
762 " <g id=\"xtick_8\">\n",
763 " <g id=\"line2d_8\">\n",
764 " <g>\n",
765 " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"319.18125\" xlink:href=\"#m1f6b1ebb34\" y=\"228.14\"/>\n",
766 " </g>\n",
767 " </g>\n",
768 " <g id=\"text_8\">\n",
769 " <!-- 10 -->\n",
770 " <defs>\n",
771 " <path d=\"M 12.40625 8.296875 \n",
772 "L 28.515625 8.296875 \n",
773 "L 28.515625 63.921875 \n",
774 "L 10.984375 60.40625 \n",
775 "L 10.984375 69.390625 \n",
776 "L 28.421875 72.90625 \n",
777 "L 38.28125 72.90625 \n",
778 "L 38.28125 8.296875 \n",
779 "L 54.390625 8.296875 \n",
780 "L 54.390625 0 \n",
781 "L 12.40625 0 \n",
782 "z\n",
783 "\" id=\"DejaVuSans-49\"/>\n",
784 " <path d=\"M 31.78125 66.40625 \n",
785 "Q 24.171875 66.40625 20.328125 58.90625 \n",
786 "Q 16.5 51.421875 16.5 36.375 \n",
787 "Q 16.5 21.390625 20.328125 13.890625 \n",
788 "Q 24.171875 6.390625 31.78125 6.390625 \n",
@@ -801,31 +917,17 @@
801 "Q 6.59375 54.828125 13.0625 64.515625 \n",
802 "Q 19.53125 74.21875 31.78125 74.21875 \n",
803 "z\n",
804 "\" id=\"DejaVuSans-48\"/>\n",
805 " </defs>\n",
806 " <g transform=\"translate(321.940625 247.865)rotate(-90)scale(0.1 -0.1)\">\n",
807 " <use xlink:href=\"#DejaVuSans-49\"/>\n",
808 " <use x=\"63.623047\" xlink:href=\"#DejaVuSans-48\"/>\n",
809 " </g>\n",
810 " </g>\n",
811 " </g>\n",
812 " <g id=\"xtick_9\">\n",
813 " <g id=\"line2d_9\">\n",
814 " <g>\n",
815 " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"355.18125\" xlink:href=\"#m1f6b1ebb34\" y=\"228.14\"/>\n",
816 " </g>\n",
817 " </g>\n",
818 " <g id=\"text_9\">\n",
819 " <!-- 11 -->\n",
820 " <g transform=\"translate(357.940625 247.865)rotate(-90)scale(0.1 -0.1)\">\n",
821 " <use xlink:href=\"#DejaVuSans-49\"/>\n",
822 " <use x=\"63.623047\" xlink:href=\"#DejaVuSans-49\"/>\n",
823 " </g>\n",
824 " </g>\n",
825 " </g>\n",
826 " <g id=\"text_10\">\n",
827 " <!-- Checkin index -->\n",
828 " <defs>\n",
829 " <path d=\"M 64.40625 67.28125 \n",
830 "L 64.40625 56.890625 \n",
831 "Q 59.421875 61.53125 53.78125 63.8125 \n",
@@ -994,11 +1096,11 @@
994 "L 29.78125 35.203125 \n",
995 "L 44.28125 54.6875 \n",
996 "z\n",
997 "\" id=\"DejaVuSans-120\"/>\n",
998 " </defs>\n",
999 " <g transform=\"translate(175.885938 259.463437)scale(0.1 -0.1)\">\n",
1000 " <use xlink:href=\"#DejaVuSans-67\"/>\n",
1001 " <use x=\"69.824219\" xlink:href=\"#DejaVuSans-104\"/>\n",
1002 " <use x=\"133.203125\" xlink:href=\"#DejaVuSans-101\"/>\n",
1003 " <use x=\"194.726562\" xlink:href=\"#DejaVuSans-99\"/>\n",
1004 " <use x=\"249.707031\" xlink:href=\"#DejaVuSans-107\"/>\n",
@@ -1013,139 +1115,113 @@
1013 " </g>\n",
1014 " </g>\n",
1015 " </g>\n",
1016 " <g id=\"matplotlib.axis_2\">\n",
1017 " <g id=\"ytick_1\">\n",
1018 " <g id=\"line2d_10\">\n",
1019 " <defs>\n",
1020 " <path d=\"M 0 0 \n",
1021 "L -3.5 0 \n",
1022 "\" id=\"mc174bd9713\" style=\"stroke:#000000;stroke-width:0.8;\"/>\n",
1023 " </defs>\n",
1024 " <g>\n",
1025 " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"43.78125\" xlink:href=\"#mc174bd9713\" y=\"228.14\"/>\n",
1026 " </g>\n",
1027 " </g>\n",
1028 " <g id=\"text_11\">\n",
1029 " <!-- 0.0 -->\n",
1030 " <defs>\n",
1031 " <path d=\"M 10.6875 12.40625 \n",
1032 "L 21 12.40625 \n",
1033 "L 21 0 \n",
1034 "L 10.6875 0 \n",
1035 "z\n",
1036 "\" id=\"DejaVuSans-46\"/>\n",
1037 " </defs>\n",
1038 " <g transform=\"translate(20.878125 231.939219)scale(0.1 -0.1)\">\n",
1039 " <use xlink:href=\"#DejaVuSans-48\"/>\n",
1040 " <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
1041 " <use x=\"95.410156\" xlink:href=\"#DejaVuSans-48\"/>\n",
1042 " </g>\n",
1043 " </g>\n",
1044 " </g>\n",
1045 " <g id=\"ytick_2\">\n",
1046 " <g id=\"line2d_11\">\n",
1047 " <g>\n",
1048 " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"43.78125\" xlink:href=\"#mc174bd9713\" y=\"188.577356\"/>\n",
1049 " </g>\n",
1050 " </g>\n",
1051 " <g id=\"text_12\">\n",
1052 " <!-- 0.2 -->\n",
1053 " <defs>\n",
1054 " <path d=\"M 19.1875 8.296875 \n",
1055 "L 53.609375 8.296875 \n",
1056 "L 53.609375 0 \n",
1057 "L 7.328125 0 \n",
1058 "L 7.328125 8.296875 \n",
1059 "Q 12.9375 14.109375 22.625 23.890625 \n",
1060 "Q 32.328125 33.6875 34.8125 36.53125 \n",
1061 "Q 39.546875 41.84375 41.421875 45.53125 \n",
1062 "Q 43.3125 49.21875 43.3125 52.78125 \n",
1063 "Q 43.3125 58.59375 39.234375 62.25 \n",
1064 "Q 35.15625 65.921875 28.609375 65.921875 \n",
1065 "Q 23.96875 65.921875 18.8125 64.3125 \n",
1066 "Q 13.671875 62.703125 7.8125 59.421875 \n",
1067 "L 7.8125 69.390625 \n",
1068 "Q 13.765625 71.78125 18.9375 73 \n",
1069 "Q 24.125 74.21875 28.421875 74.21875 \n",
1070 "Q 39.75 74.21875 46.484375 68.546875 \n",
1071 "Q 53.21875 62.890625 53.21875 53.421875 \n",
1072 "Q 53.21875 48.921875 51.53125 44.890625 \n",
1073 "Q 49.859375 40.875 45.40625 35.40625 \n",
1074 "Q 44.1875 33.984375 37.640625 27.21875 \n",
1075 "Q 31.109375 20.453125 19.1875 8.296875 \n",
1076 "z\n",
1077 "\" id=\"DejaVuSans-50\"/>\n",
1078 " </defs>\n",
1079 " <g transform=\"translate(20.878125 192.376575)scale(0.1 -0.1)\">\n",
1080 " <use xlink:href=\"#DejaVuSans-48\"/>\n",
1081 " <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
1082 " <use x=\"95.410156\" xlink:href=\"#DejaVuSans-50\"/>\n",
1083 " </g>\n",
1084 " </g>\n",
1085 " </g>\n",
1086 " <g id=\"ytick_3\">\n",
1087 " <g id=\"line2d_12\">\n",
1088 " <g>\n",
1089 " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"43.78125\" xlink:href=\"#mc174bd9713\" y=\"149.014712\"/>\n",
1090 " </g>\n",
1091 " </g>\n",
1092 " <g id=\"text_13\">\n",
1093 " <!-- 0.4 -->\n",
1094 " <g transform=\"translate(20.878125 152.813931)scale(0.1 -0.1)\">\n",
1095 " <use xlink:href=\"#DejaVuSans-48\"/>\n",
1096 " <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
1097 " <use x=\"95.410156\" xlink:href=\"#DejaVuSans-52\"/>\n",
1098 " </g>\n",
1099 " </g>\n",
1100 " </g>\n",
1101 " <g id=\"ytick_4\">\n",
1102 " <g id=\"line2d_13\">\n",
1103 " <g>\n",
1104 " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"43.78125\" xlink:href=\"#mc174bd9713\" y=\"109.452068\"/>\n",
1105 " </g>\n",
1106 " </g>\n",
1107 " <g id=\"text_14\">\n",
1108 " <!-- 0.6 -->\n",
1109 " <g transform=\"translate(20.878125 113.251287)scale(0.1 -0.1)\">\n",
1110 " <use xlink:href=\"#DejaVuSans-48\"/>\n",
1111 " <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
1112 " <use x=\"95.410156\" xlink:href=\"#DejaVuSans-54\"/>\n",
1113 " </g>\n",
1114 " </g>\n",
1115 " </g>\n",
1116 " <g id=\"ytick_5\">\n",
1117 " <g id=\"line2d_14\">\n",
1118 " <g>\n",
1119 " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"43.78125\" xlink:href=\"#mc174bd9713\" y=\"69.889424\"/>\n",
1120 " </g>\n",
1121 " </g>\n",
1122 " <g id=\"text_15\">\n",
1123 " <!-- 0.8 -->\n",
1124 " <g transform=\"translate(20.878125 73.688643)scale(0.1 -0.1)\">\n",
1125 " <use xlink:href=\"#DejaVuSans-48\"/>\n",
1126 " <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
1127 " <use x=\"95.410156\" xlink:href=\"#DejaVuSans-56\"/>\n",
1128 " </g>\n",
1129 " </g>\n",
1130 " </g>\n",
1131 " <g id=\"ytick_6\">\n",
1132 " <g id=\"line2d_15\">\n",
1133 " <g>\n",
1134 " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"43.78125\" xlink:href=\"#mc174bd9713\" y=\"30.32678\"/>\n",
1135 " </g>\n",
1136 " </g>\n",
1137 " <g id=\"text_16\">\n",
1138 " <!-- 1.0 -->\n",
1139 " <g transform=\"translate(20.878125 34.125999)scale(0.1 -0.1)\">\n",
1140 " <use xlink:href=\"#DejaVuSans-49\"/>\n",
1141 " <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
1142 " <use x=\"95.410156\" xlink:href=\"#DejaVuSans-48\"/>\n",
1143 " </g>\n",
1144 " </g>\n",
1145 " </g>\n",
1146 " <g id=\"text_17\">\n",
1147 " <!-- Repo size (MiB) -->\n",
1148 " <defs>\n",
1149 " <path d=\"M 44.390625 34.1875 \n",
1150 "Q 47.5625 33.109375 50.5625 29.59375 \n",
1151 "Q 53.5625 26.078125 56.59375 19.921875 \n",
@@ -1331,11 +1407,11 @@
1331 "Q 20.90625 42.671875 17.703125 53.65625 \n",
1332 "Q 14.5 64.65625 8.015625 75.875 \n",
1333 "z\n",
1334 "\" id=\"DejaVuSans-41\"/>\n",
1335 " </defs>\n",
1336 " <g transform=\"translate(14.798438 158.109062)rotate(-90)scale(0.1 -0.1)\">\n",
1337 " <use xlink:href=\"#DejaVuSans-82\"/>\n",
1338 " <use x=\"69.419922\" xlink:href=\"#DejaVuSans-101\"/>\n",
1339 " <use x=\"130.943359\" xlink:href=\"#DejaVuSans-112\"/>\n",
1340 " <use x=\"194.419922\" xlink:href=\"#DejaVuSans-111\"/>\n",
1341 " <use x=\"255.601562\" xlink:href=\"#DejaVuSans-32\"/>\n",
@@ -1350,53 +1426,53 @@
1350 " <use x=\"666.148438\" xlink:href=\"#DejaVuSans-66\"/>\n",
1351 " <use x=\"734.751953\" xlink:href=\"#DejaVuSans-41\"/>\n",
1352 " </g>\n",
1353 " </g>\n",
1354 " </g>\n",
1355 " <g id=\"patch_39\">\n",
1356 " <path d=\"M 43.78125 228.14 \n",
1357 "L 43.78125 10.7 \n",
1358 "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
1359 " </g>\n",
1360 " <g id=\"patch_40\">\n",
1361 " <path d=\"M 378.58125 228.14 \n",
1362 "L 378.58125 10.7 \n",
1363 "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
1364 " </g>\n",
1365 " <g id=\"patch_41\">\n",
1366 " <path d=\"M 43.78125 228.14 \n",
1367 "L 378.58125 228.14 \n",
1368 "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
1369 " </g>\n",
1370 " <g id=\"patch_42\">\n",
1371 " <path d=\"M 43.78125 10.7 \n",
1372 "L 378.58125 10.7 \n",
1373 "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
1374 " </g>\n",
1375 " <g id=\"legend_1\">\n",
1376 " <g id=\"patch_43\">\n",
1377 " <path d=\"M 50.78125 77.4125 \n",
1378 "L 105.828125 77.4125 \n",
1379 "Q 107.828125 77.4125 107.828125 75.4125 \n",
1380 "L 107.828125 17.7 \n",
1381 "Q 107.828125 15.7 105.828125 15.7 \n",
1382 "L 50.78125 15.7 \n",
1383 "Q 48.78125 15.7 48.78125 17.7 \n",
1384 "L 48.78125 75.4125 \n",
1385 "Q 48.78125 77.4125 50.78125 77.4125 \n",
1386 "z\n",
1387 "\" style=\"fill:#ffffff;opacity:0.8;stroke:#cccccc;stroke-linejoin:miter;\"/>\n",
1388 " </g>\n",
1389 " <g id=\"patch_44\">\n",
1390 " <path d=\"M 52.78125 27.298437 \n",
1391 "L 72.78125 27.298437 \n",
1392 "L 72.78125 20.298437 \n",
1393 "L 52.78125 20.298437 \n",
1394 "z\n",
1395 "\" style=\"fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
1396 " </g>\n",
1397 " <g id=\"text_18\">\n",
1398 " <!-- JPEG -->\n",
1399 " <defs>\n",
1400 " <path d=\"M 9.8125 72.90625 \n",
1401 "L 19.671875 72.90625 \n",
1402 "L 19.671875 5.078125 \n",
@@ -1466,42 +1542,42 @@
1466 "Q 48.046875 6.6875 52.140625 7.59375 \n",
1467 "Q 56.25 8.5 59.515625 10.40625 \n",
1468 "z\n",
1469 "\" id=\"DejaVuSans-71\"/>\n",
1470 " </defs>\n",
1471 " <g transform=\"translate(80.78125 27.298437)scale(0.1 -0.1)\">\n",
1472 " <use xlink:href=\"#DejaVuSans-74\"/>\n",
1473 " <use x=\"29.492188\" xlink:href=\"#DejaVuSans-80\"/>\n",
1474 " <use x=\"89.794922\" xlink:href=\"#DejaVuSans-69\"/>\n",
1475 " <use x=\"152.978516\" xlink:href=\"#DejaVuSans-71\"/>\n",
1476 " </g>\n",
1477 " </g>\n",
1478 " <g id=\"patch_45\">\n",
1479 " <path d=\"M 52.78125 41.976562 \n",
1480 "L 72.78125 41.976562 \n",
1481 "L 72.78125 34.976562 \n",
1482 "L 52.78125 34.976562 \n",
1483 "z\n",
1484 "\" style=\"fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
1485 " </g>\n",
1486 " <g id=\"text_19\">\n",
1487 " <!-- BMP -->\n",
1488 " <g transform=\"translate(80.78125 41.976562)scale(0.1 -0.1)\">\n",
1489 " <use xlink:href=\"#DejaVuSans-66\"/>\n",
1490 " <use x=\"68.603516\" xlink:href=\"#DejaVuSans-77\"/>\n",
1491 " <use x=\"154.882812\" xlink:href=\"#DejaVuSans-80\"/>\n",
1492 " </g>\n",
1493 " </g>\n",
1494 " <g id=\"patch_46\">\n",
1495 " <path d=\"M 52.78125 56.654687 \n",
1496 "L 72.78125 56.654687 \n",
1497 "L 72.78125 49.654687 \n",
1498 "L 52.78125 49.654687 \n",
1499 "z\n",
1500 "\" style=\"fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
1501 " </g>\n",
1502 " <g id=\"text_20\">\n",
1503 " <!-- TIFF -->\n",
1504 " <defs>\n",
1505 " <path d=\"M -0.296875 72.90625 \n",
1506 "L 61.375 72.90625 \n",
1507 "L 61.375 64.59375 \n",
@@ -1529,26 +1605,26 @@
1529 "L 19.671875 0 \n",
1530 "L 9.8125 0 \n",
1531 "z\n",
1532 "\" id=\"DejaVuSans-70\"/>\n",
1533 " </defs>\n",
1534 " <g transform=\"translate(80.78125 56.654687)scale(0.1 -0.1)\">\n",
1535 " <use xlink:href=\"#DejaVuSans-84\"/>\n",
1536 " <use x=\"61.083984\" xlink:href=\"#DejaVuSans-73\"/>\n",
1537 " <use x=\"90.576172\" xlink:href=\"#DejaVuSans-70\"/>\n",
1538 " <use x=\"148.095703\" xlink:href=\"#DejaVuSans-70\"/>\n",
1539 " </g>\n",
1540 " </g>\n",
1541 " <g id=\"patch_47\">\n",
1542 " <path d=\"M 52.78125 71.332812 \n",
1543 "L 72.78125 71.332812 \n",
1544 "L 72.78125 64.332812 \n",
1545 "L 52.78125 64.332812 \n",
1546 "z\n",
1547 "\" style=\"fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
1548 " </g>\n",
1549 " <g id=\"text_21\">\n",
1550 " <!-- PNG -->\n",
1551 " <defs>\n",
1552 " <path d=\"M 9.8125 72.90625 \n",
1553 "L 23.09375 72.90625 \n",
1554 "L 55.421875 11.921875 \n",
@@ -1560,22 +1636,22 @@
1560 "L 19.390625 0 \n",
1561 "L 9.8125 0 \n",
1562 "z\n",
1563 "\" id=\"DejaVuSans-78\"/>\n",
1564 " </defs>\n",
1565 " <g transform=\"translate(80.78125 71.332812)scale(0.1 -0.1)\">\n",
1566 " <use xlink:href=\"#DejaVuSans-80\"/>\n",
1567 " <use x=\"60.302734\" xlink:href=\"#DejaVuSans-78\"/>\n",
1568 " <use x=\"135.107422\" xlink:href=\"#DejaVuSans-71\"/>\n",
1569 " </g>\n",
1570 " </g>\n",
1571 " </g>\n",
1572 " </g>\n",
1573 " </g>\n",
1574 " <defs>\n",
1575 " <clipPath id=\"p836f19e185\">\n",
1576 " <rect height=\"217.44\" width=\"334.8\" x=\"43.78125\" y=\"10.7\"/>\n",
1577 " </clipPath>\n",
1578 " </defs>\n",
1579 "</svg>\n"
1580 ],
1581 "text/plain": [
@@ -1591,15 +1667,17 @@
1591 "source": [
1592 "%config InlineBackend.figure_formats = ['svg']\n",
1593 "\n",
1594 "import matplotlib as mpl\n",
1595 "import matplotlib.pyplot as plt\n",
 
 
 
1596 "\n",
1597 "# Merge per-format test data into a single DataFrame without the first\n",
1598 "# first 3 rows: the initial empty repo state (boring) and the repo DB\n",
1599 "# size as it \"settles\" in its first few checkins.\n",
1600 "data = pd.concat(repo_sizes, axis=1).drop(range(3))\n",
1601 "\n",
1602 "mpl.rcParams['figure.figsize'] = (6, 4)\n",
1603 "ax = data.plot(kind = 'bar', colormap = 'coolwarm',\n",
1604 " grid = False, width = 0.8,\n",
1605 " edgecolor = 'white', linewidth = 2)\n",
@@ -1631,11 +1709,11 @@
1631 "file_extension": ".py",
1632 "mimetype": "text/x-python",
1633 "name": "python",
1634 "nbconvert_exporter": "python",
1635 "pygments_lexer": "ipython3",
1636 "version": "3.7.1"
1637 }
1638 },
1639 "nbformat": 4,
1640 "nbformat_minor": 2
1641 }
1642
--- www/image-format-vs-repo-size.ipynb
+++ www/image-format-vs-repo-size.ipynb
@@ -6,28 +6,32 @@
6 "source": [
7 "# Image Format vs Fossil Repository Size\n",
8 "\n",
9 "## Prerequisites\n",
10 "\n",
11 "This notebook was originally developed with standalone [JupyterLab] and Python 2 but was later moved to JupyterLab under [Anaconda] with Python 3. Backporting to Python 2 may require manual adjustment. Getting it running under stock JupyterLab or plain-old-Jupyter should be straightforward for one familiar with the tools. We will assume you're following in my footsteps, using Anaconda.\n",
12 "\n",
13 "One of the reasons we switched to Anaconda is that it comes with all but one of this notebook's prerequisites, that last remaining one of which you install so:\n",
14 "\n",
15 " $ pip install wand\n",
16 "\n",
17 "That should be done in a shell where \"`pip`\" is the version that came with Anaconda. Otherwise, the package will likely end up in some *other* Python package tree, which Anaconda's Python kernel may not be smart enough to find on its own.\n",
18 "\n",
19 "Note that you do *not* use `conda` for this: as of this writing, [Wand] is not available in a form that installs via `conda`.\n",
20 "\n",
21 "This notebook was written and tested on a macOS system where `/tmp` exists. Other platforms may require adjustments to the scripts below.\n",
22 "\n",
23 "[Anaconda]: https://www.anaconda.com/distribution/\n",
24 "[JupyterLab]: https://github.com/jupyterlab/\n",
25 "[Wand]: http://wand-py.org/\n",
26 "\n",
27 "\n",
28 "## Running\n",
29 "\n",
30 "The next cell generates the test repositories. This takes about 3 seconds to run on my machine. If you have to uncomment the \"`sleep`\" call in the inner loop, this will go up to about 45 seconds.\n",
31 "\n",
32 "The next cell produces the bar chart from the collected data, all but instantaneously.\n",
33 "\n",
34 "This split allows you to generate the expensive experimental data in a single pass, then play as many games as you like with the generated data.\n",
35 "\n",
36 "\n",
37 "## Discussion\n",
@@ -42,17 +46,23 @@
46 "outputs": [
47 {
48 "name": "stdout",
49 "output_type": "stream",
50 "text": [
51 "Created test directory /tmp/image-format-vs-repo-size\n",
52 "Created ../test-jpeg.fossil for format JPEG.\n",
53 "Created ../test-bmp.fossil for format BMP.\n",
54 "Created ../test-tiff.fossil for format TIFF.\n",
55 "Created ../test-png.fossil for format PNG.\n",
56 "Experiment completed in 3.0627901554107666 seconds.\n"
57 ]
58 }
59 ],
60 "source": [
61 "import os\n",
62 "import random\n",
63 "import subprocess\n",
64 "import time\n",
65 "\n",
66 "from wand.color import Color\n",
67 "from wand.drawing import Drawing\n",
68 "from wand.image import Image\n",
@@ -61,50 +71,67 @@
71 "\n",
72 "size = 256\n",
73 "iterations = 10\n",
74 "start = time.time()\n",
75 "repo_sizes = []\n",
76 "fossil = '/usr/local/bin/fossil'\n",
77 "\n",
78 "if not os.path.isfile(fossil): raise RuntimeError(\"No such executable \" + fossil)\n",
79 "if not os.access(fossil, os.X_OK): raise RuntimeError(\"Cannot execute \" + fossil)\n",
80 "\n",
81 "tdir = os.path.join('/tmp', 'image-format-vs-repo-size')\n",
82 "if not os.path.isdir(tdir): os.mkdir(tdir, 0o700)\n",
83 "print(\"Created test directory \" + tdir)\n",
84 " \n",
85 "formats = ['JPEG', 'BMP', 'TIFF', 'PNG']\n",
86 "for f in formats:\n",
87 " ext = f.lower()\n",
88 " wdir = os.path.join(tdir, 'work-' + ext)\n",
89 " if not os.path.isdir(wdir): os.mkdir(wdir, 0o700)\n",
90 " os.chdir(wdir)\n",
91 " repo = '../test-' + ext + '.fossil'\n",
92 " ifn = 'test.' + ext\n",
93 " ipath = os.path.join(wdir, ifn)\n",
94 " rs = []\n",
95 " \n",
96 " def add_repo_size():\n",
97 " rs.append(os.path.getsize(repo) / 1024.0 / 1024.0)\n",
98 " \n",
99 " def set_repo_page_size(n):\n",
100 " subprocess.run([\n",
101 " fossil,\n",
102 " 'rebuild',\n",
103 " '--compress',\n",
104 " '--pagesize',\n",
105 " str(n),\n",
106 " '--vacuum'\n",
107 " ])\n",
108 "\n",
109 " try:\n",
110 " # Create test repo\n",
111 " subprocess.run([fossil, 'init', repo])\n",
112 " subprocess.run([fossil, 'open', repo])\n",
113 " subprocess.run([fossil, 'set', 'binary-glob', \"*.{0}\".format(ext)])\n",
114 " set_repo_page_size(512) # minimum\n",
 
 
115 " add_repo_size()\n",
116 " set_repo_page_size(8192) # default\n",
117 " print(\"Created \" + repo + \" for format \" + f + \".\")\n",
118 "\n",
119 " # Create test image and add it to the repo\n",
120 " img = Image(width = size, height = size, depth = 8,\n",
121 " background = 'white')\n",
122 " img.alpha_channel = 'remove'\n",
123 " img.evaluate('gaussiannoise', 1.0)\n",
124 " img.save(filename = ipath)\n",
125 " subprocess.run([fossil, 'add', ifn])\n",
126 " subprocess.run([fossil, 'ci', '-m', 'initial'])\n",
127 " #print(\"Added initial \" + f + \" image.\")\n",
 
 
 
128 " add_repo_size()\n",
129 "\n",
130 " # Change a random pixel to a random RGB value and check it in\n",
131 " # $iterations times.\n",
132 " for i in range(iterations - 1):\n",
133 " with Drawing() as draw:\n",
134 " x = random.randint(0, size - 1)\n",
135 " y = random.randint(0, size - 1)\n",
136 "\n",
137 " r = random.randint(0, 255)\n",
@@ -116,372 +143,474 @@
143 " ))\n",
144 " draw.color(x, y, 'point')\n",
145 " draw(img)\n",
146 " img.save(filename = ipath)\n",
147 " \n",
148 " # You might need to uncomment the next line if you find that\n",
149 " # the repo size doesn't change as expected. In some versions\n",
150 " # of Wand (or is it the ImageMagick underneath?) we have seen\n",
151 " # what appear to be asynchronous saves, with a zero-length file\n",
152 " # here if you don't wait for the save to complete.\n",
153 " #time.sleep(1.0)\n",
154 " \n",
155 " subprocess.run([fossil, 'ci', '-m', '\"change {0} step {1}'.format(\n",
156 " f, i\n",
157 " )])\n",
 
 
158 " add_repo_size()\n",
159 " \n",
160 " # Repo complete for this format\n",
161 " repo_sizes.append(pd.Series(rs, name=f))\n",
162 "\n",
163 " finally:\n",
164 " if os.path.exists(ipath): os.remove(ipath)\n",
165 " if os.path.exists(tdir):\n",
166 " if os.path.isfile(repo):\n",
167 " subprocess.run([fossil, 'close', '-f'])\n",
168 " os.unlink(repo)\n",
169 " os.chdir(tdir);\n",
170 " os.rmdir(wdir)\n",
171 " if os.path.exists(repo): os.remove(repo)\n",
172 " \n",
173 "print(\"Experiment completed in \" + str(time.time() - start) + \" seconds.\")"
174 ]
175 },
176 {
177 "cell_type": "code",
178 "execution_count": 1,
179 "metadata": {},
180 "outputs": [
181 {
182 "data": {
183 "image/svg+xml": [
184 "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\n",
185 "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
186 " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
187 "<!-- Created with matplotlib (https://matplotlib.org/) -->\n",
188 "<svg height=\"265.243125pt\" version=\"1.1\" viewBox=\"0 0 385.78125 265.243125\" width=\"385.78125pt\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
189 " <defs>\n",
190 " <style type=\"text/css\">\n",
191 "*{stroke-linecap:butt;stroke-linejoin:round;}\n",
192 " </style>\n",
193 " </defs>\n",
194 " <g id=\"figure_1\">\n",
195 " <g id=\"patch_1\">\n",
196 " <path d=\"M 0 265.243125 \n",
197 "L 385.78125 265.243125 \n",
198 "L 385.78125 0 \n",
199 "L 0 0 \n",
200 "z\n",
201 "\" style=\"fill:none;\"/>\n",
202 " </g>\n",
203 " <g id=\"axes_1\">\n",
204 " <g id=\"patch_2\">\n",
205 " <path d=\"M 43.78125 224.64 \n",
206 "L 378.58125 224.64 \n",
207 "L 378.58125 7.2 \n",
208 "L 43.78125 7.2 \n",
209 "z\n",
210 "\" style=\"fill:#ffffff;\"/>\n",
211 " </g>\n",
212 " <g id=\"patch_3\">\n",
213 " <path clip-path=\"url(#p70301a0bed)\" d=\"M 51.907464 224.64 \n",
214 "L 58.408434 224.64 \n",
215 "L 58.408434 138.354286 \n",
216 "L 51.907464 138.354286 \n",
217 "z\n",
218 "\" style=\"fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
219 " </g>\n",
220 " <g id=\"patch_4\">\n",
221 " <path clip-path=\"url(#p70301a0bed)\" d=\"M 84.412318 224.64 \n",
222 "L 90.913289 224.64 \n",
223 "L 90.913289 126.849524 \n",
224 "L 84.412318 126.849524 \n",
225 "z\n",
226 "\" style=\"fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
227 " </g>\n",
228 " <g id=\"patch_5\">\n",
229 " <path clip-path=\"url(#p70301a0bed)\" d=\"M 116.917172 224.64 \n",
230 "L 123.418143 224.64 \n",
231 "L 123.418143 118.220952 \n",
232 "L 116.917172 118.220952 \n",
233 "z\n",
234 "\" style=\"fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
235 " </g>\n",
236 " <g id=\"patch_6\">\n",
237 " <path clip-path=\"url(#p70301a0bed)\" d=\"M 149.422027 224.64 \n",
238 "L 155.922998 224.64 \n",
239 "L 155.922998 112.468571 \n",
240 "L 149.422027 112.468571 \n",
241 "z\n",
242 "\" style=\"fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
243 " </g>\n",
244 " <g id=\"patch_7\">\n",
245 " <path clip-path=\"url(#p70301a0bed)\" d=\"M 181.926881 224.64 \n",
246 "L 188.427852 224.64 \n",
247 "L 188.427852 109.592381 \n",
248 "L 181.926881 109.592381 \n",
249 "z\n",
250 "\" style=\"fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
251 " </g>\n",
252 " <g id=\"patch_8\">\n",
253 " <path clip-path=\"url(#p70301a0bed)\" d=\"M 214.431735 224.64 \n",
254 "L 220.932706 224.64 \n",
255 "L 220.932706 103.84 \n",
256 "L 214.431735 103.84 \n",
257 "z\n",
258 "\" style=\"fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
259 " </g>\n",
260 " <g id=\"patch_9\">\n",
261 " <path clip-path=\"url(#p70301a0bed)\" d=\"M 246.93659 224.64 \n",
262 "L 253.437561 224.64 \n",
263 "L 253.437561 98.087619 \n",
264 "L 246.93659 98.087619 \n",
265 "z\n",
266 "\" style=\"fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
267 " </g>\n",
268 " <g id=\"patch_10\">\n",
269 " <path clip-path=\"url(#p70301a0bed)\" d=\"M 279.441444 224.64 \n",
270 "L 285.942415 224.64 \n",
271 "L 285.942415 98.087619 \n",
272 "L 279.441444 98.087619 \n",
273 "z\n",
274 "\" style=\"fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
275 " </g>\n",
276 " <g id=\"patch_11\">\n",
277 " <path clip-path=\"url(#p70301a0bed)\" d=\"M 311.946299 224.64 \n",
278 "L 318.447269 224.64 \n",
279 "L 318.447269 82.268571 \n",
280 "L 311.946299 82.268571 \n",
281 "z\n",
282 "\" style=\"fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
283 " </g>\n",
284 " <g id=\"patch_12\">\n",
285 " <path clip-path=\"url(#p70301a0bed)\" d=\"M 344.451153 224.64 \n",
286 "L 350.952124 224.64 \n",
287 "L 350.952124 77.954286 \n",
288 "L 344.451153 77.954286 \n",
289 "z\n",
290 "\" style=\"fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
291 " </g>\n",
292 " <g id=\"patch_13\">\n",
293 " <path clip-path=\"url(#p70301a0bed)\" d=\"M 58.408434 224.64 \n",
294 "L 64.909405 224.64 \n",
295 "L 64.909405 125.411429 \n",
296 "L 58.408434 125.411429 \n",
297 "z\n",
298 "\" style=\"fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
299 " </g>\n",
300 " <g id=\"patch_14\">\n",
301 " <path clip-path=\"url(#p70301a0bed)\" d=\"M 90.913289 224.64 \n",
302 "L 97.41426 224.64 \n",
303 "L 97.41426 105.278095 \n",
304 "L 90.913289 105.278095 \n",
305 "z\n",
306 "\" style=\"fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
307 " </g>\n",
308 " <g id=\"patch_15\">\n",
309 " <path clip-path=\"url(#p70301a0bed)\" d=\"M 123.418143 224.64 \n",
310 "L 129.919114 224.64 \n",
311 "L 129.919114 105.278095 \n",
312 "L 123.418143 105.278095 \n",
313 "z\n",
314 "\" style=\"fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
315 " </g>\n",
316 " <g id=\"patch_16\">\n",
317 " <path clip-path=\"url(#p70301a0bed)\" d=\"M 155.922998 224.64 \n",
318 "L 162.423968 224.64 \n",
319 "L 162.423968 105.278095 \n",
320 "L 155.922998 105.278095 \n",
321 "z\n",
322 "\" style=\"fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
323 " </g>\n",
324 " <g id=\"patch_17\">\n",
325 " <path clip-path=\"url(#p70301a0bed)\" d=\"M 188.427852 224.64 \n",
326 "L 194.928823 224.64 \n",
327 "L 194.928823 105.278095 \n",
328 "L 188.427852 105.278095 \n",
329 "z\n",
330 "\" style=\"fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
331 " </g>\n",
332 " <g id=\"patch_18\">\n",
333 " <path clip-path=\"url(#p70301a0bed)\" d=\"M 220.932706 224.64 \n",
334 "L 227.433677 224.64 \n",
335 "L 227.433677 105.278095 \n",
336 "L 220.932706 105.278095 \n",
337 "z\n",
338 "\" style=\"fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
339 " </g>\n",
340 " <g id=\"patch_19\">\n",
341 " <path clip-path=\"url(#p70301a0bed)\" d=\"M 253.437561 224.64 \n",
342 "L 259.938532 224.64 \n",
343 "L 259.938532 105.278095 \n",
344 "L 253.437561 105.278095 \n",
345 "z\n",
346 "\" style=\"fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
347 " </g>\n",
348 " <g id=\"patch_20\">\n",
349 " <path clip-path=\"url(#p70301a0bed)\" d=\"M 285.942415 224.64 \n",
350 "L 292.443386 224.64 \n",
351 "L 292.443386 105.278095 \n",
352 "L 285.942415 105.278095 \n",
353 "z\n",
354 "\" style=\"fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
355 " </g>\n",
356 " <g id=\"patch_21\">\n",
357 " <path clip-path=\"url(#p70301a0bed)\" d=\"M 318.447269 224.64 \n",
358 "L 324.94824 224.64 \n",
359 "L 324.94824 105.278095 \n",
360 "L 318.447269 105.278095 \n",
361 "z\n",
362 "\" style=\"fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
363 " </g>\n",
364 " <g id=\"patch_22\">\n",
365 " <path clip-path=\"url(#p70301a0bed)\" d=\"M 350.952124 224.64 \n",
366 "L 357.453095 224.64 \n",
367 "L 357.453095 105.278095 \n",
368 "L 350.952124 105.278095 \n",
369 "z\n",
370 "\" style=\"fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
371 " </g>\n",
372 " <g id=\"patch_23\">\n",
373 " <path clip-path=\"url(#p70301a0bed)\" d=\"M 64.909405 224.64 \n",
374 "L 71.410376 224.64 \n",
375 "L 71.410376 128.287619 \n",
376 "L 64.909405 128.287619 \n",
377 "z\n",
378 "\" style=\"fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
379 " </g>\n",
380 " <g id=\"patch_24\">\n",
381 " <path clip-path=\"url(#p70301a0bed)\" d=\"M 97.41426 224.64 \n",
382 "L 103.915231 224.64 \n",
383 "L 103.915231 108.154286 \n",
384 "L 97.41426 108.154286 \n",
385 "z\n",
386 "\" style=\"fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
387 " </g>\n",
388 " <g id=\"patch_25\">\n",
389 " <path clip-path=\"url(#p70301a0bed)\" d=\"M 129.919114 224.64 \n",
390 "L 136.420085 224.64 \n",
391 "L 136.420085 108.154286 \n",
392 "L 129.919114 108.154286 \n",
393 "z\n",
394 "\" style=\"fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
395 " </g>\n",
396 " <g id=\"patch_26\">\n",
397 " <path clip-path=\"url(#p70301a0bed)\" d=\"M 162.423968 224.64 \n",
398 "L 168.924939 224.64 \n",
399 "L 168.924939 108.154286 \n",
400 "L 162.423968 108.154286 \n",
401 "z\n",
402 "\" style=\"fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
403 " </g>\n",
404 " <g id=\"patch_27\">\n",
405 " <path clip-path=\"url(#p70301a0bed)\" d=\"M 194.928823 224.64 \n",
406 "L 201.429794 224.64 \n",
407 "L 201.429794 108.154286 \n",
408 "L 194.928823 108.154286 \n",
409 "z\n",
410 "\" style=\"fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
411 " </g>\n",
412 " <g id=\"patch_28\">\n",
413 " <path clip-path=\"url(#p70301a0bed)\" d=\"M 227.433677 224.64 \n",
414 "L 233.934648 224.64 \n",
415 "L 233.934648 108.154286 \n",
416 "L 227.433677 108.154286 \n",
417 "z\n",
418 "\" style=\"fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
419 " </g>\n",
420 " <g id=\"patch_29\">\n",
421 " <path clip-path=\"url(#p70301a0bed)\" d=\"M 259.938532 224.64 \n",
422 "L 266.439502 224.64 \n",
423 "L 266.439502 108.154286 \n",
424 "L 259.938532 108.154286 \n",
425 "z\n",
426 "\" style=\"fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
427 " </g>\n",
428 " <g id=\"patch_30\">\n",
429 " <path clip-path=\"url(#p70301a0bed)\" d=\"M 292.443386 224.64 \n",
430 "L 298.944357 224.64 \n",
431 "L 298.944357 108.154286 \n",
432 "L 292.443386 108.154286 \n",
433 "z\n",
434 "\" style=\"fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
435 " </g>\n",
436 " <g id=\"patch_31\">\n",
437 " <path clip-path=\"url(#p70301a0bed)\" d=\"M 324.94824 224.64 \n",
438 "L 331.449211 224.64 \n",
439 "L 331.449211 108.154286 \n",
440 "L 324.94824 108.154286 \n",
441 "z\n",
442 "\" style=\"fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
443 " </g>\n",
444 " <g id=\"patch_32\">\n",
445 " <path clip-path=\"url(#p70301a0bed)\" d=\"M 357.453095 224.64 \n",
446 "L 363.954066 224.64 \n",
447 "L 363.954066 108.154286 \n",
448 "L 357.453095 108.154286 \n",
449 "z\n",
450 "\" style=\"fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
451 " </g>\n",
452 " <g id=\"patch_33\">\n",
453 " <path clip-path=\"url(#p70301a0bed)\" d=\"M 71.410376 224.64 \n",
454 "L 77.911347 224.64 \n",
455 "L 77.911347 129.725714 \n",
456 "L 71.410376 129.725714 \n",
457 "z\n",
458 "\" style=\"fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
459 " </g>\n",
460 " <g id=\"patch_34\">\n",
461 " <path clip-path=\"url(#p70301a0bed)\" d=\"M 103.915231 224.64 \n",
462 "L 110.416201 224.64 \n",
463 "L 110.416201 111.030476 \n",
464 "L 103.915231 111.030476 \n",
465 "z\n",
466 "\" style=\"fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
467 " </g>\n",
468 " <g id=\"patch_35\">\n",
469 " <path clip-path=\"url(#p70301a0bed)\" d=\"M 136.420085 224.64 \n",
470 "L 142.921056 224.64 \n",
471 "L 142.921056 80.830476 \n",
472 "L 136.420085 80.830476 \n",
473 "z\n",
474 "\" style=\"fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
475 " </g>\n",
476 " <g id=\"patch_36\">\n",
477 " <path clip-path=\"url(#p70301a0bed)\" d=\"M 168.924939 224.64 \n",
478 "L 175.42591 224.64 \n",
479 "L 175.42591 75.078095 \n",
480 "L 168.924939 75.078095 \n",
481 "z\n",
482 "\" style=\"fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
483 " </g>\n",
484 " <g id=\"patch_37\">\n",
485 " <path clip-path=\"url(#p70301a0bed)\" d=\"M 201.429794 224.64 \n",
486 "L 207.930765 224.64 \n",
487 "L 207.930765 70.76381 \n",
488 "L 201.429794 70.76381 \n",
489 "z\n",
490 "\" style=\"fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
491 " </g>\n",
492 " <g id=\"patch_38\">\n",
493 " <path clip-path=\"url(#p70301a0bed)\" d=\"M 233.934648 224.64 \n",
494 "L 240.435619 224.64 \n",
495 "L 240.435619 56.382857 \n",
496 "L 233.934648 56.382857 \n",
497 "z\n",
498 "\" style=\"fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
499 " </g>\n",
500 " <g id=\"patch_39\">\n",
501 " <path clip-path=\"url(#p70301a0bed)\" d=\"M 266.439502 224.64 \n",
502 "L 272.940473 224.64 \n",
503 "L 272.940473 40.56381 \n",
504 "L 266.439502 40.56381 \n",
505 "z\n",
506 "\" style=\"fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
507 " </g>\n",
508 " <g id=\"patch_40\">\n",
509 " <path clip-path=\"url(#p70301a0bed)\" d=\"M 298.944357 224.64 \n",
510 "L 305.445328 224.64 \n",
511 "L 305.445328 30.497143 \n",
512 "L 298.944357 30.497143 \n",
513 "z\n",
514 "\" style=\"fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
515 " </g>\n",
516 " <g id=\"patch_41\">\n",
517 " <path clip-path=\"url(#p70301a0bed)\" d=\"M 331.449211 224.64 \n",
518 "L 337.950182 224.64 \n",
519 "L 337.950182 26.182857 \n",
520 "L 331.449211 26.182857 \n",
521 "z\n",
522 "\" style=\"fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
523 " </g>\n",
524 " <g id=\"patch_42\">\n",
525 " <path clip-path=\"url(#p70301a0bed)\" d=\"M 363.954066 224.64 \n",
526 "L 370.455036 224.64 \n",
527 "L 370.455036 17.554286 \n",
528 "L 363.954066 17.554286 \n",
529 "z\n",
530 "\" style=\"fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
531 " </g>\n",
532 " <g id=\"matplotlib.axis_1\">\n",
533 " <g id=\"xtick_1\">\n",
534 " <g id=\"line2d_1\">\n",
535 " <defs>\n",
536 " <path d=\"M 0 0 \n",
537 "L 0 3.5 \n",
538 "\" id=\"m639e59548b\" style=\"stroke:#000000;stroke-width:0.8;\"/>\n",
539 " </defs>\n",
540 " <g>\n",
541 " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"64.909405\" xlink:href=\"#m639e59548b\" y=\"224.64\"/>\n",
542 " </g>\n",
543 " </g>\n",
544 " <g id=\"text_1\">\n",
545 " <!-- 1 -->\n",
546 " <defs>\n",
547 " <path d=\"M 12.40625 8.296875 \n",
548 "L 28.515625 8.296875 \n",
549 "L 28.515625 63.921875 \n",
550 "L 10.984375 60.40625 \n",
551 "L 10.984375 69.390625 \n",
552 "L 28.421875 72.90625 \n",
553 "L 38.28125 72.90625 \n",
554 "L 38.28125 8.296875 \n",
555 "L 54.390625 8.296875 \n",
556 "L 54.390625 0 \n",
557 "L 12.40625 0 \n",
558 "z\n",
559 "\" id=\"DejaVuSans-49\"/>\n",
560 " </defs>\n",
561 " <g transform=\"translate(67.66878 238.0025)rotate(-90)scale(0.1 -0.1)\">\n",
562 " <use xlink:href=\"#DejaVuSans-49\"/>\n",
563 " </g>\n",
564 " </g>\n",
565 " </g>\n",
566 " <g id=\"xtick_2\">\n",
567 " <g id=\"line2d_2\">\n",
568 " <g>\n",
569 " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"97.41426\" xlink:href=\"#m639e59548b\" y=\"224.64\"/>\n",
570 " </g>\n",
571 " </g>\n",
572 " <g id=\"text_2\">\n",
573 " <!-- 2 -->\n",
574 " <defs>\n",
575 " <path d=\"M 19.1875 8.296875 \n",
576 "L 53.609375 8.296875 \n",
577 "L 53.609375 0 \n",
578 "L 7.328125 0 \n",
579 "L 7.328125 8.296875 \n",
580 "Q 12.9375 14.109375 22.625 23.890625 \n",
581 "Q 32.328125 33.6875 34.8125 36.53125 \n",
582 "Q 39.546875 41.84375 41.421875 45.53125 \n",
583 "Q 43.3125 49.21875 43.3125 52.78125 \n",
584 "Q 43.3125 58.59375 39.234375 62.25 \n",
585 "Q 35.15625 65.921875 28.609375 65.921875 \n",
586 "Q 23.96875 65.921875 18.8125 64.3125 \n",
587 "Q 13.671875 62.703125 7.8125 59.421875 \n",
588 "L 7.8125 69.390625 \n",
589 "Q 13.765625 71.78125 18.9375 73 \n",
590 "Q 24.125 74.21875 28.421875 74.21875 \n",
591 "Q 39.75 74.21875 46.484375 68.546875 \n",
592 "Q 53.21875 62.890625 53.21875 53.421875 \n",
593 "Q 53.21875 48.921875 51.53125 44.890625 \n",
594 "Q 49.859375 40.875 45.40625 35.40625 \n",
595 "Q 44.1875 33.984375 37.640625 27.21875 \n",
596 "Q 31.109375 20.453125 19.1875 8.296875 \n",
597 "z\n",
598 "\" id=\"DejaVuSans-50\"/>\n",
599 " </defs>\n",
600 " <g transform=\"translate(100.173635 238.0025)rotate(-90)scale(0.1 -0.1)\">\n",
601 " <use xlink:href=\"#DejaVuSans-50\"/>\n",
602 " </g>\n",
603 " </g>\n",
604 " </g>\n",
605 " <g id=\"xtick_3\">\n",
606 " <g id=\"line2d_3\">\n",
607 " <g>\n",
608 " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"129.919114\" xlink:href=\"#m639e59548b\" y=\"224.64\"/>\n",
609 " </g>\n",
610 " </g>\n",
611 " <g id=\"text_3\">\n",
612 " <!-- 3 -->\n",
613 " <defs>\n",
614 " <path d=\"M 40.578125 39.3125 \n",
615 "Q 47.65625 37.796875 51.625 33 \n",
616 "Q 55.609375 28.21875 55.609375 21.1875 \n",
@@ -513,22 +642,22 @@
642 "Q 53.90625 49.265625 50.4375 45.09375 \n",
643 "Q 46.96875 40.921875 40.578125 39.3125 \n",
644 "z\n",
645 "\" id=\"DejaVuSans-51\"/>\n",
646 " </defs>\n",
647 " <g transform=\"translate(132.678489 238.0025)rotate(-90)scale(0.1 -0.1)\">\n",
648 " <use xlink:href=\"#DejaVuSans-51\"/>\n",
649 " </g>\n",
650 " </g>\n",
651 " </g>\n",
652 " <g id=\"xtick_4\">\n",
653 " <g id=\"line2d_4\">\n",
654 " <g>\n",
655 " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"162.423968\" xlink:href=\"#m639e59548b\" y=\"224.64\"/>\n",
656 " </g>\n",
657 " </g>\n",
658 " <g id=\"text_4\">\n",
659 " <!-- 4 -->\n",
660 " <defs>\n",
661 " <path d=\"M 37.796875 64.3125 \n",
662 "L 12.890625 25.390625 \n",
663 "L 37.796875 25.390625 \n",
@@ -545,22 +674,22 @@
674 "L 4.890625 17.1875 \n",
675 "L 4.890625 26.703125 \n",
676 "z\n",
677 "\" id=\"DejaVuSans-52\"/>\n",
678 " </defs>\n",
679 " <g transform=\"translate(165.183343 238.0025)rotate(-90)scale(0.1 -0.1)\">\n",
680 " <use xlink:href=\"#DejaVuSans-52\"/>\n",
681 " </g>\n",
682 " </g>\n",
683 " </g>\n",
684 " <g id=\"xtick_5\">\n",
685 " <g id=\"line2d_5\">\n",
686 " <g>\n",
687 " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"194.928823\" xlink:href=\"#m639e59548b\" y=\"224.64\"/>\n",
688 " </g>\n",
689 " </g>\n",
690 " <g id=\"text_5\">\n",
691 " <!-- 5 -->\n",
692 " <defs>\n",
693 " <path d=\"M 10.796875 72.90625 \n",
694 "L 49.515625 72.90625 \n",
695 "L 49.515625 64.59375 \n",
@@ -584,22 +713,22 @@
713 "Q 22.75 39.890625 18.8125 39.015625 \n",
714 "Q 14.890625 38.140625 10.796875 36.28125 \n",
715 "z\n",
716 "\" id=\"DejaVuSans-53\"/>\n",
717 " </defs>\n",
718 " <g transform=\"translate(197.688198 238.0025)rotate(-90)scale(0.1 -0.1)\">\n",
719 " <use xlink:href=\"#DejaVuSans-53\"/>\n",
720 " </g>\n",
721 " </g>\n",
722 " </g>\n",
723 " <g id=\"xtick_6\">\n",
724 " <g id=\"line2d_6\">\n",
725 " <g>\n",
726 " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"227.433677\" xlink:href=\"#m639e59548b\" y=\"224.64\"/>\n",
727 " </g>\n",
728 " </g>\n",
729 " <g id=\"text_6\">\n",
730 " <!-- 6 -->\n",
731 " <defs>\n",
732 " <path d=\"M 33.015625 40.375 \n",
733 "Q 26.375 40.375 22.484375 35.828125 \n",
734 "Q 18.609375 31.296875 18.609375 23.390625 \n",
@@ -629,22 +758,22 @@
758 "Q 40.921875 74.21875 44.703125 73.484375 \n",
759 "Q 48.484375 72.75 52.59375 71.296875 \n",
760 "z\n",
761 "\" id=\"DejaVuSans-54\"/>\n",
762 " </defs>\n",
763 " <g transform=\"translate(230.193052 238.0025)rotate(-90)scale(0.1 -0.1)\">\n",
764 " <use xlink:href=\"#DejaVuSans-54\"/>\n",
765 " </g>\n",
766 " </g>\n",
767 " </g>\n",
768 " <g id=\"xtick_7\">\n",
769 " <g id=\"line2d_7\">\n",
770 " <g>\n",
771 " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"259.938532\" xlink:href=\"#m639e59548b\" y=\"224.64\"/>\n",
772 " </g>\n",
773 " </g>\n",
774 " <g id=\"text_7\">\n",
775 " <!-- 7 -->\n",
776 " <defs>\n",
777 " <path d=\"M 8.203125 72.90625 \n",
778 "L 55.078125 72.90625 \n",
779 "L 55.078125 68.703125 \n",
@@ -653,22 +782,22 @@
782 "L 43.21875 64.59375 \n",
783 "L 8.203125 64.59375 \n",
784 "z\n",
785 "\" id=\"DejaVuSans-55\"/>\n",
786 " </defs>\n",
787 " <g transform=\"translate(262.697907 238.0025)rotate(-90)scale(0.1 -0.1)\">\n",
788 " <use xlink:href=\"#DejaVuSans-55\"/>\n",
789 " </g>\n",
790 " </g>\n",
791 " </g>\n",
792 " <g id=\"xtick_8\">\n",
793 " <g id=\"line2d_8\">\n",
794 " <g>\n",
795 " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"292.443386\" xlink:href=\"#m639e59548b\" y=\"224.64\"/>\n",
796 " </g>\n",
797 " </g>\n",
798 " <g id=\"text_8\">\n",
799 " <!-- 8 -->\n",
800 " <defs>\n",
801 " <path d=\"M 31.78125 34.625 \n",
802 "Q 24.75 34.625 20.71875 30.859375 \n",
803 "Q 16.703125 27.09375 16.703125 20.515625 \n",
@@ -707,22 +836,22 @@
836 "Q 25.390625 66.40625 21.84375 63.234375 \n",
837 "Q 18.3125 60.0625 18.3125 54.390625 \n",
838 "z\n",
839 "\" id=\"DejaVuSans-56\"/>\n",
840 " </defs>\n",
841 " <g transform=\"translate(295.202761 238.0025)rotate(-90)scale(0.1 -0.1)\">\n",
842 " <use xlink:href=\"#DejaVuSans-56\"/>\n",
843 " </g>\n",
844 " </g>\n",
845 " </g>\n",
846 " <g id=\"xtick_9\">\n",
847 " <g id=\"line2d_9\">\n",
848 " <g>\n",
849 " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"324.94824\" xlink:href=\"#m639e59548b\" y=\"224.64\"/>\n",
850 " </g>\n",
851 " </g>\n",
852 " <g id=\"text_9\">\n",
853 " <!-- 9 -->\n",
854 " <defs>\n",
855 " <path d=\"M 10.984375 1.515625 \n",
856 "L 10.984375 10.5 \n",
857 "Q 14.703125 8.734375 18.5 7.8125 \n",
@@ -752,37 +881,24 @@
881 "Q 16.21875 41.5 20.09375 36.953125 \n",
882 "Q 23.96875 32.421875 30.609375 32.421875 \n",
883 "z\n",
884 "\" id=\"DejaVuSans-57\"/>\n",
885 " </defs>\n",
886 " <g transform=\"translate(327.707615 238.0025)rotate(-90)scale(0.1 -0.1)\">\n",
887 " <use xlink:href=\"#DejaVuSans-57\"/>\n",
888 " </g>\n",
889 " </g>\n",
890 " </g>\n",
891 " <g id=\"xtick_10\">\n",
892 " <g id=\"line2d_10\">\n",
893 " <g>\n",
894 " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"357.453095\" xlink:href=\"#m639e59548b\" y=\"224.64\"/>\n",
895 " </g>\n",
896 " </g>\n",
897 " <g id=\"text_10\">\n",
898 " <!-- 10 -->\n",
899 " <defs>\n",
 
 
 
 
 
 
 
 
 
 
 
 
 
900 " <path d=\"M 31.78125 66.40625 \n",
901 "Q 24.171875 66.40625 20.328125 58.90625 \n",
902 "Q 16.5 51.421875 16.5 36.375 \n",
903 "Q 16.5 21.390625 20.328125 13.890625 \n",
904 "Q 24.171875 6.390625 31.78125 6.390625 \n",
@@ -801,31 +917,17 @@
917 "Q 6.59375 54.828125 13.0625 64.515625 \n",
918 "Q 19.53125 74.21875 31.78125 74.21875 \n",
919 "z\n",
920 "\" id=\"DejaVuSans-48\"/>\n",
921 " </defs>\n",
922 " <g transform=\"translate(360.21247 244.365)rotate(-90)scale(0.1 -0.1)\">\n",
923 " <use xlink:href=\"#DejaVuSans-49\"/>\n",
924 " <use x=\"63.623047\" xlink:href=\"#DejaVuSans-48\"/>\n",
925 " </g>\n",
926 " </g>\n",
927 " </g>\n",
928 " <g id=\"text_11\">\n",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
929 " <!-- Checkin index -->\n",
930 " <defs>\n",
931 " <path d=\"M 64.40625 67.28125 \n",
932 "L 64.40625 56.890625 \n",
933 "Q 59.421875 61.53125 53.78125 63.8125 \n",
@@ -994,11 +1096,11 @@
1096 "L 29.78125 35.203125 \n",
1097 "L 44.28125 54.6875 \n",
1098 "z\n",
1099 "\" id=\"DejaVuSans-120\"/>\n",
1100 " </defs>\n",
1101 " <g transform=\"translate(175.885938 255.963437)scale(0.1 -0.1)\">\n",
1102 " <use xlink:href=\"#DejaVuSans-67\"/>\n",
1103 " <use x=\"69.824219\" xlink:href=\"#DejaVuSans-104\"/>\n",
1104 " <use x=\"133.203125\" xlink:href=\"#DejaVuSans-101\"/>\n",
1105 " <use x=\"194.726562\" xlink:href=\"#DejaVuSans-99\"/>\n",
1106 " <use x=\"249.707031\" xlink:href=\"#DejaVuSans-107\"/>\n",
@@ -1013,139 +1115,113 @@
1115 " </g>\n",
1116 " </g>\n",
1117 " </g>\n",
1118 " <g id=\"matplotlib.axis_2\">\n",
1119 " <g id=\"ytick_1\">\n",
1120 " <g id=\"line2d_11\">\n",
1121 " <defs>\n",
1122 " <path d=\"M 0 0 \n",
1123 "L -3.5 0 \n",
1124 "\" id=\"m7e5aed6441\" style=\"stroke:#000000;stroke-width:0.8;\"/>\n",
1125 " </defs>\n",
1126 " <g>\n",
1127 " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"43.78125\" xlink:href=\"#m7e5aed6441\" y=\"224.64\"/>\n",
1128 " </g>\n",
1129 " </g>\n",
1130 " <g id=\"text_12\">\n",
1131 " <!-- 0.0 -->\n",
1132 " <defs>\n",
1133 " <path d=\"M 10.6875 12.40625 \n",
1134 "L 21 12.40625 \n",
1135 "L 21 0 \n",
1136 "L 10.6875 0 \n",
1137 "z\n",
1138 "\" id=\"DejaVuSans-46\"/>\n",
1139 " </defs>\n",
1140 " <g transform=\"translate(20.878125 228.439219)scale(0.1 -0.1)\">\n",
1141 " <use xlink:href=\"#DejaVuSans-48\"/>\n",
1142 " <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
1143 " <use x=\"95.410156\" xlink:href=\"#DejaVuSans-48\"/>\n",
1144 " </g>\n",
1145 " </g>\n",
1146 " </g>\n",
1147 " <g id=\"ytick_2\">\n",
1148 " <g id=\"line2d_12\">\n",
1149 " <g>\n",
1150 " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"43.78125\" xlink:href=\"#m7e5aed6441\" y=\"187.824762\"/>\n",
1151 " </g>\n",
1152 " </g>\n",
1153 " <g id=\"text_13\">\n",
1154 " <!-- 0.2 -->\n",
1155 " <g transform=\"translate(20.878125 191.623981)scale(0.1 -0.1)\">\n",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1156 " <use xlink:href=\"#DejaVuSans-48\"/>\n",
1157 " <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
1158 " <use x=\"95.410156\" xlink:href=\"#DejaVuSans-50\"/>\n",
1159 " </g>\n",
1160 " </g>\n",
1161 " </g>\n",
1162 " <g id=\"ytick_3\">\n",
1163 " <g id=\"line2d_13\">\n",
1164 " <g>\n",
1165 " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"43.78125\" xlink:href=\"#m7e5aed6441\" y=\"151.009524\"/>\n",
1166 " </g>\n",
1167 " </g>\n",
1168 " <g id=\"text_14\">\n",
1169 " <!-- 0.4 -->\n",
1170 " <g transform=\"translate(20.878125 154.808743)scale(0.1 -0.1)\">\n",
1171 " <use xlink:href=\"#DejaVuSans-48\"/>\n",
1172 " <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
1173 " <use x=\"95.410156\" xlink:href=\"#DejaVuSans-52\"/>\n",
1174 " </g>\n",
1175 " </g>\n",
1176 " </g>\n",
1177 " <g id=\"ytick_4\">\n",
1178 " <g id=\"line2d_14\">\n",
1179 " <g>\n",
1180 " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"43.78125\" xlink:href=\"#m7e5aed6441\" y=\"114.194286\"/>\n",
1181 " </g>\n",
1182 " </g>\n",
1183 " <g id=\"text_15\">\n",
1184 " <!-- 0.6 -->\n",
1185 " <g transform=\"translate(20.878125 117.993504)scale(0.1 -0.1)\">\n",
1186 " <use xlink:href=\"#DejaVuSans-48\"/>\n",
1187 " <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
1188 " <use x=\"95.410156\" xlink:href=\"#DejaVuSans-54\"/>\n",
1189 " </g>\n",
1190 " </g>\n",
1191 " </g>\n",
1192 " <g id=\"ytick_5\">\n",
1193 " <g id=\"line2d_15\">\n",
1194 " <g>\n",
1195 " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"43.78125\" xlink:href=\"#m7e5aed6441\" y=\"77.379048\"/>\n",
1196 " </g>\n",
1197 " </g>\n",
1198 " <g id=\"text_16\">\n",
1199 " <!-- 0.8 -->\n",
1200 " <g transform=\"translate(20.878125 81.178266)scale(0.1 -0.1)\">\n",
1201 " <use xlink:href=\"#DejaVuSans-48\"/>\n",
1202 " <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
1203 " <use x=\"95.410156\" xlink:href=\"#DejaVuSans-56\"/>\n",
1204 " </g>\n",
1205 " </g>\n",
1206 " </g>\n",
1207 " <g id=\"ytick_6\">\n",
1208 " <g id=\"line2d_16\">\n",
1209 " <g>\n",
1210 " <use style=\"stroke:#000000;stroke-width:0.8;\" x=\"43.78125\" xlink:href=\"#m7e5aed6441\" y=\"40.56381\"/>\n",
1211 " </g>\n",
1212 " </g>\n",
1213 " <g id=\"text_17\">\n",
1214 " <!-- 1.0 -->\n",
1215 " <g transform=\"translate(20.878125 44.363028)scale(0.1 -0.1)\">\n",
1216 " <use xlink:href=\"#DejaVuSans-49\"/>\n",
1217 " <use x=\"63.623047\" xlink:href=\"#DejaVuSans-46\"/>\n",
1218 " <use x=\"95.410156\" xlink:href=\"#DejaVuSans-48\"/>\n",
1219 " </g>\n",
1220 " </g>\n",
1221 " </g>\n",
1222 " <g id=\"text_18\">\n",
1223 " <!-- Repo size (MiB) -->\n",
1224 " <defs>\n",
1225 " <path d=\"M 44.390625 34.1875 \n",
1226 "Q 47.5625 33.109375 50.5625 29.59375 \n",
1227 "Q 53.5625 26.078125 56.59375 19.921875 \n",
@@ -1331,11 +1407,11 @@
1407 "Q 20.90625 42.671875 17.703125 53.65625 \n",
1408 "Q 14.5 64.65625 8.015625 75.875 \n",
1409 "z\n",
1410 "\" id=\"DejaVuSans-41\"/>\n",
1411 " </defs>\n",
1412 " <g transform=\"translate(14.798438 154.609062)rotate(-90)scale(0.1 -0.1)\">\n",
1413 " <use xlink:href=\"#DejaVuSans-82\"/>\n",
1414 " <use x=\"69.419922\" xlink:href=\"#DejaVuSans-101\"/>\n",
1415 " <use x=\"130.943359\" xlink:href=\"#DejaVuSans-112\"/>\n",
1416 " <use x=\"194.419922\" xlink:href=\"#DejaVuSans-111\"/>\n",
1417 " <use x=\"255.601562\" xlink:href=\"#DejaVuSans-32\"/>\n",
@@ -1350,53 +1426,53 @@
1426 " <use x=\"666.148438\" xlink:href=\"#DejaVuSans-66\"/>\n",
1427 " <use x=\"734.751953\" xlink:href=\"#DejaVuSans-41\"/>\n",
1428 " </g>\n",
1429 " </g>\n",
1430 " </g>\n",
1431 " <g id=\"patch_43\">\n",
1432 " <path d=\"M 43.78125 224.64 \n",
1433 "L 43.78125 7.2 \n",
1434 "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
1435 " </g>\n",
1436 " <g id=\"patch_44\">\n",
1437 " <path d=\"M 378.58125 224.64 \n",
1438 "L 378.58125 7.2 \n",
1439 "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
1440 " </g>\n",
1441 " <g id=\"patch_45\">\n",
1442 " <path d=\"M 43.78125 224.64 \n",
1443 "L 378.58125 224.64 \n",
1444 "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
1445 " </g>\n",
1446 " <g id=\"patch_46\">\n",
1447 " <path d=\"M 43.78125 7.2 \n",
1448 "L 378.58125 7.2 \n",
1449 "\" style=\"fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;\"/>\n",
1450 " </g>\n",
1451 " <g id=\"legend_1\">\n",
1452 " <g id=\"patch_47\">\n",
1453 " <path d=\"M 50.78125 73.9125 \n",
1454 "L 105.828125 73.9125 \n",
1455 "Q 107.828125 73.9125 107.828125 71.9125 \n",
1456 "L 107.828125 14.2 \n",
1457 "Q 107.828125 12.2 105.828125 12.2 \n",
1458 "L 50.78125 12.2 \n",
1459 "Q 48.78125 12.2 48.78125 14.2 \n",
1460 "L 48.78125 71.9125 \n",
1461 "Q 48.78125 73.9125 50.78125 73.9125 \n",
1462 "z\n",
1463 "\" style=\"fill:#ffffff;opacity:0.8;stroke:#cccccc;stroke-linejoin:miter;\"/>\n",
1464 " </g>\n",
1465 " <g id=\"patch_48\">\n",
1466 " <path d=\"M 52.78125 23.798437 \n",
1467 "L 72.78125 23.798437 \n",
1468 "L 72.78125 16.798437 \n",
1469 "L 52.78125 16.798437 \n",
1470 "z\n",
1471 "\" style=\"fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
1472 " </g>\n",
1473 " <g id=\"text_19\">\n",
1474 " <!-- JPEG -->\n",
1475 " <defs>\n",
1476 " <path d=\"M 9.8125 72.90625 \n",
1477 "L 19.671875 72.90625 \n",
1478 "L 19.671875 5.078125 \n",
@@ -1466,42 +1542,42 @@
1542 "Q 48.046875 6.6875 52.140625 7.59375 \n",
1543 "Q 56.25 8.5 59.515625 10.40625 \n",
1544 "z\n",
1545 "\" id=\"DejaVuSans-71\"/>\n",
1546 " </defs>\n",
1547 " <g transform=\"translate(80.78125 23.798437)scale(0.1 -0.1)\">\n",
1548 " <use xlink:href=\"#DejaVuSans-74\"/>\n",
1549 " <use x=\"29.492188\" xlink:href=\"#DejaVuSans-80\"/>\n",
1550 " <use x=\"89.794922\" xlink:href=\"#DejaVuSans-69\"/>\n",
1551 " <use x=\"152.978516\" xlink:href=\"#DejaVuSans-71\"/>\n",
1552 " </g>\n",
1553 " </g>\n",
1554 " <g id=\"patch_49\">\n",
1555 " <path d=\"M 52.78125 38.476562 \n",
1556 "L 72.78125 38.476562 \n",
1557 "L 72.78125 31.476562 \n",
1558 "L 52.78125 31.476562 \n",
1559 "z\n",
1560 "\" style=\"fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
1561 " </g>\n",
1562 " <g id=\"text_20\">\n",
1563 " <!-- BMP -->\n",
1564 " <g transform=\"translate(80.78125 38.476562)scale(0.1 -0.1)\">\n",
1565 " <use xlink:href=\"#DejaVuSans-66\"/>\n",
1566 " <use x=\"68.603516\" xlink:href=\"#DejaVuSans-77\"/>\n",
1567 " <use x=\"154.882812\" xlink:href=\"#DejaVuSans-80\"/>\n",
1568 " </g>\n",
1569 " </g>\n",
1570 " <g id=\"patch_50\">\n",
1571 " <path d=\"M 52.78125 53.154687 \n",
1572 "L 72.78125 53.154687 \n",
1573 "L 72.78125 46.154687 \n",
1574 "L 52.78125 46.154687 \n",
1575 "z\n",
1576 "\" style=\"fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
1577 " </g>\n",
1578 " <g id=\"text_21\">\n",
1579 " <!-- TIFF -->\n",
1580 " <defs>\n",
1581 " <path d=\"M -0.296875 72.90625 \n",
1582 "L 61.375 72.90625 \n",
1583 "L 61.375 64.59375 \n",
@@ -1529,26 +1605,26 @@
1605 "L 19.671875 0 \n",
1606 "L 9.8125 0 \n",
1607 "z\n",
1608 "\" id=\"DejaVuSans-70\"/>\n",
1609 " </defs>\n",
1610 " <g transform=\"translate(80.78125 53.154687)scale(0.1 -0.1)\">\n",
1611 " <use xlink:href=\"#DejaVuSans-84\"/>\n",
1612 " <use x=\"61.083984\" xlink:href=\"#DejaVuSans-73\"/>\n",
1613 " <use x=\"90.576172\" xlink:href=\"#DejaVuSans-70\"/>\n",
1614 " <use x=\"148.095703\" xlink:href=\"#DejaVuSans-70\"/>\n",
1615 " </g>\n",
1616 " </g>\n",
1617 " <g id=\"patch_51\">\n",
1618 " <path d=\"M 52.78125 67.832812 \n",
1619 "L 72.78125 67.832812 \n",
1620 "L 72.78125 60.832812 \n",
1621 "L 52.78125 60.832812 \n",
1622 "z\n",
1623 "\" style=\"fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;\"/>\n",
1624 " </g>\n",
1625 " <g id=\"text_22\">\n",
1626 " <!-- PNG -->\n",
1627 " <defs>\n",
1628 " <path d=\"M 9.8125 72.90625 \n",
1629 "L 23.09375 72.90625 \n",
1630 "L 55.421875 11.921875 \n",
@@ -1560,22 +1636,22 @@
1636 "L 19.390625 0 \n",
1637 "L 9.8125 0 \n",
1638 "z\n",
1639 "\" id=\"DejaVuSans-78\"/>\n",
1640 " </defs>\n",
1641 " <g transform=\"translate(80.78125 67.832812)scale(0.1 -0.1)\">\n",
1642 " <use xlink:href=\"#DejaVuSans-80\"/>\n",
1643 " <use x=\"60.302734\" xlink:href=\"#DejaVuSans-78\"/>\n",
1644 " <use x=\"135.107422\" xlink:href=\"#DejaVuSans-71\"/>\n",
1645 " </g>\n",
1646 " </g>\n",
1647 " </g>\n",
1648 " </g>\n",
1649 " </g>\n",
1650 " <defs>\n",
1651 " <clipPath id=\"p70301a0bed\">\n",
1652 " <rect height=\"217.44\" width=\"334.8\" x=\"43.78125\" y=\"7.2\"/>\n",
1653 " </clipPath>\n",
1654 " </defs>\n",
1655 "</svg>\n"
1656 ],
1657 "text/plain": [
@@ -1591,15 +1667,17 @@
1667 "source": [
1668 "%config InlineBackend.figure_formats = ['svg']\n",
1669 "\n",
1670 "import matplotlib as mpl\n",
1671 "import matplotlib.pyplot as plt\n",
1672 "import pandas as pd\n",
1673 "\n",
1674 "os.chdir(tdir)\n",
1675 "\n",
1676 "# Merge per-format test data into a single DataFrame without the first\n",
1677 "# first row, being the boring initial empty repo state.\n",
1678 "data = pd.concat(repo_sizes, axis=1).drop(range(1))\n",
 
1679 "\n",
1680 "mpl.rcParams['figure.figsize'] = (6, 4)\n",
1681 "ax = data.plot(kind = 'bar', colormap = 'coolwarm',\n",
1682 " grid = False, width = 0.8,\n",
1683 " edgecolor = 'white', linewidth = 2)\n",
@@ -1631,11 +1709,11 @@
1709 "file_extension": ".py",
1710 "mimetype": "text/x-python",
1711 "name": "python",
1712 "nbconvert_exporter": "python",
1713 "pygments_lexer": "ipython3",
1714 "version": "3.7.6"
1715 }
1716 },
1717 "nbformat": 4,
1718 "nbformat_minor": 4
1719 }
1720
--- www/image-format-vs-repo-size.md
+++ www/image-format-vs-repo-size.md
@@ -1,21 +1,19 @@
11
# Image Format vs Fossil Repo Size
22
33
## The Problem
44
55
Fossil has a [delta compression][dc] feature which removes redundant
6
-information from a file — with respect to the version checked in at the
7
-tip of the current working branch — when checking in a subsequent
8
-version.¹ That delta is then [zlib][zl]-compressed before being stored
6
+information from a file relative to its parent on check-in.¹
7
+That delta is then [zlib][zl]-compressed before being stored
98
in the Fossil repository database file.
109
1110
Storing pre-compressed data files in a Fossil repository defeats both of
1211
these space-saving measures:
1312
14
-1. Binary data compression algorithms — whether lossless as with zlib
15
- or lossy as with JPEG — turn the file data into [pseudorandom
16
- noise][prn].²
13
+1. Binary data compression algorithms turn the file data into
14
+ [pseudorandom noise][prn].²
1715
1816
Typical data compression algorithms are not [hash functions][hf],
1917
where the goal is that a change to each bit in the input has a
2018
statistically even chance of changing every bit in the output, but
2119
because they do approach that pathological condition, pre-compressed
@@ -28,11 +26,11 @@
2826
noise is incompressible. The consequence for our purposes here is
2927
that pre-compressed data doesn’t benefit from Fossil’s zlib
3028
compression.
3129
3230
You might then ask, what does it matter if the space savings comes from
33
-the application file format (e.g. JPEG, Zip, etc.) or from Fossil
31
+the application file format (e.g. JPEG, DOCX, Zip, etc.) or from Fossil
3432
itself? It really doesn’t, as far as point 2 above goes, but point 1
3533
causes the Fossil repository to balloon out of proportion to the size of
3634
the input data change on each checkin. This article will illustrate that
3735
problem, quantify it, and give a solution to it.
3836
@@ -50,12 +48,12 @@
5048
5149
* **Microsoft Office**: The [OOXML document format][oox] used from
5250
Office 2003 onward (`.docx`, `.xlsx`, `.pptx`, etc.) are Zip files
5351
containing an XML document file and several collateral files.
5452
55
-* **Libre Office**: Its [ODF][odf] format is designed in more or less
56
- the same way as OOXML.
53
+* **Libre Office**: For the purposes of this article, its
54
+ [OpenDocument Format][odf] is designed the same basic way as OOXML.
5755
5856
* **Java**: A Java [`.jar` file][jcl] is a Zip file containing JVM
5957
`.class` files, manifest files, and more.
6058
6159
* **Windows Installer:** An [`*.msi` file][wi] is a proprietary
@@ -78,14 +76,14 @@
7876
7977
8078
## Demonstration
8179
8280
The companion `image-format-vs-repo-size.ipynb` file ([download][nbd],
83
-[preview][nbp]) is a [Jupyter][jp] notebook implementing the following
81
+[preview][nbp]) is a [JupyterLab][jl] notebook implementing the following
8482
experiment:
8583
86
-1. Create an empty Fossil repository; save its initial size.
84
+1. Create a new minimum-size Fossil repository. Save this initial size.
8785
8886
2. Use [ImageMagick][im] via [Wand][wp] to generate a JPEG file of a
8987
particular size — currently 256 px² — filled with Gaussian noise to
9088
make data compression more difficult than with a solid-color image.
9189
@@ -100,20 +98,20 @@
10098
6. Repeat the above steps for BMP, TIFF,³ and PNG.
10199
102100
7. Create a bar chart showing how the Fossil repository size changes
103101
with each checkin.
104102
105
-We chose to use Jupyter for this because it makes it easy for you to
103
+We chose to use JupyterLab for this because it makes it easy for you to
106104
modify the notebook to try different things. Want to see how the
107105
results change with a different image size? Easy, change the `size`
108106
value in the second cell of the notebook. Want to try more image
109107
formats? You can put anything ImageMagick can recognize into the
110108
`formats` list. Want to find the break-even point for images like those
111109
in your own repository? Easily done with a small amount of code.
112110
113111
[im]: https://www.imagemagick.org/
114
-[jp]: https://jupyter.org/
112
+[jl]: https://jupyter.org/
115113
[nbd]: ./image-format-vs-repo-size.ipynb
116114
[nbp]: https://nbviewer.jupyter.org/urls/fossil-scm.org/fossil/doc/trunk/www/image-format-vs-repo-size.ipynb
117115
[wp]: http://wand-py.org/
118116
119117
@@ -125,23 +123,34 @@
125123
126124
There are a few key things we want to draw your attention to in that
127125
chart:
128126
129127
* BMP and uncompressed TIFF are nearly identical in size for all
130
- checkins, and the repository growth rate is negligible.⁵ We owe this
131
- economy to Fossil’s delta compression feature.
128
+ checkins, and the repository growth rate is negligible past the
129
+ first commit.⁵ We owe this economy to Fossil’s delta compression
130
+ feature: it is encoding each of those single-pixel changes in a very
131
+ small amount of repository space.
132132
133133
* The JPEG and TIFF bars increase by large amounts on most checkins
134
- even though each checkin encodes only a *single-pixel change*!
134
+ even though each checkin *also* encodes only a *single-pixel change*.
135
+
136
+* The size of the first checkin in the BMP and TIFF cases is roughly
137
+ the same as that for the PNG case, because both PNG and Fossil use
138
+ the zlib binary data compression algorithm. This shows that for
139
+ repos where the image files are committed only once, there is
140
+ virtually no penalty to using BMP or TIFF over PNG. The file sizes
141
+ likely differ only because of differences in zlib settings between
142
+ the cases.
135143
136144
* Because JPEG’s lossy nature allows it to start smaller and have
137145
smaller size increases than than PNG, the crossover point with
138146
BMP/TIFF isn’t until 7-9 checkins in typical runs of this [Monte
139147
Carlo experiment][mce]. Given a choice among these four file
140148
formats and a willingness to use lossy image compression, a rational
141149
tradeoff is to choose JPEG for repositories where each image will
142150
change fewer than that number of times.
151
+
143152
144153
[mce]: https://en.wikipedia.org/wiki/Monte_Carlo_method
145154
146155
147156
## Automated Recompression
@@ -235,23 +244,27 @@
235244
----
236245
237246
238247
## Footnotes and Digressions
239248
240
-1. Several other programs also do delta compression, so they’ll also be
241
- affected by this problem: [rsync][rs], [Unison][us], [Git][git],
242
- etc. When using file copying and synchronization programs *without*
243
- delta compression, it’s best to use the most highly-compressed file
244
- format you can tolerate, since they copy the whole file any time any
245
- bit of it changes.
249
+1. This problem is not Fossil-specific. Several other programs also do
250
+ delta compression, so they’ll also be affected by this problem:
251
+ [rsync][rs], [Unison][us], [Git][git], etc. You should take this
252
+ article’s advice when using all such programs, not just Fossil.
253
+
254
+ When using file copying and synchronization programs *without* delta
255
+ compression, on the other hand, it’s best to use the most
256
+ highly-compressed file format you can tolerate, since they copy the
257
+ whole file any time any bit of it changes.
246258
247259
2. In fact, a good way to gauge the effectiveness of a given
248260
compression scheme is to run its output through the same sort of
249261
tests we use to gauge how “random” a given [PRNG][prng] is. Another
250262
way to look at it is that if there is a discernible pattern in the
251
- output of a compression scheme, it’s information that could be
252
- further compressed.
263
+ output of a compression scheme, that constitutes *information* (in
264
+ [the technical sense of that word][ith]) that could be further
265
+ compressed.
253266
254267
3. We're using *uncompressed* TIFF here, not [LZW][lzw]- or
255268
Zip-compressed TIFF, either of which would give similar results to
256269
PNG, which is always zlib-compressed.
257270
@@ -260,33 +273,32 @@
260273
more difficult, and the random pixel changes. Those test design
261274
choices make this a [Monte Carlo experiment][mce]. We’ve found that
262275
the overall character of the results doesn’t change from one run to
263276
the next.
264277
265
- The code in the notebook’s third cell drops the first three columns
266
- of data because the first column (the empty repository size) is
267
- boring, and the subsequent two checkins show the SQLite DB file
268
- format settling in with its first few checkins. There’s a single
269
- line in the notebook you can comment out to get a bar chart with
270
- these data included.
271
-
272
- If you do this, you’ll see a mildly interesting result: the size of
273
- the first checkin in the BMP and TIFF cases is roughly the same as
274
- that for the PNG case, because both PNG and Fossil use the zlib
275
- binary data compression algorithm.
276
-
277
-5. A low-tech format like BMP will have a small edge in practice
278
+5. It’s not clear to me why there is a one-time jump in size for BMP
279
+ and TIFF past the first commit. I suspect it is due to the SQLite
280
+ indices being initialized for the first time.
281
+
282
+ Page size inflation might have something to do with it as well,
283
+ though we tried to control that by rebuilding the initial DB with a
284
+ minimal page size. If you re-run the program often enough, you will
285
+ sometimes see the BMP or TIFF bar jump higher than the other, again
286
+ likely due to one of the repos crossing a page boundary.
287
+
288
+ Another curious artifact in the data is that the BMP is slightly
289
+ larger than for the TIFF. This goes against expectation because a
290
+ low-tech format like BMP should have a small edge in this test
278291
because TIFF metadata includes the option for multiple timestamps,
279292
UUIDs, etc., which bloat the checkin size by creating many small
280
- deltas. If you don't need the advantages of TIFF, a less capable
281
- image file format will give smaller checkin sizes for a given amount
282
- of change.
293
+ deltas.
283294
284295
6. The `Makefile` above is not battle-tested. Please report bugs and
285296
needed extensions [on the forum][for].
286297
287298
[for]: https://fossil-scm.org/forum/forumpost/15e677f2c8
288299
[git]: https://git-scm.com/
300
+[ith]: https://en.wikipedia.org/wiki/Information_theory
289301
[lzw]: https://en.wikipedia.org/wiki/Lempel%E2%80%93Ziv%E2%80%93Welch
290302
[prng]: https://en.wikipedia.org/wiki/Pseudorandom_number_generator
291303
[rs]: https://rsync.samba.org/
292304
[us]: http://www.cis.upenn.edu/~bcpierce/unison/
293305
--- www/image-format-vs-repo-size.md
+++ www/image-format-vs-repo-size.md
@@ -1,21 +1,19 @@
1 # Image Format vs Fossil Repo Size
2
3 ## The Problem
4
5 Fossil has a [delta compression][dc] feature which removes redundant
6 information from a file — with respect to the version checked in at the
7 tip of the current working branch — when checking in a subsequent
8 version.¹ That delta is then [zlib][zl]-compressed before being stored
9 in the Fossil repository database file.
10
11 Storing pre-compressed data files in a Fossil repository defeats both of
12 these space-saving measures:
13
14 1. Binary data compression algorithms — whether lossless as with zlib
15 or lossy as with JPEG — turn the file data into [pseudorandom
16 noise][prn].²
17
18 Typical data compression algorithms are not [hash functions][hf],
19 where the goal is that a change to each bit in the input has a
20 statistically even chance of changing every bit in the output, but
21 because they do approach that pathological condition, pre-compressed
@@ -28,11 +26,11 @@
28 noise is incompressible. The consequence for our purposes here is
29 that pre-compressed data doesn’t benefit from Fossil’s zlib
30 compression.
31
32 You might then ask, what does it matter if the space savings comes from
33 the application file format (e.g. JPEG, Zip, etc.) or from Fossil
34 itself? It really doesn’t, as far as point 2 above goes, but point 1
35 causes the Fossil repository to balloon out of proportion to the size of
36 the input data change on each checkin. This article will illustrate that
37 problem, quantify it, and give a solution to it.
38
@@ -50,12 +48,12 @@
50
51 * **Microsoft Office**: The [OOXML document format][oox] used from
52 Office 2003 onward (`.docx`, `.xlsx`, `.pptx`, etc.) are Zip files
53 containing an XML document file and several collateral files.
54
55 * **Libre Office**: Its [ODF][odf] format is designed in more or less
56 the same way as OOXML.
57
58 * **Java**: A Java [`.jar` file][jcl] is a Zip file containing JVM
59 `.class` files, manifest files, and more.
60
61 * **Windows Installer:** An [`*.msi` file][wi] is a proprietary
@@ -78,14 +76,14 @@
78
79
80 ## Demonstration
81
82 The companion `image-format-vs-repo-size.ipynb` file ([download][nbd],
83 [preview][nbp]) is a [Jupyter][jp] notebook implementing the following
84 experiment:
85
86 1. Create an empty Fossil repository; save its initial size.
87
88 2. Use [ImageMagick][im] via [Wand][wp] to generate a JPEG file of a
89 particular size — currently 256 px² — filled with Gaussian noise to
90 make data compression more difficult than with a solid-color image.
91
@@ -100,20 +98,20 @@
100 6. Repeat the above steps for BMP, TIFF,³ and PNG.
101
102 7. Create a bar chart showing how the Fossil repository size changes
103 with each checkin.
104
105 We chose to use Jupyter for this because it makes it easy for you to
106 modify the notebook to try different things. Want to see how the
107 results change with a different image size? Easy, change the `size`
108 value in the second cell of the notebook. Want to try more image
109 formats? You can put anything ImageMagick can recognize into the
110 `formats` list. Want to find the break-even point for images like those
111 in your own repository? Easily done with a small amount of code.
112
113 [im]: https://www.imagemagick.org/
114 [jp]: https://jupyter.org/
115 [nbd]: ./image-format-vs-repo-size.ipynb
116 [nbp]: https://nbviewer.jupyter.org/urls/fossil-scm.org/fossil/doc/trunk/www/image-format-vs-repo-size.ipynb
117 [wp]: http://wand-py.org/
118
119
@@ -125,23 +123,34 @@
125
126 There are a few key things we want to draw your attention to in that
127 chart:
128
129 * BMP and uncompressed TIFF are nearly identical in size for all
130 checkins, and the repository growth rate is negligible.⁵ We owe this
131 economy to Fossil’s delta compression feature.
 
 
132
133 * The JPEG and TIFF bars increase by large amounts on most checkins
134 even though each checkin encodes only a *single-pixel change*!
 
 
 
 
 
 
 
 
135
136 * Because JPEG’s lossy nature allows it to start smaller and have
137 smaller size increases than than PNG, the crossover point with
138 BMP/TIFF isn’t until 7-9 checkins in typical runs of this [Monte
139 Carlo experiment][mce]. Given a choice among these four file
140 formats and a willingness to use lossy image compression, a rational
141 tradeoff is to choose JPEG for repositories where each image will
142 change fewer than that number of times.
 
143
144 [mce]: https://en.wikipedia.org/wiki/Monte_Carlo_method
145
146
147 ## Automated Recompression
@@ -235,23 +244,27 @@
235 ----
236
237
238 ## Footnotes and Digressions
239
240 1. Several other programs also do delta compression, so they’ll also be
241 affected by this problem: [rsync][rs], [Unison][us], [Git][git],
242 etc. When using file copying and synchronization programs *without*
243 delta compression, it’s best to use the most highly-compressed file
244 format you can tolerate, since they copy the whole file any time any
245 bit of it changes.
 
 
 
246
247 2. In fact, a good way to gauge the effectiveness of a given
248 compression scheme is to run its output through the same sort of
249 tests we use to gauge how “random” a given [PRNG][prng] is. Another
250 way to look at it is that if there is a discernible pattern in the
251 output of a compression scheme, it’s information that could be
252 further compressed.
 
253
254 3. We're using *uncompressed* TIFF here, not [LZW][lzw]- or
255 Zip-compressed TIFF, either of which would give similar results to
256 PNG, which is always zlib-compressed.
257
@@ -260,33 +273,32 @@
260 more difficult, and the random pixel changes. Those test design
261 choices make this a [Monte Carlo experiment][mce]. We’ve found that
262 the overall character of the results doesn’t change from one run to
263 the next.
264
265 The code in the notebook’s third cell drops the first three columns
266 of data because the first column (the empty repository size) is
267 boring, and the subsequent two checkins show the SQLite DB file
268 format settling in with its first few checkins. There’s a single
269 line in the notebook you can comment out to get a bar chart with
270 these data included.
271
272 If you do this, you’ll see a mildly interesting result: the size of
273 the first checkin in the BMP and TIFF cases is roughly the same as
274 that for the PNG case, because both PNG and Fossil use the zlib
275 binary data compression algorithm.
276
277 5. A low-tech format like BMP will have a small edge in practice
278 because TIFF metadata includes the option for multiple timestamps,
279 UUIDs, etc., which bloat the checkin size by creating many small
280 deltas. If you don't need the advantages of TIFF, a less capable
281 image file format will give smaller checkin sizes for a given amount
282 of change.
283
284 6. The `Makefile` above is not battle-tested. Please report bugs and
285 needed extensions [on the forum][for].
286
287 [for]: https://fossil-scm.org/forum/forumpost/15e677f2c8
288 [git]: https://git-scm.com/
 
289 [lzw]: https://en.wikipedia.org/wiki/Lempel%E2%80%93Ziv%E2%80%93Welch
290 [prng]: https://en.wikipedia.org/wiki/Pseudorandom_number_generator
291 [rs]: https://rsync.samba.org/
292 [us]: http://www.cis.upenn.edu/~bcpierce/unison/
293
--- www/image-format-vs-repo-size.md
+++ www/image-format-vs-repo-size.md
@@ -1,21 +1,19 @@
1 # Image Format vs Fossil Repo Size
2
3 ## The Problem
4
5 Fossil has a [delta compression][dc] feature which removes redundant
6 information from a file relative to its parent on check-in.¹
7 That delta is then [zlib][zl]-compressed before being stored
 
8 in the Fossil repository database file.
9
10 Storing pre-compressed data files in a Fossil repository defeats both of
11 these space-saving measures:
12
13 1. Binary data compression algorithms turn the file data into
14 [pseudorandom noise][prn].²
 
15
16 Typical data compression algorithms are not [hash functions][hf],
17 where the goal is that a change to each bit in the input has a
18 statistically even chance of changing every bit in the output, but
19 because they do approach that pathological condition, pre-compressed
@@ -28,11 +26,11 @@
26 noise is incompressible. The consequence for our purposes here is
27 that pre-compressed data doesn’t benefit from Fossil’s zlib
28 compression.
29
30 You might then ask, what does it matter if the space savings comes from
31 the application file format (e.g. JPEG, DOCX, Zip, etc.) or from Fossil
32 itself? It really doesn’t, as far as point 2 above goes, but point 1
33 causes the Fossil repository to balloon out of proportion to the size of
34 the input data change on each checkin. This article will illustrate that
35 problem, quantify it, and give a solution to it.
36
@@ -50,12 +48,12 @@
48
49 * **Microsoft Office**: The [OOXML document format][oox] used from
50 Office 2003 onward (`.docx`, `.xlsx`, `.pptx`, etc.) are Zip files
51 containing an XML document file and several collateral files.
52
53 * **Libre Office**: For the purposes of this article, its
54 [OpenDocument Format][odf] is designed the same basic way as OOXML.
55
56 * **Java**: A Java [`.jar` file][jcl] is a Zip file containing JVM
57 `.class` files, manifest files, and more.
58
59 * **Windows Installer:** An [`*.msi` file][wi] is a proprietary
@@ -78,14 +76,14 @@
76
77
78 ## Demonstration
79
80 The companion `image-format-vs-repo-size.ipynb` file ([download][nbd],
81 [preview][nbp]) is a [JupyterLab][jl] notebook implementing the following
82 experiment:
83
84 1. Create a new minimum-size Fossil repository. Save this initial size.
85
86 2. Use [ImageMagick][im] via [Wand][wp] to generate a JPEG file of a
87 particular size — currently 256 px² — filled with Gaussian noise to
88 make data compression more difficult than with a solid-color image.
89
@@ -100,20 +98,20 @@
98 6. Repeat the above steps for BMP, TIFF,³ and PNG.
99
100 7. Create a bar chart showing how the Fossil repository size changes
101 with each checkin.
102
103 We chose to use JupyterLab for this because it makes it easy for you to
104 modify the notebook to try different things. Want to see how the
105 results change with a different image size? Easy, change the `size`
106 value in the second cell of the notebook. Want to try more image
107 formats? You can put anything ImageMagick can recognize into the
108 `formats` list. Want to find the break-even point for images like those
109 in your own repository? Easily done with a small amount of code.
110
111 [im]: https://www.imagemagick.org/
112 [jl]: https://jupyter.org/
113 [nbd]: ./image-format-vs-repo-size.ipynb
114 [nbp]: https://nbviewer.jupyter.org/urls/fossil-scm.org/fossil/doc/trunk/www/image-format-vs-repo-size.ipynb
115 [wp]: http://wand-py.org/
116
117
@@ -125,23 +123,34 @@
123
124 There are a few key things we want to draw your attention to in that
125 chart:
126
127 * BMP and uncompressed TIFF are nearly identical in size for all
128 checkins, and the repository growth rate is negligible past the
129 first commit.⁵ We owe this economy to Fossil’s delta compression
130 feature: it is encoding each of those single-pixel changes in a very
131 small amount of repository space.
132
133 * The JPEG and TIFF bars increase by large amounts on most checkins
134 even though each checkin *also* encodes only a *single-pixel change*.
135
136 * The size of the first checkin in the BMP and TIFF cases is roughly
137 the same as that for the PNG case, because both PNG and Fossil use
138 the zlib binary data compression algorithm. This shows that for
139 repos where the image files are committed only once, there is
140 virtually no penalty to using BMP or TIFF over PNG. The file sizes
141 likely differ only because of differences in zlib settings between
142 the cases.
143
144 * Because JPEG’s lossy nature allows it to start smaller and have
145 smaller size increases than than PNG, the crossover point with
146 BMP/TIFF isn’t until 7-9 checkins in typical runs of this [Monte
147 Carlo experiment][mce]. Given a choice among these four file
148 formats and a willingness to use lossy image compression, a rational
149 tradeoff is to choose JPEG for repositories where each image will
150 change fewer than that number of times.
151
152
153 [mce]: https://en.wikipedia.org/wiki/Monte_Carlo_method
154
155
156 ## Automated Recompression
@@ -235,23 +244,27 @@
244 ----
245
246
247 ## Footnotes and Digressions
248
249 1. This problem is not Fossil-specific. Several other programs also do
250 delta compression, so they’ll also be affected by this problem:
251 [rsync][rs], [Unison][us], [Git][git], etc. You should take this
252 article’s advice when using all such programs, not just Fossil.
253
254 When using file copying and synchronization programs *without* delta
255 compression, on the other hand, it’s best to use the most
256 highly-compressed file format you can tolerate, since they copy the
257 whole file any time any bit of it changes.
258
259 2. In fact, a good way to gauge the effectiveness of a given
260 compression scheme is to run its output through the same sort of
261 tests we use to gauge how “random” a given [PRNG][prng] is. Another
262 way to look at it is that if there is a discernible pattern in the
263 output of a compression scheme, that constitutes *information* (in
264 [the technical sense of that word][ith]) that could be further
265 compressed.
266
267 3. We're using *uncompressed* TIFF here, not [LZW][lzw]- or
268 Zip-compressed TIFF, either of which would give similar results to
269 PNG, which is always zlib-compressed.
270
@@ -260,33 +273,32 @@
273 more difficult, and the random pixel changes. Those test design
274 choices make this a [Monte Carlo experiment][mce]. We’ve found that
275 the overall character of the results doesn’t change from one run to
276 the next.
277
278 5. It’s not clear to me why there is a one-time jump in size for BMP
279 and TIFF past the first commit. I suspect it is due to the SQLite
280 indices being initialized for the first time.
281
282 Page size inflation might have something to do with it as well,
283 though we tried to control that by rebuilding the initial DB with a
284 minimal page size. If you re-run the program often enough, you will
285 sometimes see the BMP or TIFF bar jump higher than the other, again
286 likely due to one of the repos crossing a page boundary.
287
288 Another curious artifact in the data is that the BMP is slightly
289 larger than for the TIFF. This goes against expectation because a
290 low-tech format like BMP should have a small edge in this test
291 because TIFF metadata includes the option for multiple timestamps,
292 UUIDs, etc., which bloat the checkin size by creating many small
293 deltas.
 
 
294
295 6. The `Makefile` above is not battle-tested. Please report bugs and
296 needed extensions [on the forum][for].
297
298 [for]: https://fossil-scm.org/forum/forumpost/15e677f2c8
299 [git]: https://git-scm.com/
300 [ith]: https://en.wikipedia.org/wiki/Information_theory
301 [lzw]: https://en.wikipedia.org/wiki/Lempel%E2%80%93Ziv%E2%80%93Welch
302 [prng]: https://en.wikipedia.org/wiki/Pseudorandom_number_generator
303 [rs]: https://rsync.samba.org/
304 [us]: http://www.cis.upenn.edu/~bcpierce/unison/
305
--- www/image-format-vs-repo-size.svg
+++ www/image-format-vs-repo-size.svg
@@ -25,310 +25,409 @@
2525
L 54 34.56
2626
z
2727
" style="fill:none;"/>
2828
</g>
2929
<g id="patch_3">
30
- <path clip-path="url(#pb43dd894ca)" d="M 63 252
31
-L 70.2 252
32
-L 70.2 178.592751
33
-L 63 178.592751
30
+ <path clip-path="url(#p9518871844)" d="M 62.126214 252
31
+L 68.627184 252
32
+L 68.627184 165.714286
33
+L 62.126214 165.714286
3434
z
3535
" style="fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
3636
</g>
3737
<g id="patch_4">
38
- <path clip-path="url(#pb43dd894ca)" d="M 99 252
39
-L 106.2 252
40
-L 106.2 178.592751
41
-L 99 178.592751
38
+ <path clip-path="url(#p9518871844)" d="M 94.631068 252
39
+L 101.132039 252
40
+L 101.132039 154.209524
41
+L 94.631068 154.209524
4242
z
4343
" style="fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
4444
</g>
4545
<g id="patch_5">
46
- <path clip-path="url(#pb43dd894ca)" d="M 135 252
47
-L 142.2 252
48
-L 142.2 168.547548
49
-L 135 168.547548
46
+ <path clip-path="url(#p9518871844)" d="M 127.135922 252
47
+L 133.636893 252
48
+L 133.636893 145.580952
49
+L 127.135922 145.580952
5050
z
5151
" style="fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
5252
</g>
5353
<g id="patch_6">
54
- <path clip-path="url(#pb43dd894ca)" d="M 171 252
55
-L 178.2 252
56
-L 178.2 153.866098
57
-L 171 153.866098
54
+ <path clip-path="url(#p9518871844)" d="M 159.640777 252
55
+L 166.141748 252
56
+L 166.141748 139.828571
57
+L 159.640777 139.828571
5858
z
5959
" style="fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
6060
</g>
6161
<g id="patch_7">
62
- <path clip-path="url(#pb43dd894ca)" d="M 207 252
63
-L 214.2 252
64
-L 214.2 152.320682
65
-L 207 152.320682
62
+ <path clip-path="url(#p9518871844)" d="M 192.145631 252
63
+L 198.646602 252
64
+L 198.646602 136.952381
65
+L 192.145631 136.952381
6666
z
6767
" style="fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
6868
</g>
6969
<g id="patch_8">
70
- <path clip-path="url(#pb43dd894ca)" d="M 243 252
71
-L 250.2 252
72
-L 250.2 150.775267
73
-L 243 150.775267
70
+ <path clip-path="url(#p9518871844)" d="M 224.650485 252
71
+L 231.151456 252
72
+L 231.151456 131.2
73
+L 224.650485 131.2
7474
z
7575
" style="fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
7676
</g>
7777
<g id="patch_9">
78
- <path clip-path="url(#pb43dd894ca)" d="M 279 252
79
-L 286.2 252
80
-L 286.2 150.775267
81
-L 279 150.775267
78
+ <path clip-path="url(#p9518871844)" d="M 257.15534 252
79
+L 263.656311 252
80
+L 263.656311 125.447619
81
+L 257.15534 125.447619
8282
z
8383
" style="fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
8484
</g>
8585
<g id="patch_10">
86
- <path clip-path="url(#pb43dd894ca)" d="M 315 252
87
-L 322.2 252
88
-L 322.2 140.730064
89
-L 315 140.730064
90
-z
91
-" style="fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
92
- </g>
93
- <g id="patch_11">
94
- <path clip-path="url(#pb43dd894ca)" d="M 351 252
95
-L 358.2 252
96
-L 358.2 134.548401
97
-L 351 134.548401
98
-z
99
-" style="fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
100
- </g>
101
- <g id="patch_12">
102
- <path clip-path="url(#pb43dd894ca)" d="M 70.2 252
103
-L 77.4 252
104
-L 77.4 142.27548
105
-L 70.2 142.27548
106
-z
107
-" style="fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
108
- </g>
109
- <g id="patch_13">
110
- <path clip-path="url(#pb43dd894ca)" d="M 106.2 252
111
-L 113.4 252
112
-L 113.4 142.27548
113
-L 106.2 142.27548
86
+ <path clip-path="url(#p9518871844)" d="M 289.660194 252
87
+L 296.161165 252
88
+L 296.161165 125.447619
89
+L 289.660194 125.447619
90
+z
91
+" style="fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
92
+ </g>
93
+ <g id="patch_11">
94
+ <path clip-path="url(#p9518871844)" d="M 322.165049 252
95
+L 328.666019 252
96
+L 328.666019 109.628571
97
+L 322.165049 109.628571
98
+z
99
+" style="fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
100
+ </g>
101
+ <g id="patch_12">
102
+ <path clip-path="url(#p9518871844)" d="M 354.669903 252
103
+L 361.170874 252
104
+L 361.170874 105.314286
105
+L 354.669903 105.314286
106
+z
107
+" style="fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
108
+ </g>
109
+ <g id="patch_13">
110
+ <path clip-path="url(#p9518871844)" d="M 68.627184 252
111
+L 75.128155 252
112
+L 75.128155 152.771429
113
+L 68.627184 152.771429
114114
z
115115
" style="fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
116116
</g>
117117
<g id="patch_14">
118
- <path clip-path="url(#pb43dd894ca)" d="M 142.2 252
119
-L 149.4 252
120
-L 149.4 142.27548
121
-L 142.2 142.27548
118
+ <path clip-path="url(#p9518871844)" d="M 101.132039 252
119
+L 107.63301 252
120
+L 107.63301 132.638095
121
+L 101.132039 132.638095
122122
z
123123
" style="fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
124124
</g>
125125
<g id="patch_15">
126
- <path clip-path="url(#pb43dd894ca)" d="M 178.2 252
127
-L 185.4 252
128
-L 185.4 142.27548
129
-L 178.2 142.27548
126
+ <path clip-path="url(#p9518871844)" d="M 133.636893 252
127
+L 140.137864 252
128
+L 140.137864 132.638095
129
+L 133.636893 132.638095
130130
z
131131
" style="fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
132132
</g>
133133
<g id="patch_16">
134
- <path clip-path="url(#pb43dd894ca)" d="M 214.2 252
135
-L 221.4 252
136
-L 221.4 142.27548
137
-L 214.2 142.27548
134
+ <path clip-path="url(#p9518871844)" d="M 166.141748 252
135
+L 172.642718 252
136
+L 172.642718 132.638095
137
+L 166.141748 132.638095
138138
z
139139
" style="fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
140140
</g>
141141
<g id="patch_17">
142
- <path clip-path="url(#pb43dd894ca)" d="M 250.2 252
143
-L 257.4 252
144
-L 257.4 142.27548
145
-L 250.2 142.27548
142
+ <path clip-path="url(#p9518871844)" d="M 198.646602 252
143
+L 205.147573 252
144
+L 205.147573 132.638095
145
+L 198.646602 132.638095
146146
z
147147
" style="fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
148148
</g>
149149
<g id="patch_18">
150
- <path clip-path="url(#pb43dd894ca)" d="M 286.2 252
151
-L 293.4 252
152
-L 293.4 142.27548
153
-L 286.2 142.27548
150
+ <path clip-path="url(#p9518871844)" d="M 231.151456 252
151
+L 237.652427 252
152
+L 237.652427 132.638095
153
+L 231.151456 132.638095
154154
z
155155
" style="fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
156156
</g>
157157
<g id="patch_19">
158
- <path clip-path="url(#pb43dd894ca)" d="M 322.2 252
159
-L 329.4 252
160
-L 329.4 141.502772
161
-L 322.2 141.502772
158
+ <path clip-path="url(#p9518871844)" d="M 263.656311 252
159
+L 270.157282 252
160
+L 270.157282 132.638095
161
+L 263.656311 132.638095
162162
z
163163
" style="fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
164164
</g>
165165
<g id="patch_20">
166
- <path clip-path="url(#pb43dd894ca)" d="M 358.2 252
167
-L 365.4 252
168
-L 365.4 141.502772
169
-L 358.2 141.502772
166
+ <path clip-path="url(#p9518871844)" d="M 296.161165 252
167
+L 302.662136 252
168
+L 302.662136 132.638095
169
+L 296.161165 132.638095
170170
z
171171
" style="fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
172172
</g>
173173
<g id="patch_21">
174
- <path clip-path="url(#pb43dd894ca)" d="M 77.4 252
175
-L 84.6 252
176
-L 84.6 142.27548
177
-L 77.4 142.27548
174
+ <path clip-path="url(#p9518871844)" d="M 328.666019 252
175
+L 335.16699 252
176
+L 335.16699 132.638095
177
+L 328.666019 132.638095
178178
z
179
-" style="fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
179
+" style="fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
180180
</g>
181181
<g id="patch_22">
182
- <path clip-path="url(#pb43dd894ca)" d="M 113.4 252
183
-L 120.6 252
184
-L 120.6 142.27548
185
-L 113.4 142.27548
182
+ <path clip-path="url(#p9518871844)" d="M 361.170874 252
183
+L 367.671845 252
184
+L 367.671845 132.638095
185
+L 361.170874 132.638095
186186
z
187
-" style="fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
187
+" style="fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
188188
</g>
189189
<g id="patch_23">
190
- <path clip-path="url(#pb43dd894ca)" d="M 149.4 252
191
-L 156.6 252
192
-L 156.6 142.27548
193
-L 149.4 142.27548
190
+ <path clip-path="url(#p9518871844)" d="M 75.128155 252
191
+L 81.629126 252
192
+L 81.629126 155.647619
193
+L 75.128155 155.647619
194194
z
195195
" style="fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
196196
</g>
197197
<g id="patch_24">
198
- <path clip-path="url(#pb43dd894ca)" d="M 185.4 252
199
-L 192.6 252
200
-L 192.6 142.27548
201
-L 185.4 142.27548
198
+ <path clip-path="url(#p9518871844)" d="M 107.63301 252
199
+L 114.133981 252
200
+L 114.133981 135.514286
201
+L 107.63301 135.514286
202202
z
203203
" style="fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
204204
</g>
205205
<g id="patch_25">
206
- <path clip-path="url(#pb43dd894ca)" d="M 221.4 252
207
-L 228.6 252
208
-L 228.6 142.27548
209
-L 221.4 142.27548
206
+ <path clip-path="url(#p9518871844)" d="M 140.137864 252
207
+L 146.638835 252
208
+L 146.638835 135.514286
209
+L 140.137864 135.514286
210210
z
211211
" style="fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
212212
</g>
213213
<g id="patch_26">
214
- <path clip-path="url(#pb43dd894ca)" d="M 257.4 252
215
-L 264.6 252
216
-L 264.6 142.27548
217
-L 257.4 142.27548
214
+ <path clip-path="url(#p9518871844)" d="M 172.642718 252
215
+L 179.143689 252
216
+L 179.143689 135.514286
217
+L 172.642718 135.514286
218218
z
219219
" style="fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
220220
</g>
221221
<g id="patch_27">
222
- <path clip-path="url(#pb43dd894ca)" d="M 293.4 252
223
-L 300.6 252
224
-L 300.6 142.27548
225
-L 293.4 142.27548
222
+ <path clip-path="url(#p9518871844)" d="M 205.147573 252
223
+L 211.648544 252
224
+L 211.648544 135.514286
225
+L 205.147573 135.514286
226226
z
227227
" style="fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
228228
</g>
229229
<g id="patch_28">
230
- <path clip-path="url(#pb43dd894ca)" d="M 329.4 252
231
-L 336.6 252
232
-L 336.6 141.502772
233
-L 329.4 141.502772
230
+ <path clip-path="url(#p9518871844)" d="M 237.652427 252
231
+L 244.153398 252
232
+L 244.153398 135.514286
233
+L 237.652427 135.514286
234234
z
235235
" style="fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
236236
</g>
237237
<g id="patch_29">
238
- <path clip-path="url(#pb43dd894ca)" d="M 365.4 252
239
-L 372.6 252
240
-L 372.6 141.502772
241
-L 365.4 141.502772
238
+ <path clip-path="url(#p9518871844)" d="M 270.157282 252
239
+L 276.658252 252
240
+L 276.658252 135.514286
241
+L 270.157282 135.514286
242242
z
243243
" style="fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
244244
</g>
245245
<g id="patch_30">
246
- <path clip-path="url(#pb43dd894ca)" d="M 84.6 252
247
-L 91.8 252
248
-L 91.8 143.048188
249
-L 84.6 143.048188
246
+ <path clip-path="url(#p9518871844)" d="M 302.662136 252
247
+L 309.163107 252
248
+L 309.163107 135.514286
249
+L 302.662136 135.514286
250250
z
251
-" style="fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
251
+" style="fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
252252
</g>
253253
<g id="patch_31">
254
- <path clip-path="url(#pb43dd894ca)" d="M 120.6 252
255
-L 127.8 252
256
-L 127.8 128.366738
257
-L 120.6 128.366738
254
+ <path clip-path="url(#p9518871844)" d="M 335.16699 252
255
+L 341.667961 252
256
+L 341.667961 135.514286
257
+L 335.16699 135.514286
258258
z
259
-" style="fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
259
+" style="fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
260260
</g>
261261
<g id="patch_32">
262
- <path clip-path="url(#pb43dd894ca)" d="M 156.6 252
263
-L 163.8 252
264
-L 163.8 112.139872
265
-L 156.6 112.139872
262
+ <path clip-path="url(#p9518871844)" d="M 367.671845 252
263
+L 374.172816 252
264
+L 374.172816 135.514286
265
+L 367.671845 135.514286
266266
z
267
-" style="fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
267
+" style="fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
268268
</g>
269269
<g id="patch_33">
270
- <path clip-path="url(#pb43dd894ca)" d="M 192.6 252
271
-L 199.8 252
272
-L 199.8 101.321962
273
-L 192.6 101.321962
270
+ <path clip-path="url(#p9518871844)" d="M 81.629126 252
271
+L 88.130097 252
272
+L 88.130097 157.085714
273
+L 81.629126 157.085714
274274
z
275275
" style="fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
276276
</g>
277277
<g id="patch_34">
278
- <path clip-path="url(#pb43dd894ca)" d="M 228.6 252
279
-L 235.8 252
280
-L 235.8 97.458422
281
-L 228.6 97.458422
278
+ <path clip-path="url(#p9518871844)" d="M 114.133981 252
279
+L 120.634951 252
280
+L 120.634951 138.390476
281
+L 114.133981 138.390476
282282
z
283283
" style="fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
284284
</g>
285285
<g id="patch_35">
286
- <path clip-path="url(#pb43dd894ca)" d="M 264.6 252
287
-L 271.8 252
288
-L 271.8 81.231557
289
-L 264.6 81.231557
286
+ <path clip-path="url(#p9518871844)" d="M 146.638835 252
287
+L 153.139806 252
288
+L 153.139806 108.190476
289
+L 146.638835 108.190476
290290
z
291291
" style="fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
292292
</g>
293293
<g id="patch_36">
294
- <path clip-path="url(#pb43dd894ca)" d="M 300.6 252
295
-L 307.8 252
296
-L 307.8 81.231557
297
-L 300.6 81.231557
294
+ <path clip-path="url(#p9518871844)" d="M 179.143689 252
295
+L 185.64466 252
296
+L 185.64466 102.438095
297
+L 179.143689 102.438095
298298
z
299299
" style="fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
300300
</g>
301301
<g id="patch_37">
302
- <path clip-path="url(#pb43dd894ca)" d="M 336.6 252
303
-L 343.8 252
304
-L 343.8 55.732196
305
-L 336.6 55.732196
302
+ <path clip-path="url(#p9518871844)" d="M 211.648544 252
303
+L 218.149515 252
304
+L 218.149515 98.12381
305
+L 211.648544 98.12381
306
+z
307
+" style="fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
308
+ </g>
309
+ <g id="patch_38">
310
+ <path clip-path="url(#p9518871844)" d="M 244.153398 252
311
+L 250.654369 252
312
+L 250.654369 83.742857
313
+L 244.153398 83.742857
314
+z
315
+" style="fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
316
+ </g>
317
+ <g id="patch_39">
318
+ <path clip-path="url(#p9518871844)" d="M 276.658252 252
319
+L 283.159223 252
320
+L 283.159223 67.92381
321
+L 276.658252 67.92381
322
+z
323
+" style="fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
324
+ </g>
325
+ <g id="patch_40">
326
+ <path clip-path="url(#p9518871844)" d="M 309.163107 252
327
+L 315.664078 252
328
+L 315.664078 57.857143
329
+L 309.163107 57.857143
330
+z
331
+" style="fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
332
+ </g>
333
+ <g id="patch_41">
334
+ <path clip-path="url(#p9518871844)" d="M 341.667961 252
335
+L 348.168932 252
336
+L 348.168932 53.542857
337
+L 341.667961 53.542857
306338
z
307339
" style="fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
308340
</g>
309
- <g id="patch_38">
310
- <path clip-path="url(#pb43dd894ca)" d="M 372.6 252
311
-L 379.8 252
312
-L 379.8 44.914286
313
-L 372.6 44.914286
341
+ <g id="patch_42">
342
+ <path clip-path="url(#p9518871844)" d="M 374.172816 252
343
+L 380.673786 252
344
+L 380.673786 44.914286
345
+L 374.172816 44.914286
314346
z
315347
" style="fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
316348
</g>
317349
<g id="matplotlib.axis_1">
318350
<g id="xtick_1">
319351
<g id="line2d_1">
320352
<defs>
321353
<path d="M 0 0
322354
L 0 3.5
323
-" id="m4ac62df1f0" style="stroke:#000000;stroke-width:0.8;"/>
355
+" id="m769b2cfcfb" style="stroke:#000000;stroke-width:0.8;"/>
324356
</defs>
325357
<g>
326
- <use style="stroke:#000000;stroke-width:0.8;" x="77.4" xlink:href="#m4ac62df1f0" y="252"/>
358
+ <use style="stroke:#000000;stroke-width:0.8;" x="75.128155" xlink:href="#m769b2cfcfb" y="252"/>
327359
</g>
328360
</g>
329361
<g id="text_1">
362
+ <!-- 1 -->
363
+ <defs>
364
+ <path d="M 12.40625 8.296875
365
+L 28.515625 8.296875
366
+L 28.515625 63.921875
367
+L 10.984375 60.40625
368
+L 10.984375 69.390625
369
+L 28.421875 72.90625
370
+L 38.28125 72.90625
371
+L 38.28125 8.296875
372
+L 54.390625 8.296875
373
+L 54.390625 0
374
+L 12.40625 0
375
+z
376
+" id="DejaVuSans-49"/>
377
+ </defs>
378
+ <g transform="translate(77.88753 265.3625)rotate(-90)scale(0.1 -0.1)">
379
+ <use xlink:href="#DejaVuSans-49"/>
380
+ </g>
381
+ </g>
382
+ </g>
383
+ <g id="xtick_2">
384
+ <g id="line2d_2">
385
+ <g>
386
+ <use style="stroke:#000000;stroke-width:0.8;" x="107.63301" xlink:href="#m769b2cfcfb" y="252"/>
387
+ </g>
388
+ </g>
389
+ <g id="text_2">
390
+ <!-- 2 -->
391
+ <defs>
392
+ <path d="M 19.1875 8.296875
393
+L 53.609375 8.296875
394
+L 53.609375 0
395
+L 7.328125 0
396
+L 7.328125 8.296875
397
+Q 12.9375 14.109375 22.625 23.890625
398
+Q 32.328125 33.6875 34.8125 36.53125
399
+Q 39.546875 41.84375 41.421875 45.53125
400
+Q 43.3125 49.21875 43.3125 52.78125
401
+Q 43.3125 58.59375 39.234375 62.25
402
+Q 35.15625 65.921875 28.609375 65.921875
403
+Q 23.96875 65.921875 18.8125 64.3125
404
+Q 13.671875 62.703125 7.8125 59.421875
405
+L 7.8125 69.390625
406
+Q 13.765625 71.78125 18.9375 73
407
+Q 24.125 74.21875 28.421875 74.21875
408
+Q 39.75 74.21875 46.484375 68.546875
409
+Q 53.21875 62.890625 53.21875 53.421875
410
+Q 53.21875 48.921875 51.53125 44.890625
411
+Q 49.859375 40.875 45.40625 35.40625
412
+Q 44.1875 33.984375 37.640625 27.21875
413
+Q 31.109375 20.453125 19.1875 8.296875
414
+z
415
+" id="DejaVuSans-50"/>
416
+ </defs>
417
+ <g transform="translate(110.392385 265.3625)rotate(-90)scale(0.1 -0.1)">
418
+ <use xlink:href="#DejaVuSans-50"/>
419
+ </g>
420
+ </g>
421
+ </g>
422
+ <g id="xtick_3">
423
+ <g id="line2d_3">
424
+ <g>
425
+ <use style="stroke:#000000;stroke-width:0.8;" x="140.137864" xlink:href="#m769b2cfcfb" y="252"/>
426
+ </g>
427
+ </g>
428
+ <g id="text_3">
330429
<!-- 3 -->
331430
<defs>
332431
<path d="M 40.578125 39.3125
333432
Q 47.65625 37.796875 51.625 33
334433
Q 55.609375 28.21875 55.609375 21.1875
@@ -360,22 +459,22 @@
360459
Q 53.90625 49.265625 50.4375 45.09375
361460
Q 46.96875 40.921875 40.578125 39.3125
362461
z
363462
" id="DejaVuSans-51"/>
364463
</defs>
365
- <g transform="translate(80.159375 265.3625)rotate(-90)scale(0.1 -0.1)">
464
+ <g transform="translate(142.897239 265.3625)rotate(-90)scale(0.1 -0.1)">
366465
<use xlink:href="#DejaVuSans-51"/>
367466
</g>
368467
</g>
369468
</g>
370
- <g id="xtick_2">
371
- <g id="line2d_2">
469
+ <g id="xtick_4">
470
+ <g id="line2d_4">
372471
<g>
373
- <use style="stroke:#000000;stroke-width:0.8;" x="113.4" xlink:href="#m4ac62df1f0" y="252"/>
472
+ <use style="stroke:#000000;stroke-width:0.8;" x="172.642718" xlink:href="#m769b2cfcfb" y="252"/>
374473
</g>
375474
</g>
376
- <g id="text_2">
475
+ <g id="text_4">
377476
<!-- 4 -->
378477
<defs>
379478
<path d="M 37.796875 64.3125
380479
L 12.890625 25.390625
381480
L 37.796875 25.390625
@@ -392,22 +491,22 @@
392491
L 4.890625 17.1875
393492
L 4.890625 26.703125
394493
z
395494
" id="DejaVuSans-52"/>
396495
</defs>
397
- <g transform="translate(116.159375 265.3625)rotate(-90)scale(0.1 -0.1)">
496
+ <g transform="translate(175.402093 265.3625)rotate(-90)scale(0.1 -0.1)">
398497
<use xlink:href="#DejaVuSans-52"/>
399498
</g>
400499
</g>
401500
</g>
402
- <g id="xtick_3">
403
- <g id="line2d_3">
501
+ <g id="xtick_5">
502
+ <g id="line2d_5">
404503
<g>
405
- <use style="stroke:#000000;stroke-width:0.8;" x="149.4" xlink:href="#m4ac62df1f0" y="252"/>
504
+ <use style="stroke:#000000;stroke-width:0.8;" x="205.147573" xlink:href="#m769b2cfcfb" y="252"/>
406505
</g>
407506
</g>
408
- <g id="text_3">
507
+ <g id="text_5">
409508
<!-- 5 -->
410509
<defs>
411510
<path d="M 10.796875 72.90625
412511
L 49.515625 72.90625
413512
L 49.515625 64.59375
@@ -431,22 +530,22 @@
431530
Q 22.75 39.890625 18.8125 39.015625
432531
Q 14.890625 38.140625 10.796875 36.28125
433532
z
434533
" id="DejaVuSans-53"/>
435534
</defs>
436
- <g transform="translate(152.159375 265.3625)rotate(-90)scale(0.1 -0.1)">
535
+ <g transform="translate(207.906948 265.3625)rotate(-90)scale(0.1 -0.1)">
437536
<use xlink:href="#DejaVuSans-53"/>
438537
</g>
439538
</g>
440539
</g>
441
- <g id="xtick_4">
442
- <g id="line2d_4">
540
+ <g id="xtick_6">
541
+ <g id="line2d_6">
443542
<g>
444
- <use style="stroke:#000000;stroke-width:0.8;" x="185.4" xlink:href="#m4ac62df1f0" y="252"/>
543
+ <use style="stroke:#000000;stroke-width:0.8;" x="237.652427" xlink:href="#m769b2cfcfb" y="252"/>
445544
</g>
446545
</g>
447
- <g id="text_4">
546
+ <g id="text_6">
448547
<!-- 6 -->
449548
<defs>
450549
<path d="M 33.015625 40.375
451550
Q 26.375 40.375 22.484375 35.828125
452551
Q 18.609375 31.296875 18.609375 23.390625
@@ -476,22 +575,22 @@
476575
Q 40.921875 74.21875 44.703125 73.484375
477576
Q 48.484375 72.75 52.59375 71.296875
478577
z
479578
" id="DejaVuSans-54"/>
480579
</defs>
481
- <g transform="translate(188.159375 265.3625)rotate(-90)scale(0.1 -0.1)">
580
+ <g transform="translate(240.411802 265.3625)rotate(-90)scale(0.1 -0.1)">
482581
<use xlink:href="#DejaVuSans-54"/>
483582
</g>
484583
</g>
485584
</g>
486
- <g id="xtick_5">
487
- <g id="line2d_5">
585
+ <g id="xtick_7">
586
+ <g id="line2d_7">
488587
<g>
489
- <use style="stroke:#000000;stroke-width:0.8;" x="221.4" xlink:href="#m4ac62df1f0" y="252"/>
588
+ <use style="stroke:#000000;stroke-width:0.8;" x="270.157282" xlink:href="#m769b2cfcfb" y="252"/>
490589
</g>
491590
</g>
492
- <g id="text_5">
591
+ <g id="text_7">
493592
<!-- 7 -->
494593
<defs>
495594
<path d="M 8.203125 72.90625
496595
L 55.078125 72.90625
497596
L 55.078125 68.703125
@@ -500,22 +599,22 @@
500599
L 43.21875 64.59375
501600
L 8.203125 64.59375
502601
z
503602
" id="DejaVuSans-55"/>
504603
</defs>
505
- <g transform="translate(224.159375 265.3625)rotate(-90)scale(0.1 -0.1)">
604
+ <g transform="translate(272.916657 265.3625)rotate(-90)scale(0.1 -0.1)">
506605
<use xlink:href="#DejaVuSans-55"/>
507606
</g>
508607
</g>
509608
</g>
510
- <g id="xtick_6">
511
- <g id="line2d_6">
609
+ <g id="xtick_8">
610
+ <g id="line2d_8">
512611
<g>
513
- <use style="stroke:#000000;stroke-width:0.8;" x="257.4" xlink:href="#m4ac62df1f0" y="252"/>
612
+ <use style="stroke:#000000;stroke-width:0.8;" x="302.662136" xlink:href="#m769b2cfcfb" y="252"/>
514613
</g>
515614
</g>
516
- <g id="text_6">
615
+ <g id="text_8">
517616
<!-- 8 -->
518617
<defs>
519618
<path d="M 31.78125 34.625
520619
Q 24.75 34.625 20.71875 30.859375
521620
Q 16.703125 27.09375 16.703125 20.515625
@@ -554,22 +653,22 @@
554653
Q 25.390625 66.40625 21.84375 63.234375
555654
Q 18.3125 60.0625 18.3125 54.390625
556655
z
557656
" id="DejaVuSans-56"/>
558657
</defs>
559
- <g transform="translate(260.159375 265.3625)rotate(-90)scale(0.1 -0.1)">
658
+ <g transform="translate(305.421511 265.3625)rotate(-90)scale(0.1 -0.1)">
560659
<use xlink:href="#DejaVuSans-56"/>
561660
</g>
562661
</g>
563662
</g>
564
- <g id="xtick_7">
565
- <g id="line2d_7">
663
+ <g id="xtick_9">
664
+ <g id="line2d_9">
566665
<g>
567
- <use style="stroke:#000000;stroke-width:0.8;" x="293.4" xlink:href="#m4ac62df1f0" y="252"/>
666
+ <use style="stroke:#000000;stroke-width:0.8;" x="335.16699" xlink:href="#m769b2cfcfb" y="252"/>
568667
</g>
569668
</g>
570
- <g id="text_7">
669
+ <g id="text_9">
571670
<!-- 9 -->
572671
<defs>
573672
<path d="M 10.984375 1.515625
574673
L 10.984375 10.5
575674
Q 14.703125 8.734375 18.5 7.8125
@@ -599,37 +698,24 @@
599698
Q 16.21875 41.5 20.09375 36.953125
600699
Q 23.96875 32.421875 30.609375 32.421875
601700
z
602701
" id="DejaVuSans-57"/>
603702
</defs>
604
- <g transform="translate(296.159375 265.3625)rotate(-90)scale(0.1 -0.1)">
703
+ <g transform="translate(337.926365 265.3625)rotate(-90)scale(0.1 -0.1)">
605704
<use xlink:href="#DejaVuSans-57"/>
606705
</g>
607706
</g>
608707
</g>
609
- <g id="xtick_8">
610
- <g id="line2d_8">
708
+ <g id="xtick_10">
709
+ <g id="line2d_10">
611710
<g>
612
- <use style="stroke:#000000;stroke-width:0.8;" x="329.4" xlink:href="#m4ac62df1f0" y="252"/>
711
+ <use style="stroke:#000000;stroke-width:0.8;" x="367.671845" xlink:href="#m769b2cfcfb" y="252"/>
613712
</g>
614713
</g>
615
- <g id="text_8">
714
+ <g id="text_10">
616715
<!-- 10 -->
617716
<defs>
618
- <path d="M 12.40625 8.296875
619
-L 28.515625 8.296875
620
-L 28.515625 63.921875
621
-L 10.984375 60.40625
622
-L 10.984375 69.390625
623
-L 28.421875 72.90625
624
-L 38.28125 72.90625
625
-L 38.28125 8.296875
626
-L 54.390625 8.296875
627
-L 54.390625 0
628
-L 12.40625 0
629
-z
630
-" id="DejaVuSans-49"/>
631717
<path d="M 31.78125 66.40625
632718
Q 24.171875 66.40625 20.328125 58.90625
633719
Q 16.5 51.421875 16.5 36.375
634720
Q 16.5 21.390625 20.328125 13.890625
635721
Q 24.171875 6.390625 31.78125 6.390625
@@ -648,31 +734,17 @@
648734
Q 6.59375 54.828125 13.0625 64.515625
649735
Q 19.53125 74.21875 31.78125 74.21875
650736
z
651737
" id="DejaVuSans-48"/>
652738
</defs>
653
- <g transform="translate(332.159375 271.725)rotate(-90)scale(0.1 -0.1)">
739
+ <g transform="translate(370.43122 271.725)rotate(-90)scale(0.1 -0.1)">
654740
<use xlink:href="#DejaVuSans-49"/>
655741
<use x="63.623047" xlink:href="#DejaVuSans-48"/>
656742
</g>
657743
</g>
658744
</g>
659
- <g id="xtick_9">
660
- <g id="line2d_9">
661
- <g>
662
- <use style="stroke:#000000;stroke-width:0.8;" x="365.4" xlink:href="#m4ac62df1f0" y="252"/>
663
- </g>
664
- </g>
665
- <g id="text_9">
666
- <!-- 11 -->
667
- <g transform="translate(368.159375 271.725)rotate(-90)scale(0.1 -0.1)">
668
- <use xlink:href="#DejaVuSans-49"/>
669
- <use x="63.623047" xlink:href="#DejaVuSans-49"/>
670
- </g>
671
- </g>
672
- </g>
673
- <g id="text_10">
745
+ <g id="text_11">
674746
<!-- Checkin index -->
675747
<defs>
676748
<path d="M 64.40625 67.28125
677749
L 64.40625 56.890625
678750
Q 59.421875 61.53125 53.78125 63.8125
@@ -860,21 +932,21 @@
860932
</g>
861933
</g>
862934
</g>
863935
<g id="matplotlib.axis_2">
864936
<g id="ytick_1">
865
- <g id="line2d_10">
937
+ <g id="line2d_11">
866938
<defs>
867939
<path d="M 0 0
868940
L -3.5 0
869
-" id="m78b7b2ee23" style="stroke:#000000;stroke-width:0.8;"/>
941
+" id="m80d71b6281" style="stroke:#000000;stroke-width:0.8;"/>
870942
</defs>
871943
<g>
872
- <use style="stroke:#000000;stroke-width:0.8;" x="54" xlink:href="#m78b7b2ee23" y="252"/>
944
+ <use style="stroke:#000000;stroke-width:0.8;" x="54" xlink:href="#m80d71b6281" y="252"/>
873945
</g>
874946
</g>
875
- <g id="text_11">
947
+ <g id="text_12">
876948
<!-- 0.0 -->
877949
<defs>
878950
<path d="M 10.6875 12.40625
879951
L 21 12.40625
880952
L 21 0
@@ -888,111 +960,85 @@
888960
<use x="95.410156" xlink:href="#DejaVuSans-48"/>
889961
</g>
890962
</g>
891963
</g>
892964
<g id="ytick_2">
893
- <g id="line2d_11">
965
+ <g id="line2d_12">
894966
<g>
895
- <use style="stroke:#000000;stroke-width:0.8;" x="54" xlink:href="#m78b7b2ee23" y="212.437356"/>
967
+ <use style="stroke:#000000;stroke-width:0.8;" x="54" xlink:href="#m80d71b6281" y="215.184762"/>
896968
</g>
897969
</g>
898
- <g id="text_12">
970
+ <g id="text_13">
899971
<!-- 0.2 -->
900
- <defs>
901
- <path d="M 19.1875 8.296875
902
-L 53.609375 8.296875
903
-L 53.609375 0
904
-L 7.328125 0
905
-L 7.328125 8.296875
906
-Q 12.9375 14.109375 22.625 23.890625
907
-Q 32.328125 33.6875 34.8125 36.53125
908
-Q 39.546875 41.84375 41.421875 45.53125
909
-Q 43.3125 49.21875 43.3125 52.78125
910
-Q 43.3125 58.59375 39.234375 62.25
911
-Q 35.15625 65.921875 28.609375 65.921875
912
-Q 23.96875 65.921875 18.8125 64.3125
913
-Q 13.671875 62.703125 7.8125 59.421875
914
-L 7.8125 69.390625
915
-Q 13.765625 71.78125 18.9375 73
916
-Q 24.125 74.21875 28.421875 74.21875
917
-Q 39.75 74.21875 46.484375 68.546875
918
-Q 53.21875 62.890625 53.21875 53.421875
919
-Q 53.21875 48.921875 51.53125 44.890625
920
-Q 49.859375 40.875 45.40625 35.40625
921
-Q 44.1875 33.984375 37.640625 27.21875
922
-Q 31.109375 20.453125 19.1875 8.296875
923
-z
924
-" id="DejaVuSans-50"/>
925
- </defs>
926
- <g transform="translate(31.096875 216.236575)scale(0.1 -0.1)">
972
+ <g transform="translate(31.096875 218.983981)scale(0.1 -0.1)">
927973
<use xlink:href="#DejaVuSans-48"/>
928974
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
929975
<use x="95.410156" xlink:href="#DejaVuSans-50"/>
930976
</g>
931977
</g>
932978
</g>
933979
<g id="ytick_3">
934
- <g id="line2d_12">
980
+ <g id="line2d_13">
935981
<g>
936
- <use style="stroke:#000000;stroke-width:0.8;" x="54" xlink:href="#m78b7b2ee23" y="172.874712"/>
982
+ <use style="stroke:#000000;stroke-width:0.8;" x="54" xlink:href="#m80d71b6281" y="178.369524"/>
937983
</g>
938984
</g>
939
- <g id="text_13">
985
+ <g id="text_14">
940986
<!-- 0.4 -->
941
- <g transform="translate(31.096875 176.673931)scale(0.1 -0.1)">
987
+ <g transform="translate(31.096875 182.168743)scale(0.1 -0.1)">
942988
<use xlink:href="#DejaVuSans-48"/>
943989
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
944990
<use x="95.410156" xlink:href="#DejaVuSans-52"/>
945991
</g>
946992
</g>
947993
</g>
948994
<g id="ytick_4">
949
- <g id="line2d_13">
995
+ <g id="line2d_14">
950996
<g>
951
- <use style="stroke:#000000;stroke-width:0.8;" x="54" xlink:href="#m78b7b2ee23" y="133.312068"/>
997
+ <use style="stroke:#000000;stroke-width:0.8;" x="54" xlink:href="#m80d71b6281" y="141.554286"/>
952998
</g>
953999
</g>
954
- <g id="text_14">
1000
+ <g id="text_15">
9551001
<!-- 0.6 -->
956
- <g transform="translate(31.096875 137.111287)scale(0.1 -0.1)">
1002
+ <g transform="translate(31.096875 145.353504)scale(0.1 -0.1)">
9571003
<use xlink:href="#DejaVuSans-48"/>
9581004
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
9591005
<use x="95.410156" xlink:href="#DejaVuSans-54"/>
9601006
</g>
9611007
</g>
9621008
</g>
9631009
<g id="ytick_5">
964
- <g id="line2d_14">
1010
+ <g id="line2d_15">
9651011
<g>
966
- <use style="stroke:#000000;stroke-width:0.8;" x="54" xlink:href="#m78b7b2ee23" y="93.749424"/>
1012
+ <use style="stroke:#000000;stroke-width:0.8;" x="54" xlink:href="#m80d71b6281" y="104.739048"/>
9671013
</g>
9681014
</g>
969
- <g id="text_15">
1015
+ <g id="text_16">
9701016
<!-- 0.8 -->
971
- <g transform="translate(31.096875 97.548643)scale(0.1 -0.1)">
1017
+ <g transform="translate(31.096875 108.538266)scale(0.1 -0.1)">
9721018
<use xlink:href="#DejaVuSans-48"/>
9731019
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
9741020
<use x="95.410156" xlink:href="#DejaVuSans-56"/>
9751021
</g>
9761022
</g>
9771023
</g>
9781024
<g id="ytick_6">
979
- <g id="line2d_15">
1025
+ <g id="line2d_16">
9801026
<g>
981
- <use style="stroke:#000000;stroke-width:0.8;" x="54" xlink:href="#m78b7b2ee23" y="54.18678"/>
1027
+ <use style="stroke:#000000;stroke-width:0.8;" x="54" xlink:href="#m80d71b6281" y="67.92381"/>
9821028
</g>
9831029
</g>
984
- <g id="text_16">
1030
+ <g id="text_17">
9851031
<!-- 1.0 -->
986
- <g transform="translate(31.096875 57.985999)scale(0.1 -0.1)">
1032
+ <g transform="translate(31.096875 71.723028)scale(0.1 -0.1)">
9871033
<use xlink:href="#DejaVuSans-49"/>
9881034
<use x="63.623047" xlink:href="#DejaVuSans-46"/>
9891035
<use x="95.410156" xlink:href="#DejaVuSans-48"/>
9901036
</g>
9911037
</g>
9921038
</g>
993
- <g id="text_17">
1039
+ <g id="text_18">
9941040
<!-- Repo size (MiB) -->
9951041
<defs>
9961042
<path d="M 44.390625 34.1875
9971043
Q 47.5625 33.109375 50.5625 29.59375
9981044
Q 53.5625 26.078125 56.59375 19.921875
@@ -1197,32 +1243,32 @@
11971243
<use x="666.148438" xlink:href="#DejaVuSans-66"/>
11981244
<use x="734.751953" xlink:href="#DejaVuSans-41"/>
11991245
</g>
12001246
</g>
12011247
</g>
1202
- <g id="patch_39">
1248
+ <g id="patch_43">
12031249
<path d="M 54 252
12041250
L 54 34.56
12051251
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
12061252
</g>
1207
- <g id="patch_40">
1253
+ <g id="patch_44">
12081254
<path d="M 388.8 252
12091255
L 388.8 34.56
12101256
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
12111257
</g>
1212
- <g id="patch_41">
1258
+ <g id="patch_45">
12131259
<path d="M 54 252
12141260
L 388.8 252
12151261
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
12161262
</g>
1217
- <g id="patch_42">
1263
+ <g id="patch_46">
12181264
<path d="M 54 34.56
12191265
L 388.8 34.56
12201266
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
12211267
</g>
12221268
<g id="legend_1">
1223
- <g id="patch_43">
1269
+ <g id="patch_47">
12241270
<path d="M 61 101.2725
12251271
L 116.046875 101.2725
12261272
Q 118.046875 101.2725 118.046875 99.2725
12271273
L 118.046875 41.56
12281274
Q 118.046875 39.56 116.046875 39.56
@@ -1231,19 +1277,19 @@
12311277
L 59 99.2725
12321278
Q 59 101.2725 61 101.2725
12331279
z
12341280
" style="fill:#ffffff;opacity:0.8;stroke:#cccccc;stroke-linejoin:miter;"/>
12351281
</g>
1236
- <g id="patch_44">
1282
+ <g id="patch_48">
12371283
<path d="M 63 51.158437
12381284
L 83 51.158437
12391285
L 83 44.158437
12401286
L 63 44.158437
12411287
z
12421288
" style="fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
12431289
</g>
1244
- <g id="text_18">
1290
+ <g id="text_19">
12451291
<!-- JPEG -->
12461292
<defs>
12471293
<path d="M 9.8125 72.90625
12481294
L 19.671875 72.90625
12491295
L 19.671875 5.078125
@@ -1320,35 +1366,35 @@
13201366
<use x="29.492188" xlink:href="#DejaVuSans-80"/>
13211367
<use x="89.794922" xlink:href="#DejaVuSans-69"/>
13221368
<use x="152.978516" xlink:href="#DejaVuSans-71"/>
13231369
</g>
13241370
</g>
1325
- <g id="patch_45">
1371
+ <g id="patch_49">
13261372
<path d="M 63 65.836562
13271373
L 83 65.836562
13281374
L 83 58.836562
13291375
L 63 58.836562
13301376
z
13311377
" style="fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
13321378
</g>
1333
- <g id="text_19">
1379
+ <g id="text_20">
13341380
<!-- BMP -->
13351381
<g transform="translate(91 65.836562)scale(0.1 -0.1)">
13361382
<use xlink:href="#DejaVuSans-66"/>
13371383
<use x="68.603516" xlink:href="#DejaVuSans-77"/>
13381384
<use x="154.882812" xlink:href="#DejaVuSans-80"/>
13391385
</g>
13401386
</g>
1341
- <g id="patch_46">
1387
+ <g id="patch_50">
13421388
<path d="M 63 80.514687
13431389
L 83 80.514687
13441390
L 83 73.514687
13451391
L 63 73.514687
13461392
z
13471393
" style="fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
13481394
</g>
1349
- <g id="text_20">
1395
+ <g id="text_21">
13501396
<!-- TIFF -->
13511397
<defs>
13521398
<path d="M -0.296875 72.90625
13531399
L 61.375 72.90625
13541400
L 61.375 64.59375
@@ -1383,19 +1429,19 @@
13831429
<use x="61.083984" xlink:href="#DejaVuSans-73"/>
13841430
<use x="90.576172" xlink:href="#DejaVuSans-70"/>
13851431
<use x="148.095703" xlink:href="#DejaVuSans-70"/>
13861432
</g>
13871433
</g>
1388
- <g id="patch_47">
1434
+ <g id="patch_51">
13891435
<path d="M 63 95.192813
13901436
L 83 95.192813
13911437
L 83 88.192813
13921438
L 63 88.192813
13931439
z
13941440
" style="fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
13951441
</g>
1396
- <g id="text_21">
1442
+ <g id="text_22">
13971443
<!-- PNG -->
13981444
<defs>
13991445
<path d="M 9.8125 72.90625
14001446
L 23.09375 72.90625
14011447
L 55.421875 11.921875
@@ -1417,10 +1463,10 @@
14171463
</g>
14181464
</g>
14191465
</g>
14201466
</g>
14211467
<defs>
1422
- <clipPath id="pb43dd894ca">
1468
+ <clipPath id="p9518871844">
14231469
<rect height="217.44" width="334.8" x="54" y="34.56"/>
14241470
</clipPath>
14251471
</defs>
14261472
</svg>
14271473
--- www/image-format-vs-repo-size.svg
+++ www/image-format-vs-repo-size.svg
@@ -25,310 +25,409 @@
25 L 54 34.56
26 z
27 " style="fill:none;"/>
28 </g>
29 <g id="patch_3">
30 <path clip-path="url(#pb43dd894ca)" d="M 63 252
31 L 70.2 252
32 L 70.2 178.592751
33 L 63 178.592751
34 z
35 " style="fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
36 </g>
37 <g id="patch_4">
38 <path clip-path="url(#pb43dd894ca)" d="M 99 252
39 L 106.2 252
40 L 106.2 178.592751
41 L 99 178.592751
42 z
43 " style="fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
44 </g>
45 <g id="patch_5">
46 <path clip-path="url(#pb43dd894ca)" d="M 135 252
47 L 142.2 252
48 L 142.2 168.547548
49 L 135 168.547548
50 z
51 " style="fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
52 </g>
53 <g id="patch_6">
54 <path clip-path="url(#pb43dd894ca)" d="M 171 252
55 L 178.2 252
56 L 178.2 153.866098
57 L 171 153.866098
58 z
59 " style="fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
60 </g>
61 <g id="patch_7">
62 <path clip-path="url(#pb43dd894ca)" d="M 207 252
63 L 214.2 252
64 L 214.2 152.320682
65 L 207 152.320682
66 z
67 " style="fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
68 </g>
69 <g id="patch_8">
70 <path clip-path="url(#pb43dd894ca)" d="M 243 252
71 L 250.2 252
72 L 250.2 150.775267
73 L 243 150.775267
74 z
75 " style="fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
76 </g>
77 <g id="patch_9">
78 <path clip-path="url(#pb43dd894ca)" d="M 279 252
79 L 286.2 252
80 L 286.2 150.775267
81 L 279 150.775267
82 z
83 " style="fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
84 </g>
85 <g id="patch_10">
86 <path clip-path="url(#pb43dd894ca)" d="M 315 252
87 L 322.2 252
88 L 322.2 140.730064
89 L 315 140.730064
90 z
91 " style="fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
92 </g>
93 <g id="patch_11">
94 <path clip-path="url(#pb43dd894ca)" d="M 351 252
95 L 358.2 252
96 L 358.2 134.548401
97 L 351 134.548401
98 z
99 " style="fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
100 </g>
101 <g id="patch_12">
102 <path clip-path="url(#pb43dd894ca)" d="M 70.2 252
103 L 77.4 252
104 L 77.4 142.27548
105 L 70.2 142.27548
106 z
107 " style="fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
108 </g>
109 <g id="patch_13">
110 <path clip-path="url(#pb43dd894ca)" d="M 106.2 252
111 L 113.4 252
112 L 113.4 142.27548
113 L 106.2 142.27548
114 z
115 " style="fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
116 </g>
117 <g id="patch_14">
118 <path clip-path="url(#pb43dd894ca)" d="M 142.2 252
119 L 149.4 252
120 L 149.4 142.27548
121 L 142.2 142.27548
122 z
123 " style="fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
124 </g>
125 <g id="patch_15">
126 <path clip-path="url(#pb43dd894ca)" d="M 178.2 252
127 L 185.4 252
128 L 185.4 142.27548
129 L 178.2 142.27548
130 z
131 " style="fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
132 </g>
133 <g id="patch_16">
134 <path clip-path="url(#pb43dd894ca)" d="M 214.2 252
135 L 221.4 252
136 L 221.4 142.27548
137 L 214.2 142.27548
138 z
139 " style="fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
140 </g>
141 <g id="patch_17">
142 <path clip-path="url(#pb43dd894ca)" d="M 250.2 252
143 L 257.4 252
144 L 257.4 142.27548
145 L 250.2 142.27548
146 z
147 " style="fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
148 </g>
149 <g id="patch_18">
150 <path clip-path="url(#pb43dd894ca)" d="M 286.2 252
151 L 293.4 252
152 L 293.4 142.27548
153 L 286.2 142.27548
154 z
155 " style="fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
156 </g>
157 <g id="patch_19">
158 <path clip-path="url(#pb43dd894ca)" d="M 322.2 252
159 L 329.4 252
160 L 329.4 141.502772
161 L 322.2 141.502772
162 z
163 " style="fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
164 </g>
165 <g id="patch_20">
166 <path clip-path="url(#pb43dd894ca)" d="M 358.2 252
167 L 365.4 252
168 L 365.4 141.502772
169 L 358.2 141.502772
170 z
171 " style="fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
172 </g>
173 <g id="patch_21">
174 <path clip-path="url(#pb43dd894ca)" d="M 77.4 252
175 L 84.6 252
176 L 84.6 142.27548
177 L 77.4 142.27548
178 z
179 " style="fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
180 </g>
181 <g id="patch_22">
182 <path clip-path="url(#pb43dd894ca)" d="M 113.4 252
183 L 120.6 252
184 L 120.6 142.27548
185 L 113.4 142.27548
186 z
187 " style="fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
188 </g>
189 <g id="patch_23">
190 <path clip-path="url(#pb43dd894ca)" d="M 149.4 252
191 L 156.6 252
192 L 156.6 142.27548
193 L 149.4 142.27548
194 z
195 " style="fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
196 </g>
197 <g id="patch_24">
198 <path clip-path="url(#pb43dd894ca)" d="M 185.4 252
199 L 192.6 252
200 L 192.6 142.27548
201 L 185.4 142.27548
202 z
203 " style="fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
204 </g>
205 <g id="patch_25">
206 <path clip-path="url(#pb43dd894ca)" d="M 221.4 252
207 L 228.6 252
208 L 228.6 142.27548
209 L 221.4 142.27548
210 z
211 " style="fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
212 </g>
213 <g id="patch_26">
214 <path clip-path="url(#pb43dd894ca)" d="M 257.4 252
215 L 264.6 252
216 L 264.6 142.27548
217 L 257.4 142.27548
218 z
219 " style="fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
220 </g>
221 <g id="patch_27">
222 <path clip-path="url(#pb43dd894ca)" d="M 293.4 252
223 L 300.6 252
224 L 300.6 142.27548
225 L 293.4 142.27548
226 z
227 " style="fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
228 </g>
229 <g id="patch_28">
230 <path clip-path="url(#pb43dd894ca)" d="M 329.4 252
231 L 336.6 252
232 L 336.6 141.502772
233 L 329.4 141.502772
234 z
235 " style="fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
236 </g>
237 <g id="patch_29">
238 <path clip-path="url(#pb43dd894ca)" d="M 365.4 252
239 L 372.6 252
240 L 372.6 141.502772
241 L 365.4 141.502772
242 z
243 " style="fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
244 </g>
245 <g id="patch_30">
246 <path clip-path="url(#pb43dd894ca)" d="M 84.6 252
247 L 91.8 252
248 L 91.8 143.048188
249 L 84.6 143.048188
250 z
251 " style="fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
252 </g>
253 <g id="patch_31">
254 <path clip-path="url(#pb43dd894ca)" d="M 120.6 252
255 L 127.8 252
256 L 127.8 128.366738
257 L 120.6 128.366738
258 z
259 " style="fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
260 </g>
261 <g id="patch_32">
262 <path clip-path="url(#pb43dd894ca)" d="M 156.6 252
263 L 163.8 252
264 L 163.8 112.139872
265 L 156.6 112.139872
266 z
267 " style="fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
268 </g>
269 <g id="patch_33">
270 <path clip-path="url(#pb43dd894ca)" d="M 192.6 252
271 L 199.8 252
272 L 199.8 101.321962
273 L 192.6 101.321962
274 z
275 " style="fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
276 </g>
277 <g id="patch_34">
278 <path clip-path="url(#pb43dd894ca)" d="M 228.6 252
279 L 235.8 252
280 L 235.8 97.458422
281 L 228.6 97.458422
282 z
283 " style="fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
284 </g>
285 <g id="patch_35">
286 <path clip-path="url(#pb43dd894ca)" d="M 264.6 252
287 L 271.8 252
288 L 271.8 81.231557
289 L 264.6 81.231557
290 z
291 " style="fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
292 </g>
293 <g id="patch_36">
294 <path clip-path="url(#pb43dd894ca)" d="M 300.6 252
295 L 307.8 252
296 L 307.8 81.231557
297 L 300.6 81.231557
298 z
299 " style="fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
300 </g>
301 <g id="patch_37">
302 <path clip-path="url(#pb43dd894ca)" d="M 336.6 252
303 L 343.8 252
304 L 343.8 55.732196
305 L 336.6 55.732196
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
306 z
307 " style="fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
308 </g>
309 <g id="patch_38">
310 <path clip-path="url(#pb43dd894ca)" d="M 372.6 252
311 L 379.8 252
312 L 379.8 44.914286
313 L 372.6 44.914286
314 z
315 " style="fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
316 </g>
317 <g id="matplotlib.axis_1">
318 <g id="xtick_1">
319 <g id="line2d_1">
320 <defs>
321 <path d="M 0 0
322 L 0 3.5
323 " id="m4ac62df1f0" style="stroke:#000000;stroke-width:0.8;"/>
324 </defs>
325 <g>
326 <use style="stroke:#000000;stroke-width:0.8;" x="77.4" xlink:href="#m4ac62df1f0" y="252"/>
327 </g>
328 </g>
329 <g id="text_1">
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
330 <!-- 3 -->
331 <defs>
332 <path d="M 40.578125 39.3125
333 Q 47.65625 37.796875 51.625 33
334 Q 55.609375 28.21875 55.609375 21.1875
@@ -360,22 +459,22 @@
360 Q 53.90625 49.265625 50.4375 45.09375
361 Q 46.96875 40.921875 40.578125 39.3125
362 z
363 " id="DejaVuSans-51"/>
364 </defs>
365 <g transform="translate(80.159375 265.3625)rotate(-90)scale(0.1 -0.1)">
366 <use xlink:href="#DejaVuSans-51"/>
367 </g>
368 </g>
369 </g>
370 <g id="xtick_2">
371 <g id="line2d_2">
372 <g>
373 <use style="stroke:#000000;stroke-width:0.8;" x="113.4" xlink:href="#m4ac62df1f0" y="252"/>
374 </g>
375 </g>
376 <g id="text_2">
377 <!-- 4 -->
378 <defs>
379 <path d="M 37.796875 64.3125
380 L 12.890625 25.390625
381 L 37.796875 25.390625
@@ -392,22 +491,22 @@
392 L 4.890625 17.1875
393 L 4.890625 26.703125
394 z
395 " id="DejaVuSans-52"/>
396 </defs>
397 <g transform="translate(116.159375 265.3625)rotate(-90)scale(0.1 -0.1)">
398 <use xlink:href="#DejaVuSans-52"/>
399 </g>
400 </g>
401 </g>
402 <g id="xtick_3">
403 <g id="line2d_3">
404 <g>
405 <use style="stroke:#000000;stroke-width:0.8;" x="149.4" xlink:href="#m4ac62df1f0" y="252"/>
406 </g>
407 </g>
408 <g id="text_3">
409 <!-- 5 -->
410 <defs>
411 <path d="M 10.796875 72.90625
412 L 49.515625 72.90625
413 L 49.515625 64.59375
@@ -431,22 +530,22 @@
431 Q 22.75 39.890625 18.8125 39.015625
432 Q 14.890625 38.140625 10.796875 36.28125
433 z
434 " id="DejaVuSans-53"/>
435 </defs>
436 <g transform="translate(152.159375 265.3625)rotate(-90)scale(0.1 -0.1)">
437 <use xlink:href="#DejaVuSans-53"/>
438 </g>
439 </g>
440 </g>
441 <g id="xtick_4">
442 <g id="line2d_4">
443 <g>
444 <use style="stroke:#000000;stroke-width:0.8;" x="185.4" xlink:href="#m4ac62df1f0" y="252"/>
445 </g>
446 </g>
447 <g id="text_4">
448 <!-- 6 -->
449 <defs>
450 <path d="M 33.015625 40.375
451 Q 26.375 40.375 22.484375 35.828125
452 Q 18.609375 31.296875 18.609375 23.390625
@@ -476,22 +575,22 @@
476 Q 40.921875 74.21875 44.703125 73.484375
477 Q 48.484375 72.75 52.59375 71.296875
478 z
479 " id="DejaVuSans-54"/>
480 </defs>
481 <g transform="translate(188.159375 265.3625)rotate(-90)scale(0.1 -0.1)">
482 <use xlink:href="#DejaVuSans-54"/>
483 </g>
484 </g>
485 </g>
486 <g id="xtick_5">
487 <g id="line2d_5">
488 <g>
489 <use style="stroke:#000000;stroke-width:0.8;" x="221.4" xlink:href="#m4ac62df1f0" y="252"/>
490 </g>
491 </g>
492 <g id="text_5">
493 <!-- 7 -->
494 <defs>
495 <path d="M 8.203125 72.90625
496 L 55.078125 72.90625
497 L 55.078125 68.703125
@@ -500,22 +599,22 @@
500 L 43.21875 64.59375
501 L 8.203125 64.59375
502 z
503 " id="DejaVuSans-55"/>
504 </defs>
505 <g transform="translate(224.159375 265.3625)rotate(-90)scale(0.1 -0.1)">
506 <use xlink:href="#DejaVuSans-55"/>
507 </g>
508 </g>
509 </g>
510 <g id="xtick_6">
511 <g id="line2d_6">
512 <g>
513 <use style="stroke:#000000;stroke-width:0.8;" x="257.4" xlink:href="#m4ac62df1f0" y="252"/>
514 </g>
515 </g>
516 <g id="text_6">
517 <!-- 8 -->
518 <defs>
519 <path d="M 31.78125 34.625
520 Q 24.75 34.625 20.71875 30.859375
521 Q 16.703125 27.09375 16.703125 20.515625
@@ -554,22 +653,22 @@
554 Q 25.390625 66.40625 21.84375 63.234375
555 Q 18.3125 60.0625 18.3125 54.390625
556 z
557 " id="DejaVuSans-56"/>
558 </defs>
559 <g transform="translate(260.159375 265.3625)rotate(-90)scale(0.1 -0.1)">
560 <use xlink:href="#DejaVuSans-56"/>
561 </g>
562 </g>
563 </g>
564 <g id="xtick_7">
565 <g id="line2d_7">
566 <g>
567 <use style="stroke:#000000;stroke-width:0.8;" x="293.4" xlink:href="#m4ac62df1f0" y="252"/>
568 </g>
569 </g>
570 <g id="text_7">
571 <!-- 9 -->
572 <defs>
573 <path d="M 10.984375 1.515625
574 L 10.984375 10.5
575 Q 14.703125 8.734375 18.5 7.8125
@@ -599,37 +698,24 @@
599 Q 16.21875 41.5 20.09375 36.953125
600 Q 23.96875 32.421875 30.609375 32.421875
601 z
602 " id="DejaVuSans-57"/>
603 </defs>
604 <g transform="translate(296.159375 265.3625)rotate(-90)scale(0.1 -0.1)">
605 <use xlink:href="#DejaVuSans-57"/>
606 </g>
607 </g>
608 </g>
609 <g id="xtick_8">
610 <g id="line2d_8">
611 <g>
612 <use style="stroke:#000000;stroke-width:0.8;" x="329.4" xlink:href="#m4ac62df1f0" y="252"/>
613 </g>
614 </g>
615 <g id="text_8">
616 <!-- 10 -->
617 <defs>
618 <path d="M 12.40625 8.296875
619 L 28.515625 8.296875
620 L 28.515625 63.921875
621 L 10.984375 60.40625
622 L 10.984375 69.390625
623 L 28.421875 72.90625
624 L 38.28125 72.90625
625 L 38.28125 8.296875
626 L 54.390625 8.296875
627 L 54.390625 0
628 L 12.40625 0
629 z
630 " id="DejaVuSans-49"/>
631 <path d="M 31.78125 66.40625
632 Q 24.171875 66.40625 20.328125 58.90625
633 Q 16.5 51.421875 16.5 36.375
634 Q 16.5 21.390625 20.328125 13.890625
635 Q 24.171875 6.390625 31.78125 6.390625
@@ -648,31 +734,17 @@
648 Q 6.59375 54.828125 13.0625 64.515625
649 Q 19.53125 74.21875 31.78125 74.21875
650 z
651 " id="DejaVuSans-48"/>
652 </defs>
653 <g transform="translate(332.159375 271.725)rotate(-90)scale(0.1 -0.1)">
654 <use xlink:href="#DejaVuSans-49"/>
655 <use x="63.623047" xlink:href="#DejaVuSans-48"/>
656 </g>
657 </g>
658 </g>
659 <g id="xtick_9">
660 <g id="line2d_9">
661 <g>
662 <use style="stroke:#000000;stroke-width:0.8;" x="365.4" xlink:href="#m4ac62df1f0" y="252"/>
663 </g>
664 </g>
665 <g id="text_9">
666 <!-- 11 -->
667 <g transform="translate(368.159375 271.725)rotate(-90)scale(0.1 -0.1)">
668 <use xlink:href="#DejaVuSans-49"/>
669 <use x="63.623047" xlink:href="#DejaVuSans-49"/>
670 </g>
671 </g>
672 </g>
673 <g id="text_10">
674 <!-- Checkin index -->
675 <defs>
676 <path d="M 64.40625 67.28125
677 L 64.40625 56.890625
678 Q 59.421875 61.53125 53.78125 63.8125
@@ -860,21 +932,21 @@
860 </g>
861 </g>
862 </g>
863 <g id="matplotlib.axis_2">
864 <g id="ytick_1">
865 <g id="line2d_10">
866 <defs>
867 <path d="M 0 0
868 L -3.5 0
869 " id="m78b7b2ee23" style="stroke:#000000;stroke-width:0.8;"/>
870 </defs>
871 <g>
872 <use style="stroke:#000000;stroke-width:0.8;" x="54" xlink:href="#m78b7b2ee23" y="252"/>
873 </g>
874 </g>
875 <g id="text_11">
876 <!-- 0.0 -->
877 <defs>
878 <path d="M 10.6875 12.40625
879 L 21 12.40625
880 L 21 0
@@ -888,111 +960,85 @@
888 <use x="95.410156" xlink:href="#DejaVuSans-48"/>
889 </g>
890 </g>
891 </g>
892 <g id="ytick_2">
893 <g id="line2d_11">
894 <g>
895 <use style="stroke:#000000;stroke-width:0.8;" x="54" xlink:href="#m78b7b2ee23" y="212.437356"/>
896 </g>
897 </g>
898 <g id="text_12">
899 <!-- 0.2 -->
900 <defs>
901 <path d="M 19.1875 8.296875
902 L 53.609375 8.296875
903 L 53.609375 0
904 L 7.328125 0
905 L 7.328125 8.296875
906 Q 12.9375 14.109375 22.625 23.890625
907 Q 32.328125 33.6875 34.8125 36.53125
908 Q 39.546875 41.84375 41.421875 45.53125
909 Q 43.3125 49.21875 43.3125 52.78125
910 Q 43.3125 58.59375 39.234375 62.25
911 Q 35.15625 65.921875 28.609375 65.921875
912 Q 23.96875 65.921875 18.8125 64.3125
913 Q 13.671875 62.703125 7.8125 59.421875
914 L 7.8125 69.390625
915 Q 13.765625 71.78125 18.9375 73
916 Q 24.125 74.21875 28.421875 74.21875
917 Q 39.75 74.21875 46.484375 68.546875
918 Q 53.21875 62.890625 53.21875 53.421875
919 Q 53.21875 48.921875 51.53125 44.890625
920 Q 49.859375 40.875 45.40625 35.40625
921 Q 44.1875 33.984375 37.640625 27.21875
922 Q 31.109375 20.453125 19.1875 8.296875
923 z
924 " id="DejaVuSans-50"/>
925 </defs>
926 <g transform="translate(31.096875 216.236575)scale(0.1 -0.1)">
927 <use xlink:href="#DejaVuSans-48"/>
928 <use x="63.623047" xlink:href="#DejaVuSans-46"/>
929 <use x="95.410156" xlink:href="#DejaVuSans-50"/>
930 </g>
931 </g>
932 </g>
933 <g id="ytick_3">
934 <g id="line2d_12">
935 <g>
936 <use style="stroke:#000000;stroke-width:0.8;" x="54" xlink:href="#m78b7b2ee23" y="172.874712"/>
937 </g>
938 </g>
939 <g id="text_13">
940 <!-- 0.4 -->
941 <g transform="translate(31.096875 176.673931)scale(0.1 -0.1)">
942 <use xlink:href="#DejaVuSans-48"/>
943 <use x="63.623047" xlink:href="#DejaVuSans-46"/>
944 <use x="95.410156" xlink:href="#DejaVuSans-52"/>
945 </g>
946 </g>
947 </g>
948 <g id="ytick_4">
949 <g id="line2d_13">
950 <g>
951 <use style="stroke:#000000;stroke-width:0.8;" x="54" xlink:href="#m78b7b2ee23" y="133.312068"/>
952 </g>
953 </g>
954 <g id="text_14">
955 <!-- 0.6 -->
956 <g transform="translate(31.096875 137.111287)scale(0.1 -0.1)">
957 <use xlink:href="#DejaVuSans-48"/>
958 <use x="63.623047" xlink:href="#DejaVuSans-46"/>
959 <use x="95.410156" xlink:href="#DejaVuSans-54"/>
960 </g>
961 </g>
962 </g>
963 <g id="ytick_5">
964 <g id="line2d_14">
965 <g>
966 <use style="stroke:#000000;stroke-width:0.8;" x="54" xlink:href="#m78b7b2ee23" y="93.749424"/>
967 </g>
968 </g>
969 <g id="text_15">
970 <!-- 0.8 -->
971 <g transform="translate(31.096875 97.548643)scale(0.1 -0.1)">
972 <use xlink:href="#DejaVuSans-48"/>
973 <use x="63.623047" xlink:href="#DejaVuSans-46"/>
974 <use x="95.410156" xlink:href="#DejaVuSans-56"/>
975 </g>
976 </g>
977 </g>
978 <g id="ytick_6">
979 <g id="line2d_15">
980 <g>
981 <use style="stroke:#000000;stroke-width:0.8;" x="54" xlink:href="#m78b7b2ee23" y="54.18678"/>
982 </g>
983 </g>
984 <g id="text_16">
985 <!-- 1.0 -->
986 <g transform="translate(31.096875 57.985999)scale(0.1 -0.1)">
987 <use xlink:href="#DejaVuSans-49"/>
988 <use x="63.623047" xlink:href="#DejaVuSans-46"/>
989 <use x="95.410156" xlink:href="#DejaVuSans-48"/>
990 </g>
991 </g>
992 </g>
993 <g id="text_17">
994 <!-- Repo size (MiB) -->
995 <defs>
996 <path d="M 44.390625 34.1875
997 Q 47.5625 33.109375 50.5625 29.59375
998 Q 53.5625 26.078125 56.59375 19.921875
@@ -1197,32 +1243,32 @@
1197 <use x="666.148438" xlink:href="#DejaVuSans-66"/>
1198 <use x="734.751953" xlink:href="#DejaVuSans-41"/>
1199 </g>
1200 </g>
1201 </g>
1202 <g id="patch_39">
1203 <path d="M 54 252
1204 L 54 34.56
1205 " style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
1206 </g>
1207 <g id="patch_40">
1208 <path d="M 388.8 252
1209 L 388.8 34.56
1210 " style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
1211 </g>
1212 <g id="patch_41">
1213 <path d="M 54 252
1214 L 388.8 252
1215 " style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
1216 </g>
1217 <g id="patch_42">
1218 <path d="M 54 34.56
1219 L 388.8 34.56
1220 " style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
1221 </g>
1222 <g id="legend_1">
1223 <g id="patch_43">
1224 <path d="M 61 101.2725
1225 L 116.046875 101.2725
1226 Q 118.046875 101.2725 118.046875 99.2725
1227 L 118.046875 41.56
1228 Q 118.046875 39.56 116.046875 39.56
@@ -1231,19 +1277,19 @@
1231 L 59 99.2725
1232 Q 59 101.2725 61 101.2725
1233 z
1234 " style="fill:#ffffff;opacity:0.8;stroke:#cccccc;stroke-linejoin:miter;"/>
1235 </g>
1236 <g id="patch_44">
1237 <path d="M 63 51.158437
1238 L 83 51.158437
1239 L 83 44.158437
1240 L 63 44.158437
1241 z
1242 " style="fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
1243 </g>
1244 <g id="text_18">
1245 <!-- JPEG -->
1246 <defs>
1247 <path d="M 9.8125 72.90625
1248 L 19.671875 72.90625
1249 L 19.671875 5.078125
@@ -1320,35 +1366,35 @@
1320 <use x="29.492188" xlink:href="#DejaVuSans-80"/>
1321 <use x="89.794922" xlink:href="#DejaVuSans-69"/>
1322 <use x="152.978516" xlink:href="#DejaVuSans-71"/>
1323 </g>
1324 </g>
1325 <g id="patch_45">
1326 <path d="M 63 65.836562
1327 L 83 65.836562
1328 L 83 58.836562
1329 L 63 58.836562
1330 z
1331 " style="fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
1332 </g>
1333 <g id="text_19">
1334 <!-- BMP -->
1335 <g transform="translate(91 65.836562)scale(0.1 -0.1)">
1336 <use xlink:href="#DejaVuSans-66"/>
1337 <use x="68.603516" xlink:href="#DejaVuSans-77"/>
1338 <use x="154.882812" xlink:href="#DejaVuSans-80"/>
1339 </g>
1340 </g>
1341 <g id="patch_46">
1342 <path d="M 63 80.514687
1343 L 83 80.514687
1344 L 83 73.514687
1345 L 63 73.514687
1346 z
1347 " style="fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
1348 </g>
1349 <g id="text_20">
1350 <!-- TIFF -->
1351 <defs>
1352 <path d="M -0.296875 72.90625
1353 L 61.375 72.90625
1354 L 61.375 64.59375
@@ -1383,19 +1429,19 @@
1383 <use x="61.083984" xlink:href="#DejaVuSans-73"/>
1384 <use x="90.576172" xlink:href="#DejaVuSans-70"/>
1385 <use x="148.095703" xlink:href="#DejaVuSans-70"/>
1386 </g>
1387 </g>
1388 <g id="patch_47">
1389 <path d="M 63 95.192813
1390 L 83 95.192813
1391 L 83 88.192813
1392 L 63 88.192813
1393 z
1394 " style="fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
1395 </g>
1396 <g id="text_21">
1397 <!-- PNG -->
1398 <defs>
1399 <path d="M 9.8125 72.90625
1400 L 23.09375 72.90625
1401 L 55.421875 11.921875
@@ -1417,10 +1463,10 @@
1417 </g>
1418 </g>
1419 </g>
1420 </g>
1421 <defs>
1422 <clipPath id="pb43dd894ca">
1423 <rect height="217.44" width="334.8" x="54" y="34.56"/>
1424 </clipPath>
1425 </defs>
1426 </svg>
1427
--- www/image-format-vs-repo-size.svg
+++ www/image-format-vs-repo-size.svg
@@ -25,310 +25,409 @@
25 L 54 34.56
26 z
27 " style="fill:none;"/>
28 </g>
29 <g id="patch_3">
30 <path clip-path="url(#p9518871844)" d="M 62.126214 252
31 L 68.627184 252
32 L 68.627184 165.714286
33 L 62.126214 165.714286
34 z
35 " style="fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
36 </g>
37 <g id="patch_4">
38 <path clip-path="url(#p9518871844)" d="M 94.631068 252
39 L 101.132039 252
40 L 101.132039 154.209524
41 L 94.631068 154.209524
42 z
43 " style="fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
44 </g>
45 <g id="patch_5">
46 <path clip-path="url(#p9518871844)" d="M 127.135922 252
47 L 133.636893 252
48 L 133.636893 145.580952
49 L 127.135922 145.580952
50 z
51 " style="fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
52 </g>
53 <g id="patch_6">
54 <path clip-path="url(#p9518871844)" d="M 159.640777 252
55 L 166.141748 252
56 L 166.141748 139.828571
57 L 159.640777 139.828571
58 z
59 " style="fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
60 </g>
61 <g id="patch_7">
62 <path clip-path="url(#p9518871844)" d="M 192.145631 252
63 L 198.646602 252
64 L 198.646602 136.952381
65 L 192.145631 136.952381
66 z
67 " style="fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
68 </g>
69 <g id="patch_8">
70 <path clip-path="url(#p9518871844)" d="M 224.650485 252
71 L 231.151456 252
72 L 231.151456 131.2
73 L 224.650485 131.2
74 z
75 " style="fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
76 </g>
77 <g id="patch_9">
78 <path clip-path="url(#p9518871844)" d="M 257.15534 252
79 L 263.656311 252
80 L 263.656311 125.447619
81 L 257.15534 125.447619
82 z
83 " style="fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
84 </g>
85 <g id="patch_10">
86 <path clip-path="url(#p9518871844)" d="M 289.660194 252
87 L 296.161165 252
88 L 296.161165 125.447619
89 L 289.660194 125.447619
90 z
91 " style="fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
92 </g>
93 <g id="patch_11">
94 <path clip-path="url(#p9518871844)" d="M 322.165049 252
95 L 328.666019 252
96 L 328.666019 109.628571
97 L 322.165049 109.628571
98 z
99 " style="fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
100 </g>
101 <g id="patch_12">
102 <path clip-path="url(#p9518871844)" d="M 354.669903 252
103 L 361.170874 252
104 L 361.170874 105.314286
105 L 354.669903 105.314286
106 z
107 " style="fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
108 </g>
109 <g id="patch_13">
110 <path clip-path="url(#p9518871844)" d="M 68.627184 252
111 L 75.128155 252
112 L 75.128155 152.771429
113 L 68.627184 152.771429
114 z
115 " style="fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
116 </g>
117 <g id="patch_14">
118 <path clip-path="url(#p9518871844)" d="M 101.132039 252
119 L 107.63301 252
120 L 107.63301 132.638095
121 L 101.132039 132.638095
122 z
123 " style="fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
124 </g>
125 <g id="patch_15">
126 <path clip-path="url(#p9518871844)" d="M 133.636893 252
127 L 140.137864 252
128 L 140.137864 132.638095
129 L 133.636893 132.638095
130 z
131 " style="fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
132 </g>
133 <g id="patch_16">
134 <path clip-path="url(#p9518871844)" d="M 166.141748 252
135 L 172.642718 252
136 L 172.642718 132.638095
137 L 166.141748 132.638095
138 z
139 " style="fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
140 </g>
141 <g id="patch_17">
142 <path clip-path="url(#p9518871844)" d="M 198.646602 252
143 L 205.147573 252
144 L 205.147573 132.638095
145 L 198.646602 132.638095
146 z
147 " style="fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
148 </g>
149 <g id="patch_18">
150 <path clip-path="url(#p9518871844)" d="M 231.151456 252
151 L 237.652427 252
152 L 237.652427 132.638095
153 L 231.151456 132.638095
154 z
155 " style="fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
156 </g>
157 <g id="patch_19">
158 <path clip-path="url(#p9518871844)" d="M 263.656311 252
159 L 270.157282 252
160 L 270.157282 132.638095
161 L 263.656311 132.638095
162 z
163 " style="fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
164 </g>
165 <g id="patch_20">
166 <path clip-path="url(#p9518871844)" d="M 296.161165 252
167 L 302.662136 252
168 L 302.662136 132.638095
169 L 296.161165 132.638095
170 z
171 " style="fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
172 </g>
173 <g id="patch_21">
174 <path clip-path="url(#p9518871844)" d="M 328.666019 252
175 L 335.16699 252
176 L 335.16699 132.638095
177 L 328.666019 132.638095
178 z
179 " style="fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
180 </g>
181 <g id="patch_22">
182 <path clip-path="url(#p9518871844)" d="M 361.170874 252
183 L 367.671845 252
184 L 367.671845 132.638095
185 L 361.170874 132.638095
186 z
187 " style="fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
188 </g>
189 <g id="patch_23">
190 <path clip-path="url(#p9518871844)" d="M 75.128155 252
191 L 81.629126 252
192 L 81.629126 155.647619
193 L 75.128155 155.647619
194 z
195 " style="fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
196 </g>
197 <g id="patch_24">
198 <path clip-path="url(#p9518871844)" d="M 107.63301 252
199 L 114.133981 252
200 L 114.133981 135.514286
201 L 107.63301 135.514286
202 z
203 " style="fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
204 </g>
205 <g id="patch_25">
206 <path clip-path="url(#p9518871844)" d="M 140.137864 252
207 L 146.638835 252
208 L 146.638835 135.514286
209 L 140.137864 135.514286
210 z
211 " style="fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
212 </g>
213 <g id="patch_26">
214 <path clip-path="url(#p9518871844)" d="M 172.642718 252
215 L 179.143689 252
216 L 179.143689 135.514286
217 L 172.642718 135.514286
218 z
219 " style="fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
220 </g>
221 <g id="patch_27">
222 <path clip-path="url(#p9518871844)" d="M 205.147573 252
223 L 211.648544 252
224 L 211.648544 135.514286
225 L 205.147573 135.514286
226 z
227 " style="fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
228 </g>
229 <g id="patch_28">
230 <path clip-path="url(#p9518871844)" d="M 237.652427 252
231 L 244.153398 252
232 L 244.153398 135.514286
233 L 237.652427 135.514286
234 z
235 " style="fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
236 </g>
237 <g id="patch_29">
238 <path clip-path="url(#p9518871844)" d="M 270.157282 252
239 L 276.658252 252
240 L 276.658252 135.514286
241 L 270.157282 135.514286
242 z
243 " style="fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
244 </g>
245 <g id="patch_30">
246 <path clip-path="url(#p9518871844)" d="M 302.662136 252
247 L 309.163107 252
248 L 309.163107 135.514286
249 L 302.662136 135.514286
250 z
251 " style="fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
252 </g>
253 <g id="patch_31">
254 <path clip-path="url(#p9518871844)" d="M 335.16699 252
255 L 341.667961 252
256 L 341.667961 135.514286
257 L 335.16699 135.514286
258 z
259 " style="fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
260 </g>
261 <g id="patch_32">
262 <path clip-path="url(#p9518871844)" d="M 367.671845 252
263 L 374.172816 252
264 L 374.172816 135.514286
265 L 367.671845 135.514286
266 z
267 " style="fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
268 </g>
269 <g id="patch_33">
270 <path clip-path="url(#p9518871844)" d="M 81.629126 252
271 L 88.130097 252
272 L 88.130097 157.085714
273 L 81.629126 157.085714
274 z
275 " style="fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
276 </g>
277 <g id="patch_34">
278 <path clip-path="url(#p9518871844)" d="M 114.133981 252
279 L 120.634951 252
280 L 120.634951 138.390476
281 L 114.133981 138.390476
282 z
283 " style="fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
284 </g>
285 <g id="patch_35">
286 <path clip-path="url(#p9518871844)" d="M 146.638835 252
287 L 153.139806 252
288 L 153.139806 108.190476
289 L 146.638835 108.190476
290 z
291 " style="fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
292 </g>
293 <g id="patch_36">
294 <path clip-path="url(#p9518871844)" d="M 179.143689 252
295 L 185.64466 252
296 L 185.64466 102.438095
297 L 179.143689 102.438095
298 z
299 " style="fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
300 </g>
301 <g id="patch_37">
302 <path clip-path="url(#p9518871844)" d="M 211.648544 252
303 L 218.149515 252
304 L 218.149515 98.12381
305 L 211.648544 98.12381
306 z
307 " style="fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
308 </g>
309 <g id="patch_38">
310 <path clip-path="url(#p9518871844)" d="M 244.153398 252
311 L 250.654369 252
312 L 250.654369 83.742857
313 L 244.153398 83.742857
314 z
315 " style="fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
316 </g>
317 <g id="patch_39">
318 <path clip-path="url(#p9518871844)" d="M 276.658252 252
319 L 283.159223 252
320 L 283.159223 67.92381
321 L 276.658252 67.92381
322 z
323 " style="fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
324 </g>
325 <g id="patch_40">
326 <path clip-path="url(#p9518871844)" d="M 309.163107 252
327 L 315.664078 252
328 L 315.664078 57.857143
329 L 309.163107 57.857143
330 z
331 " style="fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
332 </g>
333 <g id="patch_41">
334 <path clip-path="url(#p9518871844)" d="M 341.667961 252
335 L 348.168932 252
336 L 348.168932 53.542857
337 L 341.667961 53.542857
338 z
339 " style="fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
340 </g>
341 <g id="patch_42">
342 <path clip-path="url(#p9518871844)" d="M 374.172816 252
343 L 380.673786 252
344 L 380.673786 44.914286
345 L 374.172816 44.914286
346 z
347 " style="fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
348 </g>
349 <g id="matplotlib.axis_1">
350 <g id="xtick_1">
351 <g id="line2d_1">
352 <defs>
353 <path d="M 0 0
354 L 0 3.5
355 " id="m769b2cfcfb" style="stroke:#000000;stroke-width:0.8;"/>
356 </defs>
357 <g>
358 <use style="stroke:#000000;stroke-width:0.8;" x="75.128155" xlink:href="#m769b2cfcfb" y="252"/>
359 </g>
360 </g>
361 <g id="text_1">
362 <!-- 1 -->
363 <defs>
364 <path d="M 12.40625 8.296875
365 L 28.515625 8.296875
366 L 28.515625 63.921875
367 L 10.984375 60.40625
368 L 10.984375 69.390625
369 L 28.421875 72.90625
370 L 38.28125 72.90625
371 L 38.28125 8.296875
372 L 54.390625 8.296875
373 L 54.390625 0
374 L 12.40625 0
375 z
376 " id="DejaVuSans-49"/>
377 </defs>
378 <g transform="translate(77.88753 265.3625)rotate(-90)scale(0.1 -0.1)">
379 <use xlink:href="#DejaVuSans-49"/>
380 </g>
381 </g>
382 </g>
383 <g id="xtick_2">
384 <g id="line2d_2">
385 <g>
386 <use style="stroke:#000000;stroke-width:0.8;" x="107.63301" xlink:href="#m769b2cfcfb" y="252"/>
387 </g>
388 </g>
389 <g id="text_2">
390 <!-- 2 -->
391 <defs>
392 <path d="M 19.1875 8.296875
393 L 53.609375 8.296875
394 L 53.609375 0
395 L 7.328125 0
396 L 7.328125 8.296875
397 Q 12.9375 14.109375 22.625 23.890625
398 Q 32.328125 33.6875 34.8125 36.53125
399 Q 39.546875 41.84375 41.421875 45.53125
400 Q 43.3125 49.21875 43.3125 52.78125
401 Q 43.3125 58.59375 39.234375 62.25
402 Q 35.15625 65.921875 28.609375 65.921875
403 Q 23.96875 65.921875 18.8125 64.3125
404 Q 13.671875 62.703125 7.8125 59.421875
405 L 7.8125 69.390625
406 Q 13.765625 71.78125 18.9375 73
407 Q 24.125 74.21875 28.421875 74.21875
408 Q 39.75 74.21875 46.484375 68.546875
409 Q 53.21875 62.890625 53.21875 53.421875
410 Q 53.21875 48.921875 51.53125 44.890625
411 Q 49.859375 40.875 45.40625 35.40625
412 Q 44.1875 33.984375 37.640625 27.21875
413 Q 31.109375 20.453125 19.1875 8.296875
414 z
415 " id="DejaVuSans-50"/>
416 </defs>
417 <g transform="translate(110.392385 265.3625)rotate(-90)scale(0.1 -0.1)">
418 <use xlink:href="#DejaVuSans-50"/>
419 </g>
420 </g>
421 </g>
422 <g id="xtick_3">
423 <g id="line2d_3">
424 <g>
425 <use style="stroke:#000000;stroke-width:0.8;" x="140.137864" xlink:href="#m769b2cfcfb" y="252"/>
426 </g>
427 </g>
428 <g id="text_3">
429 <!-- 3 -->
430 <defs>
431 <path d="M 40.578125 39.3125
432 Q 47.65625 37.796875 51.625 33
433 Q 55.609375 28.21875 55.609375 21.1875
@@ -360,22 +459,22 @@
459 Q 53.90625 49.265625 50.4375 45.09375
460 Q 46.96875 40.921875 40.578125 39.3125
461 z
462 " id="DejaVuSans-51"/>
463 </defs>
464 <g transform="translate(142.897239 265.3625)rotate(-90)scale(0.1 -0.1)">
465 <use xlink:href="#DejaVuSans-51"/>
466 </g>
467 </g>
468 </g>
469 <g id="xtick_4">
470 <g id="line2d_4">
471 <g>
472 <use style="stroke:#000000;stroke-width:0.8;" x="172.642718" xlink:href="#m769b2cfcfb" y="252"/>
473 </g>
474 </g>
475 <g id="text_4">
476 <!-- 4 -->
477 <defs>
478 <path d="M 37.796875 64.3125
479 L 12.890625 25.390625
480 L 37.796875 25.390625
@@ -392,22 +491,22 @@
491 L 4.890625 17.1875
492 L 4.890625 26.703125
493 z
494 " id="DejaVuSans-52"/>
495 </defs>
496 <g transform="translate(175.402093 265.3625)rotate(-90)scale(0.1 -0.1)">
497 <use xlink:href="#DejaVuSans-52"/>
498 </g>
499 </g>
500 </g>
501 <g id="xtick_5">
502 <g id="line2d_5">
503 <g>
504 <use style="stroke:#000000;stroke-width:0.8;" x="205.147573" xlink:href="#m769b2cfcfb" y="252"/>
505 </g>
506 </g>
507 <g id="text_5">
508 <!-- 5 -->
509 <defs>
510 <path d="M 10.796875 72.90625
511 L 49.515625 72.90625
512 L 49.515625 64.59375
@@ -431,22 +530,22 @@
530 Q 22.75 39.890625 18.8125 39.015625
531 Q 14.890625 38.140625 10.796875 36.28125
532 z
533 " id="DejaVuSans-53"/>
534 </defs>
535 <g transform="translate(207.906948 265.3625)rotate(-90)scale(0.1 -0.1)">
536 <use xlink:href="#DejaVuSans-53"/>
537 </g>
538 </g>
539 </g>
540 <g id="xtick_6">
541 <g id="line2d_6">
542 <g>
543 <use style="stroke:#000000;stroke-width:0.8;" x="237.652427" xlink:href="#m769b2cfcfb" y="252"/>
544 </g>
545 </g>
546 <g id="text_6">
547 <!-- 6 -->
548 <defs>
549 <path d="M 33.015625 40.375
550 Q 26.375 40.375 22.484375 35.828125
551 Q 18.609375 31.296875 18.609375 23.390625
@@ -476,22 +575,22 @@
575 Q 40.921875 74.21875 44.703125 73.484375
576 Q 48.484375 72.75 52.59375 71.296875
577 z
578 " id="DejaVuSans-54"/>
579 </defs>
580 <g transform="translate(240.411802 265.3625)rotate(-90)scale(0.1 -0.1)">
581 <use xlink:href="#DejaVuSans-54"/>
582 </g>
583 </g>
584 </g>
585 <g id="xtick_7">
586 <g id="line2d_7">
587 <g>
588 <use style="stroke:#000000;stroke-width:0.8;" x="270.157282" xlink:href="#m769b2cfcfb" y="252"/>
589 </g>
590 </g>
591 <g id="text_7">
592 <!-- 7 -->
593 <defs>
594 <path d="M 8.203125 72.90625
595 L 55.078125 72.90625
596 L 55.078125 68.703125
@@ -500,22 +599,22 @@
599 L 43.21875 64.59375
600 L 8.203125 64.59375
601 z
602 " id="DejaVuSans-55"/>
603 </defs>
604 <g transform="translate(272.916657 265.3625)rotate(-90)scale(0.1 -0.1)">
605 <use xlink:href="#DejaVuSans-55"/>
606 </g>
607 </g>
608 </g>
609 <g id="xtick_8">
610 <g id="line2d_8">
611 <g>
612 <use style="stroke:#000000;stroke-width:0.8;" x="302.662136" xlink:href="#m769b2cfcfb" y="252"/>
613 </g>
614 </g>
615 <g id="text_8">
616 <!-- 8 -->
617 <defs>
618 <path d="M 31.78125 34.625
619 Q 24.75 34.625 20.71875 30.859375
620 Q 16.703125 27.09375 16.703125 20.515625
@@ -554,22 +653,22 @@
653 Q 25.390625 66.40625 21.84375 63.234375
654 Q 18.3125 60.0625 18.3125 54.390625
655 z
656 " id="DejaVuSans-56"/>
657 </defs>
658 <g transform="translate(305.421511 265.3625)rotate(-90)scale(0.1 -0.1)">
659 <use xlink:href="#DejaVuSans-56"/>
660 </g>
661 </g>
662 </g>
663 <g id="xtick_9">
664 <g id="line2d_9">
665 <g>
666 <use style="stroke:#000000;stroke-width:0.8;" x="335.16699" xlink:href="#m769b2cfcfb" y="252"/>
667 </g>
668 </g>
669 <g id="text_9">
670 <!-- 9 -->
671 <defs>
672 <path d="M 10.984375 1.515625
673 L 10.984375 10.5
674 Q 14.703125 8.734375 18.5 7.8125
@@ -599,37 +698,24 @@
698 Q 16.21875 41.5 20.09375 36.953125
699 Q 23.96875 32.421875 30.609375 32.421875
700 z
701 " id="DejaVuSans-57"/>
702 </defs>
703 <g transform="translate(337.926365 265.3625)rotate(-90)scale(0.1 -0.1)">
704 <use xlink:href="#DejaVuSans-57"/>
705 </g>
706 </g>
707 </g>
708 <g id="xtick_10">
709 <g id="line2d_10">
710 <g>
711 <use style="stroke:#000000;stroke-width:0.8;" x="367.671845" xlink:href="#m769b2cfcfb" y="252"/>
712 </g>
713 </g>
714 <g id="text_10">
715 <!-- 10 -->
716 <defs>
 
 
 
 
 
 
 
 
 
 
 
 
 
717 <path d="M 31.78125 66.40625
718 Q 24.171875 66.40625 20.328125 58.90625
719 Q 16.5 51.421875 16.5 36.375
720 Q 16.5 21.390625 20.328125 13.890625
721 Q 24.171875 6.390625 31.78125 6.390625
@@ -648,31 +734,17 @@
734 Q 6.59375 54.828125 13.0625 64.515625
735 Q 19.53125 74.21875 31.78125 74.21875
736 z
737 " id="DejaVuSans-48"/>
738 </defs>
739 <g transform="translate(370.43122 271.725)rotate(-90)scale(0.1 -0.1)">
740 <use xlink:href="#DejaVuSans-49"/>
741 <use x="63.623047" xlink:href="#DejaVuSans-48"/>
742 </g>
743 </g>
744 </g>
745 <g id="text_11">
 
 
 
 
 
 
 
 
 
 
 
 
 
 
746 <!-- Checkin index -->
747 <defs>
748 <path d="M 64.40625 67.28125
749 L 64.40625 56.890625
750 Q 59.421875 61.53125 53.78125 63.8125
@@ -860,21 +932,21 @@
932 </g>
933 </g>
934 </g>
935 <g id="matplotlib.axis_2">
936 <g id="ytick_1">
937 <g id="line2d_11">
938 <defs>
939 <path d="M 0 0
940 L -3.5 0
941 " id="m80d71b6281" style="stroke:#000000;stroke-width:0.8;"/>
942 </defs>
943 <g>
944 <use style="stroke:#000000;stroke-width:0.8;" x="54" xlink:href="#m80d71b6281" y="252"/>
945 </g>
946 </g>
947 <g id="text_12">
948 <!-- 0.0 -->
949 <defs>
950 <path d="M 10.6875 12.40625
951 L 21 12.40625
952 L 21 0
@@ -888,111 +960,85 @@
960 <use x="95.410156" xlink:href="#DejaVuSans-48"/>
961 </g>
962 </g>
963 </g>
964 <g id="ytick_2">
965 <g id="line2d_12">
966 <g>
967 <use style="stroke:#000000;stroke-width:0.8;" x="54" xlink:href="#m80d71b6281" y="215.184762"/>
968 </g>
969 </g>
970 <g id="text_13">
971 <!-- 0.2 -->
972 <g transform="translate(31.096875 218.983981)scale(0.1 -0.1)">
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
973 <use xlink:href="#DejaVuSans-48"/>
974 <use x="63.623047" xlink:href="#DejaVuSans-46"/>
975 <use x="95.410156" xlink:href="#DejaVuSans-50"/>
976 </g>
977 </g>
978 </g>
979 <g id="ytick_3">
980 <g id="line2d_13">
981 <g>
982 <use style="stroke:#000000;stroke-width:0.8;" x="54" xlink:href="#m80d71b6281" y="178.369524"/>
983 </g>
984 </g>
985 <g id="text_14">
986 <!-- 0.4 -->
987 <g transform="translate(31.096875 182.168743)scale(0.1 -0.1)">
988 <use xlink:href="#DejaVuSans-48"/>
989 <use x="63.623047" xlink:href="#DejaVuSans-46"/>
990 <use x="95.410156" xlink:href="#DejaVuSans-52"/>
991 </g>
992 </g>
993 </g>
994 <g id="ytick_4">
995 <g id="line2d_14">
996 <g>
997 <use style="stroke:#000000;stroke-width:0.8;" x="54" xlink:href="#m80d71b6281" y="141.554286"/>
998 </g>
999 </g>
1000 <g id="text_15">
1001 <!-- 0.6 -->
1002 <g transform="translate(31.096875 145.353504)scale(0.1 -0.1)">
1003 <use xlink:href="#DejaVuSans-48"/>
1004 <use x="63.623047" xlink:href="#DejaVuSans-46"/>
1005 <use x="95.410156" xlink:href="#DejaVuSans-54"/>
1006 </g>
1007 </g>
1008 </g>
1009 <g id="ytick_5">
1010 <g id="line2d_15">
1011 <g>
1012 <use style="stroke:#000000;stroke-width:0.8;" x="54" xlink:href="#m80d71b6281" y="104.739048"/>
1013 </g>
1014 </g>
1015 <g id="text_16">
1016 <!-- 0.8 -->
1017 <g transform="translate(31.096875 108.538266)scale(0.1 -0.1)">
1018 <use xlink:href="#DejaVuSans-48"/>
1019 <use x="63.623047" xlink:href="#DejaVuSans-46"/>
1020 <use x="95.410156" xlink:href="#DejaVuSans-56"/>
1021 </g>
1022 </g>
1023 </g>
1024 <g id="ytick_6">
1025 <g id="line2d_16">
1026 <g>
1027 <use style="stroke:#000000;stroke-width:0.8;" x="54" xlink:href="#m80d71b6281" y="67.92381"/>
1028 </g>
1029 </g>
1030 <g id="text_17">
1031 <!-- 1.0 -->
1032 <g transform="translate(31.096875 71.723028)scale(0.1 -0.1)">
1033 <use xlink:href="#DejaVuSans-49"/>
1034 <use x="63.623047" xlink:href="#DejaVuSans-46"/>
1035 <use x="95.410156" xlink:href="#DejaVuSans-48"/>
1036 </g>
1037 </g>
1038 </g>
1039 <g id="text_18">
1040 <!-- Repo size (MiB) -->
1041 <defs>
1042 <path d="M 44.390625 34.1875
1043 Q 47.5625 33.109375 50.5625 29.59375
1044 Q 53.5625 26.078125 56.59375 19.921875
@@ -1197,32 +1243,32 @@
1243 <use x="666.148438" xlink:href="#DejaVuSans-66"/>
1244 <use x="734.751953" xlink:href="#DejaVuSans-41"/>
1245 </g>
1246 </g>
1247 </g>
1248 <g id="patch_43">
1249 <path d="M 54 252
1250 L 54 34.56
1251 " style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
1252 </g>
1253 <g id="patch_44">
1254 <path d="M 388.8 252
1255 L 388.8 34.56
1256 " style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
1257 </g>
1258 <g id="patch_45">
1259 <path d="M 54 252
1260 L 388.8 252
1261 " style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
1262 </g>
1263 <g id="patch_46">
1264 <path d="M 54 34.56
1265 L 388.8 34.56
1266 " style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
1267 </g>
1268 <g id="legend_1">
1269 <g id="patch_47">
1270 <path d="M 61 101.2725
1271 L 116.046875 101.2725
1272 Q 118.046875 101.2725 118.046875 99.2725
1273 L 118.046875 41.56
1274 Q 118.046875 39.56 116.046875 39.56
@@ -1231,19 +1277,19 @@
1277 L 59 99.2725
1278 Q 59 101.2725 61 101.2725
1279 z
1280 " style="fill:#ffffff;opacity:0.8;stroke:#cccccc;stroke-linejoin:miter;"/>
1281 </g>
1282 <g id="patch_48">
1283 <path d="M 63 51.158437
1284 L 83 51.158437
1285 L 83 44.158437
1286 L 63 44.158437
1287 z
1288 " style="fill:#3b4cc0;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
1289 </g>
1290 <g id="text_19">
1291 <!-- JPEG -->
1292 <defs>
1293 <path d="M 9.8125 72.90625
1294 L 19.671875 72.90625
1295 L 19.671875 5.078125
@@ -1320,35 +1366,35 @@
1366 <use x="29.492188" xlink:href="#DejaVuSans-80"/>
1367 <use x="89.794922" xlink:href="#DejaVuSans-69"/>
1368 <use x="152.978516" xlink:href="#DejaVuSans-71"/>
1369 </g>
1370 </g>
1371 <g id="patch_49">
1372 <path d="M 63 65.836562
1373 L 83 65.836562
1374 L 83 58.836562
1375 L 63 58.836562
1376 z
1377 " style="fill:#aac7fd;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
1378 </g>
1379 <g id="text_20">
1380 <!-- BMP -->
1381 <g transform="translate(91 65.836562)scale(0.1 -0.1)">
1382 <use xlink:href="#DejaVuSans-66"/>
1383 <use x="68.603516" xlink:href="#DejaVuSans-77"/>
1384 <use x="154.882812" xlink:href="#DejaVuSans-80"/>
1385 </g>
1386 </g>
1387 <g id="patch_50">
1388 <path d="M 63 80.514687
1389 L 83 80.514687
1390 L 83 73.514687
1391 L 63 73.514687
1392 z
1393 " style="fill:#f7b89c;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
1394 </g>
1395 <g id="text_21">
1396 <!-- TIFF -->
1397 <defs>
1398 <path d="M -0.296875 72.90625
1399 L 61.375 72.90625
1400 L 61.375 64.59375
@@ -1383,19 +1429,19 @@
1429 <use x="61.083984" xlink:href="#DejaVuSans-73"/>
1430 <use x="90.576172" xlink:href="#DejaVuSans-70"/>
1431 <use x="148.095703" xlink:href="#DejaVuSans-70"/>
1432 </g>
1433 </g>
1434 <g id="patch_51">
1435 <path d="M 63 95.192813
1436 L 83 95.192813
1437 L 83 88.192813
1438 L 63 88.192813
1439 z
1440 " style="fill:#b40426;stroke:#ffffff;stroke-linejoin:miter;stroke-width:2;"/>
1441 </g>
1442 <g id="text_22">
1443 <!-- PNG -->
1444 <defs>
1445 <path d="M 9.8125 72.90625
1446 L 23.09375 72.90625
1447 L 55.421875 11.921875
@@ -1417,10 +1463,10 @@
1463 </g>
1464 </g>
1465 </g>
1466 </g>
1467 <defs>
1468 <clipPath id="p9518871844">
1469 <rect height="217.44" width="334.8" x="54" y="34.56"/>
1470 </clipPath>
1471 </defs>
1472 </svg>
1473

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button