Using sqlite database, mt proctor animation.
| After Width: | Height: | Size: 6.5 MiB | 
| @ -0,0 +1,73 @@ | ||||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <svg | ||||
|    xmlns:dc="http://purl.org/dc/elements/1.1/" | ||||
|    xmlns:cc="http://creativecommons.org/ns#" | ||||
|    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | ||||
|    xmlns:svg="http://www.w3.org/2000/svg" | ||||
|    xmlns="http://www.w3.org/2000/svg" | ||||
|    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||||
|    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||||
|    version="1.1" | ||||
|    x="0px" | ||||
|    y="0px" | ||||
|    viewBox="0 0 83.521004 90" | ||||
|    enable-background="new 0 0 100 100" | ||||
|    xml:space="preserve" | ||||
|    id="svg4827" | ||||
|    sodipodi:docname="volcano.svg" | ||||
|    width="83.521004" | ||||
|    height="90" | ||||
|    inkscape:version="0.92.4 (5da689c313, 2019-01-14)"><metadata | ||||
|      id="metadata4833"><rdf:RDF><cc:Work | ||||
|          rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type | ||||
|            rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs | ||||
|      id="defs4831" /><sodipodi:namedview | ||||
|      pagecolor="#ffffff" | ||||
|      bordercolor="#666666" | ||||
|      borderopacity="1" | ||||
|      objecttolerance="10" | ||||
|      gridtolerance="10" | ||||
|      guidetolerance="10" | ||||
|      inkscape:pageopacity="0" | ||||
|      inkscape:pageshadow="2" | ||||
|      inkscape:window-width="2560" | ||||
|      inkscape:window-height="1375" | ||||
|      id="namedview4829" | ||||
|      showgrid="false" | ||||
|      inkscape:zoom="16.931965" | ||||
|      inkscape:cx="34.840436" | ||||
|      inkscape:cy="58.282217" | ||||
|      inkscape:window-x="0" | ||||
|      inkscape:window-y="0" | ||||
|      inkscape:window-maximized="1" | ||||
|      inkscape:current-layer="layer2" /><g | ||||
|      inkscape:groupmode="layer" | ||||
|      id="layer1" | ||||
|      inkscape:label="background" | ||||
|      style="display:inline"><path | ||||
|        d="m 22.724,90 h 3.742 c 0.552,0 1,-0.448 1,-1 v 0 c 0,-0.552 -0.448,-1 -1,-1 h -3.742 c -0.552,0 -1,0.448 -1,1 v 0 c 0,0.552 0.448,1 1,1 z" | ||||
|        id="path4848" | ||||
|        inkscape:connector-curvature="0" /><path | ||||
|        d="m 31.709,48.246 c -0.5,0 -0.92,0.373 -0.991,0.868 C 26.776,76.3 7.844,86.928 5.8,88 H 1 c -0.552,0 -1,0.448 -1,1 v 0 c 0,0.552 0.448,1 1,1 h 17.541 c 0.552,0 1,-0.448 1,-1 v 0 c 0,-0.552 -0.448,-1 -1,-1 H 9.625 C 15.767,83.846 29.057,72.489 32.57,50.247 H 46.913 C 50.775,72.775 66.307,83.893 73.711,88 H 63.602 C 55.695,83.379 50.214,73.507 50.159,73.407 c -0.267,-0.485 -0.875,-0.662 -1.357,-0.396 -0.484,0.266 -0.662,0.873 -0.396,1.357 0.21,0.383 4.67,8.425 11.601,13.632 H 33.441 c -0.552,0 -1,0.448 -1,1 v 0 c 0,0.552 0.448,1 1,1 h 49.08 c 0.552,0 1,-0.448 1,-1 v 0 c 0,-0.553 -0.447,-1 -1,-1 H 78.222 C 76.161,87.159 53.146,77.158 48.752,49.104 c -0.077,-0.49 -0.493,-0.858 -0.99,-0.858" | ||||
|        id="path4821" | ||||
|        inkscape:connector-curvature="0" /></g><g | ||||
|      inkscape:groupmode="layer" | ||||
|      id="layer2" | ||||
|      inkscape:label="smoke" | ||||
|      style="display:inline"><path | ||||
|        d="m 29.271,25.283 c 0.179,0.522 -0.101,1.091 -0.623,1.27 -0.107,0.037 -0.216,0.054 -0.323,0.054 -0.416,0 -0.804,-0.262 -0.946,-0.677 -0.976,-2.858 0.208,-6.044 2.816,-7.576 2.525,-1.483 5.727,-1.065 7.784,1.015 0.389,0.393 0.385,1.026 -0.008,1.414 -0.393,0.389 -1.026,0.385 -1.414,-0.008 -1.414,-1.43 -3.614,-1.716 -5.349,-0.697 -1.793,1.053 -2.607,3.242 -1.937,5.205 z" | ||||
|        id="path4856" | ||||
|        inkscape:connector-curvature="0" /><path | ||||
|        d="m 59.002,9.435 c 4.279,0.188 8.044,3.055 9.37,7.136 0.137,0.422 0.529,0.691 0.951,0.691 0.102,0 0.207,-0.016 0.309,-0.049 0.525,-0.171 0.813,-0.735 0.642,-1.26 C 68.691,11.083 64.197,7.661 59.09,7.437 58.553,7.435 58.071,7.84 58.047,8.392 58.023,8.944 58.45,9.41 59.002,9.435 Z" | ||||
|        id="path4854" | ||||
|        inkscape:connector-curvature="0" /><path | ||||
|        d="m 15.571,32.367 h 0.85 c 0.47,2.492 2.663,4.383 5.29,4.383 h 5.372 c 2.044,0 3.708,1.663 3.708,3.708 v 4.135 h 2 v -4.135 c 0,-3.147 -2.561,-5.708 -5.708,-5.708 h -5.372 c -1.865,0 -3.383,-1.518 -3.383,-3.383 0,-0.552 -0.448,-1 -1,-1 h -1.757 c -3.271,0 -5.933,-2.662 -5.933,-5.933 0,-3.271 2.662,-5.933 5.933,-5.933 h 3.212 c 0.552,0 1,-0.448 1,-1 v -1.073 c 0,-3.677 2.992,-6.668 6.668,-6.668 0.552,0 1,-0.448 1,-1 V 8.377 C 27.452,4.861 30.313,2 33.829,2 c 3.516,0 6.377,2.861 6.377,6.377 V 8.76 c 0,0.552 0.448,1 1,1 h 3.454 c 2.576,0 4.671,2.095 4.671,4.67 0,0.552 0.448,1 1,1 h 3.058 c 5.435,0 9.856,4.421 9.856,9.855 0,0.552 0.448,1 1,1 h 2.791 c 1.905,0 3.455,1.55 3.455,3.456 0,1.906 -1.55,3.455 -3.455,3.455 H 52.499 c -3.147,0 -5.708,2.561 -5.708,5.708 v 6.034 h 2 v -6.034 c 0,-2.044 1.664,-3.708 3.708,-3.708 h 14.536 c 3.008,0 5.455,-2.447 5.455,-5.455 0,-3.008 -2.447,-5.456 -5.455,-5.456 H 65.202 C 64.693,18.214 59.589,13.43 53.388,13.43 H 51.255 C 50.771,10.225 47.997,7.76 44.659,7.76 H 42.183 C 41.866,3.428 38.24,0 33.829,0 29.398,0 25.76,3.457 25.471,7.815 21.152,8.304 17.784,11.98 17.784,16.428 v 0.073 h -2.213 c -4.375,0 -7.933,3.559 -7.933,7.933 0,4.374 3.559,7.933 7.933,7.933 z" | ||||
|        id="path4852" | ||||
|        inkscape:connector-curvature="0" /><path | ||||
|        d="M 43.531,44.77 V 30.819 c 0,-0.552 -0.448,-1 -1,-1 v 0 c -0.552,0 -1,0.448 -1,1 V 44.77 Z" | ||||
|        id="path4850" | ||||
|        inkscape:connector-curvature="0" /><path | ||||
|        style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" | ||||
|        d="M 36.754563,48.297963 V 38.85399" | ||||
|        id="path4844" | ||||
|        inkscape:connector-curvature="0" /></g></svg> | ||||
| After Width: | Height: | Size: 5.1 KiB | 
| @ -0,0 +1,80 @@ | ||||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <svg | ||||
|    xmlns:dc="http://purl.org/dc/elements/1.1/" | ||||
|    xmlns:cc="http://creativecommons.org/ns#" | ||||
|    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | ||||
|    xmlns:svg="http://www.w3.org/2000/svg" | ||||
|    xmlns="http://www.w3.org/2000/svg" | ||||
|    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||||
|    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||||
|    version="1.1" | ||||
|    x="0px" | ||||
|    y="0px" | ||||
|    viewBox="0 0 83.521004 90" | ||||
|    enable-background="new 0 0 100 100" | ||||
|    xml:space="preserve" | ||||
|    id="svg4827" | ||||
|    sodipodi:docname="volcano0.svg" | ||||
|    width="83.521004" | ||||
|    height="90" | ||||
|    inkscape:version="0.92.4 (5da689c313, 2019-01-14)" | ||||
|    inkscape:export-filename="/home/tjhintz/tmp/volcano/volcano0.png" | ||||
|    inkscape:export-xdpi="106.654" | ||||
|    inkscape:export-ydpi="106.654"><metadata | ||||
|      id="metadata4833"><rdf:RDF><cc:Work | ||||
|          rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type | ||||
|            rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs | ||||
|      id="defs4831" /><sodipodi:namedview | ||||
|      pagecolor="#ffffff" | ||||
|      bordercolor="#666666" | ||||
|      borderopacity="1" | ||||
|      objecttolerance="10" | ||||
|      gridtolerance="10" | ||||
|      guidetolerance="10" | ||||
|      inkscape:pageopacity="0" | ||||
|      inkscape:pageshadow="2" | ||||
|      inkscape:window-width="2560" | ||||
|      inkscape:window-height="1375" | ||||
|      id="namedview4829" | ||||
|      showgrid="false" | ||||
|      inkscape:zoom="11.972707" | ||||
|      inkscape:cx="3.3491555" | ||||
|      inkscape:cy="44.177135" | ||||
|      inkscape:window-x="0" | ||||
|      inkscape:window-y="0" | ||||
|      inkscape:window-maximized="1" | ||||
|      inkscape:current-layer="layer2" /><g | ||||
|      inkscape:groupmode="layer" | ||||
|      id="layer1" | ||||
|      inkscape:label="background" | ||||
|      style="display:inline"><path | ||||
|        d="m 22.724,90 h 3.742 c 0.552,0 1,-0.448 1,-1 v 0 c 0,-0.552 -0.448,-1 -1,-1 h -3.742 c -0.552,0 -1,0.448 -1,1 v 0 c 0,0.552 0.448,1 1,1 z" | ||||
|        id="path4848" | ||||
|        inkscape:connector-curvature="0" /><path | ||||
|        d="m 31.709,48.246 c -0.5,0 -0.92,0.373 -0.991,0.868 C 26.776,76.3 7.844,86.928 5.8,88 H 1 c -0.552,0 -1,0.448 -1,1 v 0 c 0,0.552 0.448,1 1,1 h 17.541 c 0.552,0 1,-0.448 1,-1 v 0 c 0,-0.552 -0.448,-1 -1,-1 H 9.625 C 15.767,83.846 29.057,72.489 32.57,50.247 H 46.913 C 50.775,72.775 66.307,83.893 73.711,88 H 63.602 C 55.695,83.379 50.214,73.507 50.159,73.407 c -0.267,-0.485 -0.875,-0.662 -1.357,-0.396 -0.484,0.266 -0.662,0.873 -0.396,1.357 0.21,0.383 4.67,8.425 11.601,13.632 H 33.441 c -0.552,0 -1,0.448 -1,1 v 0 c 0,0.552 0.448,1 1,1 h 49.08 c 0.552,0 1,-0.448 1,-1 v 0 c 0,-0.553 -0.447,-1 -1,-1 H 78.222 C 76.161,87.159 53.146,77.158 48.752,49.104 c -0.077,-0.49 -0.493,-0.858 -0.99,-0.858" | ||||
|        id="path4821" | ||||
|        inkscape:connector-curvature="0" /></g><g | ||||
|      inkscape:groupmode="layer" | ||||
|      id="layer2" | ||||
|      inkscape:label="smoke" | ||||
|      style="display:inline"><path | ||||
|        d="m 38.275981,46.275652 c 0.0179,0.0522 -0.0101,0.1091 -0.0623,0.127 -0.0107,0.0037 -0.0216,0.0054 -0.0323,0.0054 -0.0416,0 -0.0804,-0.0262 -0.0946,-0.0677 -0.0976,-0.2858 0.0208,-0.6044 0.2816,-0.7576 0.2525,-0.1483 0.5727,-0.1065 0.7784,0.1015 0.0389,0.0393 0.0385,0.1026 -8e-4,0.1414 -0.0393,0.0389 -0.1026,0.0385 -0.1414,-8e-4 -0.1414,-0.143 -0.3614,-0.1716 -0.5349,-0.0697 -0.1793,0.1053 -0.2607,0.3242 -0.1937,0.5205 z" | ||||
|        id="path4856" | ||||
|        inkscape:connector-curvature="0" | ||||
|        style="stroke-width:0.1" /><path | ||||
|        d="m 41.249081,44.690852 c 0.4279,0.0188 0.8044,0.3055 0.937,0.7136 0.0137,0.0422 0.0529,0.0691 0.0951,0.0691 0.0102,0 0.0207,-0.0016 0.0309,-0.0049 0.0525,-0.0171 0.0813,-0.0735 0.0642,-0.126 -0.1583,-0.487 -0.6077,-0.8292 -1.1184,-0.8516 -0.0537,-2e-4 -0.1019,0.0403 -0.1043,0.0955 -0.0024,0.0552 0.0403,0.1018 0.0955,0.1043 z" | ||||
|        id="path4854" | ||||
|        inkscape:connector-curvature="0" | ||||
|        style="stroke-width:0.1" /><path | ||||
|        d="m 36.905981,46.984052 h 0.085 c 0.047,0.2492 0.2663,0.4383 0.529,0.4383 h 0.5372 c 0.2044,0 0.3708,0.1663 0.3708,0.3708 v 0.4135 h 0.2 v -0.4135 c 0,-0.3147 -0.2561,-0.5708 -0.5708,-0.5708 h -0.5372 c -0.1865,0 -0.3383,-0.1518 -0.3383,-0.3383 0,-0.0552 -0.0448,-0.1 -0.1,-0.1 h -0.1757 c -0.3271,0 -0.5933,-0.2662 -0.5933,-0.5933 0,-0.3271 0.2662,-0.5933 0.5933,-0.5933 h 0.3212 c 0.0552,0 0.1,-0.0448 0.1,-0.1 v -0.1073 c 0,-0.3677 0.2992,-0.6668 0.6668,-0.6668 0.0552,0 0.1,-0.0448 0.1,-0.1 v -0.0383 c 1e-4,-0.3516 0.2862,-0.6377 0.6378,-0.6377 0.3516,0 0.6377,0.2861 0.6377,0.6377 v 0.0383 c 0,0.0552 0.0448,0.1 0.1,0.1 h 0.3454 c 0.2576,0 0.4671,0.2095 0.4671,0.467 0,0.0552 0.0448,0.1 0.1,0.1 h 0.3058 c 0.5435,0 0.9856,0.4421 0.9856,0.9855 0,0.0552 0.0448,0.1 0.1,0.1 h 0.2791 c 0.1905,0 0.3455,0.155 0.3455,0.3456 0,0.1906 -0.155,0.3455 -0.3455,0.3455 h -1.4537 c -0.3147,0 -0.5708,0.2561 -0.5708,0.5708 v 0.6034 h 0.2 v -0.6034 c 0,-0.2044 0.1664,-0.3708 0.3708,-0.3708 h 1.4536 c 0.3008,0 0.5455,-0.2447 0.5455,-0.5455 0,-0.3008 -0.2447,-0.5456 -0.5455,-0.5456 h -0.1833 c -0.0509,-0.6071 -0.5613,-1.0855 -1.1814,-1.0855 h -0.2133 c -0.0484,-0.3205 -0.3258,-0.567 -0.6596,-0.567 h -0.2476 c -0.0317,-0.4332 -0.3943,-0.776 -0.8354,-0.776 -0.4431,0 -0.8069,0.3457 -0.8358,0.7815 -0.4319,0.0489 -0.7687,0.4165 -0.7687,0.8613 v 0.0073 h -0.2213 c -0.4375,0 -0.7933,0.3559 -0.7933,0.7933 0,0.4374 0.3559,0.7933 0.7933,0.7933 z" | ||||
|        id="path4852" | ||||
|        inkscape:connector-curvature="0" | ||||
|        style="stroke-width:0.1" /><path | ||||
|        d="m 39.701981,48.224352 v -1.3951 c 0,-0.0552 -0.0448,-0.1 -0.1,-0.1 v 0 c -0.0552,0 -0.1,0.0448 -0.1,0.1 v 1.3951 z" | ||||
|        id="path4850" | ||||
|        inkscape:connector-curvature="0" | ||||
|        style="stroke-width:0.1" /><path | ||||
|        style="fill:none;stroke:#000000;stroke-width:0.2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" | ||||
|        d="M 39.024337,48.577149 V 47.632751" | ||||
|        id="path4844" | ||||
|        inkscape:connector-curvature="0" /></g></svg> | ||||
| After Width: | Height: | Size: 5.8 KiB | 
| @ -0,0 +1,82 @@ | ||||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <svg | ||||
|    xmlns:dc="http://purl.org/dc/elements/1.1/" | ||||
|    xmlns:cc="http://creativecommons.org/ns#" | ||||
|    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | ||||
|    xmlns:svg="http://www.w3.org/2000/svg" | ||||
|    xmlns="http://www.w3.org/2000/svg" | ||||
|    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||||
|    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||||
|    version="1.1" | ||||
|    x="0px" | ||||
|    y="0px" | ||||
|    viewBox="0 0 83.521004 90" | ||||
|    enable-background="new 0 0 100 100" | ||||
|    xml:space="preserve" | ||||
|    id="svg4827" | ||||
|    sodipodi:docname="volcano1.svg" | ||||
|    width="83.521004" | ||||
|    height="90" | ||||
|    inkscape:version="0.92.4 (5da689c313, 2019-01-14)" | ||||
|    inkscape:export-filename="/home/tjhintz/tmp/volcano/volcano1.png" | ||||
|    inkscape:export-xdpi="106.654" | ||||
|    inkscape:export-ydpi="106.654"><metadata | ||||
|      id="metadata4833"><rdf:RDF><cc:Work | ||||
|          rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type | ||||
|            rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs | ||||
|      id="defs4831" /><sodipodi:namedview | ||||
|      pagecolor="#ffffff" | ||||
|      bordercolor="#666666" | ||||
|      borderopacity="1" | ||||
|      objecttolerance="10" | ||||
|      gridtolerance="10" | ||||
|      guidetolerance="10" | ||||
|      inkscape:pageopacity="0" | ||||
|      inkscape:pageshadow="2" | ||||
|      inkscape:window-width="2560" | ||||
|      inkscape:window-height="1375" | ||||
|      id="namedview4829" | ||||
|      showgrid="false" | ||||
|      inkscape:zoom="16" | ||||
|      inkscape:cx="19.364384" | ||||
|      inkscape:cy="35.768813" | ||||
|      inkscape:window-x="0" | ||||
|      inkscape:window-y="0" | ||||
|      inkscape:window-maximized="1" | ||||
|      inkscape:current-layer="layer2" /><g | ||||
|      inkscape:groupmode="layer" | ||||
|      id="layer1" | ||||
|      inkscape:label="background" | ||||
|      style="display:inline"><path | ||||
|        d="m 22.724,90 h 3.742 c 0.552,0 1,-0.448 1,-1 v 0 c 0,-0.552 -0.448,-1 -1,-1 h -3.742 c -0.552,0 -1,0.448 -1,1 v 0 c 0,0.552 0.448,1 1,1 z" | ||||
|        id="path4848" | ||||
|        inkscape:connector-curvature="0" /><path | ||||
|        d="m 31.709,48.246 c -0.5,0 -0.92,0.373 -0.991,0.868 C 26.776,76.3 7.844,86.928 5.8,88 H 1 c -0.552,0 -1,0.448 -1,1 v 0 c 0,0.552 0.448,1 1,1 h 17.541 c 0.552,0 1,-0.448 1,-1 v 0 c 0,-0.552 -0.448,-1 -1,-1 H 9.625 C 15.767,83.846 29.057,72.489 32.57,50.247 H 46.913 C 50.775,72.775 66.307,83.893 73.711,88 H 63.602 C 55.695,83.379 50.214,73.507 50.159,73.407 c -0.267,-0.485 -0.875,-0.662 -1.357,-0.396 -0.484,0.266 -0.662,0.873 -0.396,1.357 0.21,0.383 4.67,8.425 11.601,13.632 H 33.441 c -0.552,0 -1,0.448 -1,1 v 0 c 0,0.552 0.448,1 1,1 h 49.08 c 0.552,0 1,-0.448 1,-1 v 0 c 0,-0.553 -0.447,-1 -1,-1 H 78.222 C 76.161,87.159 53.146,77.158 48.752,49.104 c -0.077,-0.49 -0.493,-0.858 -0.99,-0.858" | ||||
|        id="path4821" | ||||
|        inkscape:connector-curvature="0" /></g><g | ||||
|      inkscape:groupmode="layer" | ||||
|      id="layer2" | ||||
|      inkscape:label="smoke" | ||||
|      style="display:inline"><g | ||||
|        id="g4911" | ||||
|        transform="matrix(2,0,0,2,-39.355281,-48.923119)"><path | ||||
|          style="stroke-width:0.1" | ||||
|          inkscape:connector-curvature="0" | ||||
|          id="path4856" | ||||
|          d="m 38.275981,46.275652 c 0.0179,0.0522 -0.0101,0.1091 -0.0623,0.127 -0.0107,0.0037 -0.0216,0.0054 -0.0323,0.0054 -0.0416,0 -0.0804,-0.0262 -0.0946,-0.0677 -0.0976,-0.2858 0.0208,-0.6044 0.2816,-0.7576 0.2525,-0.1483 0.5727,-0.1065 0.7784,0.1015 0.0389,0.0393 0.0385,0.1026 -8e-4,0.1414 -0.0393,0.0389 -0.1026,0.0385 -0.1414,-8e-4 -0.1414,-0.143 -0.3614,-0.1716 -0.5349,-0.0697 -0.1793,0.1053 -0.2607,0.3242 -0.1937,0.5205 z" /><path | ||||
|          style="stroke-width:0.1" | ||||
|          inkscape:connector-curvature="0" | ||||
|          id="path4854" | ||||
|          d="m 41.249081,44.690852 c 0.4279,0.0188 0.8044,0.3055 0.937,0.7136 0.0137,0.0422 0.0529,0.0691 0.0951,0.0691 0.0102,0 0.0207,-0.0016 0.0309,-0.0049 0.0525,-0.0171 0.0813,-0.0735 0.0642,-0.126 -0.1583,-0.487 -0.6077,-0.8292 -1.1184,-0.8516 -0.0537,-2e-4 -0.1019,0.0403 -0.1043,0.0955 -0.0024,0.0552 0.0403,0.1018 0.0955,0.1043 z" /><path | ||||
|          style="stroke-width:0.1" | ||||
|          inkscape:connector-curvature="0" | ||||
|          id="path4852" | ||||
|          d="m 36.905981,46.984052 h 0.085 c 0.047,0.2492 0.2663,0.4383 0.529,0.4383 h 0.5372 c 0.2044,0 0.3708,0.1663 0.3708,0.3708 v 0.4135 h 0.2 v -0.4135 c 0,-0.3147 -0.2561,-0.5708 -0.5708,-0.5708 h -0.5372 c -0.1865,0 -0.3383,-0.1518 -0.3383,-0.3383 0,-0.0552 -0.0448,-0.1 -0.1,-0.1 h -0.1757 c -0.3271,0 -0.5933,-0.2662 -0.5933,-0.5933 0,-0.3271 0.2662,-0.5933 0.5933,-0.5933 h 0.3212 c 0.0552,0 0.1,-0.0448 0.1,-0.1 v -0.1073 c 0,-0.3677 0.2992,-0.6668 0.6668,-0.6668 0.0552,0 0.1,-0.0448 0.1,-0.1 v -0.0383 c 1e-4,-0.3516 0.2862,-0.6377 0.6378,-0.6377 0.3516,0 0.6377,0.2861 0.6377,0.6377 v 0.0383 c 0,0.0552 0.0448,0.1 0.1,0.1 h 0.3454 c 0.2576,0 0.4671,0.2095 0.4671,0.467 0,0.0552 0.0448,0.1 0.1,0.1 h 0.3058 c 0.5435,0 0.9856,0.4421 0.9856,0.9855 0,0.0552 0.0448,0.1 0.1,0.1 h 0.2791 c 0.1905,0 0.3455,0.155 0.3455,0.3456 0,0.1906 -0.155,0.3455 -0.3455,0.3455 h -1.4537 c -0.3147,0 -0.5708,0.2561 -0.5708,0.5708 v 0.6034 h 0.2 v -0.6034 c 0,-0.2044 0.1664,-0.3708 0.3708,-0.3708 h 1.4536 c 0.3008,0 0.5455,-0.2447 0.5455,-0.5455 0,-0.3008 -0.2447,-0.5456 -0.5455,-0.5456 h -0.1833 c -0.0509,-0.6071 -0.5613,-1.0855 -1.1814,-1.0855 h -0.2133 c -0.0484,-0.3205 -0.3258,-0.567 -0.6596,-0.567 h -0.2476 c -0.0317,-0.4332 -0.3943,-0.776 -0.8354,-0.776 -0.4431,0 -0.8069,0.3457 -0.8358,0.7815 -0.4319,0.0489 -0.7687,0.4165 -0.7687,0.8613 v 0.0073 h -0.2213 c -0.4375,0 -0.7933,0.3559 -0.7933,0.7933 0,0.4374 0.3559,0.7933 0.7933,0.7933 z" /><path | ||||
|          style="stroke-width:0.1" | ||||
|          inkscape:connector-curvature="0" | ||||
|          id="path4850" | ||||
|          d="m 39.701981,48.224352 v -1.3951 c 0,-0.0552 -0.0448,-0.1 -0.1,-0.1 v 0 c -0.0552,0 -0.1,0.0448 -0.1,0.1 v 1.3951 z" /><path | ||||
|          inkscape:connector-curvature="0" | ||||
|          id="path4844" | ||||
|          d="M 39.024337,48.577149 V 47.632751" | ||||
|          style="fill:none;stroke:#000000;stroke-width:0.2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /></g></g></svg> | ||||
| After Width: | Height: | Size: 5.9 KiB | 
| After Width: | Height: | Size: 1.9 KiB | 
| @ -0,0 +1,82 @@ | ||||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <svg | ||||
|    xmlns:dc="http://purl.org/dc/elements/1.1/" | ||||
|    xmlns:cc="http://creativecommons.org/ns#" | ||||
|    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | ||||
|    xmlns:svg="http://www.w3.org/2000/svg" | ||||
|    xmlns="http://www.w3.org/2000/svg" | ||||
|    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||||
|    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||||
|    version="1.1" | ||||
|    x="0px" | ||||
|    y="0px" | ||||
|    viewBox="0 0 83.521004 90" | ||||
|    enable-background="new 0 0 100 100" | ||||
|    xml:space="preserve" | ||||
|    id="svg4827" | ||||
|    sodipodi:docname="volcano2.svg" | ||||
|    width="83.521004" | ||||
|    height="90" | ||||
|    inkscape:version="0.92.4 (5da689c313, 2019-01-14)" | ||||
|    inkscape:export-filename="/home/tjhintz/tmp/volcano/volcano2.png" | ||||
|    inkscape:export-xdpi="106.654" | ||||
|    inkscape:export-ydpi="106.654"><metadata | ||||
|      id="metadata4833"><rdf:RDF><cc:Work | ||||
|          rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type | ||||
|            rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs | ||||
|      id="defs4831" /><sodipodi:namedview | ||||
|      pagecolor="#ffffff" | ||||
|      bordercolor="#666666" | ||||
|      borderopacity="1" | ||||
|      objecttolerance="10" | ||||
|      gridtolerance="10" | ||||
|      guidetolerance="10" | ||||
|      inkscape:pageopacity="0" | ||||
|      inkscape:pageshadow="2" | ||||
|      inkscape:window-width="2560" | ||||
|      inkscape:window-height="1375" | ||||
|      id="namedview4829" | ||||
|      showgrid="false" | ||||
|      inkscape:zoom="11.313709" | ||||
|      inkscape:cx="-8.2897213" | ||||
|      inkscape:cy="46.522973" | ||||
|      inkscape:window-x="0" | ||||
|      inkscape:window-y="0" | ||||
|      inkscape:window-maximized="1" | ||||
|      inkscape:current-layer="layer2" /><g | ||||
|      inkscape:groupmode="layer" | ||||
|      id="layer1" | ||||
|      inkscape:label="background" | ||||
|      style="display:inline"><path | ||||
|        d="m 22.724,90 h 3.742 c 0.552,0 1,-0.448 1,-1 v 0 c 0,-0.552 -0.448,-1 -1,-1 h -3.742 c -0.552,0 -1,0.448 -1,1 v 0 c 0,0.552 0.448,1 1,1 z" | ||||
|        id="path4848" | ||||
|        inkscape:connector-curvature="0" /><path | ||||
|        d="m 31.709,48.246 c -0.5,0 -0.92,0.373 -0.991,0.868 C 26.776,76.3 7.844,86.928 5.8,88 H 1 c -0.552,0 -1,0.448 -1,1 v 0 c 0,0.552 0.448,1 1,1 h 17.541 c 0.552,0 1,-0.448 1,-1 v 0 c 0,-0.552 -0.448,-1 -1,-1 H 9.625 C 15.767,83.846 29.057,72.489 32.57,50.247 H 46.913 C 50.775,72.775 66.307,83.893 73.711,88 H 63.602 C 55.695,83.379 50.214,73.507 50.159,73.407 c -0.267,-0.485 -0.875,-0.662 -1.357,-0.396 -0.484,0.266 -0.662,0.873 -0.396,1.357 0.21,0.383 4.67,8.425 11.601,13.632 H 33.441 c -0.552,0 -1,0.448 -1,1 v 0 c 0,0.552 0.448,1 1,1 h 49.08 c 0.552,0 1,-0.448 1,-1 v 0 c 0,-0.553 -0.447,-1 -1,-1 H 78.222 C 76.161,87.159 53.146,77.158 48.752,49.104 c -0.077,-0.49 -0.493,-0.858 -0.99,-0.858" | ||||
|        id="path4821" | ||||
|        inkscape:connector-curvature="0" /></g><g | ||||
|      inkscape:groupmode="layer" | ||||
|      id="layer2" | ||||
|      inkscape:label="smoke" | ||||
|      style="display:inline"><g | ||||
|        id="g4911" | ||||
|        transform="matrix(4,0,0,4,-118.06584,-146.02873)"><path | ||||
|          style="stroke-width:0.1" | ||||
|          inkscape:connector-curvature="0" | ||||
|          id="path4856" | ||||
|          d="m 38.275981,46.275652 c 0.0179,0.0522 -0.0101,0.1091 -0.0623,0.127 -0.0107,0.0037 -0.0216,0.0054 -0.0323,0.0054 -0.0416,0 -0.0804,-0.0262 -0.0946,-0.0677 -0.0976,-0.2858 0.0208,-0.6044 0.2816,-0.7576 0.2525,-0.1483 0.5727,-0.1065 0.7784,0.1015 0.0389,0.0393 0.0385,0.1026 -8e-4,0.1414 -0.0393,0.0389 -0.1026,0.0385 -0.1414,-8e-4 -0.1414,-0.143 -0.3614,-0.1716 -0.5349,-0.0697 -0.1793,0.1053 -0.2607,0.3242 -0.1937,0.5205 z" /><path | ||||
|          style="stroke-width:0.1" | ||||
|          inkscape:connector-curvature="0" | ||||
|          id="path4854" | ||||
|          d="m 41.249081,44.690852 c 0.4279,0.0188 0.8044,0.3055 0.937,0.7136 0.0137,0.0422 0.0529,0.0691 0.0951,0.0691 0.0102,0 0.0207,-0.0016 0.0309,-0.0049 0.0525,-0.0171 0.0813,-0.0735 0.0642,-0.126 -0.1583,-0.487 -0.6077,-0.8292 -1.1184,-0.8516 -0.0537,-2e-4 -0.1019,0.0403 -0.1043,0.0955 -0.0024,0.0552 0.0403,0.1018 0.0955,0.1043 z" /><path | ||||
|          style="stroke-width:0.1" | ||||
|          inkscape:connector-curvature="0" | ||||
|          id="path4852" | ||||
|          d="m 36.905981,46.984052 h 0.085 c 0.047,0.2492 0.2663,0.4383 0.529,0.4383 h 0.5372 c 0.2044,0 0.3708,0.1663 0.3708,0.3708 v 0.4135 h 0.2 v -0.4135 c 0,-0.3147 -0.2561,-0.5708 -0.5708,-0.5708 h -0.5372 c -0.1865,0 -0.3383,-0.1518 -0.3383,-0.3383 0,-0.0552 -0.0448,-0.1 -0.1,-0.1 h -0.1757 c -0.3271,0 -0.5933,-0.2662 -0.5933,-0.5933 0,-0.3271 0.2662,-0.5933 0.5933,-0.5933 h 0.3212 c 0.0552,0 0.1,-0.0448 0.1,-0.1 v -0.1073 c 0,-0.3677 0.2992,-0.6668 0.6668,-0.6668 0.0552,0 0.1,-0.0448 0.1,-0.1 v -0.0383 c 1e-4,-0.3516 0.2862,-0.6377 0.6378,-0.6377 0.3516,0 0.6377,0.2861 0.6377,0.6377 v 0.0383 c 0,0.0552 0.0448,0.1 0.1,0.1 h 0.3454 c 0.2576,0 0.4671,0.2095 0.4671,0.467 0,0.0552 0.0448,0.1 0.1,0.1 h 0.3058 c 0.5435,0 0.9856,0.4421 0.9856,0.9855 0,0.0552 0.0448,0.1 0.1,0.1 h 0.2791 c 0.1905,0 0.3455,0.155 0.3455,0.3456 0,0.1906 -0.155,0.3455 -0.3455,0.3455 h -1.4537 c -0.3147,0 -0.5708,0.2561 -0.5708,0.5708 v 0.6034 h 0.2 v -0.6034 c 0,-0.2044 0.1664,-0.3708 0.3708,-0.3708 h 1.4536 c 0.3008,0 0.5455,-0.2447 0.5455,-0.5455 0,-0.3008 -0.2447,-0.5456 -0.5455,-0.5456 h -0.1833 c -0.0509,-0.6071 -0.5613,-1.0855 -1.1814,-1.0855 h -0.2133 c -0.0484,-0.3205 -0.3258,-0.567 -0.6596,-0.567 h -0.2476 c -0.0317,-0.4332 -0.3943,-0.776 -0.8354,-0.776 -0.4431,0 -0.8069,0.3457 -0.8358,0.7815 -0.4319,0.0489 -0.7687,0.4165 -0.7687,0.8613 v 0.0073 h -0.2213 c -0.4375,0 -0.7933,0.3559 -0.7933,0.7933 0,0.4374 0.3559,0.7933 0.7933,0.7933 z" /><path | ||||
|          style="stroke-width:0.1" | ||||
|          inkscape:connector-curvature="0" | ||||
|          id="path4850" | ||||
|          d="m 39.701981,48.224352 v -1.3951 c 0,-0.0552 -0.0448,-0.1 -0.1,-0.1 v 0 c -0.0552,0 -0.1,0.0448 -0.1,0.1 v 1.3951 z" /><path | ||||
|          inkscape:connector-curvature="0" | ||||
|          id="path4844" | ||||
|          d="M 39.024337,48.577149 V 47.632751" | ||||
|          style="fill:none;stroke:#000000;stroke-width:0.2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /></g></g></svg> | ||||
| After Width: | Height: | Size: 5.9 KiB | 
| @ -0,0 +1,82 @@ | ||||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <svg | ||||
|    xmlns:dc="http://purl.org/dc/elements/1.1/" | ||||
|    xmlns:cc="http://creativecommons.org/ns#" | ||||
|    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | ||||
|    xmlns:svg="http://www.w3.org/2000/svg" | ||||
|    xmlns="http://www.w3.org/2000/svg" | ||||
|    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||||
|    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||||
|    version="1.1" | ||||
|    x="0px" | ||||
|    y="0px" | ||||
|    viewBox="0 0 83.521004 90" | ||||
|    enable-background="new 0 0 100 100" | ||||
|    xml:space="preserve" | ||||
|    id="svg4827" | ||||
|    sodipodi:docname="volcano3.svg" | ||||
|    width="83.521004" | ||||
|    height="90" | ||||
|    inkscape:version="0.92.4 (5da689c313, 2019-01-14)" | ||||
|    inkscape:export-filename="/home/tjhintz/tmp/volcano/volcano3.png" | ||||
|    inkscape:export-xdpi="106.66666" | ||||
|    inkscape:export-ydpi="106.66666"><metadata | ||||
|      id="metadata4833"><rdf:RDF><cc:Work | ||||
|          rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type | ||||
|            rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs | ||||
|      id="defs4831" /><sodipodi:namedview | ||||
|      pagecolor="#ffffff" | ||||
|      bordercolor="#666666" | ||||
|      borderopacity="1" | ||||
|      objecttolerance="10" | ||||
|      gridtolerance="10" | ||||
|      guidetolerance="10" | ||||
|      inkscape:pageopacity="0" | ||||
|      inkscape:pageshadow="2" | ||||
|      inkscape:window-width="2560" | ||||
|      inkscape:window-height="1375" | ||||
|      id="namedview4829" | ||||
|      showgrid="false" | ||||
|      inkscape:zoom="8" | ||||
|      inkscape:cx="-43.021575" | ||||
|      inkscape:cy="60.241354" | ||||
|      inkscape:window-x="0" | ||||
|      inkscape:window-y="0" | ||||
|      inkscape:window-maximized="1" | ||||
|      inkscape:current-layer="layer2" /><g | ||||
|      inkscape:groupmode="layer" | ||||
|      id="layer1" | ||||
|      inkscape:label="background" | ||||
|      style="display:inline"><path | ||||
|        d="m 22.724,90 h 3.742 c 0.552,0 1,-0.448 1,-1 v 0 c 0,-0.552 -0.448,-1 -1,-1 h -3.742 c -0.552,0 -1,0.448 -1,1 v 0 c 0,0.552 0.448,1 1,1 z" | ||||
|        id="path4848" | ||||
|        inkscape:connector-curvature="0" /><path | ||||
|        d="m 31.709,48.246 c -0.5,0 -0.92,0.373 -0.991,0.868 C 26.776,76.3 7.844,86.928 5.8,88 H 1 c -0.552,0 -1,0.448 -1,1 v 0 c 0,0.552 0.448,1 1,1 h 17.541 c 0.552,0 1,-0.448 1,-1 v 0 c 0,-0.552 -0.448,-1 -1,-1 H 9.625 C 15.767,83.846 29.057,72.489 32.57,50.247 H 46.913 C 50.775,72.775 66.307,83.893 73.711,88 H 63.602 C 55.695,83.379 50.214,73.507 50.159,73.407 c -0.267,-0.485 -0.875,-0.662 -1.357,-0.396 -0.484,0.266 -0.662,0.873 -0.396,1.357 0.21,0.383 4.67,8.425 11.601,13.632 H 33.441 c -0.552,0 -1,0.448 -1,1 v 0 c 0,0.552 0.448,1 1,1 h 49.08 c 0.552,0 1,-0.448 1,-1 v 0 c 0,-0.553 -0.447,-1 -1,-1 H 78.222 C 76.161,87.159 53.146,77.158 48.752,49.104 c -0.077,-0.49 -0.493,-0.858 -0.99,-0.858" | ||||
|        id="path4821" | ||||
|        inkscape:connector-curvature="0" /></g><g | ||||
|      inkscape:groupmode="layer" | ||||
|      id="layer2" | ||||
|      inkscape:label="smoke" | ||||
|      style="display:inline"><g | ||||
|        id="g4911" | ||||
|        transform="matrix(8,0,0,8,-275.48696,-340.41183)"><path | ||||
|          style="stroke-width:0.1" | ||||
|          inkscape:connector-curvature="0" | ||||
|          id="path4856" | ||||
|          d="m 38.275981,46.275652 c 0.0179,0.0522 -0.0101,0.1091 -0.0623,0.127 -0.0107,0.0037 -0.0216,0.0054 -0.0323,0.0054 -0.0416,0 -0.0804,-0.0262 -0.0946,-0.0677 -0.0976,-0.2858 0.0208,-0.6044 0.2816,-0.7576 0.2525,-0.1483 0.5727,-0.1065 0.7784,0.1015 0.0389,0.0393 0.0385,0.1026 -8e-4,0.1414 -0.0393,0.0389 -0.1026,0.0385 -0.1414,-8e-4 -0.1414,-0.143 -0.3614,-0.1716 -0.5349,-0.0697 -0.1793,0.1053 -0.2607,0.3242 -0.1937,0.5205 z" /><path | ||||
|          style="stroke-width:0.1" | ||||
|          inkscape:connector-curvature="0" | ||||
|          id="path4854" | ||||
|          d="m 41.249081,44.690852 c 0.4279,0.0188 0.8044,0.3055 0.937,0.7136 0.0137,0.0422 0.0529,0.0691 0.0951,0.0691 0.0102,0 0.0207,-0.0016 0.0309,-0.0049 0.0525,-0.0171 0.0813,-0.0735 0.0642,-0.126 -0.1583,-0.487 -0.6077,-0.8292 -1.1184,-0.8516 -0.0537,-2e-4 -0.1019,0.0403 -0.1043,0.0955 -0.0024,0.0552 0.0403,0.1018 0.0955,0.1043 z" /><path | ||||
|          style="stroke-width:0.1" | ||||
|          inkscape:connector-curvature="0" | ||||
|          id="path4852" | ||||
|          d="m 36.905981,46.984052 h 0.085 c 0.047,0.2492 0.2663,0.4383 0.529,0.4383 h 0.5372 c 0.2044,0 0.3708,0.1663 0.3708,0.3708 v 0.4135 h 0.2 v -0.4135 c 0,-0.3147 -0.2561,-0.5708 -0.5708,-0.5708 h -0.5372 c -0.1865,0 -0.3383,-0.1518 -0.3383,-0.3383 0,-0.0552 -0.0448,-0.1 -0.1,-0.1 h -0.1757 c -0.3271,0 -0.5933,-0.2662 -0.5933,-0.5933 0,-0.3271 0.2662,-0.5933 0.5933,-0.5933 h 0.3212 c 0.0552,0 0.1,-0.0448 0.1,-0.1 v -0.1073 c 0,-0.3677 0.2992,-0.6668 0.6668,-0.6668 0.0552,0 0.1,-0.0448 0.1,-0.1 v -0.0383 c 1e-4,-0.3516 0.2862,-0.6377 0.6378,-0.6377 0.3516,0 0.6377,0.2861 0.6377,0.6377 v 0.0383 c 0,0.0552 0.0448,0.1 0.1,0.1 h 0.3454 c 0.2576,0 0.4671,0.2095 0.4671,0.467 0,0.0552 0.0448,0.1 0.1,0.1 h 0.3058 c 0.5435,0 0.9856,0.4421 0.9856,0.9855 0,0.0552 0.0448,0.1 0.1,0.1 h 0.2791 c 0.1905,0 0.3455,0.155 0.3455,0.3456 0,0.1906 -0.155,0.3455 -0.3455,0.3455 h -1.4537 c -0.3147,0 -0.5708,0.2561 -0.5708,0.5708 v 0.6034 h 0.2 v -0.6034 c 0,-0.2044 0.1664,-0.3708 0.3708,-0.3708 h 1.4536 c 0.3008,0 0.5455,-0.2447 0.5455,-0.5455 0,-0.3008 -0.2447,-0.5456 -0.5455,-0.5456 h -0.1833 c -0.0509,-0.6071 -0.5613,-1.0855 -1.1814,-1.0855 h -0.2133 c -0.0484,-0.3205 -0.3258,-0.567 -0.6596,-0.567 h -0.2476 c -0.0317,-0.4332 -0.3943,-0.776 -0.8354,-0.776 -0.4431,0 -0.8069,0.3457 -0.8358,0.7815 -0.4319,0.0489 -0.7687,0.4165 -0.7687,0.8613 v 0.0073 h -0.2213 c -0.4375,0 -0.7933,0.3559 -0.7933,0.7933 0,0.4374 0.3559,0.7933 0.7933,0.7933 z" /><path | ||||
|          style="stroke-width:0.1" | ||||
|          inkscape:connector-curvature="0" | ||||
|          id="path4850" | ||||
|          d="m 39.701981,48.224352 v -1.3951 c 0,-0.0552 -0.0448,-0.1 -0.1,-0.1 v 0 c -0.0552,0 -0.1,0.0448 -0.1,0.1 v 1.3951 z" /><path | ||||
|          inkscape:connector-curvature="0" | ||||
|          id="path4844" | ||||
|          d="M 39.024337,48.577149 V 47.632751" | ||||
|          style="fill:none;stroke:#000000;stroke-width:0.2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /></g></g></svg> | ||||
| After Width: | Height: | Size: 5.9 KiB | 
| @ -0,0 +1,82 @@ | ||||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <svg | ||||
|    xmlns:dc="http://purl.org/dc/elements/1.1/" | ||||
|    xmlns:cc="http://creativecommons.org/ns#" | ||||
|    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | ||||
|    xmlns:svg="http://www.w3.org/2000/svg" | ||||
|    xmlns="http://www.w3.org/2000/svg" | ||||
|    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||||
|    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||||
|    version="1.1" | ||||
|    x="0px" | ||||
|    y="0px" | ||||
|    viewBox="0 0 83.521004 90" | ||||
|    enable-background="new 0 0 100 100" | ||||
|    xml:space="preserve" | ||||
|    id="svg4827" | ||||
|    sodipodi:docname="volcano4.svg" | ||||
|    width="83.521004" | ||||
|    height="90" | ||||
|    inkscape:version="0.92.4 (5da689c313, 2019-01-14)" | ||||
|    inkscape:export-filename="/home/tjhintz/tmp/volcano/volcano4.png" | ||||
|    inkscape:export-xdpi="106.66666" | ||||
|    inkscape:export-ydpi="106.66666"><metadata | ||||
|      id="metadata4833"><rdf:RDF><cc:Work | ||||
|          rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type | ||||
|            rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs | ||||
|      id="defs4831" /><sodipodi:namedview | ||||
|      pagecolor="#ffffff" | ||||
|      bordercolor="#666666" | ||||
|      borderopacity="1" | ||||
|      objecttolerance="10" | ||||
|      gridtolerance="10" | ||||
|      guidetolerance="10" | ||||
|      inkscape:pageopacity="0" | ||||
|      inkscape:pageshadow="2" | ||||
|      inkscape:window-width="2560" | ||||
|      inkscape:window-height="1375" | ||||
|      id="namedview4829" | ||||
|      showgrid="false" | ||||
|      inkscape:zoom="8" | ||||
|      inkscape:cx="-14.5812" | ||||
|      inkscape:cy="44.273261" | ||||
|      inkscape:window-x="0" | ||||
|      inkscape:window-y="0" | ||||
|      inkscape:window-maximized="1" | ||||
|      inkscape:current-layer="layer2" /><g | ||||
|      inkscape:groupmode="layer" | ||||
|      id="layer1" | ||||
|      inkscape:label="background" | ||||
|      style="display:inline"><path | ||||
|        d="m 22.724,90 h 3.742 c 0.552,0 1,-0.448 1,-1 v 0 c 0,-0.552 -0.448,-1 -1,-1 h -3.742 c -0.552,0 -1,0.448 -1,1 v 0 c 0,0.552 0.448,1 1,1 z" | ||||
|        id="path4848" | ||||
|        inkscape:connector-curvature="0" /><path | ||||
|        d="m 31.709,48.246 c -0.5,0 -0.92,0.373 -0.991,0.868 C 26.776,76.3 7.844,86.928 5.8,88 H 1 c -0.552,0 -1,0.448 -1,1 v 0 c 0,0.552 0.448,1 1,1 h 17.541 c 0.552,0 1,-0.448 1,-1 v 0 c 0,-0.552 -0.448,-1 -1,-1 H 9.625 C 15.767,83.846 29.057,72.489 32.57,50.247 H 46.913 C 50.775,72.775 66.307,83.893 73.711,88 H 63.602 C 55.695,83.379 50.214,73.507 50.159,73.407 c -0.267,-0.485 -0.875,-0.662 -1.357,-0.396 -0.484,0.266 -0.662,0.873 -0.396,1.357 0.21,0.383 4.67,8.425 11.601,13.632 H 33.441 c -0.552,0 -1,0.448 -1,1 v 0 c 0,0.552 0.448,1 1,1 h 49.08 c 0.552,0 1,-0.448 1,-1 v 0 c 0,-0.553 -0.447,-1 -1,-1 H 78.222 C 76.161,87.159 53.146,77.158 48.752,49.104 c -0.077,-0.49 -0.493,-0.858 -0.99,-0.858" | ||||
|        id="path4821" | ||||
|        inkscape:connector-curvature="0" /></g><g | ||||
|      inkscape:groupmode="layer" | ||||
|      id="layer2" | ||||
|      inkscape:label="smoke" | ||||
|      style="display:inline"><g | ||||
|        id="g4911" | ||||
|        transform="matrix(9.9676375,0,0,9.9676375,-351.91862,-436.06862)"><path | ||||
|          style="stroke-width:0.1" | ||||
|          inkscape:connector-curvature="0" | ||||
|          id="path4856" | ||||
|          d="m 38.275981,46.275652 c 0.0179,0.0522 -0.0101,0.1091 -0.0623,0.127 -0.0107,0.0037 -0.0216,0.0054 -0.0323,0.0054 -0.0416,0 -0.0804,-0.0262 -0.0946,-0.0677 -0.0976,-0.2858 0.0208,-0.6044 0.2816,-0.7576 0.2525,-0.1483 0.5727,-0.1065 0.7784,0.1015 0.0389,0.0393 0.0385,0.1026 -8e-4,0.1414 -0.0393,0.0389 -0.1026,0.0385 -0.1414,-8e-4 -0.1414,-0.143 -0.3614,-0.1716 -0.5349,-0.0697 -0.1793,0.1053 -0.2607,0.3242 -0.1937,0.5205 z" /><path | ||||
|          style="stroke-width:0.1" | ||||
|          inkscape:connector-curvature="0" | ||||
|          id="path4854" | ||||
|          d="m 41.249081,44.690852 c 0.4279,0.0188 0.8044,0.3055 0.937,0.7136 0.0137,0.0422 0.0529,0.0691 0.0951,0.0691 0.0102,0 0.0207,-0.0016 0.0309,-0.0049 0.0525,-0.0171 0.0813,-0.0735 0.0642,-0.126 -0.1583,-0.487 -0.6077,-0.8292 -1.1184,-0.8516 -0.0537,-2e-4 -0.1019,0.0403 -0.1043,0.0955 -0.0024,0.0552 0.0403,0.1018 0.0955,0.1043 z" /><path | ||||
|          style="stroke-width:0.1" | ||||
|          inkscape:connector-curvature="0" | ||||
|          id="path4852" | ||||
|          d="m 36.905981,46.984052 h 0.085 c 0.047,0.2492 0.2663,0.4383 0.529,0.4383 h 0.5372 c 0.2044,0 0.3708,0.1663 0.3708,0.3708 v 0.4135 h 0.2 v -0.4135 c 0,-0.3147 -0.2561,-0.5708 -0.5708,-0.5708 h -0.5372 c -0.1865,0 -0.3383,-0.1518 -0.3383,-0.3383 0,-0.0552 -0.0448,-0.1 -0.1,-0.1 h -0.1757 c -0.3271,0 -0.5933,-0.2662 -0.5933,-0.5933 0,-0.3271 0.2662,-0.5933 0.5933,-0.5933 h 0.3212 c 0.0552,0 0.1,-0.0448 0.1,-0.1 v -0.1073 c 0,-0.3677 0.2992,-0.6668 0.6668,-0.6668 0.0552,0 0.1,-0.0448 0.1,-0.1 v -0.0383 c 1e-4,-0.3516 0.2862,-0.6377 0.6378,-0.6377 0.3516,0 0.6377,0.2861 0.6377,0.6377 v 0.0383 c 0,0.0552 0.0448,0.1 0.1,0.1 h 0.3454 c 0.2576,0 0.4671,0.2095 0.4671,0.467 0,0.0552 0.0448,0.1 0.1,0.1 h 0.3058 c 0.5435,0 0.9856,0.4421 0.9856,0.9855 0,0.0552 0.0448,0.1 0.1,0.1 h 0.2791 c 0.1905,0 0.3455,0.155 0.3455,0.3456 0,0.1906 -0.155,0.3455 -0.3455,0.3455 h -1.4537 c -0.3147,0 -0.5708,0.2561 -0.5708,0.5708 v 0.6034 h 0.2 v -0.6034 c 0,-0.2044 0.1664,-0.3708 0.3708,-0.3708 h 1.4536 c 0.3008,0 0.5455,-0.2447 0.5455,-0.5455 0,-0.3008 -0.2447,-0.5456 -0.5455,-0.5456 h -0.1833 c -0.0509,-0.6071 -0.5613,-1.0855 -1.1814,-1.0855 h -0.2133 c -0.0484,-0.3205 -0.3258,-0.567 -0.6596,-0.567 h -0.2476 c -0.0317,-0.4332 -0.3943,-0.776 -0.8354,-0.776 -0.4431,0 -0.8069,0.3457 -0.8358,0.7815 -0.4319,0.0489 -0.7687,0.4165 -0.7687,0.8613 v 0.0073 h -0.2213 c -0.4375,0 -0.7933,0.3559 -0.7933,0.7933 0,0.4374 0.3559,0.7933 0.7933,0.7933 z" /><path | ||||
|          style="stroke-width:0.1" | ||||
|          inkscape:connector-curvature="0" | ||||
|          id="path4850" | ||||
|          d="m 39.701981,48.224352 v -1.3951 c 0,-0.0552 -0.0448,-0.1 -0.1,-0.1 v 0 c -0.0552,0 -0.1,0.0448 -0.1,0.1 v 1.3951 z" /><path | ||||
|          inkscape:connector-curvature="0" | ||||
|          id="path4844" | ||||
|          d="M 39.024337,48.577149 V 47.632751" | ||||
|          style="fill:none;stroke:#000000;stroke-width:0.2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /></g></g></svg> | ||||
| After Width: | Height: | Size: 5.9 KiB | 
| @ -0,0 +1,108 @@ | ||||
| // Copyright 2020 Thomas Hintz | ||||
| // | ||||
| // This file is part of the Alpha Centauri Farming project. | ||||
| // | ||||
| // The Alpha Centauri Farming project is free software: you can | ||||
| // redistribute it and/or modify it under the terms of the GNU General | ||||
| // Public License as published by the Free Software Foundation, either | ||||
| // version 3 of the License, or (at your option) any later version. | ||||
| // | ||||
| // The Alpha Centauri Farming project is distributed in the hope that | ||||
| // it will be useful, but WITHOUT ANY WARRANTY; without even the | ||||
| // implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR | ||||
| // PURPOSE.  See the GNU General Public License for more details. | ||||
| // | ||||
| // You should have received a copy of the GNU General Public License | ||||
| // along with the Alpha Centauri Farming project.  If not, see | ||||
| // <https://www.gnu.org/licenses/>. | ||||
| 
 | ||||
| import React from 'react' | ||||
| import { GroupBox, Row, Col, Button } from '../widgets.jsx' | ||||
| 
 | ||||
| export default class CreateAccount extends React.Component { | ||||
|     state = { | ||||
|         username: '', | ||||
|         email: '', | ||||
|         password: '', | ||||
|         confirmPassword: '', | ||||
|         loading: false | ||||
|     } | ||||
|     onChange = (e) => { | ||||
|         const target = e.target, | ||||
|               value = target.value, | ||||
|               name =  target.name; | ||||
| 
 | ||||
|         this.setState({ | ||||
|             [name]: value | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
|     onSubmit = (e) => { | ||||
|         e.preventDefault(); | ||||
|         this.setState({ loading: true }); | ||||
|         this.props.createAccount(this.state); | ||||
|     } | ||||
| 
 | ||||
|     componentDidUpdate(prevProps) { | ||||
|         if (this.state.loading && prevProps.errors !== this.props.errors) { | ||||
|             this.setState({ loading: false }); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     render() { | ||||
|         return ( | ||||
|             <GroupBox title="Create Account"> | ||||
|                 <form onSubmit={this.onSubmit}> | ||||
|                     <Row> | ||||
|                         <Col width="12"> | ||||
|                             <label> | ||||
|                                 Username | ||||
|                                 <input onChange={this.onChange} required name="username" type="text" /> | ||||
|                             </label> | ||||
|                         </Col> | ||||
|                     </Row> | ||||
|                     <Row> | ||||
|                         <Col width="12"> | ||||
|                             <label> | ||||
|                                 Email (optional) | ||||
|                                 <input onChange={this.onChange} name="email" type="email" /> | ||||
|                             </label> | ||||
|                         </Col> | ||||
|                     </Row> | ||||
|                     <Row> | ||||
|                         <Col width="12"> | ||||
|                             <label> | ||||
|                                 Password | ||||
|                                 <input onChange={this.onChange} required name="password" type="password" /> | ||||
|                             </label> | ||||
|                         </Col> | ||||
|                     </Row> | ||||
|                     <Row> | ||||
|                         <Col width="12"> | ||||
|                             <label> | ||||
|                                 Confirm Password | ||||
|                                 <input onChange={this.onChange} required name="confirmPassword" type="password" /> | ||||
|                             </label> | ||||
|                         </Col> | ||||
|                     </Row> | ||||
|                     <Row> | ||||
|                         <Col width="12"> | ||||
|                             {!this.state.loading ? ( | ||||
|                                  <> | ||||
|                                      {this.props.errors.map((err, i) => ( | ||||
|                                          <p key={i}> | ||||
|                                              Error: {err} | ||||
|                                          </p> | ||||
|                                      ))} | ||||
|                                      <Button type="submit">Create Account</Button> | ||||
|                                  </> | ||||
|                             ) : ( | ||||
|                                  <span>Creating Account...</span> | ||||
|                             )} | ||||
|                         </Col> | ||||
|                     </Row> | ||||
|                 </form> | ||||
|             </GroupBox> | ||||
|         ); | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,50 @@ | ||||
| // Copyright 2020 Thomas Hintz | ||||
| // | ||||
| // This file is part of the Alpha Centauri Farming project. | ||||
| // | ||||
| // The Alpha Centauri Farming project is free software: you can | ||||
| // redistribute it and/or modify it under the terms of the GNU General | ||||
| // Public License as published by the Free Software Foundation, either | ||||
| // version 3 of the License, or (at your option) any later version. | ||||
| // | ||||
| // The Alpha Centauri Farming project is distributed in the hope that | ||||
| // it will be useful, but WITHOUT ANY WARRANTY; without even the | ||||
| // implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR | ||||
| // PURPOSE.  See the GNU General Public License for more details. | ||||
| // | ||||
| // You should have received a copy of the GNU General Public License | ||||
| // along with the Alpha Centauri Farming project.  If not, see | ||||
| // <https://www.gnu.org/licenses/>. | ||||
| 
 | ||||
| import React from 'react' | ||||
| import { GroupBox, Row, Col, Button } from '../widgets.jsx' | ||||
| 
 | ||||
| import CreateAccount from '../create-account/CreateAccount.jsx'; | ||||
| import Login from '../login/Login.jsx'; | ||||
| 
 | ||||
| export default class LoginOrCreateAccount extends React.Component { | ||||
|     state = { | ||||
|         showLogin: !!this.props.showLogin | ||||
|     } | ||||
| 
 | ||||
|     toggleLogin = (e) => { | ||||
|         e.preventDefault(); | ||||
|         this.setState(state => { return { showLogin: !state.showLogin }; }); | ||||
|     } | ||||
| 
 | ||||
|     render() { | ||||
|         return ( | ||||
|             <> | ||||
|                 {this.state.showLogin ? ( | ||||
|                      <Login errors={this.props.errors} login={this.props.login} /> | ||||
|                 ) : ( | ||||
|                      <CreateAccount errors={this.props.errors} | ||||
|                                     createAccount={this.props.createAccount} /> | ||||
|                 )} | ||||
|                 <div className="center"> | ||||
|                     <a onClick={this.toggleLogin}>{this.state.showLogin ? 'Create Account' : 'Login'}</a> | ||||
|                 </div> | ||||
|             </> | ||||
|         ); | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,90 @@ | ||||
| // Copyright 2020 Thomas Hintz | ||||
| // | ||||
| // This file is part of the Alpha Centauri Farming project. | ||||
| // | ||||
| // The Alpha Centauri Farming project is free software: you can | ||||
| // redistribute it and/or modify it under the terms of the GNU General | ||||
| // Public License as published by the Free Software Foundation, either | ||||
| // version 3 of the License, or (at your option) any later version. | ||||
| // | ||||
| // The Alpha Centauri Farming project is distributed in the hope that | ||||
| // it will be useful, but WITHOUT ANY WARRANTY; without even the | ||||
| // implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR | ||||
| // PURPOSE.  See the GNU General Public License for more details. | ||||
| // | ||||
| // You should have received a copy of the GNU General Public License | ||||
| // along with the Alpha Centauri Farming project.  If not, see | ||||
| // <https://www.gnu.org/licenses/>. | ||||
| 
 | ||||
| import React from 'react' | ||||
| import { GroupBox, Row, Col, Button } from '../widgets.jsx' | ||||
| 
 | ||||
| export default class Login extends React.Component { | ||||
|     state = { | ||||
|         username: '', | ||||
|         password: '', | ||||
|         loading: false | ||||
|     } | ||||
|     onChange = (e) => { | ||||
|         const target = e.target, | ||||
|               value = target.value, | ||||
|               name =  target.name; | ||||
| 
 | ||||
|               this.setState({ | ||||
|             [name]: value | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
|     onSubmit = (e) => { | ||||
|         e.preventDefault(); | ||||
|         this.setState({ loading: true }); | ||||
|         this.props.login(this.state); | ||||
|     } | ||||
| 
 | ||||
|     componentDidUpdate(prevProps) { | ||||
|         if (this.state.loading && prevProps.errors !== this.props.errors) { | ||||
|             this.setState({ loading: false }); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     render() { | ||||
|         return ( | ||||
|             <GroupBox title="Login"> | ||||
|                 <form onSubmit={this.onSubmit}> | ||||
|                     <Row> | ||||
|                         <Col width="12"> | ||||
|                             <label> | ||||
|                                 Username | ||||
|                                 <input onChange={this.onChange} required name="username" type="text" /> | ||||
|                             </label> | ||||
|                         </Col> | ||||
|                     </Row> | ||||
|                     <Row> | ||||
|                         <Col width="12"> | ||||
|                             <label> | ||||
|                                 Password | ||||
|                                 <input onChange={this.onChange} required name="password" type="password" /> | ||||
|                             </label> | ||||
|                         </Col> | ||||
|                     </Row> | ||||
|                     <Row> | ||||
|                         <Col width="12"> | ||||
|                             {!this.state.loading ? ( | ||||
|                                  <> | ||||
|                                      {this.props.errors.map((err, i) => ( | ||||
|                                          <p key={i}> | ||||
|                                              Error: {err} | ||||
|                                          </p> | ||||
|                                      ))} | ||||
|                                      <Button type="submit">Login</Button> | ||||
|                                  </> | ||||
|                             ) : ( | ||||
|                                  <span>Logging in...</span> | ||||
|                             )} | ||||
|                         </Col> | ||||
|                     </Row> | ||||
|                 </form> | ||||
|             </GroupBox> | ||||
|         ); | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,134 @@ | ||||
| (use sql-de-lite crypt) | ||||
| 
 | ||||
| (define *db* "/home/tjhintz/db") | ||||
| 
 | ||||
| (define-syntax with-db | ||||
|   (syntax-rules () | ||||
|     ((_ (var) body ...) | ||||
|      (call-with-database *db* | ||||
|        (lambda (var) | ||||
|          body ...))))) | ||||
| 
 | ||||
| (define (create-tables) | ||||
|   (with-db (db) | ||||
|     (exec (sql db "create table users(id INTEGER PRIMARY KEY, username TEXT, email TEXT, password TEXT, salt TEXT);")) | ||||
|     (exec (sql db "create table sessions(bindings TEXT, session_id TEXT PRIMARY KEY);")) | ||||
|     (exec (sql db "create table games(id INTEGER PRIMARY KEY, status TEXT, object TEXT);")) | ||||
|     (exec (sql db "create table players(id INTEGER PRIMARY KEY, object TEXT);")) | ||||
|     (exec (sql db "create table user_games(user_id INTEGER, game_id INTEGER);")))) | ||||
| 
 | ||||
| (define (db-session-set! sid bindings) | ||||
|   (with-db (db) | ||||
|     (exec (sql db "insert or replace into sessions(bindings, session_id) values (?, ?);") | ||||
|           (with-output-to-string (lambda () (write bindings))) | ||||
|           sid))) | ||||
| 
 | ||||
| (define (db-session-ref sid) | ||||
|   (with-input-from-string | ||||
|       (or (alist-ref | ||||
|            'bindings | ||||
|            (with-db (db) | ||||
|              (query fetch-alist | ||||
|                     (sql db "select * from sessions where session_id=?;") | ||||
|                     sid))) | ||||
|           "#f") | ||||
|     read)) | ||||
| 
 | ||||
| (define (add-user username email password) | ||||
|   (let ((salt (crypt-gensalt))) | ||||
|     (with-db (db) | ||||
|       (exec (sql db "insert into users(username, password, salt, email) values(?, ?, ?, ?);") | ||||
|             username (crypt password salt) salt email) | ||||
|       (last-insert-rowid db)))) | ||||
| 
 | ||||
| (define (fetch-user username) | ||||
|   (with-db (db) | ||||
|     (query fetch-alist | ||||
|            (sql db "select * from users where username=?;") | ||||
|            username))) | ||||
| 
 | ||||
| (define (fetch-user-by-id id) | ||||
|   (with-db (db) | ||||
|     (query fetch-alist | ||||
|            (sql db "select * from users where id=?;") | ||||
|            id))) | ||||
| 
 | ||||
| (define (valid-password? username password) | ||||
|   (and-let* ((user (fetch-user username)) | ||||
|              (_ (if (null? user) | ||||
|                     (begin (crypt password "$2a$12$OW1wyLclJvq.PIxgoHCjdu") | ||||
|                            #f) | ||||
|                     #t))) | ||||
|     (string=? (crypt password (alist-ref 'salt user)) | ||||
|               (alist-ref 'password user)))) | ||||
| 
 | ||||
| (define (alist->string alist) | ||||
|   (with-output-to-string (lambda () (write alist)))) | ||||
| 
 | ||||
| (define (string->alist s) | ||||
|   (with-input-from-string s read)) | ||||
| 
 | ||||
| (define (db-add-game status object) | ||||
|   (with-db (db) | ||||
|     (exec (sql db "insert into games(status, object) values (?, ?);") | ||||
|           status (alist->string object)) | ||||
|     (last-insert-rowid db))) | ||||
| 
 | ||||
| (define (db-update-game id status object) | ||||
|   (with-db (db) | ||||
|     (exec (sql db "replace into games(id, status, object) values (?, ?, ?);") | ||||
|           id status (alist->string object)))) | ||||
| 
 | ||||
| (define (db-fetch-game id) | ||||
|   (string->alist | ||||
|    (with-db (db) | ||||
|      (query fetch-value | ||||
|             (sql db "select object from games where id=?;") | ||||
|             id)))) | ||||
| 
 | ||||
| (define (db-fetch-open-games) | ||||
|   (map | ||||
|    string->alist | ||||
|    (with-db (db) | ||||
|      (query fetch-column | ||||
|             (sql db "select object from games where status=?;") | ||||
|             "pre-game")))) | ||||
| 
 | ||||
| (define (db-fetch-game-row id) | ||||
|   (let ((res | ||||
|          (with-db (db) | ||||
|            (query fetch-alist | ||||
|                   (sql db "select * from games where id=?;") | ||||
|                   id)))) | ||||
|     `((id . ,(alist-ref 'id res)) | ||||
|       (status . ,(alist-ref 'status res)) | ||||
|       (object . ,(string->alist (alist-ref 'object res)))))) | ||||
| 
 | ||||
| (define (db-add-player object) | ||||
|   (with-db (db) | ||||
|     (exec (sql db "insert into players(object) values (?);") | ||||
|           (alist->string object)) | ||||
|     (last-insert-rowid db))) | ||||
| 
 | ||||
| (define (db-update-player id object) | ||||
|   (with-db (db) | ||||
|     (exec (sql db "replace into players(id, object) values (?, ?);") | ||||
|           id (alist->string object)))) | ||||
| 
 | ||||
| (define (db-fetch-player id) | ||||
|   (string->alist | ||||
|    (with-db (db) | ||||
|      (query fetch-value | ||||
|             (sql db "select object from players where id=?;") | ||||
|             id)))) | ||||
| 
 | ||||
| (define (db-add-user-game user-id game-id) | ||||
|   (with-db (db) | ||||
|     (exec (sql db "insert into user_games(user_id, game_id) values (?, ?);") | ||||
|           user-id game-id))) | ||||
| 
 | ||||
| (define (db-fetch-user-games user-id) | ||||
|   (with-db (db) | ||||
|     (query fetch-column | ||||
|            (sql db "select game_id from user_games where user_id=?;") | ||||
|            user-id))) | ||||