diff --git a/images/2025-pydrofoil-ablations.svg b/images/2025-pydrofoil-ablations.svg new file mode 100644 index 000000000..1d164d708 --- /dev/null +++ b/images/2025-pydrofoil-ablations.svg @@ -0,0 +1,594 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="647.999983" height="371.999983" viewBox="0 0 647.999983 371.999983"> +<defs> +<g> +<g id="glyph-0-0"> +<path d="M 2.125 0 L 1.609375 0 L 1.609375 -3 C 1.609375 -3.164062 1.609375 -3.300781 1.609375 -3.40625 C 1.617188 -3.507812 1.628906 -3.617188 1.640625 -3.734375 C 1.578125 -3.671875 1.519531 -3.613281 1.46875 -3.5625 C 1.414062 -3.519531 1.347656 -3.46875 1.265625 -3.40625 L 0.8125 -3.03125 L 0.53125 -3.390625 L 1.6875 -4.28125 L 2.125 -4.28125 Z M 2.125 0 "/> +</g> +<g id="glyph-0-1"> +<path d="M 0.4375 -0.328125 C 0.4375 -0.472656 0.46875 -0.570312 0.53125 -0.625 C 0.601562 -0.6875 0.691406 -0.71875 0.796875 -0.71875 C 0.898438 -0.71875 0.988281 -0.6875 1.0625 -0.625 C 1.132812 -0.570312 1.171875 -0.472656 1.171875 -0.328125 C 1.171875 -0.179688 1.132812 -0.078125 1.0625 -0.015625 C 0.988281 0.046875 0.898438 0.078125 0.796875 0.078125 C 0.691406 0.078125 0.601562 0.046875 0.53125 -0.015625 C 0.46875 -0.078125 0.4375 -0.179688 0.4375 -0.328125 Z M 0.4375 -0.328125 "/> +</g> +<g id="glyph-0-2"> +<path d="M 3.140625 -2.140625 C 3.140625 -1.679688 3.085938 -1.285156 2.984375 -0.953125 C 2.890625 -0.628906 2.738281 -0.378906 2.53125 -0.203125 C 2.320312 -0.0234375 2.046875 0.0625 1.703125 0.0625 C 1.222656 0.0625 0.867188 -0.128906 0.640625 -0.515625 C 0.410156 -0.910156 0.296875 -1.453125 0.296875 -2.140625 C 0.296875 -2.609375 0.34375 -3.003906 0.4375 -3.328125 C 0.53125 -3.660156 0.679688 -3.910156 0.890625 -4.078125 C 1.097656 -4.253906 1.367188 -4.34375 1.703125 -4.34375 C 2.191406 -4.34375 2.550781 -4.148438 2.78125 -3.765625 C 3.019531 -3.378906 3.140625 -2.835938 3.140625 -2.140625 Z M 0.828125 -2.140625 C 0.828125 -1.554688 0.890625 -1.117188 1.015625 -0.828125 C 1.148438 -0.535156 1.378906 -0.390625 1.703125 -0.390625 C 2.023438 -0.390625 2.253906 -0.535156 2.390625 -0.828125 C 2.535156 -1.117188 2.609375 -1.554688 2.609375 -2.140625 C 2.609375 -2.734375 2.535156 -3.175781 2.390625 -3.46875 C 2.253906 -3.757812 2.023438 -3.90625 1.703125 -3.90625 C 1.378906 -3.90625 1.148438 -3.757812 1.015625 -3.46875 C 0.890625 -3.175781 0.828125 -2.734375 0.828125 -2.140625 Z M 0.828125 -2.140625 "/> +</g> +<g id="glyph-0-3"> +<path d="M 3.125 0 L 0.28125 0 L 0.28125 -0.4375 L 1.40625 -1.578125 C 1.625 -1.785156 1.804688 -1.972656 1.953125 -2.140625 C 2.097656 -2.316406 2.207031 -2.484375 2.28125 -2.640625 C 2.363281 -2.804688 2.40625 -2.984375 2.40625 -3.171875 C 2.40625 -3.410156 2.332031 -3.585938 2.1875 -3.703125 C 2.050781 -3.828125 1.875 -3.890625 1.65625 -3.890625 C 1.445312 -3.890625 1.257812 -3.851562 1.09375 -3.78125 C 0.9375 -3.707031 0.78125 -3.609375 0.625 -3.484375 L 0.34375 -3.84375 C 0.507812 -3.976562 0.695312 -4.09375 0.90625 -4.1875 C 1.125 -4.289062 1.375 -4.34375 1.65625 -4.34375 C 2.050781 -4.34375 2.363281 -4.238281 2.59375 -4.03125 C 2.832031 -3.832031 2.953125 -3.554688 2.953125 -3.203125 C 2.953125 -2.984375 2.90625 -2.773438 2.8125 -2.578125 C 2.71875 -2.378906 2.585938 -2.179688 2.421875 -1.984375 C 2.253906 -1.796875 2.0625 -1.597656 1.84375 -1.390625 L 0.953125 -0.5 L 0.953125 -0.484375 L 3.125 -0.484375 Z M 3.125 0 "/> +</g> +<g id="glyph-0-4"> +<path d="M 1.65625 -2.625 C 2.09375 -2.625 2.441406 -2.515625 2.703125 -2.296875 C 2.960938 -2.078125 3.09375 -1.769531 3.09375 -1.375 C 3.09375 -0.925781 2.953125 -0.570312 2.671875 -0.3125 C 2.390625 -0.0625 1.992188 0.0625 1.484375 0.0625 C 1.265625 0.0625 1.054688 0.0390625 0.859375 0 C 0.671875 -0.0390625 0.507812 -0.0976562 0.375 -0.171875 L 0.375 -0.671875 C 0.519531 -0.585938 0.695312 -0.519531 0.90625 -0.46875 C 1.113281 -0.414062 1.3125 -0.390625 1.5 -0.390625 C 1.8125 -0.390625 2.0625 -0.460938 2.25 -0.609375 C 2.445312 -0.765625 2.546875 -1 2.546875 -1.3125 C 2.546875 -1.59375 2.457031 -1.804688 2.28125 -1.953125 C 2.113281 -2.109375 1.84375 -2.1875 1.46875 -2.1875 C 1.363281 -2.1875 1.238281 -2.175781 1.09375 -2.15625 C 0.945312 -2.132812 0.832031 -2.113281 0.75 -2.09375 L 0.484375 -2.265625 L 0.640625 -4.28125 L 2.796875 -4.28125 L 2.796875 -3.796875 L 1.09375 -3.796875 L 0.984375 -2.5625 C 1.054688 -2.570312 1.148438 -2.582031 1.265625 -2.59375 C 1.378906 -2.613281 1.507812 -2.625 1.65625 -2.625 Z M 1.65625 -2.625 "/> +</g> +<g id="glyph-0-5"> +<path d="M 0.328125 -1.828125 C 0.328125 -2.140625 0.351562 -2.441406 0.40625 -2.734375 C 0.457031 -3.035156 0.554688 -3.304688 0.703125 -3.546875 C 0.847656 -3.785156 1.046875 -3.976562 1.296875 -4.125 C 1.554688 -4.269531 1.890625 -4.34375 2.296875 -4.34375 C 2.378906 -4.34375 2.46875 -4.335938 2.5625 -4.328125 C 2.664062 -4.316406 2.75 -4.304688 2.8125 -4.296875 L 2.8125 -3.84375 C 2.75 -3.863281 2.671875 -3.878906 2.578125 -3.890625 C 2.484375 -3.898438 2.390625 -3.90625 2.296875 -3.90625 C 2.023438 -3.90625 1.796875 -3.859375 1.609375 -3.765625 C 1.429688 -3.679688 1.285156 -3.554688 1.171875 -3.390625 C 1.066406 -3.234375 0.988281 -3.050781 0.9375 -2.84375 C 0.894531 -2.632812 0.867188 -2.410156 0.859375 -2.171875 L 0.890625 -2.171875 C 0.984375 -2.316406 1.113281 -2.4375 1.28125 -2.53125 C 1.445312 -2.632812 1.65625 -2.6875 1.90625 -2.6875 C 2.28125 -2.6875 2.582031 -2.570312 2.8125 -2.34375 C 3.039062 -2.113281 3.15625 -1.789062 3.15625 -1.375 C 3.15625 -0.925781 3.03125 -0.570312 2.78125 -0.3125 C 2.53125 -0.0625 2.195312 0.0625 1.78125 0.0625 C 1.507812 0.0625 1.265625 -0.00390625 1.046875 -0.140625 C 0.828125 -0.273438 0.648438 -0.484375 0.515625 -0.765625 C 0.390625 -1.046875 0.328125 -1.398438 0.328125 -1.828125 Z M 1.78125 -0.390625 C 2.03125 -0.390625 2.234375 -0.46875 2.390625 -0.625 C 2.546875 -0.789062 2.625 -1.039062 2.625 -1.375 C 2.625 -1.644531 2.554688 -1.859375 2.421875 -2.015625 C 2.285156 -2.179688 2.078125 -2.265625 1.796875 -2.265625 C 1.609375 -2.265625 1.441406 -2.222656 1.296875 -2.140625 C 1.160156 -2.066406 1.050781 -1.96875 0.96875 -1.84375 C 0.894531 -1.726562 0.859375 -1.609375 0.859375 -1.484375 C 0.859375 -1.304688 0.890625 -1.132812 0.953125 -0.96875 C 1.023438 -0.800781 1.128906 -0.660156 1.265625 -0.546875 C 1.398438 -0.441406 1.570312 -0.390625 1.78125 -0.390625 Z M 1.78125 -0.390625 "/> +</g> +<g id="glyph-0-6"> +<path d="M 1.703125 -4.34375 C 2.085938 -4.34375 2.398438 -4.253906 2.640625 -4.078125 C 2.878906 -3.898438 3 -3.644531 3 -3.3125 C 3 -3.144531 2.957031 -2.992188 2.875 -2.859375 C 2.800781 -2.734375 2.703125 -2.617188 2.578125 -2.515625 C 2.460938 -2.421875 2.328125 -2.335938 2.171875 -2.265625 C 2.347656 -2.179688 2.507812 -2.085938 2.65625 -1.984375 C 2.800781 -1.878906 2.914062 -1.753906 3 -1.609375 C 3.082031 -1.472656 3.125 -1.304688 3.125 -1.109375 C 3.125 -0.742188 3 -0.457031 2.75 -0.25 C 2.5 -0.0390625 2.160156 0.0625 1.734375 0.0625 C 1.265625 0.0625 0.90625 -0.0351562 0.65625 -0.234375 C 0.414062 -0.441406 0.296875 -0.726562 0.296875 -1.09375 C 0.296875 -1.289062 0.335938 -1.457031 0.421875 -1.59375 C 0.503906 -1.738281 0.613281 -1.863281 0.75 -1.96875 C 0.882812 -2.070312 1.03125 -2.160156 1.1875 -2.234375 C 0.976562 -2.359375 0.800781 -2.503906 0.65625 -2.671875 C 0.507812 -2.835938 0.4375 -3.054688 0.4375 -3.328125 C 0.4375 -3.546875 0.488281 -3.726562 0.59375 -3.875 C 0.707031 -4.03125 0.859375 -4.144531 1.046875 -4.21875 C 1.242188 -4.300781 1.460938 -4.34375 1.703125 -4.34375 Z M 1.703125 -3.921875 C 1.484375 -3.921875 1.300781 -3.863281 1.15625 -3.75 C 1.019531 -3.644531 0.953125 -3.492188 0.953125 -3.296875 C 0.953125 -3.148438 0.984375 -3.023438 1.046875 -2.921875 C 1.117188 -2.828125 1.210938 -2.742188 1.328125 -2.671875 C 1.453125 -2.597656 1.585938 -2.53125 1.734375 -2.46875 C 1.941406 -2.5625 2.113281 -2.664062 2.25 -2.78125 C 2.394531 -2.90625 2.46875 -3.078125 2.46875 -3.296875 C 2.46875 -3.492188 2.394531 -3.644531 2.25 -3.75 C 2.113281 -3.863281 1.929688 -3.921875 1.703125 -3.921875 Z M 0.8125 -1.09375 C 0.8125 -0.882812 0.882812 -0.707031 1.03125 -0.5625 C 1.175781 -0.425781 1.40625 -0.359375 1.71875 -0.359375 C 2.007812 -0.359375 2.226562 -0.425781 2.375 -0.5625 C 2.53125 -0.707031 2.609375 -0.890625 2.609375 -1.109375 C 2.609375 -1.316406 2.523438 -1.488281 2.359375 -1.625 C 2.203125 -1.757812 1.988281 -1.878906 1.71875 -1.984375 L 1.625 -2.015625 C 1.351562 -1.910156 1.148438 -1.785156 1.015625 -1.640625 C 0.878906 -1.492188 0.8125 -1.3125 0.8125 -1.09375 Z M 0.8125 -1.09375 "/> +</g> +<g id="glyph-0-7"> +<path d="M 2.953125 -3.28125 C 2.953125 -2.988281 2.875 -2.757812 2.71875 -2.59375 C 2.5625 -2.425781 2.34375 -2.3125 2.0625 -2.25 L 2.0625 -2.234375 C 2.414062 -2.191406 2.675781 -2.082031 2.84375 -1.90625 C 3.007812 -1.726562 3.09375 -1.5 3.09375 -1.21875 C 3.09375 -0.96875 3.03125 -0.742188 2.90625 -0.546875 C 2.789062 -0.359375 2.613281 -0.207031 2.375 -0.09375 C 2.132812 0.0078125 1.828125 0.0625 1.453125 0.0625 C 1.222656 0.0625 1.007812 0.0390625 0.8125 0 C 0.625 -0.03125 0.441406 -0.0859375 0.265625 -0.171875 L 0.265625 -0.671875 C 0.453125 -0.578125 0.644531 -0.503906 0.84375 -0.453125 C 1.050781 -0.410156 1.253906 -0.390625 1.453125 -0.390625 C 1.835938 -0.390625 2.113281 -0.460938 2.28125 -0.609375 C 2.445312 -0.753906 2.53125 -0.960938 2.53125 -1.234375 C 2.53125 -1.492188 2.425781 -1.679688 2.21875 -1.796875 C 2.007812 -1.921875 1.71875 -1.984375 1.34375 -1.984375 L 0.921875 -1.984375 L 0.921875 -2.4375 L 1.34375 -2.4375 C 1.695312 -2.4375 1.960938 -2.507812 2.140625 -2.65625 C 2.328125 -2.800781 2.421875 -3 2.421875 -3.25 C 2.421875 -3.457031 2.347656 -3.617188 2.203125 -3.734375 C 2.066406 -3.847656 1.878906 -3.90625 1.640625 -3.90625 C 1.410156 -3.90625 1.210938 -3.867188 1.046875 -3.796875 C 0.878906 -3.734375 0.71875 -3.648438 0.5625 -3.546875 L 0.296875 -3.90625 C 0.441406 -4.019531 0.628906 -4.117188 0.859375 -4.203125 C 1.085938 -4.296875 1.34375 -4.34375 1.625 -4.34375 C 2.070312 -4.34375 2.40625 -4.242188 2.625 -4.046875 C 2.84375 -3.847656 2.953125 -3.59375 2.953125 -3.28125 Z M 2.953125 -3.28125 "/> +</g> +<g id="glyph-0-8"> +<path d="M 3.125 -2.453125 C 3.125 -2.140625 3.09375 -1.832031 3.03125 -1.53125 C 2.976562 -1.238281 2.878906 -0.972656 2.734375 -0.734375 C 2.597656 -0.492188 2.398438 -0.300781 2.140625 -0.15625 C 1.890625 -0.0078125 1.5625 0.0625 1.15625 0.0625 C 1.070312 0.0625 0.976562 0.0546875 0.875 0.046875 C 0.769531 0.0351562 0.679688 0.0195312 0.609375 0 L 0.609375 -0.453125 C 0.765625 -0.398438 0.941406 -0.375 1.140625 -0.375 C 1.421875 -0.375 1.648438 -0.414062 1.828125 -0.5 C 2.015625 -0.59375 2.160156 -0.71875 2.265625 -0.875 C 2.378906 -1.039062 2.457031 -1.226562 2.5 -1.4375 C 2.550781 -1.644531 2.582031 -1.863281 2.59375 -2.09375 L 2.546875 -2.09375 C 2.460938 -1.957031 2.335938 -1.84375 2.171875 -1.75 C 2.003906 -1.65625 1.789062 -1.609375 1.53125 -1.609375 C 1.164062 -1.609375 0.867188 -1.71875 0.640625 -1.9375 C 0.410156 -2.164062 0.296875 -2.484375 0.296875 -2.890625 C 0.296875 -3.191406 0.351562 -3.453125 0.46875 -3.671875 C 0.582031 -3.890625 0.738281 -4.054688 0.9375 -4.171875 C 1.144531 -4.285156 1.390625 -4.34375 1.671875 -4.34375 C 1.941406 -4.34375 2.1875 -4.273438 2.40625 -4.140625 C 2.625 -4.003906 2.796875 -3.796875 2.921875 -3.515625 C 3.054688 -3.234375 3.125 -2.878906 3.125 -2.453125 Z M 1.671875 -3.90625 C 1.421875 -3.90625 1.21875 -3.820312 1.0625 -3.65625 C 0.90625 -3.488281 0.828125 -3.238281 0.828125 -2.90625 C 0.828125 -2.625 0.890625 -2.40625 1.015625 -2.25 C 1.148438 -2.09375 1.359375 -2.015625 1.640625 -2.015625 C 1.835938 -2.015625 2.003906 -2.050781 2.140625 -2.125 C 2.285156 -2.207031 2.394531 -2.304688 2.46875 -2.421875 C 2.550781 -2.546875 2.59375 -2.671875 2.59375 -2.796875 C 2.59375 -2.972656 2.554688 -3.144531 2.484375 -3.3125 C 2.410156 -3.476562 2.304688 -3.617188 2.171875 -3.734375 C 2.035156 -3.847656 1.867188 -3.90625 1.671875 -3.90625 Z M 1.671875 -3.90625 "/> +</g> +<g id="glyph-0-9"> +<path d="M 3.3125 -0.96875 L 2.6875 -0.96875 L 2.6875 0 L 2.171875 0 L 2.171875 -0.96875 L 0.125 -0.96875 L 0.125 -1.421875 L 2.140625 -4.3125 L 2.6875 -4.3125 L 2.6875 -1.453125 L 3.3125 -1.453125 Z M 2.171875 -2.796875 C 2.171875 -3.003906 2.175781 -3.179688 2.1875 -3.328125 C 2.195312 -3.472656 2.203125 -3.613281 2.203125 -3.75 L 2.1875 -3.75 C 2.15625 -3.664062 2.113281 -3.578125 2.0625 -3.484375 C 2.007812 -3.398438 1.960938 -3.332031 1.921875 -3.28125 L 0.640625 -1.453125 L 2.171875 -1.453125 Z M 2.171875 -2.796875 "/> +</g> +<g id="glyph-1-0"> +<path d="M -4.375 -2.71875 C -4.375 -3.25 -4.1875 -3.675781 -3.8125 -4 C -3.445312 -4.320312 -2.894531 -4.484375 -2.15625 -4.484375 C -1.425781 -4.484375 -0.867188 -4.320312 -0.484375 -4 C -0.109375 -3.675781 0.078125 -3.25 0.078125 -2.71875 C 0.078125 -2.382812 0.015625 -2.109375 -0.109375 -1.890625 C -0.234375 -1.671875 -0.378906 -1.503906 -0.546875 -1.390625 L -0.546875 -1.34375 C -0.453125 -1.351562 -0.332031 -1.363281 -0.1875 -1.375 C -0.0507812 -1.382812 0.0625 -1.390625 0.15625 -1.390625 L 1.921875 -1.390625 L 1.921875 -0.6875 L -4.28125 -0.6875 L -4.28125 -1.25 L -3.703125 -1.359375 L -3.703125 -1.390625 C -3.890625 -1.515625 -4.046875 -1.679688 -4.171875 -1.890625 C -4.304688 -2.097656 -4.375 -2.375 -4.375 -2.71875 Z M -3.78125 -2.59375 C -3.78125 -2.15625 -3.65625 -1.847656 -3.40625 -1.671875 C -3.164062 -1.492188 -2.789062 -1.398438 -2.28125 -1.390625 L -2.15625 -1.390625 C -1.625 -1.390625 -1.210938 -1.472656 -0.921875 -1.640625 C -0.640625 -1.816406 -0.5 -2.140625 -0.5 -2.609375 C -0.5 -2.867188 -0.570312 -3.082031 -0.71875 -3.25 C -0.863281 -3.414062 -1.0625 -3.539062 -1.3125 -3.625 C -1.5625 -3.707031 -1.84375 -3.75 -2.15625 -3.75 C -2.644531 -3.75 -3.035156 -3.65625 -3.328125 -3.46875 C -3.628906 -3.28125 -3.78125 -2.988281 -3.78125 -2.59375 Z M -3.78125 -2.59375 "/> +</g> +<g id="glyph-1-1"> +<path d="M -4.28125 -0.015625 L -4.28125 -0.765625 L -1.84375 -1.6875 C -1.632812 -1.769531 -1.429688 -1.84375 -1.234375 -1.90625 C -1.035156 -1.96875 -0.851562 -2.015625 -0.6875 -2.046875 L -0.6875 -2.078125 C -0.8125 -2.109375 -0.984375 -2.160156 -1.203125 -2.234375 C -1.421875 -2.304688 -1.640625 -2.378906 -1.859375 -2.453125 L -4.28125 -3.3125 L -4.28125 -4.078125 L 0.59375 -2.234375 C 1 -2.085938 1.320312 -1.894531 1.5625 -1.65625 C 1.800781 -1.414062 1.921875 -1.085938 1.921875 -0.671875 C 1.921875 -0.546875 1.910156 -0.429688 1.890625 -0.328125 C 1.878906 -0.234375 1.867188 -0.15625 1.859375 -0.09375 L 1.296875 -0.09375 C 1.304688 -0.144531 1.316406 -0.210938 1.328125 -0.296875 C 1.335938 -0.378906 1.34375 -0.46875 1.34375 -0.5625 C 1.34375 -0.800781 1.269531 -1 1.125 -1.15625 C 0.988281 -1.3125 0.804688 -1.429688 0.578125 -1.515625 L 0.015625 -1.734375 Z M -4.28125 -0.015625 "/> +</g> +<g id="glyph-1-2"> +<path d="M 0.078125 -2.203125 C 0.078125 -1.671875 -0.101562 -1.242188 -0.46875 -0.921875 C -0.84375 -0.597656 -1.398438 -0.4375 -2.140625 -0.4375 C -2.867188 -0.4375 -3.421875 -0.597656 -3.796875 -0.921875 C -4.179688 -1.242188 -4.375 -1.671875 -4.375 -2.203125 C -4.375 -2.535156 -4.3125 -2.804688 -4.1875 -3.015625 C -4.0625 -3.234375 -3.910156 -3.40625 -3.734375 -3.53125 L -3.734375 -3.578125 C -3.804688 -3.578125 -3.910156 -3.566406 -4.046875 -3.546875 C -4.179688 -3.535156 -4.289062 -3.53125 -4.375 -3.53125 L -6.078125 -3.53125 L -6.078125 -4.234375 L 0 -4.234375 L 0 -3.671875 L -0.578125 -3.5625 L -0.578125 -3.53125 C -0.390625 -3.40625 -0.234375 -3.234375 -0.109375 -3.015625 C 0.015625 -2.804688 0.078125 -2.535156 0.078125 -2.203125 Z M -0.5 -2.3125 C -0.5 -2.757812 -0.625 -3.078125 -0.875 -3.265625 C -1.125 -3.453125 -1.5 -3.546875 -2 -3.546875 L -2.125 -3.546875 C -2.65625 -3.546875 -3.0625 -3.457031 -3.34375 -3.28125 C -3.632812 -3.101562 -3.78125 -2.773438 -3.78125 -2.296875 C -3.78125 -1.921875 -3.628906 -1.640625 -3.328125 -1.453125 C -3.023438 -1.265625 -2.625 -1.171875 -2.125 -1.171875 C -1.613281 -1.171875 -1.210938 -1.265625 -0.921875 -1.453125 C -0.640625 -1.640625 -0.5 -1.925781 -0.5 -2.3125 Z M -0.5 -2.3125 "/> +</g> +<g id="glyph-1-3"> +<path d="M -4.375 -2.6875 C -4.375 -2.757812 -4.367188 -2.84375 -4.359375 -2.9375 C -4.347656 -3.03125 -4.332031 -3.113281 -4.3125 -3.1875 L -3.671875 -3.09375 C -3.691406 -3.019531 -3.707031 -2.941406 -3.71875 -2.859375 C -3.726562 -2.785156 -3.734375 -2.707031 -3.734375 -2.625 C -3.734375 -2.40625 -3.671875 -2.203125 -3.546875 -2.015625 C -3.429688 -1.828125 -3.265625 -1.675781 -3.046875 -1.5625 C -2.828125 -1.445312 -2.570312 -1.390625 -2.28125 -1.390625 L 0 -1.390625 L 0 -0.6875 L -4.28125 -0.6875 L -4.28125 -1.25 L -3.5 -1.34375 L -3.5 -1.375 C -3.738281 -1.507812 -3.941406 -1.6875 -4.109375 -1.90625 C -4.285156 -2.125 -4.375 -2.382812 -4.375 -2.6875 Z M -4.375 -2.6875 "/> +</g> +<g id="glyph-1-4"> +<path d="M -2.15625 -4.40625 C -1.445312 -4.40625 -0.894531 -4.222656 -0.5 -3.859375 C -0.113281 -3.503906 0.078125 -3.019531 0.078125 -2.40625 C 0.078125 -2.03125 -0.00390625 -1.691406 -0.171875 -1.390625 C -0.347656 -1.097656 -0.601562 -0.863281 -0.9375 -0.6875 C -1.269531 -0.519531 -1.675781 -0.4375 -2.15625 -0.4375 C -2.863281 -0.4375 -3.410156 -0.613281 -3.796875 -0.96875 C -4.179688 -1.332031 -4.375 -1.820312 -4.375 -2.4375 C -4.375 -2.820312 -4.285156 -3.160156 -4.109375 -3.453125 C -3.929688 -3.753906 -3.675781 -3.988281 -3.34375 -4.15625 C -3.019531 -4.320312 -2.625 -4.40625 -2.15625 -4.40625 Z M -2.15625 -1.171875 C -1.644531 -1.171875 -1.238281 -1.269531 -0.9375 -1.46875 C -0.644531 -1.664062 -0.5 -1.984375 -0.5 -2.421875 C -0.5 -2.859375 -0.644531 -3.175781 -0.9375 -3.375 C -1.238281 -3.582031 -1.644531 -3.6875 -2.15625 -3.6875 C -2.65625 -3.6875 -3.050781 -3.582031 -3.34375 -3.375 C -3.632812 -3.175781 -3.78125 -2.859375 -3.78125 -2.421875 C -3.78125 -1.984375 -3.632812 -1.664062 -3.34375 -1.46875 C -3.050781 -1.269531 -2.65625 -1.171875 -2.15625 -1.171875 Z M -2.15625 -1.171875 "/> +</g> +<g id="glyph-1-5"> +<path d="M -3.75 -2.65625 L -3.75 -1.578125 L 0 -1.578125 L 0 -0.875 L -3.75 -0.875 L -3.75 -0.125 L -4.078125 -0.125 L -4.3125 -0.875 L -4.5625 -0.875 C -5.113281 -0.875 -5.507812 -0.992188 -5.75 -1.234375 C -6 -1.484375 -6.125 -1.828125 -6.125 -2.265625 C -6.125 -2.429688 -6.109375 -2.582031 -6.078125 -2.71875 C -6.046875 -2.863281 -6.007812 -2.988281 -5.96875 -3.09375 L -5.421875 -2.90625 C -5.453125 -2.820312 -5.476562 -2.722656 -5.5 -2.609375 C -5.53125 -2.503906 -5.546875 -2.390625 -5.546875 -2.265625 C -5.546875 -2.035156 -5.46875 -1.863281 -5.3125 -1.75 C -5.15625 -1.632812 -4.90625 -1.578125 -4.5625 -1.578125 L -4.28125 -1.578125 L -4.28125 -2.65625 Z M -3.75 -2.65625 "/> +</g> +<g id="glyph-1-6"> +<path d="M -5.890625 -1.046875 C -5.890625 -1.148438 -5.851562 -1.242188 -5.78125 -1.328125 C -5.71875 -1.410156 -5.609375 -1.453125 -5.453125 -1.453125 C -5.296875 -1.453125 -5.179688 -1.410156 -5.109375 -1.328125 C -5.035156 -1.242188 -5 -1.148438 -5 -1.046875 C -5 -0.921875 -5.035156 -0.816406 -5.109375 -0.734375 C -5.179688 -0.660156 -5.296875 -0.625 -5.453125 -0.625 C -5.609375 -0.625 -5.71875 -0.660156 -5.78125 -0.734375 C -5.851562 -0.816406 -5.890625 -0.921875 -5.890625 -1.046875 Z M -4.28125 -1.390625 L 0 -1.390625 L 0 -0.6875 L -4.28125 -0.6875 Z M -4.28125 -1.390625 "/> +</g> +<g id="glyph-1-7"> +<path d="M 0 -1.390625 L 0 -0.6875 L -6.078125 -0.6875 L -6.078125 -1.390625 Z M 0 -1.390625 "/> +</g> +<g id="glyph-1-8"> +<path d="M -1.828125 -0.3125 L -2.453125 -0.3125 L -2.453125 -2.25 L -1.828125 -2.25 Z M -1.828125 -0.3125 "/> +</g> +<g id="glyph-1-9"> +<path d="M -4.28125 -4.265625 L 0 -4.265625 L 0 -3.6875 L -0.5625 -3.578125 L -0.5625 -3.546875 C -0.34375 -3.410156 -0.179688 -3.21875 -0.078125 -2.96875 C 0.0234375 -2.726562 0.078125 -2.46875 0.078125 -2.1875 C 0.078125 -1.675781 -0.0390625 -1.285156 -0.28125 -1.015625 C -0.53125 -0.753906 -0.929688 -0.625 -1.484375 -0.625 L -4.28125 -0.625 L -4.28125 -1.34375 L -1.53125 -1.34375 C -0.84375 -1.34375 -0.5 -1.660156 -0.5 -2.296875 C -0.5 -2.773438 -0.628906 -3.101562 -0.890625 -3.28125 C -1.160156 -3.46875 -1.550781 -3.5625 -2.0625 -3.5625 L -4.28125 -3.5625 Z M -4.28125 -4.265625 "/> +</g> +<g id="glyph-1-10"> +<path d="M -4.375 -2.75 C -4.375 -3.257812 -4.25 -3.644531 -4 -3.90625 C -3.75 -4.164062 -3.347656 -4.296875 -2.796875 -4.296875 L 0 -4.296875 L 0 -3.59375 L -2.75 -3.59375 C -3.4375 -3.59375 -3.78125 -3.273438 -3.78125 -2.640625 C -3.78125 -2.160156 -3.644531 -1.832031 -3.375 -1.65625 C -3.101562 -1.476562 -2.71875 -1.390625 -2.21875 -1.390625 L 0 -1.390625 L 0 -0.6875 L -4.28125 -0.6875 L -4.28125 -1.25 L -3.703125 -1.359375 L -3.703125 -1.390625 C -3.929688 -1.523438 -4.097656 -1.71875 -4.203125 -1.96875 C -4.316406 -2.21875 -4.375 -2.476562 -4.375 -2.75 Z M -4.375 -2.75 "/> +</g> +<g id="glyph-1-11"> +<path d="M -4.375 -5.390625 C -4.375 -5.867188 -4.25 -6.226562 -4 -6.46875 C -3.75 -6.707031 -3.347656 -6.828125 -2.796875 -6.828125 L 0 -6.828125 L 0 -6.140625 L -2.765625 -6.140625 C -3.441406 -6.140625 -3.78125 -5.847656 -3.78125 -5.265625 C -3.78125 -4.847656 -3.660156 -4.550781 -3.421875 -4.375 C -3.179688 -4.195312 -2.832031 -4.109375 -2.375 -4.109375 L 0 -4.109375 L 0 -3.40625 L -2.765625 -3.40625 C -3.441406 -3.40625 -3.78125 -3.113281 -3.78125 -2.53125 C -3.78125 -2.09375 -3.644531 -1.789062 -3.375 -1.625 C -3.101562 -1.46875 -2.71875 -1.390625 -2.21875 -1.390625 L 0 -1.390625 L 0 -0.6875 L -4.28125 -0.6875 L -4.28125 -1.25 L -3.703125 -1.359375 L -3.703125 -1.390625 C -3.929688 -1.523438 -4.097656 -1.703125 -4.203125 -1.921875 C -4.316406 -2.148438 -4.375 -2.394531 -4.375 -2.65625 C -4.375 -3.320312 -4.128906 -3.757812 -3.640625 -3.96875 L -3.640625 -4.015625 C -3.890625 -4.148438 -4.070312 -4.34375 -4.1875 -4.59375 C -4.3125 -4.84375 -4.375 -5.109375 -4.375 -5.390625 Z M -4.375 -5.390625 "/> +</g> +<g id="glyph-1-12"> +<path d="M -4.375 -2.34375 C -4.375 -2.707031 -4.289062 -3.019531 -4.125 -3.28125 C -3.96875 -3.550781 -3.742188 -3.753906 -3.453125 -3.890625 C -3.160156 -4.035156 -2.820312 -4.109375 -2.4375 -4.109375 L -2.015625 -4.109375 L -2.015625 -1.171875 C -1.523438 -1.179688 -1.148438 -1.300781 -0.890625 -1.53125 C -0.640625 -1.769531 -0.515625 -2.101562 -0.515625 -2.53125 C -0.515625 -2.800781 -0.539062 -3.039062 -0.59375 -3.25 C -0.644531 -3.46875 -0.71875 -3.6875 -0.8125 -3.90625 L -0.203125 -3.90625 C -0.109375 -3.6875 -0.0390625 -3.46875 0 -3.25 C 0.0507812 -3.039062 0.078125 -2.789062 0.078125 -2.5 C 0.078125 -2.09375 -0.00390625 -1.734375 -0.171875 -1.421875 C -0.335938 -1.109375 -0.582031 -0.863281 -0.90625 -0.6875 C -1.238281 -0.519531 -1.640625 -0.4375 -2.109375 -0.4375 C -2.578125 -0.4375 -2.976562 -0.515625 -3.3125 -0.671875 C -3.65625 -0.828125 -3.914062 -1.046875 -4.09375 -1.328125 C -4.28125 -1.617188 -4.375 -1.957031 -4.375 -2.34375 Z M -3.796875 -2.328125 C -3.796875 -1.992188 -3.6875 -1.726562 -3.46875 -1.53125 C -3.25 -1.332031 -2.945312 -1.21875 -2.5625 -1.1875 L -2.5625 -3.375 C -2.925781 -3.363281 -3.222656 -3.273438 -3.453125 -3.109375 C -3.679688 -2.941406 -3.796875 -2.679688 -3.796875 -2.328125 Z M -3.796875 -2.328125 "/> +</g> +<g id="glyph-1-13"> +<path d="M -0.5 -2.109375 C -0.5 -2.210938 -0.503906 -2.320312 -0.515625 -2.4375 C -0.535156 -2.550781 -0.554688 -2.644531 -0.578125 -2.71875 L -0.046875 -2.71875 C -0.00390625 -2.632812 0.0234375 -2.523438 0.046875 -2.390625 C 0.0664062 -2.253906 0.078125 -2.117188 0.078125 -1.984375 C 0.078125 -1.765625 0.0390625 -1.5625 -0.03125 -1.375 C -0.113281 -1.1875 -0.25 -1.03125 -0.4375 -0.90625 C -0.632812 -0.789062 -0.90625 -0.734375 -1.25 -0.734375 L -3.75 -0.734375 L -3.75 -0.125 L -4.078125 -0.125 L -4.359375 -0.75 L -5.265625 -1.03125 L -5.265625 -1.4375 L -4.28125 -1.4375 L -4.28125 -2.6875 L -3.75 -2.6875 L -3.75 -1.4375 L -1.265625 -1.4375 C -1.003906 -1.4375 -0.8125 -1.5 -0.6875 -1.625 C -0.5625 -1.75 -0.5 -1.910156 -0.5 -2.109375 Z M -0.5 -2.109375 "/> +</g> +<g id="glyph-1-14"> +<path d="M -4.359375 -2.296875 C -4.359375 -2.828125 -4.242188 -3.21875 -4.015625 -3.46875 C -3.785156 -3.71875 -3.421875 -3.84375 -2.921875 -3.84375 L 0 -3.84375 L 0 -3.328125 L -0.609375 -3.1875 L -0.609375 -3.15625 C -0.367188 -2.96875 -0.191406 -2.769531 -0.078125 -2.5625 C 0.0234375 -2.363281 0.078125 -2.082031 0.078125 -1.71875 C 0.078125 -1.332031 -0.0195312 -1.007812 -0.21875 -0.75 C -0.425781 -0.5 -0.75 -0.375 -1.1875 -0.375 C -1.613281 -0.375 -1.941406 -0.539062 -2.171875 -0.875 C -2.410156 -1.207031 -2.539062 -1.722656 -2.5625 -2.421875 L -2.578125 -3.15625 L -2.84375 -3.15625 C -3.195312 -3.15625 -3.441406 -3.078125 -3.578125 -2.921875 C -3.722656 -2.765625 -3.796875 -2.546875 -3.796875 -2.265625 C -3.796875 -2.035156 -3.757812 -1.816406 -3.6875 -1.609375 C -3.625 -1.410156 -3.550781 -1.226562 -3.46875 -1.0625 L -3.984375 -0.84375 C -4.085938 -1.03125 -4.175781 -1.25 -4.25 -1.5 C -4.320312 -1.757812 -4.359375 -2.023438 -4.359375 -2.296875 Z M -2.078125 -2.515625 C -2.054688 -1.984375 -1.96875 -1.613281 -1.8125 -1.40625 C -1.664062 -1.195312 -1.457031 -1.09375 -1.1875 -1.09375 C -0.945312 -1.09375 -0.769531 -1.164062 -0.65625 -1.3125 C -0.539062 -1.457031 -0.484375 -1.644531 -0.484375 -1.875 C -0.484375 -2.238281 -0.582031 -2.539062 -0.78125 -2.78125 C -0.988281 -3.019531 -1.300781 -3.140625 -1.71875 -3.140625 L -2.09375 -3.140625 Z M -2.078125 -2.515625 "/> +</g> +<g id="glyph-1-15"> +<path d="M -4.59375 -1.390625 C -4.414062 -1.390625 -4.25 -1.382812 -4.09375 -1.375 C -3.9375 -1.363281 -3.8125 -1.351562 -3.71875 -1.34375 L -3.71875 -1.390625 C -3.894531 -1.503906 -4.046875 -1.664062 -4.171875 -1.875 C -4.296875 -2.09375 -4.359375 -2.375 -4.359375 -2.71875 C -4.359375 -3.25 -4.171875 -3.675781 -3.796875 -4 C -3.429688 -4.320312 -2.878906 -4.484375 -2.140625 -4.484375 C -1.410156 -4.484375 -0.859375 -4.316406 -0.484375 -3.984375 C -0.109375 -3.660156 0.078125 -3.238281 0.078125 -2.71875 C 0.078125 -2.375 0.0195312 -2.09375 -0.09375 -1.875 C -0.21875 -1.664062 -0.367188 -1.503906 -0.546875 -1.390625 L -0.546875 -1.328125 L 0 -1.1875 L 0 -0.6875 L -6.078125 -0.6875 L -6.078125 -1.390625 Z M -3.78125 -2.59375 C -3.78125 -2.132812 -3.644531 -1.816406 -3.375 -1.640625 C -3.113281 -1.472656 -2.710938 -1.390625 -2.171875 -1.390625 L -2.140625 -1.390625 C -1.609375 -1.390625 -1.203125 -1.472656 -0.921875 -1.640625 C -0.640625 -1.816406 -0.5 -2.140625 -0.5 -2.609375 C -0.5 -2.992188 -0.640625 -3.28125 -0.921875 -3.46875 C -1.210938 -3.65625 -1.625 -3.75 -2.15625 -3.75 C -3.238281 -3.75 -3.78125 -3.363281 -3.78125 -2.59375 Z M -3.78125 -2.59375 "/> +</g> +<g id="glyph-1-16"> +<path d="M -5.453125 -0.625 C -5.609375 -0.625 -5.71875 -0.660156 -5.78125 -0.734375 C -5.851562 -0.816406 -5.890625 -0.921875 -5.890625 -1.046875 C -5.890625 -1.148438 -5.851562 -1.242188 -5.78125 -1.328125 C -5.71875 -1.410156 -5.609375 -1.453125 -5.453125 -1.453125 C -5.296875 -1.453125 -5.179688 -1.410156 -5.109375 -1.328125 C -5.035156 -1.242188 -5 -1.148438 -5 -1.046875 C -5 -0.921875 -5.035156 -0.816406 -5.109375 -0.734375 C -5.179688 -0.660156 -5.296875 -0.625 -5.453125 -0.625 Z M 1.921875 -0.171875 C 1.921875 -0.0351562 1.910156 0.078125 1.890625 0.171875 C 1.867188 0.273438 1.847656 0.363281 1.828125 0.4375 L 1.25 0.4375 C 1.269531 0.351562 1.289062 0.269531 1.3125 0.1875 C 1.332031 0.101562 1.34375 0.0078125 1.34375 -0.09375 C 1.34375 -0.257812 1.296875 -0.398438 1.203125 -0.515625 C 1.109375 -0.628906 0.925781 -0.6875 0.65625 -0.6875 L -4.28125 -0.6875 L -4.28125 -1.390625 L 0.640625 -1.390625 C 1.035156 -1.390625 1.347656 -1.289062 1.578125 -1.09375 C 1.804688 -0.90625 1.921875 -0.597656 1.921875 -0.171875 Z M 1.921875 -0.171875 "/> +</g> +<g id="glyph-1-17"> +<path d="M 0 -1.625 L -4.28125 0 L -4.28125 -0.75 L -1.765625 -1.65625 C -1.640625 -1.707031 -1.503906 -1.753906 -1.359375 -1.796875 C -1.222656 -1.847656 -1.085938 -1.890625 -0.953125 -1.921875 C -0.828125 -1.960938 -0.71875 -1.992188 -0.625 -2.015625 L -0.625 -2.046875 C -0.71875 -2.066406 -0.828125 -2.09375 -0.953125 -2.125 C -1.085938 -2.164062 -1.226562 -2.210938 -1.375 -2.265625 C -1.519531 -2.316406 -1.648438 -2.363281 -1.765625 -2.40625 L -4.28125 -3.3125 L -4.28125 -4.0625 L 0 -2.4375 Z M 0 -1.625 "/> +</g> +<g id="glyph-1-18"> +<path d="M -1.1875 -3.46875 C -0.769531 -3.46875 -0.453125 -3.3125 -0.234375 -3 C -0.0234375 -2.695312 0.078125 -2.285156 0.078125 -1.765625 C 0.078125 -1.460938 0.0507812 -1.203125 0 -0.984375 C -0.0390625 -0.765625 -0.101562 -0.578125 -0.1875 -0.421875 L -0.828125 -0.421875 C -0.742188 -0.585938 -0.664062 -0.789062 -0.59375 -1.03125 C -0.519531 -1.28125 -0.484375 -1.53125 -0.484375 -1.78125 C -0.484375 -2.132812 -0.539062 -2.390625 -0.65625 -2.546875 C -0.769531 -2.710938 -0.925781 -2.796875 -1.125 -2.796875 C -1.226562 -2.796875 -1.320312 -2.765625 -1.40625 -2.703125 C -1.488281 -2.640625 -1.570312 -2.53125 -1.65625 -2.375 C -1.75 -2.226562 -1.847656 -2.015625 -1.953125 -1.734375 C -2.054688 -1.453125 -2.160156 -1.210938 -2.265625 -1.015625 C -2.378906 -0.828125 -2.507812 -0.675781 -2.65625 -0.5625 C -2.800781 -0.457031 -2.992188 -0.40625 -3.234375 -0.40625 C -3.597656 -0.40625 -3.878906 -0.550781 -4.078125 -0.84375 C -4.273438 -1.144531 -4.375 -1.535156 -4.375 -2.015625 C -4.375 -2.273438 -4.347656 -2.519531 -4.296875 -2.75 C -4.242188 -2.976562 -4.171875 -3.191406 -4.078125 -3.390625 L -3.515625 -3.140625 C -3.585938 -2.960938 -3.648438 -2.773438 -3.703125 -2.578125 C -3.765625 -2.378906 -3.796875 -2.175781 -3.796875 -1.96875 C -3.796875 -1.675781 -3.75 -1.453125 -3.65625 -1.296875 C -3.5625 -1.148438 -3.429688 -1.078125 -3.265625 -1.078125 C -3.148438 -1.078125 -3.050781 -1.109375 -2.96875 -1.171875 C -2.882812 -1.242188 -2.800781 -1.363281 -2.71875 -1.53125 C -2.644531 -1.695312 -2.554688 -1.914062 -2.453125 -2.1875 C -2.347656 -2.457031 -2.242188 -2.6875 -2.140625 -2.875 C -2.035156 -3.070312 -1.90625 -3.21875 -1.75 -3.3125 C -1.601562 -3.414062 -1.414062 -3.46875 -1.1875 -3.46875 Z M -1.1875 -3.46875 "/> +</g> +<g id="glyph-1-19"> +<path d="M 0.078125 -2.40625 C 0.078125 -2.019531 0 -1.675781 -0.15625 -1.375 C -0.3125 -1.082031 -0.550781 -0.851562 -0.875 -0.6875 C -1.195312 -0.519531 -1.613281 -0.4375 -2.125 -0.4375 C -2.644531 -0.4375 -3.070312 -0.523438 -3.40625 -0.703125 C -3.738281 -0.878906 -3.984375 -1.117188 -4.140625 -1.421875 C -4.296875 -1.722656 -4.375 -2.066406 -4.375 -2.453125 C -4.375 -2.671875 -4.347656 -2.878906 -4.296875 -3.078125 C -4.253906 -3.285156 -4.203125 -3.453125 -4.140625 -3.578125 L -3.546875 -3.359375 C -3.597656 -3.234375 -3.644531 -3.082031 -3.6875 -2.90625 C -3.726562 -2.738281 -3.75 -2.582031 -3.75 -2.4375 C -3.75 -1.59375 -3.207031 -1.171875 -2.125 -1.171875 C -1.613281 -1.171875 -1.21875 -1.269531 -0.9375 -1.46875 C -0.664062 -1.675781 -0.53125 -1.984375 -0.53125 -2.390625 C -0.53125 -2.628906 -0.550781 -2.835938 -0.59375 -3.015625 C -0.644531 -3.191406 -0.707031 -3.351562 -0.78125 -3.5 L -0.15625 -3.5 C -0.0820312 -3.351562 -0.0234375 -3.191406 0.015625 -3.015625 C 0.0546875 -2.847656 0.078125 -2.644531 0.078125 -2.40625 Z M 0.078125 -2.40625 "/> +</g> +<g id="glyph-2-0"> +<path d="M 2.84375 0 L 2.15625 0 L 2.15625 -3.984375 C 2.15625 -4.222656 2.15625 -4.410156 2.15625 -4.546875 C 2.164062 -4.679688 2.175781 -4.820312 2.1875 -4.96875 C 2.101562 -4.882812 2.023438 -4.8125 1.953125 -4.75 C 1.878906 -4.695312 1.789062 -4.625 1.6875 -4.53125 L 1.078125 -4.046875 L 0.71875 -4.515625 L 2.25 -5.71875 L 2.84375 -5.71875 Z M 2.84375 0 "/> +</g> +<g id="glyph-2-1"> +<path d="M 0.578125 -0.4375 C 0.578125 -0.632812 0.625 -0.769531 0.71875 -0.84375 C 0.8125 -0.925781 0.925781 -0.96875 1.0625 -0.96875 C 1.195312 -0.96875 1.3125 -0.925781 1.40625 -0.84375 C 1.507812 -0.769531 1.5625 -0.632812 1.5625 -0.4375 C 1.5625 -0.238281 1.507812 -0.0976562 1.40625 -0.015625 C 1.3125 0.0664062 1.195312 0.109375 1.0625 0.109375 C 0.925781 0.109375 0.8125 0.0664062 0.71875 -0.015625 C 0.625 -0.0976562 0.578125 -0.238281 0.578125 -0.4375 Z M 0.578125 -0.4375 "/> +</g> +<g id="glyph-2-2"> +<path d="M 4.1875 -2.859375 C 4.1875 -2.242188 4.117188 -1.71875 3.984375 -1.28125 C 3.859375 -0.84375 3.65625 -0.503906 3.375 -0.265625 C 3.101562 -0.0351562 2.738281 0.078125 2.28125 0.078125 C 1.632812 0.078125 1.15625 -0.179688 0.84375 -0.703125 C 0.539062 -1.222656 0.390625 -1.941406 0.390625 -2.859375 C 0.390625 -3.484375 0.453125 -4.015625 0.578125 -4.453125 C 0.703125 -4.890625 0.898438 -5.222656 1.171875 -5.453125 C 1.453125 -5.679688 1.820312 -5.796875 2.28125 -5.796875 C 2.914062 -5.796875 3.390625 -5.535156 3.703125 -5.015625 C 4.023438 -4.503906 4.1875 -3.785156 4.1875 -2.859375 Z M 1.09375 -2.859375 C 1.09375 -2.078125 1.179688 -1.488281 1.359375 -1.09375 C 1.535156 -0.707031 1.84375 -0.515625 2.28125 -0.515625 C 2.707031 -0.515625 3.007812 -0.707031 3.1875 -1.09375 C 3.375 -1.488281 3.46875 -2.078125 3.46875 -2.859375 C 3.46875 -3.640625 3.375 -4.222656 3.1875 -4.609375 C 3.007812 -5.003906 2.707031 -5.203125 2.28125 -5.203125 C 1.84375 -5.203125 1.535156 -5.003906 1.359375 -4.609375 C 1.179688 -4.222656 1.09375 -3.640625 1.09375 -2.859375 Z M 1.09375 -2.859375 "/> +</g> +<g id="glyph-3-0"> +<path d="M -1.484375 -4.34375 C -0.960938 -4.34375 -0.566406 -4.148438 -0.296875 -3.765625 C -0.0351562 -3.378906 0.09375 -2.859375 0.09375 -2.203125 C 0.09375 -1.828125 0.0625 -1.503906 0 -1.234375 C -0.0507812 -0.960938 -0.128906 -0.722656 -0.234375 -0.515625 L -1.046875 -0.515625 C -0.929688 -0.734375 -0.828125 -0.992188 -0.734375 -1.296875 C -0.648438 -1.597656 -0.609375 -1.90625 -0.609375 -2.21875 C -0.609375 -2.664062 -0.679688 -2.988281 -0.828125 -3.1875 C -0.972656 -3.382812 -1.164062 -3.484375 -1.40625 -3.484375 C -1.53125 -3.484375 -1.644531 -3.445312 -1.75 -3.375 C -1.863281 -3.300781 -1.972656 -3.171875 -2.078125 -2.984375 C -2.179688 -2.796875 -2.300781 -2.523438 -2.4375 -2.171875 C -2.570312 -1.828125 -2.707031 -1.53125 -2.84375 -1.28125 C -2.976562 -1.03125 -3.132812 -0.835938 -3.3125 -0.703125 C -3.5 -0.578125 -3.742188 -0.515625 -4.046875 -0.515625 C -4.492188 -0.515625 -4.835938 -0.695312 -5.078125 -1.0625 C -5.328125 -1.4375 -5.453125 -1.921875 -5.453125 -2.515625 C -5.453125 -2.847656 -5.421875 -3.15625 -5.359375 -3.4375 C -5.296875 -3.71875 -5.207031 -3.984375 -5.09375 -4.234375 L -4.40625 -3.9375 C -4.5 -3.707031 -4.578125 -3.46875 -4.640625 -3.21875 C -4.703125 -2.96875 -4.734375 -2.710938 -4.734375 -2.453125 C -4.734375 -2.097656 -4.675781 -1.820312 -4.5625 -1.625 C -4.445312 -1.4375 -4.289062 -1.34375 -4.09375 -1.34375 C -3.945312 -1.34375 -3.820312 -1.382812 -3.71875 -1.46875 C -3.613281 -1.5625 -3.507812 -1.707031 -3.40625 -1.90625 C -3.3125 -2.113281 -3.195312 -2.390625 -3.0625 -2.734375 C -2.9375 -3.066406 -2.804688 -3.351562 -2.671875 -3.59375 C -2.546875 -3.832031 -2.382812 -4.015625 -2.1875 -4.140625 C -2 -4.273438 -1.765625 -4.34375 -1.484375 -4.34375 Z M -1.484375 -4.34375 "/> +</g> +<g id="glyph-3-1"> +<path d="M 0 -1.734375 L 0 -0.84375 L -7.59375 -0.84375 L -7.59375 -1.734375 Z M 0 -1.734375 "/> +</g> +<g id="glyph-3-2"> +<path d="M -2.6875 -5.515625 C -1.800781 -5.515625 -1.113281 -5.285156 -0.625 -4.828125 C -0.144531 -4.378906 0.09375 -3.773438 0.09375 -3.015625 C 0.09375 -2.535156 -0.0078125 -2.109375 -0.21875 -1.734375 C -0.4375 -1.367188 -0.753906 -1.078125 -1.171875 -0.859375 C -1.585938 -0.648438 -2.09375 -0.546875 -2.6875 -0.546875 C -3.570312 -0.546875 -4.253906 -0.769531 -4.734375 -1.21875 C -5.210938 -1.664062 -5.453125 -2.273438 -5.453125 -3.046875 C -5.453125 -3.523438 -5.34375 -3.945312 -5.125 -4.3125 C -4.914062 -4.6875 -4.601562 -4.976562 -4.1875 -5.1875 C -3.78125 -5.40625 -3.28125 -5.515625 -2.6875 -5.515625 Z M -2.6875 -1.453125 C -2.050781 -1.453125 -1.546875 -1.578125 -1.171875 -1.828125 C -0.804688 -2.078125 -0.625 -2.476562 -0.625 -3.03125 C -0.625 -3.570312 -0.804688 -3.96875 -1.171875 -4.21875 C -1.546875 -4.46875 -2.050781 -4.59375 -2.6875 -4.59375 C -3.320312 -4.59375 -3.816406 -4.46875 -4.171875 -4.21875 C -4.535156 -3.96875 -4.71875 -3.566406 -4.71875 -3.015625 C -4.71875 -2.472656 -4.535156 -2.078125 -4.171875 -1.828125 C -3.816406 -1.578125 -3.320312 -1.453125 -2.6875 -1.453125 Z M -2.6875 -1.453125 "/> +</g> +<g id="glyph-3-3"> +<path d="M -3.03125 -4.3125 C -3.300781 -4.226562 -3.566406 -4.148438 -3.828125 -4.078125 C -4.097656 -4.015625 -4.304688 -3.96875 -4.453125 -3.9375 L -4.453125 -3.90625 C -4.304688 -3.875 -4.097656 -3.828125 -3.828125 -3.765625 C -3.566406 -3.710938 -3.296875 -3.640625 -3.015625 -3.546875 L -0.015625 -2.578125 L -0.015625 -1.578125 L -5.375 -0.109375 L -5.375 -1.015625 L -2.515625 -1.765625 C -2.222656 -1.835938 -1.929688 -1.90625 -1.640625 -1.96875 C -1.347656 -2.03125 -1.101562 -2.078125 -0.90625 -2.109375 L -0.90625 -2.15625 C -1.019531 -2.175781 -1.160156 -2.203125 -1.328125 -2.234375 C -1.492188 -2.273438 -1.664062 -2.316406 -1.84375 -2.359375 C -2.03125 -2.410156 -2.195312 -2.460938 -2.34375 -2.515625 L -5.375 -3.453125 L -5.375 -4.421875 L -2.34375 -5.34375 C -2.125 -5.414062 -1.878906 -5.484375 -1.609375 -5.546875 C -1.335938 -5.617188 -1.109375 -5.671875 -0.921875 -5.703125 L -0.921875 -5.734375 C -1.085938 -5.753906 -1.316406 -5.800781 -1.609375 -5.875 C -1.898438 -5.945312 -2.203125 -6.019531 -2.515625 -6.09375 L -5.375 -6.84375 L -5.375 -7.75 L -0.015625 -6.265625 L -0.015625 -5.234375 Z M -3.03125 -4.3125 "/> +</g> +<g id="glyph-3-4"> +<path d="M 0.09375 -2.75 C 0.09375 -2.082031 -0.132812 -1.546875 -0.59375 -1.140625 C -1.0625 -0.742188 -1.753906 -0.546875 -2.671875 -0.546875 C -3.585938 -0.546875 -4.28125 -0.75 -4.75 -1.15625 C -5.21875 -1.5625 -5.453125 -2.097656 -5.453125 -2.765625 C -5.453125 -3.171875 -5.375 -3.503906 -5.21875 -3.765625 C -5.070312 -4.035156 -4.890625 -4.253906 -4.671875 -4.421875 L -4.671875 -4.484375 C -4.753906 -4.472656 -4.878906 -4.457031 -5.046875 -4.4375 C -5.222656 -4.425781 -5.359375 -4.421875 -5.453125 -4.421875 L -7.59375 -4.421875 L -7.59375 -5.296875 L 0 -5.296875 L 0 -4.59375 L -0.71875 -4.453125 L -0.71875 -4.421875 C -0.488281 -4.265625 -0.296875 -4.050781 -0.140625 -3.78125 C 0.015625 -3.507812 0.09375 -3.164062 0.09375 -2.75 Z M -0.625 -2.890625 C -0.625 -3.453125 -0.78125 -3.847656 -1.09375 -4.078125 C -1.40625 -4.316406 -1.875 -4.4375 -2.5 -4.4375 L -2.65625 -4.4375 C -3.320312 -4.4375 -3.832031 -4.320312 -4.1875 -4.09375 C -4.550781 -3.875 -4.734375 -3.46875 -4.734375 -2.875 C -4.734375 -2.40625 -4.539062 -2.050781 -4.15625 -1.8125 C -3.78125 -1.570312 -3.28125 -1.453125 -2.65625 -1.453125 C -2.007812 -1.453125 -1.507812 -1.570312 -1.15625 -1.8125 C -0.800781 -2.050781 -0.625 -2.410156 -0.625 -2.890625 Z M -0.625 -2.890625 "/> +</g> +<g id="glyph-3-5"> +<path d="M -5.453125 -3.4375 C -5.453125 -4.070312 -5.296875 -4.550781 -4.984375 -4.875 C -4.679688 -5.207031 -4.179688 -5.375 -3.484375 -5.375 L 0 -5.375 L 0 -4.5 L -3.4375 -4.5 C -4.289062 -4.5 -4.71875 -4.097656 -4.71875 -3.296875 C -4.71875 -2.703125 -4.550781 -2.289062 -4.21875 -2.0625 C -3.882812 -1.84375 -3.40625 -1.734375 -2.78125 -1.734375 L 0 -1.734375 L 0 -0.84375 L -5.359375 -0.84375 L -5.359375 -1.5625 L -4.625 -1.6875 L -4.625 -1.734375 C -4.90625 -1.910156 -5.113281 -2.148438 -5.25 -2.453125 C -5.382812 -2.765625 -5.453125 -3.09375 -5.453125 -3.4375 Z M -5.453125 -3.4375 "/> +</g> +<g id="glyph-3-6"> +</g> +<g id="glyph-3-7"> +<path d="M 0 -2.03125 L -5.359375 0 L -5.359375 -0.9375 L -2.203125 -2.078125 C -2.054688 -2.128906 -1.890625 -2.1875 -1.703125 -2.25 C -1.523438 -2.3125 -1.351562 -2.363281 -1.1875 -2.40625 C -1.03125 -2.457031 -0.894531 -2.492188 -0.78125 -2.515625 L -0.78125 -2.546875 C -0.894531 -2.578125 -1.035156 -2.613281 -1.203125 -2.65625 C -1.367188 -2.707031 -1.539062 -2.765625 -1.71875 -2.828125 C -1.894531 -2.898438 -2.054688 -2.957031 -2.203125 -3 L -5.359375 -4.140625 L -5.359375 -5.078125 L 0 -3.046875 Z M 0 -2.03125 "/> +</g> +<g id="glyph-3-8"> +<path d="M -5.453125 -2.921875 C -5.453125 -3.378906 -5.351562 -3.769531 -5.15625 -4.09375 C -4.957031 -4.425781 -4.675781 -4.679688 -4.3125 -4.859375 C -3.945312 -5.035156 -3.523438 -5.125 -3.046875 -5.125 L -2.515625 -5.125 L -2.515625 -1.453125 C -1.898438 -1.472656 -1.4375 -1.628906 -1.125 -1.921875 C -0.8125 -2.222656 -0.65625 -2.640625 -0.65625 -3.171875 C -0.65625 -3.515625 -0.6875 -3.816406 -0.75 -4.078125 C -0.8125 -4.335938 -0.898438 -4.609375 -1.015625 -4.890625 L -0.25 -4.890625 C -0.125 -4.617188 -0.0351562 -4.347656 0.015625 -4.078125 C 0.0664062 -3.816406 0.09375 -3.5 0.09375 -3.125 C 0.09375 -2.625 -0.00390625 -2.175781 -0.203125 -1.78125 C -0.410156 -1.394531 -0.71875 -1.09375 -1.125 -0.875 C -1.539062 -0.65625 -2.046875 -0.546875 -2.640625 -0.546875 C -3.222656 -0.546875 -3.722656 -0.644531 -4.140625 -0.84375 C -4.566406 -1.039062 -4.890625 -1.316406 -5.109375 -1.671875 C -5.335938 -2.023438 -5.453125 -2.441406 -5.453125 -2.921875 Z M -4.734375 -2.90625 C -4.734375 -2.488281 -4.597656 -2.15625 -4.328125 -1.90625 C -4.066406 -1.664062 -3.691406 -1.523438 -3.203125 -1.484375 L -3.203125 -4.203125 C -3.660156 -4.203125 -4.03125 -4.097656 -4.3125 -3.890625 C -4.59375 -3.679688 -4.734375 -3.351562 -4.734375 -2.90625 Z M -4.734375 -2.90625 "/> +</g> +<g id="glyph-3-9"> +<path d="M -5.453125 -3.34375 C -5.453125 -3.445312 -5.445312 -3.554688 -5.4375 -3.671875 C -5.4375 -3.785156 -5.425781 -3.890625 -5.40625 -3.984375 L -4.59375 -3.875 C -4.613281 -3.78125 -4.628906 -3.679688 -4.640625 -3.578125 C -4.648438 -3.484375 -4.65625 -3.390625 -4.65625 -3.296875 C -4.65625 -3.015625 -4.578125 -2.753906 -4.421875 -2.515625 C -4.273438 -2.273438 -4.066406 -2.082031 -3.796875 -1.9375 C -3.535156 -1.800781 -3.222656 -1.734375 -2.859375 -1.734375 L 0 -1.734375 L 0 -0.84375 L -5.359375 -0.84375 L -5.359375 -1.5625 L -4.375 -1.671875 L -4.375 -1.703125 C -4.664062 -1.878906 -4.914062 -2.101562 -5.125 -2.375 C -5.34375 -2.65625 -5.453125 -2.976562 -5.453125 -3.34375 Z M -5.453125 -3.34375 "/> +</g> +<g id="glyph-3-10"> +<path d="M -5.453125 -3.40625 C -5.453125 -4.0625 -5.222656 -4.585938 -4.765625 -4.984375 C -4.304688 -5.390625 -3.613281 -5.59375 -2.6875 -5.59375 C -1.769531 -5.59375 -1.078125 -5.390625 -0.609375 -4.984375 C -0.140625 -4.585938 0.09375 -4.054688 0.09375 -3.390625 C 0.09375 -2.972656 0.015625 -2.628906 -0.140625 -2.359375 C -0.296875 -2.085938 -0.476562 -1.878906 -0.6875 -1.734375 L -0.6875 -1.671875 C -0.570312 -1.679688 -0.425781 -1.691406 -0.25 -1.703125 C -0.0703125 -1.722656 0.078125 -1.734375 0.203125 -1.734375 L 2.40625 -1.734375 L 2.40625 -0.84375 L -5.359375 -0.84375 L -5.359375 -1.5625 L -4.625 -1.6875 L -4.625 -1.734375 C -4.863281 -1.890625 -5.0625 -2.097656 -5.21875 -2.359375 C -5.375 -2.617188 -5.453125 -2.96875 -5.453125 -3.40625 Z M -4.71875 -3.234375 C -4.71875 -2.691406 -4.5625 -2.304688 -4.25 -2.078125 C -3.945312 -1.859375 -3.484375 -1.742188 -2.859375 -1.734375 L -2.6875 -1.734375 C -2.03125 -1.734375 -1.519531 -1.835938 -1.15625 -2.046875 C -0.800781 -2.265625 -0.625 -2.671875 -0.625 -3.265625 C -0.625 -3.585938 -0.710938 -3.851562 -0.890625 -4.0625 C -1.078125 -4.269531 -1.320312 -4.425781 -1.625 -4.53125 C -1.9375 -4.632812 -2.296875 -4.6875 -2.703125 -4.6875 C -3.316406 -4.6875 -3.804688 -4.566406 -4.171875 -4.328125 C -4.535156 -4.097656 -4.71875 -3.734375 -4.71875 -3.234375 Z M -4.71875 -3.234375 "/> +</g> +<g id="glyph-3-11"> +<path d="M -5.359375 -0.015625 L -5.359375 -0.953125 L -2.3125 -2.109375 C -2.039062 -2.210938 -1.785156 -2.300781 -1.546875 -2.375 C -1.304688 -2.457031 -1.070312 -2.519531 -0.84375 -2.5625 L -0.84375 -2.59375 C -1.007812 -2.632812 -1.226562 -2.695312 -1.5 -2.78125 C -1.769531 -2.875 -2.039062 -2.96875 -2.3125 -3.0625 L -5.359375 -4.15625 L -5.359375 -5.09375 L 0.734375 -2.796875 C 1.242188 -2.609375 1.648438 -2.363281 1.953125 -2.0625 C 2.253906 -1.769531 2.40625 -1.363281 2.40625 -0.84375 C 2.40625 -0.675781 2.394531 -0.53125 2.375 -0.40625 C 2.351562 -0.289062 2.332031 -0.191406 2.3125 -0.109375 L 1.625 -0.109375 C 1.632812 -0.179688 1.644531 -0.269531 1.65625 -0.375 C 1.675781 -0.476562 1.6875 -0.585938 1.6875 -0.703125 C 1.6875 -1.003906 1.597656 -1.25 1.421875 -1.4375 C 1.242188 -1.632812 1.015625 -1.785156 0.734375 -1.890625 L 0.015625 -2.171875 Z M -5.359375 -0.015625 "/> +</g> +<g id="glyph-3-12"> +<path d="M -4.6875 -3.3125 L -4.6875 -1.96875 L 0 -1.96875 L 0 -1.09375 L -4.6875 -1.09375 L -4.6875 -0.15625 L -5.09375 -0.15625 L -5.390625 -1.09375 L -5.703125 -1.09375 C -6.390625 -1.09375 -6.882812 -1.242188 -7.1875 -1.546875 C -7.5 -1.859375 -7.65625 -2.285156 -7.65625 -2.828125 C -7.65625 -3.046875 -7.632812 -3.242188 -7.59375 -3.421875 C -7.5625 -3.597656 -7.519531 -3.75 -7.46875 -3.875 L -6.78125 -3.640625 C -6.8125 -3.535156 -6.84375 -3.410156 -6.875 -3.265625 C -6.914062 -3.128906 -6.9375 -2.988281 -6.9375 -2.84375 C -6.9375 -2.550781 -6.835938 -2.332031 -6.640625 -2.1875 C -6.441406 -2.039062 -6.128906 -1.96875 -5.703125 -1.96875 L -5.359375 -1.96875 L -5.359375 -3.3125 Z M -4.6875 -3.3125 "/> +</g> +<g id="glyph-3-13"> +<path d="M -7.375 -1.296875 C -7.375 -1.429688 -7.328125 -1.550781 -7.234375 -1.65625 C -7.140625 -1.757812 -7 -1.8125 -6.8125 -1.8125 C -6.625 -1.8125 -6.484375 -1.757812 -6.390625 -1.65625 C -6.296875 -1.550781 -6.25 -1.429688 -6.25 -1.296875 C -6.25 -1.148438 -6.296875 -1.023438 -6.390625 -0.921875 C -6.484375 -0.828125 -6.625 -0.78125 -6.8125 -0.78125 C -7 -0.78125 -7.140625 -0.828125 -7.234375 -0.921875 C -7.328125 -1.023438 -7.375 -1.148438 -7.375 -1.296875 Z M -5.359375 -1.734375 L 0 -1.734375 L 0 -0.84375 L -5.359375 -0.84375 Z M -5.359375 -1.734375 "/> +</g> +<g id="glyph-3-14"> +<path d="M -2.296875 -0.40625 L -3.0625 -0.40625 L -3.0625 -2.8125 L -2.296875 -2.8125 Z M -2.296875 -0.40625 "/> +</g> +<g id="glyph-3-15"> +<path d="M -5.359375 -5.328125 L 0 -5.328125 L 0 -4.609375 L -0.703125 -4.484375 L -0.703125 -4.4375 C -0.429688 -4.269531 -0.226562 -4.03125 -0.09375 -3.71875 C 0.03125 -3.414062 0.09375 -3.085938 0.09375 -2.734375 C 0.09375 -2.085938 -0.0546875 -1.601562 -0.359375 -1.28125 C -0.671875 -0.957031 -1.164062 -0.796875 -1.84375 -0.796875 L -5.359375 -0.796875 L -5.359375 -1.6875 L -1.90625 -1.6875 C -1.050781 -1.6875 -0.625 -2.082031 -0.625 -2.875 C -0.625 -3.46875 -0.789062 -3.878906 -1.125 -4.109375 C -1.457031 -4.335938 -1.9375 -4.453125 -2.5625 -4.453125 L -5.359375 -4.453125 Z M -5.359375 -5.328125 "/> +</g> +<g id="glyph-4-0"> +<path d="M 3.8125 -8.5625 C 4.914062 -8.5625 5.722656 -8.320312 6.234375 -7.84375 C 6.742188 -7.375 7 -6.722656 7 -5.890625 C 7 -5.390625 6.894531 -4.921875 6.6875 -4.484375 C 6.476562 -4.054688 6.128906 -3.707031 5.640625 -3.4375 C 5.160156 -3.175781 4.503906 -3.046875 3.671875 -3.046875 L 2.890625 -3.046875 L 2.890625 0 L 1.078125 0 L 1.078125 -8.5625 Z M 3.71875 -7.078125 L 2.890625 -7.078125 L 2.890625 -4.53125 L 3.484375 -4.53125 C 4.003906 -4.53125 4.410156 -4.628906 4.703125 -4.828125 C 5.003906 -5.035156 5.15625 -5.367188 5.15625 -5.828125 C 5.15625 -6.660156 4.675781 -7.078125 3.71875 -7.078125 Z M 3.71875 -7.078125 "/> +</g> +<g id="glyph-4-1"> +<path d="M 0 -6.546875 L 1.953125 -6.546875 L 3.1875 -2.875 C 3.25 -2.695312 3.296875 -2.515625 3.328125 -2.328125 C 3.367188 -2.140625 3.394531 -1.941406 3.40625 -1.734375 L 3.4375 -1.734375 C 3.46875 -1.941406 3.503906 -2.140625 3.546875 -2.328125 C 3.585938 -2.515625 3.640625 -2.695312 3.703125 -2.875 L 4.90625 -6.546875 L 6.828125 -6.546875 L 4.0625 0.84375 C 3.8125 1.519531 3.445312 2.023438 2.96875 2.359375 C 2.488281 2.703125 1.9375 2.875 1.3125 2.875 C 1.113281 2.875 0.941406 2.863281 0.796875 2.84375 C 0.648438 2.820312 0.519531 2.800781 0.40625 2.78125 L 0.40625 1.375 C 0.5 1.382812 0.601562 1.394531 0.71875 1.40625 C 0.84375 1.425781 0.972656 1.4375 1.109375 1.4375 C 1.492188 1.4375 1.796875 1.320312 2.015625 1.09375 C 2.234375 0.863281 2.394531 0.59375 2.5 0.28125 L 2.609375 -0.046875 Z M 0 -6.546875 "/> +</g> +<g id="glyph-4-2"> +<path d="M 3.015625 0.125 C 2.285156 0.125 1.691406 -0.160156 1.234375 -0.734375 C 0.773438 -1.304688 0.546875 -2.148438 0.546875 -3.265625 C 0.546875 -4.378906 0.773438 -5.222656 1.234375 -5.796875 C 1.703125 -6.378906 2.3125 -6.671875 3.0625 -6.671875 C 3.53125 -6.671875 3.914062 -6.578125 4.21875 -6.390625 C 4.53125 -6.210938 4.769531 -5.988281 4.9375 -5.71875 L 5 -5.71875 C 4.976562 -5.84375 4.953125 -6.023438 4.921875 -6.265625 C 4.890625 -6.515625 4.875 -6.765625 4.875 -7.015625 L 4.875 -9.125 L 6.65625 -9.125 L 6.65625 0 L 5.296875 0 L 4.9375 -0.859375 L 4.875 -0.859375 C 4.695312 -0.578125 4.457031 -0.34375 4.15625 -0.15625 C 3.863281 0.03125 3.484375 0.125 3.015625 0.125 Z M 3.640625 -1.3125 C 4.128906 -1.3125 4.472656 -1.457031 4.671875 -1.75 C 4.878906 -2.039062 4.984375 -2.476562 4.984375 -3.0625 L 4.984375 -3.25 C 4.984375 -3.894531 4.882812 -4.382812 4.6875 -4.71875 C 4.5 -5.050781 4.140625 -5.21875 3.609375 -5.21875 C 3.222656 -5.21875 2.914062 -5.046875 2.6875 -4.703125 C 2.46875 -4.367188 2.359375 -3.878906 2.359375 -3.234375 C 2.359375 -2.597656 2.46875 -2.117188 2.6875 -1.796875 C 2.914062 -1.472656 3.234375 -1.3125 3.640625 -1.3125 Z M 3.640625 -1.3125 "/> +</g> +<g id="glyph-4-3"> +<path d="M 4.59375 -6.671875 C 4.6875 -6.671875 4.789062 -6.664062 4.90625 -6.65625 C 5.03125 -6.644531 5.128906 -6.632812 5.203125 -6.625 L 5.0625 -4.9375 C 5.007812 -4.957031 4.925781 -4.972656 4.8125 -4.984375 C 4.707031 -4.992188 4.613281 -5 4.53125 -5 C 4.226562 -5 3.9375 -4.945312 3.65625 -4.84375 C 3.375 -4.738281 3.144531 -4.5625 2.96875 -4.3125 C 2.800781 -4.070312 2.71875 -3.75 2.71875 -3.34375 L 2.71875 0 L 0.9375 0 L 0.9375 -6.546875 L 2.296875 -6.546875 L 2.5625 -5.453125 L 2.640625 -5.453125 C 2.828125 -5.785156 3.085938 -6.070312 3.421875 -6.3125 C 3.765625 -6.550781 4.15625 -6.671875 4.59375 -6.671875 Z M 4.59375 -6.671875 "/> +</g> +<g id="glyph-4-4"> +<path d="M 6.890625 -3.28125 C 6.890625 -2.195312 6.601562 -1.359375 6.03125 -0.765625 C 5.457031 -0.171875 4.679688 0.125 3.703125 0.125 C 3.085938 0.125 2.539062 -0.00390625 2.0625 -0.265625 C 1.59375 -0.535156 1.222656 -0.925781 0.953125 -1.4375 C 0.679688 -1.945312 0.546875 -2.5625 0.546875 -3.28125 C 0.546875 -4.375 0.828125 -5.210938 1.390625 -5.796875 C 1.960938 -6.378906 2.742188 -6.671875 3.734375 -6.671875 C 4.347656 -6.671875 4.890625 -6.535156 5.359375 -6.265625 C 5.835938 -6.003906 6.210938 -5.625 6.484375 -5.125 C 6.753906 -4.625 6.890625 -4.007812 6.890625 -3.28125 Z M 2.359375 -3.28125 C 2.359375 -2.632812 2.460938 -2.144531 2.671875 -1.8125 C 2.890625 -1.476562 3.238281 -1.3125 3.71875 -1.3125 C 4.1875 -1.3125 4.523438 -1.476562 4.734375 -1.8125 C 4.953125 -2.144531 5.0625 -2.632812 5.0625 -3.28125 C 5.0625 -3.9375 4.953125 -4.425781 4.734375 -4.75 C 4.523438 -5.070312 4.179688 -5.234375 3.703125 -5.234375 C 3.234375 -5.234375 2.890625 -5.070312 2.671875 -4.75 C 2.460938 -4.425781 2.359375 -3.9375 2.359375 -3.28125 Z M 2.359375 -3.28125 "/> +</g> +<g id="glyph-4-5"> +<path d="M 4.5625 -5.203125 L 3.015625 -5.203125 L 3.015625 0 L 1.21875 0 L 1.21875 -5.203125 L 0.234375 -5.203125 L 0.234375 -6.078125 L 1.21875 -6.546875 L 1.21875 -7.03125 C 1.21875 -7.59375 1.3125 -8.023438 1.5 -8.328125 C 1.6875 -8.640625 1.953125 -8.859375 2.296875 -8.984375 C 2.648438 -9.117188 3.066406 -9.1875 3.546875 -9.1875 C 3.890625 -9.1875 4.203125 -9.15625 4.484375 -9.09375 C 4.773438 -9.039062 5.007812 -8.976562 5.1875 -8.90625 L 4.734375 -7.59375 C 4.597656 -7.632812 4.445312 -7.671875 4.28125 -7.703125 C 4.125 -7.742188 3.941406 -7.765625 3.734375 -7.765625 C 3.484375 -7.765625 3.300781 -7.6875 3.1875 -7.53125 C 3.070312 -7.382812 3.015625 -7.191406 3.015625 -6.953125 L 3.015625 -6.546875 L 4.5625 -6.546875 Z M 4.5625 -5.203125 "/> +</g> +<g id="glyph-4-6"> +<path d="M 1.84375 -9.125 C 2.101562 -9.125 2.328125 -9.0625 2.515625 -8.9375 C 2.710938 -8.8125 2.8125 -8.582031 2.8125 -8.25 C 2.8125 -7.914062 2.710938 -7.6875 2.515625 -7.5625 C 2.328125 -7.4375 2.101562 -7.375 1.84375 -7.375 C 1.5625 -7.375 1.328125 -7.4375 1.140625 -7.5625 C 0.953125 -7.6875 0.859375 -7.914062 0.859375 -8.25 C 0.859375 -8.582031 0.953125 -8.8125 1.140625 -8.9375 C 1.328125 -9.0625 1.5625 -9.125 1.84375 -9.125 Z M 2.71875 -6.546875 L 2.71875 0 L 0.9375 0 L 0.9375 -6.546875 Z M 2.71875 -6.546875 "/> +</g> +<g id="glyph-4-7"> +<path d="M 2.71875 0 L 0.9375 0 L 0.9375 -9.125 L 2.71875 -9.125 Z M 2.71875 0 "/> +</g> +<g id="glyph-4-8"> +</g> +<g id="glyph-4-9"> +<path d="M 3.625 -6.6875 C 4.5 -6.6875 5.171875 -6.492188 5.640625 -6.109375 C 6.109375 -5.734375 6.34375 -5.15625 6.34375 -4.375 L 6.34375 0 L 5.09375 0 L 4.75 -0.890625 L 4.703125 -0.890625 C 4.421875 -0.535156 4.125 -0.273438 3.8125 -0.109375 C 3.5 0.046875 3.070312 0.125 2.53125 0.125 C 1.945312 0.125 1.460938 -0.046875 1.078125 -0.390625 C 0.691406 -0.734375 0.5 -1.253906 0.5 -1.953125 C 0.5 -2.648438 0.742188 -3.164062 1.234375 -3.5 C 1.722656 -3.832031 2.457031 -4.015625 3.4375 -4.046875 L 4.578125 -4.078125 L 4.578125 -4.375 C 4.578125 -4.71875 4.484375 -4.96875 4.296875 -5.125 C 4.117188 -5.28125 3.867188 -5.359375 3.546875 -5.359375 C 3.234375 -5.359375 2.921875 -5.3125 2.609375 -5.21875 C 2.304688 -5.132812 2.003906 -5.023438 1.703125 -4.890625 L 1.109375 -6.09375 C 1.460938 -6.28125 1.851562 -6.425781 2.28125 -6.53125 C 2.707031 -6.632812 3.15625 -6.6875 3.625 -6.6875 Z M 3.875 -3.015625 C 3.300781 -2.992188 2.898438 -2.882812 2.671875 -2.6875 C 2.453125 -2.5 2.34375 -2.25 2.34375 -1.9375 C 2.34375 -1.664062 2.421875 -1.472656 2.578125 -1.359375 C 2.734375 -1.242188 2.941406 -1.1875 3.203125 -1.1875 C 3.585938 -1.1875 3.910156 -1.300781 4.171875 -1.53125 C 4.441406 -1.757812 4.578125 -2.082031 4.578125 -2.5 L 4.578125 -3.03125 Z M 3.875 -3.015625 "/> +</g> +<g id="glyph-4-10"> +<path d="M 2.71875 -7 C 2.71875 -6.75 2.707031 -6.503906 2.6875 -6.265625 C 2.675781 -6.023438 2.664062 -5.835938 2.65625 -5.703125 L 2.71875 -5.703125 C 2.894531 -5.972656 3.128906 -6.203125 3.421875 -6.390625 C 3.722656 -6.578125 4.109375 -6.671875 4.578125 -6.671875 C 5.316406 -6.671875 5.914062 -6.382812 6.375 -5.8125 C 6.832031 -5.238281 7.0625 -4.394531 7.0625 -3.28125 C 7.0625 -2.164062 6.828125 -1.316406 6.359375 -0.734375 C 5.890625 -0.160156 5.28125 0.125 4.53125 0.125 C 4.050781 0.125 3.671875 0.0390625 3.390625 -0.125 C 3.117188 -0.300781 2.894531 -0.5 2.71875 -0.71875 L 2.609375 -0.71875 L 2.296875 0 L 0.9375 0 L 0.9375 -9.125 L 2.71875 -9.125 Z M 4.015625 -5.25 C 3.546875 -5.25 3.21875 -5.101562 3.03125 -4.8125 C 2.84375 -4.519531 2.738281 -4.078125 2.71875 -3.484375 L 2.71875 -3.296875 C 2.71875 -2.671875 2.8125 -2.1875 3 -1.84375 C 3.1875 -1.5 3.53125 -1.328125 4.03125 -1.328125 C 4.394531 -1.328125 4.6875 -1.5 4.90625 -1.84375 C 5.125 -2.1875 5.234375 -2.675781 5.234375 -3.3125 C 5.234375 -3.945312 5.125 -4.425781 4.90625 -4.75 C 4.6875 -5.082031 4.390625 -5.25 4.015625 -5.25 Z M 4.015625 -5.25 "/> +</g> +<g id="glyph-4-11"> +<path d="M 3.703125 -1.3125 C 3.898438 -1.3125 4.085938 -1.328125 4.265625 -1.359375 C 4.453125 -1.398438 4.640625 -1.453125 4.828125 -1.515625 L 4.828125 -0.1875 C 4.628906 -0.101562 4.390625 -0.03125 4.109375 0.03125 C 3.828125 0.09375 3.519531 0.125 3.1875 0.125 C 2.789062 0.125 2.4375 0.0625 2.125 -0.0625 C 1.820312 -0.195312 1.578125 -0.421875 1.390625 -0.734375 C 1.210938 -1.054688 1.125 -1.492188 1.125 -2.046875 L 1.125 -5.203125 L 0.28125 -5.203125 L 0.28125 -5.96875 L 1.265625 -6.5625 L 1.78125 -7.9375 L 2.921875 -7.9375 L 2.921875 -6.546875 L 4.75 -6.546875 L 4.75 -5.203125 L 2.921875 -5.203125 L 2.921875 -2.046875 C 2.921875 -1.804688 2.988281 -1.625 3.125 -1.5 C 3.269531 -1.375 3.460938 -1.3125 3.703125 -1.3125 Z M 3.703125 -1.3125 "/> +</g> +<g id="glyph-4-12"> +<path d="M 4.65625 -6.671875 C 5.363281 -6.671875 5.925781 -6.476562 6.34375 -6.09375 C 6.769531 -5.71875 6.984375 -5.109375 6.984375 -4.265625 L 6.984375 0 L 5.203125 0 L 5.203125 -3.828125 C 5.203125 -4.296875 5.113281 -4.648438 4.9375 -4.890625 C 4.769531 -5.128906 4.503906 -5.25 4.140625 -5.25 C 3.597656 -5.25 3.222656 -5.0625 3.015625 -4.6875 C 2.816406 -4.3125 2.71875 -3.773438 2.71875 -3.078125 L 2.71875 0 L 0.9375 0 L 0.9375 -6.546875 L 2.296875 -6.546875 L 2.546875 -5.71875 L 2.640625 -5.71875 C 2.847656 -6.050781 3.132812 -6.289062 3.5 -6.4375 C 3.863281 -6.59375 4.25 -6.671875 4.65625 -6.671875 Z M 4.65625 -6.671875 "/> +</g> +<g id="glyph-4-13"> +<path d="M 3.640625 -6.671875 C 4.535156 -6.671875 5.25 -6.410156 5.78125 -5.890625 C 6.3125 -5.378906 6.578125 -4.648438 6.578125 -3.703125 L 6.578125 -2.828125 L 2.359375 -2.828125 C 2.367188 -2.328125 2.515625 -1.929688 2.796875 -1.640625 C 3.085938 -1.359375 3.484375 -1.21875 3.984375 -1.21875 C 4.410156 -1.21875 4.796875 -1.257812 5.140625 -1.34375 C 5.484375 -1.425781 5.835938 -1.554688 6.203125 -1.734375 L 6.203125 -0.34375 C 5.878906 -0.1875 5.539062 -0.0703125 5.1875 0 C 4.832031 0.0820312 4.40625 0.125 3.90625 0.125 C 3.25 0.125 2.664062 0.00390625 2.15625 -0.234375 C 1.65625 -0.484375 1.257812 -0.851562 0.96875 -1.34375 C 0.6875 -1.84375 0.546875 -2.472656 0.546875 -3.234375 C 0.546875 -3.992188 0.671875 -4.628906 0.921875 -5.140625 C 1.179688 -5.648438 1.546875 -6.03125 2.015625 -6.28125 C 2.484375 -6.539062 3.023438 -6.671875 3.640625 -6.671875 Z M 3.640625 -5.40625 C 3.296875 -5.40625 3.007812 -5.289062 2.78125 -5.0625 C 2.5625 -4.84375 2.429688 -4.492188 2.390625 -4.015625 L 4.890625 -4.015625 C 4.890625 -4.421875 4.785156 -4.753906 4.578125 -5.015625 C 4.378906 -5.273438 4.066406 -5.40625 3.640625 -5.40625 Z M 3.640625 -5.40625 "/> +</g> +<g id="glyph-4-14"> +<path d="M 4.578125 -6.671875 C 5.316406 -6.671875 5.914062 -6.382812 6.375 -5.8125 C 6.832031 -5.238281 7.0625 -4.394531 7.0625 -3.28125 C 7.0625 -2.175781 6.820312 -1.332031 6.34375 -0.75 C 5.875 -0.164062 5.269531 0.125 4.53125 0.125 C 4.0625 0.125 3.6875 0.0390625 3.40625 -0.125 C 3.125 -0.300781 2.894531 -0.5 2.71875 -0.71875 L 2.625 -0.71875 C 2.6875 -0.382812 2.71875 -0.0664062 2.71875 0.234375 L 2.71875 2.875 L 0.9375 2.875 L 0.9375 -6.546875 L 2.390625 -6.546875 L 2.640625 -5.703125 L 2.71875 -5.703125 C 2.894531 -5.960938 3.128906 -6.1875 3.421875 -6.375 C 3.722656 -6.570312 4.109375 -6.671875 4.578125 -6.671875 Z M 4.015625 -5.25 C 3.546875 -5.25 3.21875 -5.101562 3.03125 -4.8125 C 2.84375 -4.519531 2.738281 -4.078125 2.71875 -3.484375 L 2.71875 -3.296875 C 2.71875 -2.671875 2.8125 -2.1875 3 -1.84375 C 3.1875 -1.5 3.53125 -1.328125 4.03125 -1.328125 C 4.4375 -1.328125 4.738281 -1.5 4.9375 -1.84375 C 5.132812 -2.1875 5.234375 -2.675781 5.234375 -3.3125 C 5.234375 -4.601562 4.828125 -5.25 4.015625 -5.25 Z M 4.015625 -5.25 "/> +</g> +<g id="glyph-4-15"> +<path d="M 5.515625 -1.9375 C 5.515625 -1.28125 5.28125 -0.769531 4.8125 -0.40625 C 4.34375 -0.0507812 3.644531 0.125 2.71875 0.125 C 2.257812 0.125 1.863281 0.09375 1.53125 0.03125 C 1.207031 -0.03125 0.878906 -0.128906 0.546875 -0.265625 L 0.546875 -1.734375 C 0.898438 -1.578125 1.28125 -1.445312 1.6875 -1.34375 C 2.09375 -1.238281 2.453125 -1.1875 2.765625 -1.1875 C 3.117188 -1.1875 3.367188 -1.238281 3.515625 -1.34375 C 3.671875 -1.445312 3.75 -1.582031 3.75 -1.75 C 3.75 -1.863281 3.71875 -1.960938 3.65625 -2.046875 C 3.59375 -2.140625 3.460938 -2.238281 3.265625 -2.34375 C 3.066406 -2.457031 2.753906 -2.601562 2.328125 -2.78125 C 1.921875 -2.957031 1.582031 -3.128906 1.3125 -3.296875 C 1.050781 -3.472656 0.859375 -3.679688 0.734375 -3.921875 C 0.609375 -4.171875 0.546875 -4.476562 0.546875 -4.84375 C 0.546875 -5.457031 0.78125 -5.914062 1.25 -6.21875 C 1.71875 -6.519531 2.34375 -6.671875 3.125 -6.671875 C 3.539062 -6.671875 3.929688 -6.628906 4.296875 -6.546875 C 4.660156 -6.472656 5.039062 -6.34375 5.4375 -6.15625 L 4.890625 -4.875 C 4.578125 -5.007812 4.273438 -5.125 3.984375 -5.21875 C 3.691406 -5.3125 3.398438 -5.359375 3.109375 -5.359375 C 2.578125 -5.359375 2.3125 -5.210938 2.3125 -4.921875 C 2.3125 -4.816406 2.34375 -4.722656 2.40625 -4.640625 C 2.476562 -4.554688 2.613281 -4.460938 2.8125 -4.359375 C 3.007812 -4.265625 3.300781 -4.140625 3.6875 -3.984375 C 4.0625 -3.828125 4.382812 -3.664062 4.65625 -3.5 C 4.925781 -3.34375 5.132812 -3.140625 5.28125 -2.890625 C 5.4375 -2.648438 5.515625 -2.332031 5.515625 -1.9375 Z M 5.515625 -1.9375 "/> +</g> +<g id="glyph-4-16"> +<path d="M 0.859375 -8.25 C 0.859375 -8.582031 0.953125 -8.8125 1.140625 -8.9375 C 1.328125 -9.0625 1.5625 -9.125 1.84375 -9.125 C 2.101562 -9.125 2.328125 -9.0625 2.515625 -8.9375 C 2.710938 -8.8125 2.8125 -8.582031 2.8125 -8.25 C 2.8125 -7.914062 2.710938 -7.6875 2.515625 -7.5625 C 2.328125 -7.4375 2.101562 -7.375 1.84375 -7.375 C 1.5625 -7.375 1.328125 -7.4375 1.140625 -7.5625 C 0.953125 -7.6875 0.859375 -7.914062 0.859375 -8.25 Z M 0.40625 2.875 C 0.207031 2.875 0 2.859375 -0.21875 2.828125 C -0.4375 2.804688 -0.617188 2.773438 -0.765625 2.734375 L -0.765625 1.328125 C -0.617188 1.359375 -0.484375 1.382812 -0.359375 1.40625 C -0.234375 1.425781 -0.0859375 1.4375 0.078125 1.4375 C 0.316406 1.4375 0.519531 1.367188 0.6875 1.234375 C 0.851562 1.097656 0.9375 0.832031 0.9375 0.4375 L 0.9375 -6.546875 L 2.71875 -6.546875 L 2.71875 0.703125 C 2.71875 1.109375 2.640625 1.472656 2.484375 1.796875 C 2.335938 2.128906 2.09375 2.390625 1.75 2.578125 C 1.414062 2.773438 0.96875 2.875 0.40625 2.875 Z M 0.40625 2.875 "/> +</g> +<g id="glyph-4-17"> +<path d="M 3.0625 -6.671875 C 3.863281 -6.671875 4.492188 -6.351562 4.953125 -5.71875 L 5 -5.71875 L 5.140625 -6.546875 L 6.65625 -6.546875 L 6.65625 0.015625 C 6.65625 0.953125 6.378906 1.660156 5.828125 2.140625 C 5.273438 2.628906 4.460938 2.875 3.390625 2.875 C 2.921875 2.875 2.488281 2.847656 2.09375 2.796875 C 1.695312 2.742188 1.3125 2.644531 0.9375 2.5 L 0.9375 1.0625 C 1.738281 1.40625 2.585938 1.578125 3.484375 1.578125 C 4.410156 1.578125 4.875 1.078125 4.875 0.078125 L 4.875 -0.046875 C 4.875 -0.179688 4.878906 -0.320312 4.890625 -0.46875 C 4.898438 -0.613281 4.910156 -0.742188 4.921875 -0.859375 L 4.875 -0.859375 C 4.644531 -0.515625 4.375 -0.265625 4.0625 -0.109375 C 3.75 0.046875 3.398438 0.125 3.015625 0.125 C 2.234375 0.125 1.625 -0.171875 1.1875 -0.765625 C 0.757812 -1.367188 0.546875 -2.203125 0.546875 -3.265625 C 0.546875 -4.335938 0.769531 -5.171875 1.21875 -5.765625 C 1.664062 -6.367188 2.28125 -6.671875 3.0625 -6.671875 Z M 3.625 -5.21875 C 2.78125 -5.21875 2.359375 -4.554688 2.359375 -3.234375 C 2.359375 -1.929688 2.785156 -1.28125 3.640625 -1.28125 C 4.097656 -1.28125 4.4375 -1.410156 4.65625 -1.671875 C 4.875 -1.929688 4.984375 -2.382812 4.984375 -3.03125 L 4.984375 -3.25 C 4.984375 -3.957031 4.875 -4.460938 4.65625 -4.765625 C 4.445312 -5.066406 4.101562 -5.21875 3.625 -5.21875 Z M 3.625 -5.21875 "/> +</g> +<g id="glyph-4-18"> +<path d="M 6.46875 0 L 0.484375 0 L 0.484375 -1.265625 L 2.625 -3.4375 C 3.0625 -3.882812 3.410156 -4.253906 3.671875 -4.546875 C 3.929688 -4.847656 4.117188 -5.117188 4.234375 -5.359375 C 4.359375 -5.609375 4.421875 -5.875 4.421875 -6.15625 C 4.421875 -6.5 4.328125 -6.753906 4.140625 -6.921875 C 3.953125 -7.085938 3.703125 -7.171875 3.390625 -7.171875 C 3.054688 -7.171875 2.734375 -7.09375 2.421875 -6.9375 C 2.109375 -6.789062 1.78125 -6.578125 1.4375 -6.296875 L 0.453125 -7.46875 C 0.703125 -7.675781 0.960938 -7.875 1.234375 -8.0625 C 1.515625 -8.25 1.835938 -8.398438 2.203125 -8.515625 C 2.566406 -8.628906 3.003906 -8.6875 3.515625 -8.6875 C 4.078125 -8.6875 4.554688 -8.582031 4.953125 -8.375 C 5.359375 -8.175781 5.671875 -7.898438 5.890625 -7.546875 C 6.117188 -7.203125 6.234375 -6.8125 6.234375 -6.375 C 6.234375 -5.894531 6.132812 -5.457031 5.9375 -5.0625 C 5.75 -4.675781 5.476562 -4.289062 5.125 -3.90625 C 4.769531 -3.53125 4.34375 -3.109375 3.84375 -2.640625 L 2.734375 -1.609375 L 2.734375 -1.53125 L 6.46875 -1.53125 Z M 6.46875 0 "/> +</g> +<g id="glyph-4-19"> +<path d="M 6.421875 -4.28125 C 6.421875 -3.363281 6.320312 -2.578125 6.125 -1.921875 C 5.925781 -1.265625 5.609375 -0.757812 5.171875 -0.40625 C 4.742188 -0.0507812 4.160156 0.125 3.421875 0.125 C 2.390625 0.125 1.632812 -0.265625 1.15625 -1.046875 C 0.675781 -1.828125 0.4375 -2.90625 0.4375 -4.28125 C 0.4375 -5.207031 0.53125 -6 0.71875 -6.65625 C 0.914062 -7.3125 1.234375 -7.816406 1.671875 -8.171875 C 2.109375 -8.523438 2.691406 -8.703125 3.421875 -8.703125 C 4.441406 -8.703125 5.195312 -8.3125 5.6875 -7.53125 C 6.175781 -6.757812 6.421875 -5.675781 6.421875 -4.28125 Z M 2.234375 -4.28125 C 2.234375 -3.300781 2.316406 -2.566406 2.484375 -2.078125 C 2.648438 -1.585938 2.960938 -1.34375 3.421875 -1.34375 C 3.867188 -1.34375 4.179688 -1.585938 4.359375 -2.078125 C 4.535156 -2.566406 4.625 -3.300781 4.625 -4.28125 C 4.625 -5.257812 4.535156 -5.992188 4.359375 -6.484375 C 4.179688 -6.984375 3.867188 -7.234375 3.421875 -7.234375 C 2.960938 -7.234375 2.648438 -6.984375 2.484375 -6.484375 C 2.316406 -5.992188 2.234375 -5.257812 2.234375 -4.28125 Z M 2.234375 -4.28125 "/> +</g> +<g id="glyph-4-20"> +<path d="M 4.328125 -4.8125 L 7.734375 -4.8125 L 7.734375 -0.375 C 7.285156 -0.21875 6.816406 -0.09375 6.328125 0 C 5.847656 0.0820312 5.300781 0.125 4.6875 0.125 C 3.40625 0.125 2.421875 -0.25 1.734375 -1 C 1.046875 -1.757812 0.703125 -2.859375 0.703125 -4.296875 C 0.703125 -5.191406 0.875 -5.96875 1.21875 -6.625 C 1.5625 -7.28125 2.066406 -7.785156 2.734375 -8.140625 C 3.398438 -8.503906 4.210938 -8.6875 5.171875 -8.6875 C 5.628906 -8.6875 6.078125 -8.640625 6.515625 -8.546875 C 6.953125 -8.453125 7.351562 -8.320312 7.71875 -8.15625 L 7.109375 -6.703125 C 6.847656 -6.835938 6.550781 -6.945312 6.21875 -7.03125 C 5.882812 -7.125 5.53125 -7.171875 5.15625 -7.171875 C 4.632812 -7.171875 4.175781 -7.050781 3.78125 -6.8125 C 3.394531 -6.570312 3.09375 -6.234375 2.875 -5.796875 C 2.664062 -5.359375 2.5625 -4.847656 2.5625 -4.265625 C 2.5625 -3.703125 2.640625 -3.203125 2.796875 -2.765625 C 2.953125 -2.335938 3.191406 -2 3.515625 -1.75 C 3.847656 -1.507812 4.273438 -1.390625 4.796875 -1.390625 C 5.054688 -1.390625 5.273438 -1.398438 5.453125 -1.421875 C 5.628906 -1.453125 5.796875 -1.484375 5.953125 -1.515625 L 5.953125 -3.296875 L 4.328125 -3.296875 Z M 4.328125 -4.8125 "/> +</g> +<g id="glyph-4-21"> +<path d="M 6.953125 -6.546875 L 6.953125 0 L 5.578125 0 L 5.34375 -0.84375 L 5.25 -0.84375 C 5.039062 -0.507812 4.753906 -0.265625 4.390625 -0.109375 C 4.023438 0.046875 3.640625 0.125 3.234375 0.125 C 2.523438 0.125 1.957031 -0.0625 1.53125 -0.4375 C 1.113281 -0.820312 0.90625 -1.4375 0.90625 -2.28125 L 0.90625 -6.546875 L 2.6875 -6.546875 L 2.6875 -2.71875 C 2.6875 -2.257812 2.769531 -1.910156 2.9375 -1.671875 C 3.101562 -1.429688 3.375 -1.3125 3.75 -1.3125 C 4.289062 -1.3125 4.660156 -1.492188 4.859375 -1.859375 C 5.054688 -2.234375 5.15625 -2.769531 5.15625 -3.46875 L 5.15625 -6.546875 Z M 6.953125 -6.546875 "/> +</g> +<g id="glyph-4-22"> +<path d="M 3.59375 0.125 C 2.625 0.125 1.875 -0.144531 1.34375 -0.6875 C 0.8125 -1.226562 0.546875 -2.078125 0.546875 -3.234375 C 0.546875 -4.035156 0.679688 -4.6875 0.953125 -5.1875 C 1.222656 -5.695312 1.597656 -6.070312 2.078125 -6.3125 C 2.566406 -6.550781 3.125 -6.671875 3.75 -6.671875 C 4.195312 -6.671875 4.585938 -6.625 4.921875 -6.53125 C 5.253906 -6.445312 5.546875 -6.347656 5.796875 -6.234375 L 5.265625 -4.84375 C 4.984375 -4.957031 4.71875 -5.050781 4.46875 -5.125 C 4.226562 -5.195312 3.988281 -5.234375 3.75 -5.234375 C 2.820312 -5.234375 2.359375 -4.570312 2.359375 -3.25 C 2.359375 -2.59375 2.476562 -2.109375 2.71875 -1.796875 C 2.96875 -1.484375 3.3125 -1.328125 3.75 -1.328125 C 4.125 -1.328125 4.457031 -1.375 4.75 -1.46875 C 5.039062 -1.570312 5.320312 -1.710938 5.59375 -1.890625 L 5.59375 -0.375 C 5.320312 -0.195312 5.035156 -0.0703125 4.734375 0 C 4.429688 0.0820312 4.050781 0.125 3.59375 0.125 Z M 3.59375 0.125 "/> +</g> +</g> +<clipPath id="clip-0"> +<path clip-rule="nonzero" d="M 50.371094 66 L 643.957031 66 L 643.957031 243.746094 L 50.371094 243.746094 Z M 50.371094 66 "/> +</clipPath> +<clipPath id="clip-1"> +<path clip-rule="nonzero" d="M 75 243 L 110 243 L 110 243.746094 L 75 243.746094 Z M 75 243 "/> +</clipPath> +<clipPath id="clip-2"> +<path clip-rule="nonzero" d="M 160 215 L 195 215 L 195 243.746094 L 160 243.746094 Z M 160 215 "/> +</clipPath> +<clipPath id="clip-3"> +<path clip-rule="nonzero" d="M 160 214 L 195 214 L 195 243.746094 L 160 243.746094 Z M 160 214 "/> +</clipPath> +<clipPath id="clip-4"> +<path clip-rule="nonzero" d="M 245 139 L 280 139 L 280 243.746094 L 245 243.746094 Z M 245 139 "/> +</clipPath> +<clipPath id="clip-5"> +<path clip-rule="nonzero" d="M 330 81 L 365 81 L 365 243.746094 L 330 243.746094 Z M 330 81 "/> +</clipPath> +<clipPath id="clip-6"> +<path clip-rule="nonzero" d="M 329 81 L 365 81 L 365 243.746094 L 329 243.746094 Z M 329 81 "/> +</clipPath> +<clipPath id="clip-7"> +<path clip-rule="nonzero" d="M 415 71 L 449 71 L 449 243.746094 L 415 243.746094 Z M 415 71 "/> +</clipPath> +<clipPath id="clip-8"> +<path clip-rule="nonzero" d="M 414 70 L 450 70 L 450 243.746094 L 414 243.746094 Z M 414 70 "/> +</clipPath> +<clipPath id="clip-9"> +<path clip-rule="nonzero" d="M 499 60 L 534 60 L 534 243.746094 L 499 243.746094 Z M 499 60 "/> +</clipPath> +<clipPath id="clip-10"> +<path clip-rule="nonzero" d="M 584 32 L 619 32 L 619 243.746094 L 584 243.746094 Z M 584 32 "/> +</clipPath> +</defs> +<path fill-rule="nonzero" fill="rgb(100%, 100%, 100%)" fill-opacity="1" stroke-width="0.5" stroke-linecap="round" stroke-linejoin="round" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 0.25 0.25 L 647.75 0.25 L 647.75 371.75 L 0.25 371.75 Z M 0.25 0.25 "/> +<path fill-rule="nonzero" fill="rgb(100%, 100%, 100%)" fill-opacity="1" stroke-width="1" stroke-linecap="round" stroke-linejoin="round" stroke="rgb(51.764706%, 50.980392%, 51.764706%)" stroke-opacity="1" stroke-miterlimit="10" d="M 50.371094 24.886719 L 643.957031 24.886719 L 643.957031 243.746094 L 50.371094 243.746094 Z M 50.371094 24.886719 "/> +<g clip-path="url(#clip-0)"> +<path fill="none" stroke-width="0.4" stroke-linecap="round" stroke-linejoin="round" stroke="rgb(75.294118%, 75.294118%, 75.294118%)" stroke-opacity="1" stroke-miterlimit="10" d="M 50.371094 243.746094 L 643.957031 243.746094 M 50.371094 155.394531 L 643.957031 155.394531 M 50.371094 67.042969 L 643.957031 67.042969 "/> +</g> +<g clip-path="url(#clip-1)"> +<path fill="none" stroke-width="0.5" stroke-linecap="round" stroke-linejoin="round" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 75.8125 243.746094 L 109.730469 243.746094 Z M 75.8125 243.746094 "/> +</g> +<g clip-path="url(#clip-2)"> +<path fill-rule="nonzero" fill="rgb(61.176471%, 61.176471%, 100%)" fill-opacity="1" d="M 160.609375 243.746094 L 194.527344 243.746094 L 194.527344 215.074219 L 160.609375 215.074219 Z M 160.609375 243.746094 "/> +</g> +<g clip-path="url(#clip-3)"> +<path fill="none" stroke-width="0.5" stroke-linecap="round" stroke-linejoin="round" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 160.609375 243.746094 L 194.527344 243.746094 L 194.527344 215.074219 L 160.609375 215.074219 Z M 160.609375 243.746094 "/> +</g> +<g clip-path="url(#clip-4)"> +<path fill-rule="nonzero" fill="rgb(61.176471%, 61.176471%, 100%)" fill-opacity="1" stroke-width="0.5" stroke-linecap="round" stroke-linejoin="round" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 245.40625 243.746094 L 279.328125 243.746094 L 279.328125 139.945312 L 245.40625 139.945312 Z M 245.40625 243.746094 "/> +</g> +<g clip-path="url(#clip-5)"> +<path fill-rule="nonzero" fill="rgb(61.176471%, 61.176471%, 100%)" fill-opacity="1" d="M 330.207031 243.746094 L 364.125 243.746094 L 364.125 81.664062 L 330.207031 81.664062 Z M 330.207031 243.746094 "/> +</g> +<g clip-path="url(#clip-6)"> +<path fill="none" stroke-width="0.5" stroke-linecap="round" stroke-linejoin="round" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 330.207031 243.746094 L 364.125 243.746094 L 364.125 81.664062 L 330.207031 81.664062 Z M 330.207031 243.746094 "/> +</g> +<g clip-path="url(#clip-7)"> +<path fill-rule="nonzero" fill="rgb(61.176471%, 61.176471%, 100%)" fill-opacity="1" d="M 415.003906 243.746094 L 448.921875 243.746094 L 448.921875 71.074219 L 415.003906 71.074219 Z M 415.003906 243.746094 "/> +</g> +<g clip-path="url(#clip-8)"> +<path fill="none" stroke-width="0.5" stroke-linecap="round" stroke-linejoin="round" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 415.003906 243.746094 L 448.921875 243.746094 L 448.921875 71.074219 L 415.003906 71.074219 Z M 415.003906 243.746094 "/> +</g> +<g clip-path="url(#clip-9)"> +<path fill-rule="nonzero" fill="rgb(61.176471%, 61.176471%, 100%)" fill-opacity="1" stroke-width="0.5" stroke-linecap="round" stroke-linejoin="round" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 499.800781 243.746094 L 533.71875 243.746094 L 533.71875 60.683594 L 499.800781 60.683594 Z M 499.800781 243.746094 "/> +</g> +<g clip-path="url(#clip-10)"> +<path fill-rule="nonzero" fill="rgb(61.176471%, 61.176471%, 100%)" fill-opacity="1" stroke-width="0.5" stroke-linecap="round" stroke-linejoin="round" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 584.597656 243.746094 L 618.515625 243.746094 L 618.515625 32.941406 L 584.597656 32.941406 Z M 584.597656 243.746094 "/> +</g> +<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> +<use xlink:href="#glyph-0-0" x="88.521602" y="240.489537"/> +<use xlink:href="#glyph-0-1" x="91.521602" y="240.489537"/> +<use xlink:href="#glyph-0-2" x="93.521602" y="240.489537"/> +</g> +<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> +<use xlink:href="#glyph-0-3" x="173.319306" y="211.815387"/> +<use xlink:href="#glyph-0-1" x="176.319306" y="211.815387"/> +<use xlink:href="#glyph-0-0" x="178.319306" y="211.815387"/> +</g> +<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> +<use xlink:href="#glyph-0-0" x="256.617009" y="136.685808"/> +<use xlink:href="#glyph-0-4" x="259.617009" y="136.685808"/> +<use xlink:href="#glyph-0-1" x="262.617009" y="136.685808"/> +<use xlink:href="#glyph-0-2" x="264.617009" y="136.685808"/> +</g> +<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> +<use xlink:href="#glyph-0-5" x="341.414713" y="78.407712"/> +<use xlink:href="#glyph-0-6" x="344.414713" y="78.407712"/> +<use xlink:href="#glyph-0-1" x="347.414713" y="78.407712"/> +<use xlink:href="#glyph-0-7" x="349.414713" y="78.407712"/> +</g> +<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> +<use xlink:href="#glyph-0-8" x="426.212417" y="67.81619"/> +<use xlink:href="#glyph-0-2" x="429.212417" y="67.81619"/> +<use xlink:href="#glyph-0-1" x="432.212417" y="67.81619"/> +<use xlink:href="#glyph-0-2" x="434.212417" y="67.81619"/> +</g> +<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> +<use xlink:href="#glyph-0-0" x="509.51012" y="57.423917"/> +<use xlink:href="#glyph-0-0" x="512.51012" y="57.423917"/> +<use xlink:href="#glyph-0-6" x="515.51012" y="57.423917"/> +<use xlink:href="#glyph-0-1" x="518.51012" y="57.423917"/> +<use xlink:href="#glyph-0-2" x="520.51012" y="57.423917"/> +</g> +<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> +<use xlink:href="#glyph-0-3" x="594.307824" y="29.683334"/> +<use xlink:href="#glyph-0-9" x="597.307824" y="29.683334"/> +<use xlink:href="#glyph-0-7" x="600.307824" y="29.683334"/> +<use xlink:href="#glyph-0-1" x="603.307824" y="29.683334"/> +<use xlink:href="#glyph-0-3" x="605.307824" y="29.683334"/> +</g> +<path fill="none" stroke-width="0.5" stroke-linecap="round" stroke-linejoin="round" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 50.371094 243.746094 L 643.957031 243.746094 M 50.371094 247.996094 L 50.371094 243.746094 M 135.171875 247.996094 L 135.171875 243.746094 M 219.96875 247.996094 L 219.96875 243.746094 M 304.765625 247.996094 L 304.765625 243.746094 M 389.5625 247.996094 L 389.5625 243.746094 M 474.359375 247.996094 L 474.359375 243.746094 M 559.160156 247.996094 L 559.160156 243.746094 M 643.957031 247.996094 L 643.957031 243.746094 "/> +<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> +<use xlink:href="#glyph-1-0" x="95.625977" y="299.207031"/> +<use xlink:href="#glyph-1-1" x="95.625977" y="294.207031"/> +<use xlink:href="#glyph-1-2" x="95.625977" y="290.207031"/> +<use xlink:href="#glyph-1-3" x="95.625977" y="285.207031"/> +<use xlink:href="#glyph-1-4" x="95.625977" y="282.207031"/> +<use xlink:href="#glyph-1-5" x="95.625977" y="277.207031"/> +<use xlink:href="#glyph-1-4" x="95.625977" y="274.207031"/> +<use xlink:href="#glyph-1-6" x="95.625977" y="269.207031"/> +<use xlink:href="#glyph-1-7" x="95.625977" y="267.207031"/> +<use xlink:href="#glyph-1-8" x="95.625977" y="265.207031"/> +<use xlink:href="#glyph-1-5" x="95.625977" y="262.207031"/> +<use xlink:href="#glyph-1-9" x="95.625977" y="259.207031"/> +<use xlink:href="#glyph-1-7" x="95.625977" y="254.207031"/> +<use xlink:href="#glyph-1-7" x="95.625977" y="252.207031"/> +</g> +<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> +<use xlink:href="#glyph-1-0" x="180.422852" y="368.207031"/> +<use xlink:href="#glyph-1-1" x="180.422852" y="363.207031"/> +<use xlink:href="#glyph-1-2" x="180.422852" y="359.207031"/> +<use xlink:href="#glyph-1-3" x="180.422852" y="354.207031"/> +<use xlink:href="#glyph-1-4" x="180.422852" y="351.207031"/> +<use xlink:href="#glyph-1-5" x="180.422852" y="346.207031"/> +<use xlink:href="#glyph-1-4" x="180.422852" y="343.207031"/> +<use xlink:href="#glyph-1-6" x="180.422852" y="338.207031"/> +<use xlink:href="#glyph-1-7" x="180.422852" y="336.207031"/> +<use xlink:href="#glyph-1-8" x="180.422852" y="334.207031"/> +<use xlink:href="#glyph-1-10" x="180.422852" y="331.207031"/> +<use xlink:href="#glyph-1-4" x="180.422852" y="326.207031"/> +<use xlink:href="#glyph-1-8" x="180.422852" y="321.207031"/> +<use xlink:href="#glyph-1-11" x="180.422852" y="318.207031"/> +<use xlink:href="#glyph-1-12" x="180.422852" y="311.207031"/> +<use xlink:href="#glyph-1-11" x="180.422852" y="306.207031"/> +<use xlink:href="#glyph-1-8" x="180.422852" y="299.207031"/> +<use xlink:href="#glyph-1-6" x="180.422852" y="296.207031"/> +<use xlink:href="#glyph-1-11" x="180.422852" y="294.207031"/> +<use xlink:href="#glyph-1-11" x="180.422852" y="287.207031"/> +<use xlink:href="#glyph-1-9" x="180.422852" y="280.207031"/> +<use xlink:href="#glyph-1-13" x="180.422852" y="275.207031"/> +<use xlink:href="#glyph-1-14" x="180.422852" y="272.207031"/> +<use xlink:href="#glyph-1-15" x="180.422852" y="268.207031"/> +<use xlink:href="#glyph-1-6" x="180.422852" y="263.207031"/> +<use xlink:href="#glyph-1-7" x="180.422852" y="261.207031"/> +<use xlink:href="#glyph-1-6" x="180.422852" y="259.207031"/> +<use xlink:href="#glyph-1-13" x="180.422852" y="257.207031"/> +<use xlink:href="#glyph-1-1" x="180.422852" y="254.207031"/> +</g> +<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> +<use xlink:href="#glyph-1-0" x="265.219727" y="307.207031"/> +<use xlink:href="#glyph-1-1" x="265.219727" y="302.207031"/> +<use xlink:href="#glyph-1-2" x="265.219727" y="298.207031"/> +<use xlink:href="#glyph-1-3" x="265.219727" y="293.207031"/> +<use xlink:href="#glyph-1-4" x="265.219727" y="290.207031"/> +<use xlink:href="#glyph-1-5" x="265.219727" y="285.207031"/> +<use xlink:href="#glyph-1-4" x="265.219727" y="282.207031"/> +<use xlink:href="#glyph-1-6" x="265.219727" y="277.207031"/> +<use xlink:href="#glyph-1-7" x="265.219727" y="275.207031"/> +<use xlink:href="#glyph-1-8" x="265.219727" y="273.207031"/> +<use xlink:href="#glyph-1-10" x="265.219727" y="270.207031"/> +<use xlink:href="#glyph-1-4" x="265.219727" y="265.207031"/> +<use xlink:href="#glyph-1-8" x="265.219727" y="260.207031"/> +<use xlink:href="#glyph-1-16" x="265.219727" y="257.207031"/> +<use xlink:href="#glyph-1-6" x="265.219727" y="255.207031"/> +<use xlink:href="#glyph-1-13" x="265.219727" y="253.207031"/> +</g> +<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> +<use xlink:href="#glyph-1-0" x="350.020508" y="342.207031"/> +<use xlink:href="#glyph-1-1" x="350.020508" y="337.207031"/> +<use xlink:href="#glyph-1-2" x="350.020508" y="333.207031"/> +<use xlink:href="#glyph-1-3" x="350.020508" y="328.207031"/> +<use xlink:href="#glyph-1-4" x="350.020508" y="325.207031"/> +<use xlink:href="#glyph-1-5" x="350.020508" y="320.207031"/> +<use xlink:href="#glyph-1-4" x="350.020508" y="317.207031"/> +<use xlink:href="#glyph-1-6" x="350.020508" y="312.207031"/> +<use xlink:href="#glyph-1-7" x="350.020508" y="310.207031"/> +<use xlink:href="#glyph-1-8" x="350.020508" y="308.207031"/> +<use xlink:href="#glyph-1-10" x="350.020508" y="305.207031"/> +<use xlink:href="#glyph-1-4" x="350.020508" y="300.207031"/> +<use xlink:href="#glyph-1-8" x="350.020508" y="295.207031"/> +<use xlink:href="#glyph-1-6" x="350.020508" y="292.207031"/> +<use xlink:href="#glyph-1-10" x="350.020508" y="290.207031"/> +<use xlink:href="#glyph-1-13" x="350.020508" y="285.207031"/> +<use xlink:href="#glyph-1-8" x="350.020508" y="282.207031"/> +<use xlink:href="#glyph-1-15" x="350.020508" y="279.207031"/> +<use xlink:href="#glyph-1-17" x="350.020508" y="274.207031"/> +<use xlink:href="#glyph-1-8" x="350.020508" y="270.207031"/> +<use xlink:href="#glyph-1-4" x="350.020508" y="267.207031"/> +<use xlink:href="#glyph-1-0" x="350.020508" y="262.207031"/> +<use xlink:href="#glyph-1-13" x="350.020508" y="257.207031"/> +<use xlink:href="#glyph-1-18" x="350.020508" y="254.207031"/> +</g> +<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> +<use xlink:href="#glyph-1-0" x="434.817383" y="318.207031"/> +<use xlink:href="#glyph-1-1" x="434.817383" y="313.207031"/> +<use xlink:href="#glyph-1-2" x="434.817383" y="309.207031"/> +<use xlink:href="#glyph-1-3" x="434.817383" y="304.207031"/> +<use xlink:href="#glyph-1-4" x="434.817383" y="301.207031"/> +<use xlink:href="#glyph-1-5" x="434.817383" y="296.207031"/> +<use xlink:href="#glyph-1-4" x="434.817383" y="293.207031"/> +<use xlink:href="#glyph-1-6" x="434.817383" y="288.207031"/> +<use xlink:href="#glyph-1-7" x="434.817383" y="286.207031"/> +<use xlink:href="#glyph-1-8" x="434.817383" y="284.207031"/> +<use xlink:href="#glyph-1-10" x="434.817383" y="281.207031"/> +<use xlink:href="#glyph-1-4" x="434.817383" y="276.207031"/> +<use xlink:href="#glyph-1-8" x="434.817383" y="271.207031"/> +<use xlink:href="#glyph-1-18" x="434.817383" y="268.207031"/> +<use xlink:href="#glyph-1-0" x="434.817383" y="264.207031"/> +<use xlink:href="#glyph-1-12" x="434.817383" y="259.207031"/> +<use xlink:href="#glyph-1-19" x="434.817383" y="254.207031"/> +</g> +<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> +<use xlink:href="#glyph-1-0" x="519.614258" y="336.207031"/> +<use xlink:href="#glyph-1-1" x="519.614258" y="331.207031"/> +<use xlink:href="#glyph-1-2" x="519.614258" y="327.207031"/> +<use xlink:href="#glyph-1-3" x="519.614258" y="322.207031"/> +<use xlink:href="#glyph-1-4" x="519.614258" y="319.207031"/> +<use xlink:href="#glyph-1-5" x="519.614258" y="314.207031"/> +<use xlink:href="#glyph-1-4" x="519.614258" y="311.207031"/> +<use xlink:href="#glyph-1-6" x="519.614258" y="306.207031"/> +<use xlink:href="#glyph-1-7" x="519.614258" y="304.207031"/> +<use xlink:href="#glyph-1-8" x="519.614258" y="302.207031"/> +<use xlink:href="#glyph-1-10" x="519.614258" y="299.207031"/> +<use xlink:href="#glyph-1-4" x="519.614258" y="294.207031"/> +<use xlink:href="#glyph-1-8" x="519.614258" y="289.207031"/> +<use xlink:href="#glyph-1-18" x="519.614258" y="286.207031"/> +<use xlink:href="#glyph-1-13" x="519.614258" y="282.207031"/> +<use xlink:href="#glyph-1-14" x="519.614258" y="279.207031"/> +<use xlink:href="#glyph-1-13" x="519.614258" y="275.207031"/> +<use xlink:href="#glyph-1-6" x="519.614258" y="272.207031"/> +<use xlink:href="#glyph-1-19" x="519.614258" y="270.207031"/> +<use xlink:href="#glyph-1-8" x="519.614258" y="266.207031"/> +<use xlink:href="#glyph-1-4" x="519.614258" y="263.207031"/> +<use xlink:href="#glyph-1-0" x="519.614258" y="258.207031"/> +<use xlink:href="#glyph-1-13" x="519.614258" y="253.207031"/> +</g> +<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> +<use xlink:href="#glyph-1-0" x="604.411133" y="362.207031"/> +<use xlink:href="#glyph-1-1" x="604.411133" y="357.207031"/> +<use xlink:href="#glyph-1-2" x="604.411133" y="353.207031"/> +<use xlink:href="#glyph-1-3" x="604.411133" y="348.207031"/> +<use xlink:href="#glyph-1-4" x="604.411133" y="345.207031"/> +<use xlink:href="#glyph-1-5" x="604.411133" y="340.207031"/> +<use xlink:href="#glyph-1-4" x="604.411133" y="337.207031"/> +<use xlink:href="#glyph-1-6" x="604.411133" y="332.207031"/> +<use xlink:href="#glyph-1-7" x="604.411133" y="330.207031"/> +<use xlink:href="#glyph-1-8" x="604.411133" y="328.207031"/> +<use xlink:href="#glyph-1-10" x="604.411133" y="325.207031"/> +<use xlink:href="#glyph-1-4" x="604.411133" y="320.207031"/> +<use xlink:href="#glyph-1-8" x="604.411133" y="315.207031"/> +<use xlink:href="#glyph-1-3" x="604.411133" y="312.207031"/> +<use xlink:href="#glyph-1-9" x="604.411133" y="309.207031"/> +<use xlink:href="#glyph-1-10" x="604.411133" y="304.207031"/> +<use xlink:href="#glyph-1-13" x="604.411133" y="299.207031"/> +<use xlink:href="#glyph-1-6" x="604.411133" y="296.207031"/> +<use xlink:href="#glyph-1-11" x="604.411133" y="294.207031"/> +<use xlink:href="#glyph-1-12" x="604.411133" y="287.207031"/> +<use xlink:href="#glyph-1-8" x="604.411133" y="282.207031"/> +<use xlink:href="#glyph-1-18" x="604.411133" y="279.207031"/> +<use xlink:href="#glyph-1-11" x="604.411133" y="275.207031"/> +<use xlink:href="#glyph-1-14" x="604.411133" y="268.207031"/> +<use xlink:href="#glyph-1-7" x="604.411133" y="264.207031"/> +<use xlink:href="#glyph-1-7" x="604.411133" y="262.207031"/> +<use xlink:href="#glyph-1-6" x="604.411133" y="260.207031"/> +<use xlink:href="#glyph-1-10" x="604.411133" y="258.207031"/> +<use xlink:href="#glyph-1-13" x="604.411133" y="253.207031"/> +</g> +<path fill="none" stroke-width="0.5" stroke-linecap="round" stroke-linejoin="round" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 50.371094 243.746094 L 50.371094 24.886719 M 46.121094 243.746094 L 50.371094 243.746094 M 46.121094 155.394531 L 50.371094 155.394531 M 46.121094 67.042969 L 50.371094 67.042969 "/> +<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> +<use xlink:href="#glyph-2-0" x="31.914062" y="246.602539"/> +<use xlink:href="#glyph-2-1" x="36.914062" y="246.602539"/> +<use xlink:href="#glyph-2-2" x="38.914062" y="246.602539"/> +</g> +<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> +<use xlink:href="#glyph-2-0" x="26.914062" y="158.24707"/> +<use xlink:href="#glyph-2-2" x="31.914062" y="158.24707"/> +<use xlink:href="#glyph-2-1" x="36.914062" y="158.24707"/> +<use xlink:href="#glyph-2-2" x="38.914062" y="158.24707"/> +</g> +<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> +<use xlink:href="#glyph-2-0" x="21.914062" y="69.895508"/> +<use xlink:href="#glyph-2-2" x="26.914062" y="69.895508"/> +<use xlink:href="#glyph-2-2" x="31.914062" y="69.895508"/> +<use xlink:href="#glyph-2-1" x="36.914062" y="69.895508"/> +<use xlink:href="#glyph-2-2" x="38.914062" y="69.895508"/> +</g> +<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> +<use xlink:href="#glyph-3-0" x="14.733398" y="202.066406"/> +<use xlink:href="#glyph-3-1" x="14.733398" y="197.066406"/> +<use xlink:href="#glyph-3-2" x="14.733398" y="194.066406"/> +<use xlink:href="#glyph-3-3" x="14.733398" y="188.066406"/> +<use xlink:href="#glyph-3-4" x="14.733398" y="180.066406"/> +<use xlink:href="#glyph-3-2" x="14.733398" y="174.066406"/> +<use xlink:href="#glyph-3-3" x="14.733398" y="168.066406"/> +<use xlink:href="#glyph-3-5" x="14.733398" y="160.066406"/> +<use xlink:href="#glyph-3-6" x="14.733398" y="154.066406"/> +<use xlink:href="#glyph-3-2" x="14.733398" y="151.066406"/> +<use xlink:href="#glyph-3-7" x="14.733398" y="145.066406"/> +<use xlink:href="#glyph-3-8" x="14.733398" y="140.066406"/> +<use xlink:href="#glyph-3-9" x="14.733398" y="134.066406"/> +<use xlink:href="#glyph-3-6" x="14.733398" y="130.066406"/> +<use xlink:href="#glyph-3-10" x="14.733398" y="127.066406"/> +<use xlink:href="#glyph-3-11" x="14.733398" y="121.066406"/> +<use xlink:href="#glyph-3-4" x="14.733398" y="116.066406"/> +<use xlink:href="#glyph-3-9" x="14.733398" y="110.066406"/> +<use xlink:href="#glyph-3-2" x="14.733398" y="106.066406"/> +<use xlink:href="#glyph-3-12" x="14.733398" y="100.066406"/> +<use xlink:href="#glyph-3-2" x="14.733398" y="97.066406"/> +<use xlink:href="#glyph-3-13" x="14.733398" y="91.066406"/> +<use xlink:href="#glyph-3-1" x="14.733398" y="88.066406"/> +<use xlink:href="#glyph-3-14" x="14.733398" y="85.066406"/> +<use xlink:href="#glyph-3-12" x="14.733398" y="82.066406"/> +<use xlink:href="#glyph-3-15" x="14.733398" y="79.066406"/> +<use xlink:href="#glyph-3-1" x="14.733398" y="73.066406"/> +<use xlink:href="#glyph-3-1" x="14.733398" y="70.066406"/> +</g> +<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> +<use xlink:href="#glyph-4-0" x="186.25" y="16.871094"/> +<use xlink:href="#glyph-4-1" x="194.25" y="16.871094"/> +<use xlink:href="#glyph-4-2" x="201.25" y="16.871094"/> +<use xlink:href="#glyph-4-3" x="209.25" y="16.871094"/> +<use xlink:href="#glyph-4-4" x="214.25" y="16.871094"/> +<use xlink:href="#glyph-4-5" x="221.25" y="16.871094"/> +<use xlink:href="#glyph-4-4" x="226.25" y="16.871094"/> +<use xlink:href="#glyph-4-6" x="233.25" y="16.871094"/> +<use xlink:href="#glyph-4-7" x="237.25" y="16.871094"/> +<use xlink:href="#glyph-4-8" x="241.25" y="16.871094"/> +<use xlink:href="#glyph-4-9" x="244.25" y="16.871094"/> +<use xlink:href="#glyph-4-10" x="251.25" y="16.871094"/> +<use xlink:href="#glyph-4-7" x="259.25" y="16.871094"/> +<use xlink:href="#glyph-4-9" x="263.25" y="16.871094"/> +<use xlink:href="#glyph-4-11" x="270.25" y="16.871094"/> +<use xlink:href="#glyph-4-6" x="275.25" y="16.871094"/> +<use xlink:href="#glyph-4-4" x="279.25" y="16.871094"/> +<use xlink:href="#glyph-4-12" x="286.25" y="16.871094"/> +<use xlink:href="#glyph-4-8" x="294.25" y="16.871094"/> +<use xlink:href="#glyph-4-2" x="297.25" y="16.871094"/> +<use xlink:href="#glyph-4-13" x="305.25" y="16.871094"/> +<use xlink:href="#glyph-4-13" x="312.25" y="16.871094"/> +<use xlink:href="#glyph-4-14" x="319.25" y="16.871094"/> +<use xlink:href="#glyph-4-15" x="327.25" y="16.871094"/> +<use xlink:href="#glyph-4-16" x="333.25" y="16.871094"/> +<use xlink:href="#glyph-4-13" x="337.25" y="16.871094"/> +<use xlink:href="#glyph-4-12" x="344.25" y="16.871094"/> +<use xlink:href="#glyph-4-17" x="352.25" y="16.871094"/> +<use xlink:href="#glyph-4-8" x="360.25" y="16.871094"/> +<use xlink:href="#glyph-4-18" x="363.25" y="16.871094"/> +<use xlink:href="#glyph-4-19" x="370.25" y="16.871094"/> +<use xlink:href="#glyph-4-20" x="377.25" y="16.871094"/> +<use xlink:href="#glyph-4-8" x="386.25" y="16.871094"/> +<use xlink:href="#glyph-4-6" x="389.25" y="16.871094"/> +<use xlink:href="#glyph-4-12" x="393.25" y="16.871094"/> +<use xlink:href="#glyph-4-15" x="401.25" y="16.871094"/> +<use xlink:href="#glyph-4-11" x="407.25" y="16.871094"/> +<use xlink:href="#glyph-4-3" x="412.25" y="16.871094"/> +<use xlink:href="#glyph-4-21" x="417.25" y="16.871094"/> +<use xlink:href="#glyph-4-22" x="425.25" y="16.871094"/> +<use xlink:href="#glyph-4-11" x="431.25" y="16.871094"/> +<use xlink:href="#glyph-4-6" x="436.25" y="16.871094"/> +<use xlink:href="#glyph-4-4" x="440.25" y="16.871094"/> +<use xlink:href="#glyph-4-12" x="447.25" y="16.871094"/> +<use xlink:href="#glyph-4-15" x="455.25" y="16.871094"/> +</g> +</svg> diff --git a/images/2025-pydrofoil-itype-after.svg b/images/2025-pydrofoil-itype-after.svg new file mode 100644 index 000000000..3deb068f4 --- /dev/null +++ b/images/2025-pydrofoil-itype-after.svg @@ -0,0 +1,329 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" + "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<!-- Generated by graphviz version 2.43.0 (0) + --> +<!-- Title: _G Pages: 1 --> +<svg width="2839pt" height="1032pt" + viewBox="0.00 0.00 2838.50 1032.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> +<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 1028)"> +<title>_G</title> +<polygon fill="white" stroke="transparent" points="-4,4 -4,-1028 2834.5,-1028 2834.5,4 -4,4"/> +<!-- _graphzexecute__zITYPE --> +<g id="node1" class="node"> +<title>_graphzexecute__zITYPE</title> +<polygon fill="green" stroke="black" points="2290.5,-1024 2153.5,-1024 2153.5,-986 2290.5,-986 2290.5,-1024"/> +<text text-anchor="start" x="2161.5" y="-1008.8" font-family="Times,serif" font-size="14.00">zexecute_zITYPE</text> +<text text-anchor="middle" x="2222" y="-993.8" font-family="Times,serif" font-size="14.00">[zmergez3var]</text> +</g> +<!-- _275738704 --> +<g id="node2" class="node"> +<title>_275738704</title> +<polygon fill="white" stroke="black" points="2830.5,-949 1613.5,-949 1613.5,-761 2830.5,-761 2830.5,-949"/> +<text text-anchor="start" x="1621.5" y="-933.8" font-family="Times,serif" font-size="14.00">i0 = zITYPE(zmergez3var) [UnionCast]</text> +<text text-anchor="start" x="1621.5" y="-918.8" font-family="Times,serif" font-size="14.00">i1 = ztuplez3z5bv12_z5bv5_z5bv5_z5enumz0zziop0(i0) [FieldAccess]</text> +<text text-anchor="start" x="1621.5" y="-903.8" font-family="Times,serif" font-size="14.00">i2 = ztuplez3z5bv12_z5bv5_z5bv5_z5enumz0zziop1(i0) [FieldAccess]</text> +<text text-anchor="start" x="1621.5" y="-888.8" font-family="Times,serif" font-size="14.00">i3 = ztuplez3z5bv12_z5bv5_z5bv5_z5enumz0zziop2(i0) [FieldAccess]</text> +<text text-anchor="start" x="1621.5" y="-873.8" font-family="Times,serif" font-size="14.00">i4 = ztuplez3z5bv12_z5bv5_z5bv5_z5enumz0zziop3(i0) [FieldAccess]</text> +<text text-anchor="start" x="1621.5" y="-858.8" font-family="Times,serif" font-size="14.00">i5 = inlined zrX_bits() [Comment]</text> +<text text-anchor="start" x="1621.5" y="-843.8" font-family="Times,serif" font-size="14.00">i6 = @unsigned_bv(i2, MachineIntConstant(5)) [Operation]</text> +<text text-anchor="start" x="1621.5" y="-828.8" font-family="Times,serif" font-size="14.00">i7 = zrX(i6) [Operation]</text> +<text text-anchor="start" x="1621.5" y="-813.8" font-family="Times,serif" font-size="14.00">i8 = inlined zsign_extend() [Comment]</text> +<text text-anchor="start" x="1621.5" y="-798.8" font-family="Times,serif" font-size="14.00">i9 = @sign_extend_bv_i_i(i1, MachineIntConstant(12), MachineIntConstant(64)) [Operation]</text> +<text text-anchor="start" x="1621.5" y="-783.8" font-family="Times,serif" font-size="14.00">i10 = @eq(EnumConstant('zRISCV_ADDI', Enum('ziop', ('zRISCV_ADDI', 'zRISCV_SLTI', 'zRISCV_SLTIU', 'zRISCV_XORI', 'zRISCV_ORI', 'zRISCV_ANDI'))), i4) [Operation]</text> +<text text-anchor="middle" x="2222" y="-768.8" font-family="Times,serif" font-size="14.00">goto if i10</text> +</g> +<!-- _graphzexecute__zITYPE->_275738704 --> +<g id="edge25" class="edge"> +<title>_graphzexecute__zITYPE->_275738704</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M2222,-985.85C2222,-978.5 2222,-969.39 2222,-959.43"/> +<polygon fill="black" stroke="black" points="2225.5,-959.22 2222,-949.22 2218.5,-959.22 2225.5,-959.22"/> +</g> +<!-- _275739096 --> +<g id="node3" class="node"> +<title>_275739096</title> +<polygon fill="white" stroke="black" points="2510.5,-710 1299.5,-710 1299.5,-672 2510.5,-672 2510.5,-710"/> +<text text-anchor="start" x="1307.5" y="-694.8" font-family="Times,serif" font-size="14.00">i11 = @eq(EnumConstant('zRISCV_SLTI', Enum('ziop', ('zRISCV_ADDI', 'zRISCV_SLTI', 'zRISCV_SLTIU', 'zRISCV_XORI', 'zRISCV_ORI', 'zRISCV_ANDI'))), i4) [Operation]</text> +<text text-anchor="middle" x="1905" y="-679.8" font-family="Times,serif" font-size="14.00">goto if i11</text> +</g> +<!-- _275738704->_275739096 --> +<g id="edge22" class="edge"> +<title>_275738704->_275739096</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M2039.9,-760.94C2006.13,-743.68 1973.82,-727.17 1949.29,-714.64"/> +<polygon fill="black" stroke="black" points="1950.78,-711.47 1940.29,-710.03 1947.6,-717.7 1950.78,-711.47"/> +<text text-anchor="middle" x="2018" y="-731.8" font-family="Times,serif" font-size="14.00">False</text> +</g> +<!-- _275738760 --> +<g id="node19" class="node"> +<title>_275738760</title> +<polygon fill="white" stroke="black" points="2788,-654 2290,-654 2290,-616 2788,-616 2788,-654"/> +<text text-anchor="start" x="2298" y="-638.8" font-family="Times,serif" font-size="14.00">i17 = @add_bits_bv_bv(i7, i9, MachineIntConstant(64)) [Operation]</text> +<text text-anchor="middle" x="2539" y="-623.8" font-family="Times,serif" font-size="14.00">goto</text> +</g> +<!-- _275738704->_275738760 --> +<g id="edge24" class="edge"> +<title>_275738704->_275738760</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M2462.97,-761C2483.81,-746.22 2503.01,-729.31 2519,-710 2529.59,-697.22 2534.61,-679.32 2536.97,-664.33"/> +<polygon fill="black" stroke="black" points="2540.49,-664.41 2538.26,-654.05 2533.54,-663.53 2540.49,-664.41"/> +<text text-anchor="middle" x="2519" y="-731.8" font-family="Times,serif" font-size="14.00">True</text> +</g> +<!-- _275739264 --> +<g id="node4" class="node"> +<title>_275739264</title> +<polygon fill="white" stroke="black" points="1826.5,-560.5 603.5,-560.5 603.5,-522.5 1826.5,-522.5 1826.5,-560.5"/> +<text text-anchor="start" x="611.5" y="-545.3" font-family="Times,serif" font-size="14.00">i12 = @eq(EnumConstant('zRISCV_SLTIU', Enum('ziop', ('zRISCV_ADDI', 'zRISCV_SLTI', 'zRISCV_SLTIU', 'zRISCV_XORI', 'zRISCV_ORI', 'zRISCV_ANDI'))), i4) [Operation]</text> +<text text-anchor="middle" x="1215" y="-530.3" font-family="Times,serif" font-size="14.00">goto if i12</text> +</g> +<!-- _275739096->_275739264 --> +<g id="edge15" class="edge"> +<title>_275739096->_275739264</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1820.74,-671.99C1691.32,-644.32 1444.44,-591.55 1309.25,-562.65"/> +<polygon fill="black" stroke="black" points="1309.83,-559.19 1299.32,-560.52 1308.36,-566.04 1309.83,-559.19"/> +<text text-anchor="middle" x="1739" y="-631.3" font-family="Times,serif" font-size="14.00">False</text> +</g> +<!-- _275739152 --> +<g id="node15" class="node"> +<title>_275739152</title> +<polygon fill="white" stroke="black" points="2283.5,-598 1844.5,-598 1844.5,-485 2283.5,-485 2283.5,-598"/> +<text text-anchor="start" x="1852.5" y="-582.8" font-family="Times,serif" font-size="14.00">i30 = inlined zz8operatorz0zI_sz9() [Comment]</text> +<text text-anchor="start" x="1852.5" y="-567.8" font-family="Times,serif" font-size="14.00">i31 = @signed_bv(i7, MachineIntConstant(64)) [Operation]</text> +<text text-anchor="start" x="1852.5" y="-552.8" font-family="Times,serif" font-size="14.00">i32 = @signed_bv(i9, MachineIntConstant(64)) [Operation]</text> +<text text-anchor="start" x="1852.5" y="-537.8" font-family="Times,serif" font-size="14.00">i33 = @lt(i31, i32) [Operation]</text> +<text text-anchor="start" x="1852.5" y="-522.8" font-family="Times,serif" font-size="14.00">i34 = inlined zbool_to_bits() [Comment]</text> +<text text-anchor="start" x="1852.5" y="-507.8" font-family="Times,serif" font-size="14.00">i35 = inlined zbool_bits_forwards() [Comment]</text> +<text text-anchor="middle" x="2064" y="-492.8" font-family="Times,serif" font-size="14.00">goto if i33</text> +</g> +<!-- _275739096->_275739152 --> +<g id="edge21" class="edge"> +<title>_275739096->_275739152</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1924.5,-671.91C1942.46,-655.25 1970.19,-629.52 1996.22,-605.38"/> +<polygon fill="black" stroke="black" points="1998.91,-607.66 2003.86,-598.29 1994.15,-602.52 1998.91,-607.66"/> +<text text-anchor="middle" x="2002" y="-631.3" font-family="Times,serif" font-size="14.00">True</text> +</g> +<!-- _275739432 --> +<g id="node5" class="node"> +<title>_275739432</title> +<polygon fill="white" stroke="black" points="1341.5,-411.5 124.5,-411.5 124.5,-373.5 1341.5,-373.5 1341.5,-411.5"/> +<text text-anchor="start" x="132.5" y="-396.3" font-family="Times,serif" font-size="14.00">i13 = @eq(EnumConstant('zRISCV_ANDI', Enum('ziop', ('zRISCV_ADDI', 'zRISCV_SLTI', 'zRISCV_SLTIU', 'zRISCV_XORI', 'zRISCV_ORI', 'zRISCV_ANDI'))), i4) [Operation]</text> +<text text-anchor="middle" x="733" y="-381.3" font-family="Times,serif" font-size="14.00">goto if i13</text> +</g> +<!-- _275739264->_275739432 --> +<g id="edge8" class="edge"> +<title>_275739264->_275739432</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1155.9,-522.47C1066.43,-495.19 897,-443.52 802.01,-414.55"/> +<polygon fill="black" stroke="black" points="802.79,-411.13 792.21,-411.56 800.75,-417.82 802.79,-411.13"/> +<text text-anchor="middle" x="993" y="-455.8" font-family="Times,serif" font-size="14.00">False</text> +</g> +<!-- _275739376 --> +<g id="node11" class="node"> +<title>_275739376</title> +<polygon fill="white" stroke="black" points="1714.5,-434 1359.5,-434 1359.5,-351 1714.5,-351 1714.5,-434"/> +<text text-anchor="start" x="1367.5" y="-418.8" font-family="Times,serif" font-size="14.00">i25 = inlined zz8operatorz0zI_uz9() [Comment]</text> +<text text-anchor="start" x="1367.5" y="-403.8" font-family="Times,serif" font-size="14.00">i26 = @lt_unsigned64(i7, i9) [Operation]</text> +<text text-anchor="start" x="1367.5" y="-388.8" font-family="Times,serif" font-size="14.00">i27 = inlined zbool_to_bits() [Comment]</text> +<text text-anchor="start" x="1367.5" y="-373.8" font-family="Times,serif" font-size="14.00">i28 = inlined zbool_bits_forwards() [Comment]</text> +<text text-anchor="middle" x="1537" y="-358.8" font-family="Times,serif" font-size="14.00">goto if i26</text> +</g> +<!-- _275739264->_275739376 --> +<g id="edge14" class="edge"> +<title>_275739264->_275739376</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1254.48,-522.47C1300.09,-501.66 1376.79,-466.64 1438.78,-438.34"/> +<polygon fill="black" stroke="black" points="1440.56,-441.38 1448.2,-434.04 1437.65,-435.01 1440.56,-441.38"/> +<text text-anchor="middle" x="1422" y="-455.8" font-family="Times,serif" font-size="14.00">True</text> +</g> +<!-- _275739600 --> +<g id="node6" class="node"> +<title>_275739600</title> +<polygon fill="white" stroke="black" points="1206,-292.5 0,-292.5 0,-254.5 1206,-254.5 1206,-292.5"/> +<text text-anchor="start" x="8" y="-277.3" font-family="Times,serif" font-size="14.00">i14 = @eq(EnumConstant('zRISCV_ORI', Enum('ziop', ('zRISCV_ADDI', 'zRISCV_SLTI', 'zRISCV_SLTIU', 'zRISCV_XORI', 'zRISCV_ORI', 'zRISCV_ANDI'))), i4) [Operation]</text> +<text text-anchor="middle" x="603" y="-262.3" font-family="Times,serif" font-size="14.00">goto if i14</text> +</g> +<!-- _275739432->_275739600 --> +<g id="edge5" class="edge"> +<title>_275739432->_275739600</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M712.97,-373.48C690.99,-353.69 655.56,-321.8 630.87,-299.58"/> +<polygon fill="black" stroke="black" points="633.04,-296.83 623.26,-292.74 628.36,-302.03 633.04,-296.83"/> +<text text-anchor="middle" x="687" y="-321.8" font-family="Times,serif" font-size="14.00">False</text> +</g> +<!-- _275739488 --> +<g id="node10" class="node"> +<title>_275739488</title> +<polygon fill="white" stroke="black" points="1325,-229 1013,-229 1013,-191 1325,-191 1325,-229"/> +<text text-anchor="start" x="1021" y="-213.8" font-family="Times,serif" font-size="14.00">i20 = @and_vec_bv_bv(i7, i9) [Operation]</text> +<text text-anchor="middle" x="1169" y="-198.8" font-family="Times,serif" font-size="14.00">goto</text> +</g> +<!-- _275739432->_275739488 --> +<g id="edge7" class="edge"> +<title>_275739432->_275739488</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M979.52,-373.47C1081.57,-360.4 1183.49,-338.05 1215,-300 1230.02,-281.86 1225.32,-268.18 1215,-247 1213.1,-243.1 1210.55,-239.5 1207.63,-236.21"/> +<polygon fill="black" stroke="black" points="1209.87,-233.51 1200.24,-229.09 1205.01,-238.55 1209.87,-233.51"/> +<text text-anchor="middle" x="1208" y="-321.8" font-family="Times,serif" font-size="14.00">True</text> +</g> +<!-- _275739992 --> +<g id="node7" class="node"> +<title>_275739992</title> +<polygon fill="white" stroke="black" points="757.5,-165.5 448.5,-165.5 448.5,-127.5 757.5,-127.5 757.5,-165.5"/> +<text text-anchor="start" x="456.5" y="-150.3" font-family="Times,serif" font-size="14.00">i15 = @xor_vec_bv_bv(i7, i9) [Operation]</text> +<text text-anchor="middle" x="603" y="-135.3" font-family="Times,serif" font-size="14.00">goto</text> +</g> +<!-- _275739600->_275739992 --> +<g id="edge2" class="edge"> +<title>_275739600->_275739992</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M603,-254.32C603,-233.77 603,-200.05 603,-175.99"/> +<polygon fill="black" stroke="black" points="606.5,-175.7 603,-165.7 599.5,-175.7 606.5,-175.7"/> +<text text-anchor="middle" x="622" y="-206.3" font-family="Times,serif" font-size="14.00">False</text> +</g> +<!-- _275739712 --> +<g id="node9" class="node"> +<title>_275739712</title> +<polygon fill="white" stroke="black" points="1076.5,-165.5 775.5,-165.5 775.5,-127.5 1076.5,-127.5 1076.5,-165.5"/> +<text text-anchor="start" x="783.5" y="-150.3" font-family="Times,serif" font-size="14.00">i21 = @or_vec_bv_bv(i7, i9) [Operation]</text> +<text text-anchor="middle" x="926" y="-135.3" font-family="Times,serif" font-size="14.00">goto</text> +</g> +<!-- _275739600->_275739712 --> +<g id="edge4" class="edge"> +<title>_275739600->_275739712</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M649.62,-254.46C707.83,-231.93 807.32,-193.43 869.71,-169.28"/> +<polygon fill="black" stroke="black" points="871.33,-172.41 879.39,-165.54 868.8,-165.88 871.33,-172.41"/> +<text text-anchor="middle" x="830" y="-206.3" font-family="Times,serif" font-size="14.00">True</text> +</g> +<!-- _275738872 --> +<g id="node8" class="node"> +<title>_275738872</title> +<polygon fill="yellow" stroke="black" points="1634.5,-83 825.5,-83 825.5,0 1634.5,0 1634.5,-83"/> +<text text-anchor="start" x="833.5" y="-67.8" font-family="Times,serif" font-size="14.00">i16 = phi [i17, i18, i19, i20, i21, i15]</text> +<text text-anchor="start" x="833.5" y="-52.8" font-family="Times,serif" font-size="14.00">i22 = inlined zwX_bits() [Comment]</text> +<text text-anchor="start" x="833.5" y="-37.8" font-family="Times,serif" font-size="14.00">i23 = @unsigned_bv(i3, MachineIntConstant(5)) [Operation]</text> +<text text-anchor="start" x="833.5" y="-22.8" font-family="Times,serif" font-size="14.00">i24 = zwX(i23, i16) [Operation]</text> +<text text-anchor="middle" x="1230" y="-7.8" font-family="Times,serif" font-size="14.00">Return(EnumConstant('zRETIRE_SUCCESS', Enum('zRetired', ('zRETIRE_SUCCESS', 'zRETIRE_FAIL'))), None)</text> +</g> +<!-- _275739992->_275738872 --> +<g id="edge1" class="edge"> +<title>_275739992->_275738872</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M712.57,-127.5C784.72,-115.65 882.31,-99.62 973.3,-84.67"/> +<polygon fill="black" stroke="black" points="973.91,-88.12 983.22,-83.04 972.78,-81.21 973.91,-88.12"/> +</g> +<!-- _275739712->_275738872 --> +<g id="edge3" class="edge"> +<title>_275739712->_275738872</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M979.3,-127.44C1012.94,-116.04 1057.95,-100.79 1100.54,-86.36"/> +<polygon fill="black" stroke="black" points="1101.81,-89.63 1110.15,-83.11 1099.56,-83 1101.81,-89.63"/> +</g> +<!-- _275739488->_275738872 --> +<g id="edge6" class="edge"> +<title>_275739488->_275738872</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1137.76,-190.91C1131.8,-185.92 1126.38,-179.93 1123,-173 1112.68,-151.82 1112.29,-140.98 1123,-120 1128.76,-108.72 1137.02,-98.69 1146.42,-89.91"/> +<polygon fill="black" stroke="black" points="1148.95,-92.35 1154.19,-83.14 1144.35,-87.08 1148.95,-92.35"/> +</g> +<!-- _247178536 --> +<g id="node12" class="node"> +<title>_247178536</title> +<polygon fill="white" stroke="black" points="1529,-291.5 1475,-291.5 1475,-255.5 1529,-255.5 1529,-291.5"/> +<text text-anchor="middle" x="1502" y="-269.8" font-family="Times,serif" font-size="14.00">goto</text> +</g> +<!-- _275739376->_247178536 --> +<g id="edge11" class="edge"> +<title>_275739376->_247178536</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1515.52,-350.94C1513.01,-345.04 1510.73,-338.95 1509,-333 1506.11,-323.05 1504.41,-311.8 1503.41,-301.86"/> +<polygon fill="black" stroke="black" points="1506.88,-301.37 1502.58,-291.69 1499.91,-301.94 1506.88,-301.37"/> +<text text-anchor="middle" x="1528" y="-321.8" font-family="Times,serif" font-size="14.00">False</text> +</g> +<!-- _247178144 --> +<g id="node14" class="node"> +<title>_247178144</title> +<polygon fill="white" stroke="black" points="1601,-291.5 1547,-291.5 1547,-255.5 1601,-255.5 1601,-291.5"/> +<text text-anchor="middle" x="1574" y="-269.8" font-family="Times,serif" font-size="14.00">goto</text> +</g> +<!-- _275739376->_247178144 --> +<g id="edge13" class="edge"> +<title>_275739376->_247178144</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1549.84,-350.91C1555.01,-334.55 1560.84,-316.12 1565.47,-301.47"/> +<polygon fill="black" stroke="black" points="1568.93,-302.13 1568.61,-291.54 1562.26,-300.02 1568.93,-302.13"/> +<text text-anchor="middle" x="1577" y="-321.8" font-family="Times,serif" font-size="14.00">True</text> +</g> +<!-- _247178200 --> +<g id="node13" class="node"> +<title>_247178200</title> +<polygon fill="white" stroke="black" points="2025.5,-173 1132.5,-173 1132.5,-120 2025.5,-120 2025.5,-173"/> +<text text-anchor="start" x="1140.5" y="-157.8" font-family="Times,serif" font-size="14.00">i19 = phi [SmallBitVectorConstant(0x1, SmallFixedBitVector(64)), SmallBitVectorConstant(0x0, SmallFixedBitVector(64))]</text> +<text text-anchor="start" x="1140.5" y="-142.8" font-family="Times,serif" font-size="14.00">i29 = inlined zzzero_extend() [Comment]</text> +<text text-anchor="middle" x="1579" y="-127.8" font-family="Times,serif" font-size="14.00">goto</text> +</g> +<!-- _247178536->_247178200 --> +<g id="edge10" class="edge"> +<title>_247178536->_247178200</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1512.55,-255.38C1524.16,-236.53 1543.14,-205.72 1557.85,-181.84"/> +<polygon fill="black" stroke="black" points="1560.98,-183.42 1563.25,-173.07 1555.02,-179.75 1560.98,-183.42"/> +</g> +<!-- _247178200->_275738872 --> +<g id="edge9" class="edge"> +<title>_247178200->_275738872</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1492.28,-119.91C1457.48,-109.64 1416.38,-97.51 1377.17,-85.93"/> +<polygon fill="black" stroke="black" points="1377.83,-82.48 1367.24,-83 1375.84,-89.19 1377.83,-82.48"/> +</g> +<!-- _247178144->_247178200 --> +<g id="edge12" class="edge"> +<title>_247178144->_247178200</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1574.68,-255.38C1575.43,-236.86 1576.63,-206.8 1577.58,-183.11"/> +<polygon fill="black" stroke="black" points="1581.07,-183.2 1577.98,-173.07 1574.08,-182.92 1581.07,-183.2"/> +</g> +<!-- _272712160 --> +<g id="node16" class="node"> +<title>_272712160</title> +<polygon fill="white" stroke="black" points="2056,-410.5 2002,-410.5 2002,-374.5 2056,-374.5 2056,-410.5"/> +<text text-anchor="middle" x="2029" y="-388.8" font-family="Times,serif" font-size="14.00">goto</text> +</g> +<!-- _275739152->_272712160 --> +<g id="edge18" class="edge"> +<title>_275739152->_272712160</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M2041.01,-484.8C2039.09,-478.86 2037.37,-472.85 2036,-467 2032.5,-452.03 2030.75,-434.95 2029.87,-421.03"/> +<polygon fill="black" stroke="black" points="2033.34,-420.45 2029.33,-410.64 2026.35,-420.81 2033.34,-420.45"/> +<text text-anchor="middle" x="2055" y="-455.8" font-family="Times,serif" font-size="14.00">False</text> +</g> +<!-- _272734368 --> +<g id="node18" class="node"> +<title>_272734368</title> +<polygon fill="white" stroke="black" points="2128,-410.5 2074,-410.5 2074,-374.5 2128,-374.5 2128,-410.5"/> +<text text-anchor="middle" x="2101" y="-388.8" font-family="Times,serif" font-size="14.00">goto</text> +</g> +<!-- _275739152->_272734368 --> +<g id="edge20" class="edge"> +<title>_275739152->_272734368</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M2077.99,-484.93C2083.53,-462.9 2089.65,-438.6 2094.18,-420.59"/> +<polygon fill="black" stroke="black" points="2097.61,-421.32 2096.65,-410.77 2090.82,-419.62 2097.61,-421.32"/> +<text text-anchor="middle" x="2103" y="-455.8" font-family="Times,serif" font-size="14.00">True</text> +</g> +<!-- _272734480 --> +<g id="node17" class="node"> +<title>_272734480</title> +<polygon fill="white" stroke="black" points="2511.5,-300 1618.5,-300 1618.5,-247 2511.5,-247 2511.5,-300"/> +<text text-anchor="start" x="1626.5" y="-284.8" font-family="Times,serif" font-size="14.00">i18 = phi [SmallBitVectorConstant(0x1, SmallFixedBitVector(64)), SmallBitVectorConstant(0x0, SmallFixedBitVector(64))]</text> +<text text-anchor="start" x="1626.5" y="-269.8" font-family="Times,serif" font-size="14.00">i36 = inlined zzzero_extend() [Comment]</text> +<text text-anchor="middle" x="2065" y="-254.8" font-family="Times,serif" font-size="14.00">goto</text> +</g> +<!-- _272712160->_272734480 --> +<g id="edge17" class="edge"> +<title>_272712160->_272734480</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M2034.23,-374.49C2039.42,-357.64 2047.52,-331.32 2054.1,-309.92"/> +<polygon fill="black" stroke="black" points="2057.5,-310.76 2057.1,-300.17 2050.81,-308.7 2057.5,-310.76"/> +</g> +<!-- _272734480->_275738872 --> +<g id="edge16" class="edge"> +<title>_272734480->_275738872</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M2068.14,-246.75C2070.74,-212.31 2069.43,-151.91 2034,-120 2002.84,-91.94 1825.28,-73.18 1644.92,-61.16"/> +<polygon fill="black" stroke="black" points="1644.9,-57.65 1634.69,-60.48 1644.44,-64.63 1644.9,-57.65"/> +</g> +<!-- _272734368->_272734480 --> +<g id="edge19" class="edge"> +<title>_272734368->_272734480</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M2095.77,-374.49C2090.58,-357.64 2082.48,-331.32 2075.9,-309.92"/> +<polygon fill="black" stroke="black" points="2079.19,-308.7 2072.9,-300.17 2072.5,-310.76 2079.19,-308.7"/> +</g> +<!-- _275738760->_275738872 --> +<g id="edge23" class="edge"> +<title>_275738760->_275738872</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M2539,-615.77C2539,-584.15 2539,-517.13 2539,-460.5 2539,-460.5 2539,-460.5 2539,-145.5 2539,-99.94 2028.34,-71.11 1644.93,-55.89"/> +<polygon fill="black" stroke="black" points="1644.89,-52.38 1634.76,-55.48 1644.62,-59.38 1644.89,-52.38"/> +</g> +</g> +</svg> diff --git a/images/2025-pydrofoil-itype-before.svg b/images/2025-pydrofoil-itype-before.svg new file mode 100644 index 000000000..c60ad7795 --- /dev/null +++ b/images/2025-pydrofoil-itype-before.svg @@ -0,0 +1,319 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" + "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<!-- Generated by graphviz version 2.43.0 (0) + --> +<!-- Title: _G Pages: 1 --> +<svg width="2603pt" height="1664pt" + viewBox="0.00 0.00 2602.50 1664.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> +<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 1660)"> +<title>_G</title> +<polygon fill="white" stroke="transparent" points="-4,4 -4,-1660 2598.5,-1660 2598.5,4 -4,4"/> +<!-- _graphzexecute__zITYPE --> +<g id="node1" class="node"> +<title>_graphzexecute__zITYPE</title> +<polygon fill="green" stroke="black" points="681.5,-1656 544.5,-1656 544.5,-1618 681.5,-1618 681.5,-1656"/> +<text text-anchor="start" x="552.5" y="-1640.8" font-family="Times,serif" font-size="14.00">zexecute_zITYPE</text> +<text text-anchor="middle" x="613" y="-1625.8" font-family="Times,serif" font-size="14.00">[zmergez3var]</text> +</g> +<!-- _275738704 --> +<g id="node2" class="node"> +<title>_275738704</title> +<polygon fill="white" stroke="black" points="640,-1581 586,-1581 586,-1545 640,-1545 640,-1581"/> +<text text-anchor="middle" x="613" y="-1559.3" font-family="Times,serif" font-size="14.00">goto</text> +</g> +<!-- _graphzexecute__zITYPE->_275738704 --> +<g id="edge22" class="edge"> +<title>_graphzexecute__zITYPE->_275738704</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M613,-1617.83C613,-1609.89 613,-1600.41 613,-1591.63"/> +<polygon fill="black" stroke="black" points="616.5,-1591.42 613,-1581.42 609.5,-1591.42 616.5,-1591.42"/> +</g> +<!-- _275736744 --> +<g id="node3" class="node"> +<title>_275736744</title> +<polygon fill="white" stroke="black" points="1226,-1508 0,-1508 0,-1275 1226,-1275 1226,-1508"/> +<text text-anchor="start" x="8" y="-1492.8" font-family="Times,serif" font-size="14.00">i0 = zITYPE(zmergez3var) [UnionCast]</text> +<text text-anchor="start" x="8" y="-1477.8" font-family="Times,serif" font-size="14.00">i1 = ztuplez3z5bv12_z5bv5_z5bv5_z5enumz0zziop0(i0) [FieldAccess]</text> +<text text-anchor="start" x="8" y="-1462.8" font-family="Times,serif" font-size="14.00">i2 = zITYPE(zmergez3var) [UnionCast]</text> +<text text-anchor="start" x="8" y="-1447.8" font-family="Times,serif" font-size="14.00">i3 = ztuplez3z5bv12_z5bv5_z5bv5_z5enumz0zziop1(i2) [FieldAccess]</text> +<text text-anchor="start" x="8" y="-1432.8" font-family="Times,serif" font-size="14.00">i4 = zITYPE(zmergez3var) [UnionCast]</text> +<text text-anchor="start" x="8" y="-1417.8" font-family="Times,serif" font-size="14.00">i5 = ztuplez3z5bv12_z5bv5_z5bv5_z5enumz0zziop2(i4) [FieldAccess]</text> +<text text-anchor="start" x="8" y="-1402.8" font-family="Times,serif" font-size="14.00">i6 = zITYPE(zmergez3var) [UnionCast]</text> +<text text-anchor="start" x="8" y="-1387.8" font-family="Times,serif" font-size="14.00">i7 = ztuplez3z5bv12_z5bv5_z5bv5_z5enumz0zziop3(i6) [FieldAccess]</text> +<text text-anchor="start" x="8" y="-1372.8" font-family="Times,serif" font-size="14.00">i8 = zrX_bits(i3) [Operation]</text> +<text text-anchor="start" x="8" y="-1357.8" font-family="Times,serif" font-size="14.00">i9 = zz5i64zDzKz5i(MachineIntConstant(64)) [Operation]</text> +<text text-anchor="start" x="8" y="-1342.8" font-family="Times,serif" font-size="14.00">i10 = $cast(i1) [Cast]</text> +<text text-anchor="start" x="8" y="-1327.8" font-family="Times,serif" font-size="14.00">i11 = zsign_extend(i9, i10) [Operation]</text> +<text text-anchor="start" x="8" y="-1312.8" font-family="Times,serif" font-size="14.00">i12 = $cast(i11) [Cast]</text> +<text text-anchor="start" x="8" y="-1297.8" font-family="Times,serif" font-size="14.00">i13 = @neq(EnumConstant('zRISCV_ADDI', Enum('ziop', ('zRISCV_ADDI', 'zRISCV_SLTI', 'zRISCV_SLTIU', 'zRISCV_XORI', 'zRISCV_ORI', 'zRISCV_ANDI'))), i7) [Operation]</text> +<text text-anchor="middle" x="613" y="-1282.8" font-family="Times,serif" font-size="14.00">goto if i13</text> +</g> +<!-- _275738704->_275736744 --> +<g id="edge21" class="edge"> +<title>_275738704->_275736744</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M613,-1544.81C613,-1537.54 613,-1528.39 613,-1518.2"/> +<polygon fill="black" stroke="black" points="616.5,-1518.13 613,-1508.13 609.5,-1518.13 616.5,-1518.13"/> +</g> +<!-- _275738760 --> +<g id="node4" class="node"> +<title>_275738760</title> +<polygon fill="white" stroke="black" points="722,-1168 444,-1168 444,-1085 722,-1085 722,-1168"/> +<text text-anchor="start" x="452" y="-1152.8" font-family="Times,serif" font-size="14.00">i14 = $cast(i8) [Cast]</text> +<text text-anchor="start" x="452" y="-1137.8" font-family="Times,serif" font-size="14.00">i15 = $cast(i12) [Cast]</text> +<text text-anchor="start" x="452" y="-1122.8" font-family="Times,serif" font-size="14.00">i16 = zadd_bits(i14, i15) [Operation]</text> +<text text-anchor="start" x="452" y="-1107.8" font-family="Times,serif" font-size="14.00">i17 = $cast(i16) [Cast]</text> +<text text-anchor="middle" x="583" y="-1092.8" font-family="Times,serif" font-size="14.00">goto</text> +</g> +<!-- _275736744->_275738760 --> +<g id="edge4" class="edge"> +<title>_275736744->_275738760</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M599.8,-1274.76C595.95,-1241.03 591.94,-1205.9 588.81,-1178.42"/> +<polygon fill="black" stroke="black" points="592.26,-1177.81 587.65,-1168.28 585.31,-1178.61 592.26,-1177.81"/> +<text text-anchor="middle" x="617" y="-1245.8" font-family="Times,serif" font-size="14.00">False</text> +</g> +<!-- _275739096 --> +<g id="node8" class="node"> +<title>_275739096</title> +<polygon fill="white" stroke="black" points="1831,-1224 611,-1224 611,-1186 1831,-1186 1831,-1224"/> +<text text-anchor="start" x="619" y="-1208.8" font-family="Times,serif" font-size="14.00">i25 = @neq(EnumConstant('zRISCV_SLTI', Enum('ziop', ('zRISCV_ADDI', 'zRISCV_SLTI', 'zRISCV_SLTIU', 'zRISCV_XORI', 'zRISCV_ORI', 'zRISCV_ANDI'))), i7) [Operation]</text> +<text text-anchor="middle" x="1221" y="-1193.8" font-family="Times,serif" font-size="14.00">goto if i25</text> +</g> +<!-- _275736744->_275739096 --> +<g id="edge20" class="edge"> +<title>_275736744->_275739096</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M993.74,-1274.96C1054.22,-1256.61 1110.37,-1239.57 1151.72,-1227.02"/> +<polygon fill="black" stroke="black" points="1152.83,-1230.35 1161.38,-1224.09 1150.79,-1223.65 1152.83,-1230.35"/> +<text text-anchor="middle" x="1107" y="-1245.8" font-family="Times,serif" font-size="14.00">True</text> +</g> +<!-- _275738872 --> +<g id="node5" class="node"> +<title>_275738872</title> +<polygon fill="white" stroke="black" points="1242,-199 964,-199 964,-146 1242,-146 1242,-199"/> +<text text-anchor="start" x="972" y="-183.8" font-family="Times,serif" font-size="14.00">i18 = phi [i17, i19, i20, i21, i22, i23]</text> +<text text-anchor="start" x="972" y="-168.8" font-family="Times,serif" font-size="14.00">i24 = zwX_bits(i5, i18) [Operation]</text> +<text text-anchor="middle" x="1103" y="-153.8" font-family="Times,serif" font-size="14.00">goto</text> +</g> +<!-- _275738760->_275738872 --> +<g id="edge3" class="edge"> +<title>_275738760->_275738872</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M583,-1084.72C583,-1047.23 583,-990.12 583,-940.5 583,-940.5 583,-940.5 583,-276.5 583,-200.35 800.31,-179.61 953.97,-174.46"/> +<polygon fill="black" stroke="black" points="954.11,-177.96 963.99,-174.15 953.89,-170.96 954.11,-177.96"/> +</g> +<!-- _275738928 --> +<g id="node6" class="node"> +<title>_275738928</title> +<polygon fill="white" stroke="black" points="1130,-109 1076,-109 1076,-73 1130,-73 1130,-109"/> +<text text-anchor="middle" x="1103" y="-87.3" font-family="Times,serif" font-size="14.00">goto</text> +</g> +<!-- _275738872->_275738928 --> +<g id="edge2" class="edge"> +<title>_275738872->_275738928</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1103,-145.91C1103,-137.48 1103,-128.08 1103,-119.52"/> +<polygon fill="black" stroke="black" points="1106.5,-119.26 1103,-109.26 1099.5,-119.26 1106.5,-119.26"/> +</g> +<!-- _275738984 --> +<g id="node7" class="node"> +<title>_275738984</title> +<polygon fill="yellow" stroke="black" points="1507.5,-36 698.5,-36 698.5,0 1507.5,0 1507.5,-36"/> +<text text-anchor="middle" x="1103" y="-14.3" font-family="Times,serif" font-size="14.00">Return(EnumConstant('zRETIRE_SUCCESS', Enum('zRetired', ('zRETIRE_SUCCESS', 'zRETIRE_FAIL'))), None)</text> +</g> +<!-- _275738928->_275738984 --> +<g id="edge1" class="edge"> +<title>_275738928->_275738984</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1103,-72.81C1103,-64.79 1103,-55.05 1103,-46.07"/> +<polygon fill="black" stroke="black" points="1106.5,-46.03 1103,-36.03 1099.5,-46.03 1106.5,-46.03"/> +</g> +<!-- _275739152 --> +<g id="node9" class="node"> +<title>_275739152</title> +<polygon fill="white" stroke="black" points="1032.5,-1011 597.5,-1011 597.5,-868 1032.5,-868 1032.5,-1011"/> +<text text-anchor="start" x="605.5" y="-995.8" font-family="Times,serif" font-size="14.00">i26 = $cast(i8) [Cast]</text> +<text text-anchor="start" x="605.5" y="-980.8" font-family="Times,serif" font-size="14.00">i27 = $cast(i12) [Cast]</text> +<text text-anchor="start" x="605.5" y="-965.8" font-family="Times,serif" font-size="14.00">i28 = zz8operatorz0zI_sz9(i26, i27) [Operation]</text> +<text text-anchor="start" x="605.5" y="-950.8" font-family="Times,serif" font-size="14.00">i29 = zbool_to_bits(i28) [Operation]</text> +<text text-anchor="start" x="605.5" y="-935.8" font-family="Times,serif" font-size="14.00">i30 = zz5i64zDzKz5i(MachineIntConstant(64)) [Operation]</text> +<text text-anchor="start" x="605.5" y="-920.8" font-family="Times,serif" font-size="14.00">i31 = $cast(i29) [Cast]</text> +<text text-anchor="start" x="605.5" y="-905.8" font-family="Times,serif" font-size="14.00">i32 = zzzero_extend(i30, i31) [Operation]</text> +<text text-anchor="start" x="605.5" y="-890.8" font-family="Times,serif" font-size="14.00">i19 = $cast(i32) [Cast]</text> +<text text-anchor="middle" x="815" y="-875.8" font-family="Times,serif" font-size="14.00">goto</text> +</g> +<!-- _275739096->_275739152 --> +<g id="edge6" class="edge"> +<title>_275739096->_275739152</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1059.88,-1185.93C980.19,-1168.47 889.45,-1134.21 834,-1067 823.41,-1054.16 817.39,-1038 814.17,-1021.56"/> +<polygon fill="black" stroke="black" points="817.57,-1020.63 812.52,-1011.31 810.66,-1021.74 817.57,-1020.63"/> +<text text-anchor="middle" x="1010" y="-1122.8" font-family="Times,serif" font-size="14.00">False</text> +</g> +<!-- _275739264 --> +<g id="node10" class="node"> +<title>_275739264</title> +<polygon fill="white" stroke="black" points="2075,-1067 843,-1067 843,-1029 2075,-1029 2075,-1067"/> +<text text-anchor="start" x="851" y="-1051.8" font-family="Times,serif" font-size="14.00">i33 = @neq(EnumConstant('zRISCV_SLTIU', Enum('ziop', ('zRISCV_ADDI', 'zRISCV_SLTI', 'zRISCV_SLTIU', 'zRISCV_XORI', 'zRISCV_ORI', 'zRISCV_ANDI'))), i7) [Operation]</text> +<text text-anchor="middle" x="1459" y="-1036.8" font-family="Times,serif" font-size="14.00">goto if i33</text> +</g> +<!-- _275739096->_275739264 --> +<g id="edge19" class="edge"> +<title>_275739096->_275739264</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1248.77,-1185.92C1291.82,-1157.87 1374.71,-1103.9 1422.54,-1072.75"/> +<polygon fill="black" stroke="black" points="1424.57,-1075.6 1431.04,-1067.21 1420.75,-1069.73 1424.57,-1075.6"/> +<text text-anchor="middle" x="1418" y="-1122.8" font-family="Times,serif" font-size="14.00">True</text> +</g> +<!-- _275739152->_275738872 --> +<g id="edge5" class="edge"> +<title>_275739152->_275738872</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M815,-867.81C815,-825.87 815,-771.65 815,-723.5 815,-723.5 815,-723.5 815,-276.5 815,-243.34 883.53,-218.03 953.73,-200.79"/> +<polygon fill="black" stroke="black" points="954.73,-204.15 963.64,-198.41 953.1,-197.34 954.73,-204.15"/> +</g> +<!-- _275739376 --> +<g id="node11" class="node"> +<title>_275739376</title> +<polygon fill="white" stroke="black" points="1264.5,-794 829.5,-794 829.5,-651 1264.5,-651 1264.5,-794"/> +<text text-anchor="start" x="837.5" y="-778.8" font-family="Times,serif" font-size="14.00">i34 = $cast(i8) [Cast]</text> +<text text-anchor="start" x="837.5" y="-763.8" font-family="Times,serif" font-size="14.00">i35 = $cast(i12) [Cast]</text> +<text text-anchor="start" x="837.5" y="-748.8" font-family="Times,serif" font-size="14.00">i36 = zz8operatorz0zI_uz9(i34, i35) [Operation]</text> +<text text-anchor="start" x="837.5" y="-733.8" font-family="Times,serif" font-size="14.00">i37 = zbool_to_bits(i36) [Operation]</text> +<text text-anchor="start" x="837.5" y="-718.8" font-family="Times,serif" font-size="14.00">i38 = zz5i64zDzKz5i(MachineIntConstant(64)) [Operation]</text> +<text text-anchor="start" x="837.5" y="-703.8" font-family="Times,serif" font-size="14.00">i39 = $cast(i37) [Cast]</text> +<text text-anchor="start" x="837.5" y="-688.8" font-family="Times,serif" font-size="14.00">i40 = zzzero_extend(i38, i39) [Operation]</text> +<text text-anchor="start" x="837.5" y="-673.8" font-family="Times,serif" font-size="14.00">i20 = $cast(i40) [Cast]</text> +<text text-anchor="middle" x="1047" y="-658.8" font-family="Times,serif" font-size="14.00">goto</text> +</g> +<!-- _275739264->_275739376 --> +<g id="edge8" class="edge"> +<title>_275739264->_275739376</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1382.18,-1028.99C1293.84,-1004.14 1151.09,-950.55 1074,-850 1063.87,-836.79 1057.35,-820.63 1053.19,-804.33"/> +<polygon fill="black" stroke="black" points="1056.51,-803.16 1050.89,-794.18 1049.68,-804.71 1056.51,-803.16"/> +<text text-anchor="middle" x="1343" y="-935.8" font-family="Times,serif" font-size="14.00">False</text> +</g> +<!-- _275739432 --> +<g id="node12" class="node"> +<title>_275739432</title> +<polygon fill="white" stroke="black" points="2309,-850 1083,-850 1083,-812 2309,-812 2309,-850"/> +<text text-anchor="start" x="1091" y="-834.8" font-family="Times,serif" font-size="14.00">i41 = @neq(EnumConstant('zRISCV_ANDI', Enum('ziop', ('zRISCV_ADDI', 'zRISCV_SLTI', 'zRISCV_SLTIU', 'zRISCV_XORI', 'zRISCV_ORI', 'zRISCV_ANDI'))), i7) [Operation]</text> +<text text-anchor="middle" x="1696" y="-819.8" font-family="Times,serif" font-size="14.00">goto if i41</text> +</g> +<!-- _275739264->_275739432 --> +<g id="edge18" class="edge"> +<title>_275739264->_275739432</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1479.21,-1028.67C1521.62,-990.19 1619.99,-900.95 1668.27,-857.16"/> +<polygon fill="black" stroke="black" points="1670.79,-859.6 1675.84,-850.28 1666.09,-854.41 1670.79,-859.6"/> +<text text-anchor="middle" x="1673" y="-935.8" font-family="Times,serif" font-size="14.00">True</text> +</g> +<!-- _275739376->_275738872 --> +<g id="edge7" class="edge"> +<title>_275739376->_275738872</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1035.77,-650.97C1031.21,-616.55 1027,-574.46 1027,-536.5 1027,-536.5 1027,-536.5 1027,-276.5 1027,-249.23 1044.46,-224.44 1062.65,-206.01"/> +<polygon fill="black" stroke="black" points="1065.12,-208.49 1069.89,-199.02 1060.26,-203.45 1065.12,-208.49"/> +</g> +<!-- _275739488 --> +<g id="node13" class="node"> +<title>_275739488</title> +<polygon fill="white" stroke="black" points="1317.5,-577 1042.5,-577 1042.5,-494 1317.5,-494 1317.5,-577"/> +<text text-anchor="start" x="1050.5" y="-561.8" font-family="Times,serif" font-size="14.00">i42 = $cast(i8) [Cast]</text> +<text text-anchor="start" x="1050.5" y="-546.8" font-family="Times,serif" font-size="14.00">i43 = $cast(i12) [Cast]</text> +<text text-anchor="start" x="1050.5" y="-531.8" font-family="Times,serif" font-size="14.00">i44 = zand_vec(i42, i43) [Operation]</text> +<text text-anchor="start" x="1050.5" y="-516.8" font-family="Times,serif" font-size="14.00">i21 = $cast(i44) [Cast]</text> +<text text-anchor="middle" x="1180" y="-501.8" font-family="Times,serif" font-size="14.00">goto</text> +</g> +<!-- _275739432->_275739488 --> +<g id="edge10" class="edge"> +<title>_275739432->_275739488</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1654.21,-811.99C1581.31,-779.91 1427.1,-709.03 1306,-633 1282.41,-618.19 1257.81,-600.03 1236.66,-583.47"/> +<polygon fill="black" stroke="black" points="1238.76,-580.67 1228.74,-577.22 1234.42,-586.16 1238.76,-580.67"/> +<text text-anchor="middle" x="1630" y="-718.8" font-family="Times,serif" font-size="14.00">False</text> +</g> +<!-- _275739600 --> +<g id="node14" class="node"> +<title>_275739600</title> +<polygon fill="white" stroke="black" points="2530.5,-633 1315.5,-633 1315.5,-595 2530.5,-595 2530.5,-633"/> +<text text-anchor="start" x="1323.5" y="-617.8" font-family="Times,serif" font-size="14.00">i45 = @neq(EnumConstant('zRISCV_ORI', Enum('ziop', ('zRISCV_ADDI', 'zRISCV_SLTI', 'zRISCV_SLTIU', 'zRISCV_XORI', 'zRISCV_ORI', 'zRISCV_ANDI'))), i7) [Operation]</text> +<text text-anchor="middle" x="1923" y="-602.8" font-family="Times,serif" font-size="14.00">goto if i45</text> +</g> +<!-- _275739432->_275739600 --> +<g id="edge17" class="edge"> +<title>_275739432->_275739600</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1715.35,-811.67C1755.9,-773.27 1849.81,-684.32 1896.15,-640.43"/> +<polygon fill="black" stroke="black" points="1898.84,-642.7 1903.7,-633.28 1894.03,-637.62 1898.84,-642.7"/> +<text text-anchor="middle" x="1901" y="-718.8" font-family="Times,serif" font-size="14.00">True</text> +</g> +<!-- _275739488->_275738872 --> +<g id="edge9" class="edge"> +<title>_275739488->_275738872</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1171.32,-493.79C1156.16,-422.73 1125.11,-277.18 1110.69,-209.54"/> +<polygon fill="black" stroke="black" points="1114.03,-208.42 1108.52,-199.37 1107.18,-209.88 1114.03,-208.42"/> +</g> +<!-- _275739712 --> +<g id="node15" class="node"> +<title>_275739712</title> +<polygon fill="white" stroke="black" points="1447,-420 1183,-420 1183,-337 1447,-337 1447,-420"/> +<text text-anchor="start" x="1191" y="-404.8" font-family="Times,serif" font-size="14.00">i46 = $cast(i8) [Cast]</text> +<text text-anchor="start" x="1191" y="-389.8" font-family="Times,serif" font-size="14.00">i47 = $cast(i12) [Cast]</text> +<text text-anchor="start" x="1191" y="-374.8" font-family="Times,serif" font-size="14.00">i48 = zor_vec(i46, i47) [Operation]</text> +<text text-anchor="start" x="1191" y="-359.8" font-family="Times,serif" font-size="14.00">i22 = $cast(i48) [Cast]</text> +<text text-anchor="middle" x="1315" y="-344.8" font-family="Times,serif" font-size="14.00">goto</text> +</g> +<!-- _275739600->_275739712 --> +<g id="edge12" class="edge"> +<title>_275739600->_275739712</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1796.17,-594.98C1651.67,-572.28 1427,-529.65 1361,-476 1346.55,-464.26 1336.37,-446.9 1329.32,-430.13"/> +<polygon fill="black" stroke="black" points="1332.41,-428.42 1325.52,-420.37 1325.88,-430.96 1332.41,-428.42"/> +<text text-anchor="middle" x="1709" y="-531.8" font-family="Times,serif" font-size="14.00">False</text> +</g> +<!-- _275739992 --> +<g id="node16" class="node"> +<title>_275739992</title> +<polygon fill="white" stroke="black" points="2594.5,-476 1369.5,-476 1369.5,-438 2594.5,-438 2594.5,-476"/> +<text text-anchor="start" x="1377.5" y="-460.8" font-family="Times,serif" font-size="14.00">i49 = @neq(EnumConstant('zRISCV_XORI', Enum('ziop', ('zRISCV_ADDI', 'zRISCV_SLTI', 'zRISCV_SLTIU', 'zRISCV_XORI', 'zRISCV_ORI', 'zRISCV_ANDI'))), i7) [Operation]</text> +<text text-anchor="middle" x="1982" y="-445.8" font-family="Times,serif" font-size="14.00">goto if i49</text> +</g> +<!-- _275739600->_275739992 --> +<g id="edge16" class="edge"> +<title>_275739600->_275739992</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1929.88,-594.92C1940.09,-568.11 1959.31,-517.6 1971.34,-485.99"/> +<polygon fill="black" stroke="black" points="1974.69,-487.04 1974.98,-476.45 1968.15,-484.55 1974.69,-487.04"/> +<text text-anchor="middle" x="1984" y="-531.8" font-family="Times,serif" font-size="14.00">True</text> +</g> +<!-- _275739712->_275738872 --> +<g id="edge11" class="edge"> +<title>_275739712->_275738872</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1276.9,-336.77C1245.36,-303.62 1198.92,-256.09 1156,-217 1151.93,-213.29 1147.6,-209.51 1143.24,-205.79"/> +<polygon fill="black" stroke="black" points="1145.31,-202.96 1135.4,-199.2 1140.81,-208.32 1145.31,-202.96"/> +</g> +<!-- _275740104 --> +<g id="node17" class="node"> +<title>_275740104</title> +<polygon fill="white" stroke="black" points="1678,-319 1406,-319 1406,-236 1678,-236 1678,-319"/> +<text text-anchor="start" x="1414" y="-303.8" font-family="Times,serif" font-size="14.00">i50 = $cast(i8) [Cast]</text> +<text text-anchor="start" x="1414" y="-288.8" font-family="Times,serif" font-size="14.00">i51 = $cast(i12) [Cast]</text> +<text text-anchor="start" x="1414" y="-273.8" font-family="Times,serif" font-size="14.00">i52 = zxor_vec(i50, i51) [Operation]</text> +<text text-anchor="start" x="1414" y="-258.8" font-family="Times,serif" font-size="14.00">i23 = $cast(i52) [Cast]</text> +<text text-anchor="middle" x="1542" y="-243.8" font-family="Times,serif" font-size="14.00">goto</text> +</g> +<!-- _275739992->_275740104 --> +<g id="edge14" class="edge"> +<title>_275739992->_275740104</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1936.98,-437.84C1870.49,-411.02 1743.99,-359.98 1652.02,-322.88"/> +<polygon fill="black" stroke="black" points="1653.25,-319.61 1642.67,-319.11 1650.63,-326.1 1653.25,-319.61"/> +<text text-anchor="middle" x="1905" y="-374.8" font-family="Times,serif" font-size="14.00">False</text> +</g> +<!-- _275740216 --> +<g id="node18" class="node"> +<title>_275740216</title> +<polygon fill="yellow" stroke="black" points="2171,-295.5 1793,-295.5 1793,-259.5 2171,-259.5 2171,-295.5"/> +<text text-anchor="middle" x="1982" y="-273.8" font-family="Times,serif" font-size="14.00">Raise(StringConstant('match'), '`39 181:26-188:3')</text> +</g> +<!-- _275739992->_275740216 --> +<g id="edge15" class="edge"> +<title>_275739992->_275740216</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1982,-437.67C1982,-406.45 1982,-342.76 1982,-306.12"/> +<polygon fill="black" stroke="black" points="1985.5,-305.68 1982,-295.68 1978.5,-305.68 1985.5,-305.68"/> +<text text-anchor="middle" x="1999" y="-374.8" font-family="Times,serif" font-size="14.00">True</text> +</g> +<!-- _275740104->_275738872 --> +<g id="edge13" class="edge"> +<title>_275740104->_275738872</title> +<path fill="none" stroke="black" stroke-dasharray="5,2" d="M1405.8,-244.55C1346.78,-230.7 1278.33,-214.64 1221.45,-201.29"/> +<polygon fill="black" stroke="black" points="1222.23,-197.88 1211.7,-199 1220.63,-204.69 1222.23,-197.88"/> +</g> +</g> +</svg> diff --git a/images/2025-pydrofoil-mem-states.svg b/images/2025-pydrofoil-mem-states.svg new file mode 100644 index 000000000..483310049 --- /dev/null +++ b/images/2025-pydrofoil-mem-states.svg @@ -0,0 +1,293 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + width="49.19141mm" + height="35.377266mm" + viewBox="0 0 185.9203 133.70935" + version="1.1" + id="svg1" + inkscape:version="1.3.1 (9b9bdc1480, 2023-11-25, custom)" + sodipodi:docname="state.svg" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <sodipodi:namedview + id="namedview1" + pagecolor="#ffffff" + bordercolor="#000000" + borderopacity="0.25" + inkscape:showpageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + inkscape:deskcolor="#d1d1d1" + inkscape:document-units="mm" + inkscape:zoom="5.9011672" + inkscape:cx="88.626535" + inkscape:cy="68.206846" + inkscape:window-width="2494" + inkscape:window-height="1371" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="layer1" /> + <defs + id="defs1"> + <marker + style="overflow:visible" + id="marker11" + refX="0" + refY="0" + orient="auto-start-reverse" + inkscape:stockid="Stylized triangle arrow" + markerWidth="1" + markerHeight="1" + viewBox="0 0 1 1" + inkscape:isstock="true" + inkscape:collect="always" + preserveAspectRatio="xMidYMid"> + <path + transform="scale(0.5)" + style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt" + d="m 6,0 c -3,1 -7,3 -9,5 0,0 0,-4 2,-5 -2,-1 -2,-5 -2,-5 2,2 6,4 9,5 z" + id="path11" /> + </marker> + <marker + style="overflow:visible" + id="ArrowTriangleStylized" + refX="0" + refY="0" + orient="auto-start-reverse" + inkscape:stockid="Stylized triangle arrow" + markerWidth="1" + markerHeight="1" + viewBox="0 0 1 1" + inkscape:isstock="true" + inkscape:collect="always" + preserveAspectRatio="xMidYMid"> + <path + transform="scale(0.5)" + style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt" + d="m 6,0 c -3,1 -7,3 -9,5 0,0 0,-4 2,-5 -2,-1 -2,-5 -2,-5 2,2 6,4 9,5 z" + id="path4" /> + </marker> + <marker + style="overflow:visible" + id="marker11-2-0" + refX="0" + refY="0" + orient="auto-start-reverse" + inkscape:stockid="Stylized triangle arrow" + markerWidth="1" + markerHeight="1" + viewBox="0 0 1 1" + inkscape:isstock="true" + inkscape:collect="always" + preserveAspectRatio="xMidYMid"> + <path + transform="scale(0.5)" + style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt" + d="m 6,0 c -3,1 -7,3 -9,5 0,0 0,-4 2,-5 -2,-1 -2,-5 -2,-5 2,2 6,4 9,5 z" + id="path11-8-2" /> + </marker> + <marker + style="overflow:visible" + id="marker11-2-0-2" + refX="0" + refY="0" + orient="auto-start-reverse" + inkscape:stockid="Stylized triangle arrow" + markerWidth="1" + markerHeight="1" + viewBox="0 0 1 1" + inkscape:isstock="true" + inkscape:collect="always" + preserveAspectRatio="xMidYMid"> + <path + transform="scale(0.5)" + style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt" + d="m 6,0 c -3,1 -7,3 -9,5 0,0 0,-4 2,-5 -2,-1 -2,-5 -2,-5 2,2 6,4 9,5 z" + id="path11-8-2-1" /> + </marker> + <marker + style="overflow:visible" + id="marker11-2-0-4" + refX="0" + refY="0" + orient="auto-start-reverse" + inkscape:stockid="Stylized triangle arrow" + markerWidth="1" + markerHeight="1" + viewBox="0 0 1 1" + inkscape:isstock="true" + inkscape:collect="always" + preserveAspectRatio="xMidYMid"> + <path + transform="scale(0.5)" + style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt" + d="m 6,0 c -3,1 -7,3 -9,5 0,0 0,-4 2,-5 -2,-1 -2,-5 -2,-5 2,2 6,4 9,5 z" + id="path11-8-2-9" /> + </marker> + </defs> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(-80.39287,-26.113786)"> + <path + style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.755906;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#marker11-2-0)" + d="m 172.85332,28.611857 h -3.2e-4 c -5.07868,-3e-5 -9.19578,4.11706 -9.19575,9.19575 0.002,0.0303 0.005,0.0606 0.007,0.0909 l 9.28259,9.09822 c 5.03952,-0.0512 9.09923,-4.14929 9.10223,-9.18907 3e-5,-5.07869 -4.11707,-9.19578 -9.19575,-9.19575 z" + id="path12-0-9-9-6" + sodipodi:nodetypes="ssccccs" /> + <path + style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.755906;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#marker11-2-0-2)" + d="m 190.29488,78.142142 h -3.1e-4 c -5.07869,-3e-5 -9.19579,4.11706 -9.19576,9.19575 0.002,0.0303 0.005,0.0606 0.007,0.0909 l 9.2826,9.09822 c 5.03951,-0.0512 9.09922,-4.14929 9.10222,-9.18907 4e-5,-5.07869 -4.11707,-9.19578 -9.19575,-9.19575 z" + id="path12-0-9-9-6-9" + sodipodi:nodetypes="ssccccs" /> + <path + style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.755906;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#marker11-2-0-4)" + d="m 178.12625,123.53235 h -3.2e-4 c -5.07868,-3e-5 -9.19578,4.11706 -9.19575,9.19575 0.002,0.0303 0.005,0.0606 0.007,0.0909 l 9.28259,9.09822 c 5.03952,-0.0512 9.09923,-4.14929 9.10223,-9.18907 3e-5,-5.07869 -4.11707,-9.19578 -9.19575,-9.19575 z" + id="path12-0-9-9-6-0" + sodipodi:nodetypes="ssccccs" /> + <g + id="g9" + transform="translate(66.290516,20.806928)"> + <rect + style="fill:#e5e5e5;fill-opacity:1;stroke:#000000;stroke-width:1.00157;stroke-opacity:1" + id="rect1" + width="75.669617" + height="25.905891" + x="31.634369" + y="16.855114" /> + <text + xml:space="preserve" + style="font-size:21.3333px;font-family:Ubuntu;-inkscape-font-specification:Ubuntu;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.00157;stroke-opacity:1" + x="34.77066" + y="37.720291" + id="text1"><tspan + sodipodi:role="line" + id="tspan1" + x="34.77066" + y="37.720291">default</tspan></text> + </g> + <text + xml:space="preserve" + style="font-size:13.3333px;font-family:Ubuntu;-inkscape-font-specification:Ubuntu;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.00157;stroke-dasharray:none;stroke-opacity:1" + x="202.51353" + y="87.215233" + id="text12-9-5"><tspan + sodipodi:role="line" + id="tspan12-3-1" + x="202.51353" + y="87.215233">read, fetch</tspan></text> + <text + xml:space="preserve" + style="font-size:13.3333px;font-family:Ubuntu;-inkscape-font-specification:Ubuntu;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.00157;stroke-dasharray:none;stroke-opacity:1" + x="195.69041" + y="134.55566" + id="text12-9-5-2"><tspan + sodipodi:role="line" + id="tspan12-3-1-8" + x="195.69041" + y="134.55566">any</tspan></text> + <g + id="g9-7" + transform="translate(49.259286,69.499016)"> + <rect + style="fill:#e5e5e5;fill-opacity:1;stroke:#000000;stroke-width:1.00157;stroke-opacity:1" + id="rect1-7" + width="109.46656" + height="25.905891" + x="31.634369" + y="16.855114" /> + <text + xml:space="preserve" + style="font-size:21.3333px;font-family:Ubuntu;-inkscape-font-specification:Ubuntu;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.00157;stroke-opacity:1" + x="34.77066" + y="37.720291" + id="text1-6"><tspan + sodipodi:role="line" + id="tspan1-4" + x="34.77066" + y="37.720291">immutable</tspan></text> + </g> + <g + id="g9-7-2" + transform="translate(60.592806,116.56135)"> + <rect + style="fill:#e5e5e5;fill-opacity:1;stroke:#000000;stroke-width:1.00157;stroke-opacity:1" + id="rect1-7-5" + width="86.887596" + height="25.905891" + x="31.634369" + y="16.855114" /> + <text + xml:space="preserve" + style="font-size:21.3333px;font-family:Ubuntu;-inkscape-font-specification:Ubuntu;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.00157;stroke-opacity:1" + x="34.77066" + y="37.720291" + id="text1-6-4"><tspan + sodipodi:role="line" + id="tspan1-4-0" + x="34.77066" + y="37.720291">mutable</tspan></text> + </g> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.00157;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowTriangleStylized)" + d="m 135.72438,63.567933 -0.0621,22.786197" + id="path9" + inkscape:connector-type="polyline" + inkscape:connector-curvature="0" + inkscape:connection-start="#g9" + inkscape:connection-end="#g9-7" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker11)" + d="m 135.63906,112.26002 0.0198,21.15644" + id="path10" + inkscape:connector-type="polyline" + inkscape:connector-curvature="0" + inkscape:connection-start="#g9-7" + inkscape:connection-end="#g9-7-2" /> + <text + xml:space="preserve" + style="font-size:13.3333px;font-family:Ubuntu;-inkscape-font-specification:Ubuntu;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.00157;stroke-dasharray:none;stroke-opacity:1" + x="90.142387" + y="83.646721" + id="text11"><tspan + sodipodi:role="line" + id="tspan11" + x="90.142387" + y="83.646721" /></text> + <text + xml:space="preserve" + style="font-size:13.3333px;font-family:Ubuntu;-inkscape-font-specification:Ubuntu;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.00157;stroke-dasharray:none;stroke-opacity:1" + x="102.4951" + y="80.106407" + id="text12"><tspan + sodipodi:role="line" + id="tspan12" + x="102.4951" + y="80.106407">fetch</tspan></text> + <text + xml:space="preserve" + style="font-size:13.3333px;font-family:Ubuntu;-inkscape-font-specification:Ubuntu;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.00157;stroke-dasharray:none;stroke-opacity:1" + x="187.8288" + y="39.2285" + id="text12-9"><tspan + sodipodi:role="line" + id="tspan12-3" + x="187.8288" + y="39.2285">read, write</tspan></text> + <text + xml:space="preserve" + style="font-size:13.3333px;font-family:Ubuntu;-inkscape-font-specification:Ubuntu;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.00157;stroke-dasharray:none;stroke-opacity:1" + x="101.60253" + y="126.81479" + id="text12-2"><tspan + sodipodi:role="line" + id="tspan12-2" + x="101.60253" + y="126.81479">write</tspan></text> + </g> +</svg> diff --git a/images/2025-pydrofoil-qemu.svg b/images/2025-pydrofoil-qemu.svg new file mode 100644 index 000000000..5be59002d --- /dev/null +++ b/images/2025-pydrofoil-qemu.svg @@ -0,0 +1,352 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="647.999983" height="371.999983" viewBox="0 0 647.999983 371.999983"> +<defs> +<g> +<g id="glyph-0-0"> +<path d="M 2.125 0 L 1.609375 0 L 1.609375 -3 C 1.609375 -3.164062 1.609375 -3.300781 1.609375 -3.40625 C 1.617188 -3.507812 1.628906 -3.617188 1.640625 -3.734375 C 1.578125 -3.671875 1.519531 -3.613281 1.46875 -3.5625 C 1.414062 -3.519531 1.347656 -3.46875 1.265625 -3.40625 L 0.8125 -3.03125 L 0.53125 -3.390625 L 1.6875 -4.28125 L 2.125 -4.28125 Z M 2.125 0 "/> +</g> +<g id="glyph-0-1"> +<path d="M 3.3125 -0.96875 L 2.6875 -0.96875 L 2.6875 0 L 2.171875 0 L 2.171875 -0.96875 L 0.125 -0.96875 L 0.125 -1.421875 L 2.140625 -4.3125 L 2.6875 -4.3125 L 2.6875 -1.453125 L 3.3125 -1.453125 Z M 2.171875 -2.796875 C 2.171875 -3.003906 2.175781 -3.179688 2.1875 -3.328125 C 2.195312 -3.472656 2.203125 -3.613281 2.203125 -3.75 L 2.1875 -3.75 C 2.15625 -3.664062 2.113281 -3.578125 2.0625 -3.484375 C 2.007812 -3.398438 1.960938 -3.332031 1.921875 -3.28125 L 0.640625 -1.453125 L 2.171875 -1.453125 Z M 2.171875 -2.796875 "/> +</g> +<g id="glyph-0-2"> +<path d="M 2.953125 -3.28125 C 2.953125 -2.988281 2.875 -2.757812 2.71875 -2.59375 C 2.5625 -2.425781 2.34375 -2.3125 2.0625 -2.25 L 2.0625 -2.234375 C 2.414062 -2.191406 2.675781 -2.082031 2.84375 -1.90625 C 3.007812 -1.726562 3.09375 -1.5 3.09375 -1.21875 C 3.09375 -0.96875 3.03125 -0.742188 2.90625 -0.546875 C 2.789062 -0.359375 2.613281 -0.207031 2.375 -0.09375 C 2.132812 0.0078125 1.828125 0.0625 1.453125 0.0625 C 1.222656 0.0625 1.007812 0.0390625 0.8125 0 C 0.625 -0.03125 0.441406 -0.0859375 0.265625 -0.171875 L 0.265625 -0.671875 C 0.453125 -0.578125 0.644531 -0.503906 0.84375 -0.453125 C 1.050781 -0.410156 1.253906 -0.390625 1.453125 -0.390625 C 1.835938 -0.390625 2.113281 -0.460938 2.28125 -0.609375 C 2.445312 -0.753906 2.53125 -0.960938 2.53125 -1.234375 C 2.53125 -1.492188 2.425781 -1.679688 2.21875 -1.796875 C 2.007812 -1.921875 1.71875 -1.984375 1.34375 -1.984375 L 0.921875 -1.984375 L 0.921875 -2.4375 L 1.34375 -2.4375 C 1.695312 -2.4375 1.960938 -2.507812 2.140625 -2.65625 C 2.328125 -2.800781 2.421875 -3 2.421875 -3.25 C 2.421875 -3.457031 2.347656 -3.617188 2.203125 -3.734375 C 2.066406 -3.847656 1.878906 -3.90625 1.640625 -3.90625 C 1.410156 -3.90625 1.210938 -3.867188 1.046875 -3.796875 C 0.878906 -3.734375 0.71875 -3.648438 0.5625 -3.546875 L 0.296875 -3.90625 C 0.441406 -4.019531 0.628906 -4.117188 0.859375 -4.203125 C 1.085938 -4.296875 1.34375 -4.34375 1.625 -4.34375 C 2.070312 -4.34375 2.40625 -4.242188 2.625 -4.046875 C 2.84375 -3.847656 2.953125 -3.59375 2.953125 -3.28125 Z M 2.953125 -3.28125 "/> +</g> +<g id="glyph-0-3"> +<path d="M 3.140625 -2.140625 C 3.140625 -1.679688 3.085938 -1.285156 2.984375 -0.953125 C 2.890625 -0.628906 2.738281 -0.378906 2.53125 -0.203125 C 2.320312 -0.0234375 2.046875 0.0625 1.703125 0.0625 C 1.222656 0.0625 0.867188 -0.128906 0.640625 -0.515625 C 0.410156 -0.910156 0.296875 -1.453125 0.296875 -2.140625 C 0.296875 -2.609375 0.34375 -3.003906 0.4375 -3.328125 C 0.53125 -3.660156 0.679688 -3.910156 0.890625 -4.078125 C 1.097656 -4.253906 1.367188 -4.34375 1.703125 -4.34375 C 2.191406 -4.34375 2.550781 -4.148438 2.78125 -3.765625 C 3.019531 -3.378906 3.140625 -2.835938 3.140625 -2.140625 Z M 0.828125 -2.140625 C 0.828125 -1.554688 0.890625 -1.117188 1.015625 -0.828125 C 1.148438 -0.535156 1.378906 -0.390625 1.703125 -0.390625 C 2.023438 -0.390625 2.253906 -0.535156 2.390625 -0.828125 C 2.535156 -1.117188 2.609375 -1.554688 2.609375 -2.140625 C 2.609375 -2.734375 2.535156 -3.175781 2.390625 -3.46875 C 2.253906 -3.757812 2.023438 -3.90625 1.703125 -3.90625 C 1.378906 -3.90625 1.148438 -3.757812 1.015625 -3.46875 C 0.890625 -3.175781 0.828125 -2.734375 0.828125 -2.140625 Z M 0.828125 -2.140625 "/> +</g> +<g id="glyph-0-4"> +<path d="M 1.703125 -4.34375 C 2.085938 -4.34375 2.398438 -4.253906 2.640625 -4.078125 C 2.878906 -3.898438 3 -3.644531 3 -3.3125 C 3 -3.144531 2.957031 -2.992188 2.875 -2.859375 C 2.800781 -2.734375 2.703125 -2.617188 2.578125 -2.515625 C 2.460938 -2.421875 2.328125 -2.335938 2.171875 -2.265625 C 2.347656 -2.179688 2.507812 -2.085938 2.65625 -1.984375 C 2.800781 -1.878906 2.914062 -1.753906 3 -1.609375 C 3.082031 -1.472656 3.125 -1.304688 3.125 -1.109375 C 3.125 -0.742188 3 -0.457031 2.75 -0.25 C 2.5 -0.0390625 2.160156 0.0625 1.734375 0.0625 C 1.265625 0.0625 0.90625 -0.0351562 0.65625 -0.234375 C 0.414062 -0.441406 0.296875 -0.726562 0.296875 -1.09375 C 0.296875 -1.289062 0.335938 -1.457031 0.421875 -1.59375 C 0.503906 -1.738281 0.613281 -1.863281 0.75 -1.96875 C 0.882812 -2.070312 1.03125 -2.160156 1.1875 -2.234375 C 0.976562 -2.359375 0.800781 -2.503906 0.65625 -2.671875 C 0.507812 -2.835938 0.4375 -3.054688 0.4375 -3.328125 C 0.4375 -3.546875 0.488281 -3.726562 0.59375 -3.875 C 0.707031 -4.03125 0.859375 -4.144531 1.046875 -4.21875 C 1.242188 -4.300781 1.460938 -4.34375 1.703125 -4.34375 Z M 1.703125 -3.921875 C 1.484375 -3.921875 1.300781 -3.863281 1.15625 -3.75 C 1.019531 -3.644531 0.953125 -3.492188 0.953125 -3.296875 C 0.953125 -3.148438 0.984375 -3.023438 1.046875 -2.921875 C 1.117188 -2.828125 1.210938 -2.742188 1.328125 -2.671875 C 1.453125 -2.597656 1.585938 -2.53125 1.734375 -2.46875 C 1.941406 -2.5625 2.113281 -2.664062 2.25 -2.78125 C 2.394531 -2.90625 2.46875 -3.078125 2.46875 -3.296875 C 2.46875 -3.492188 2.394531 -3.644531 2.25 -3.75 C 2.113281 -3.863281 1.929688 -3.921875 1.703125 -3.921875 Z M 0.8125 -1.09375 C 0.8125 -0.882812 0.882812 -0.707031 1.03125 -0.5625 C 1.175781 -0.425781 1.40625 -0.359375 1.71875 -0.359375 C 2.007812 -0.359375 2.226562 -0.425781 2.375 -0.5625 C 2.53125 -0.707031 2.609375 -0.890625 2.609375 -1.109375 C 2.609375 -1.316406 2.523438 -1.488281 2.359375 -1.625 C 2.203125 -1.757812 1.988281 -1.878906 1.71875 -1.984375 L 1.625 -2.015625 C 1.351562 -1.910156 1.148438 -1.785156 1.015625 -1.640625 C 0.878906 -1.492188 0.8125 -1.3125 0.8125 -1.09375 Z M 0.8125 -1.09375 "/> +</g> +<g id="glyph-0-5"> +<path d="M 1.65625 -2.625 C 2.09375 -2.625 2.441406 -2.515625 2.703125 -2.296875 C 2.960938 -2.078125 3.09375 -1.769531 3.09375 -1.375 C 3.09375 -0.925781 2.953125 -0.570312 2.671875 -0.3125 C 2.390625 -0.0625 1.992188 0.0625 1.484375 0.0625 C 1.265625 0.0625 1.054688 0.0390625 0.859375 0 C 0.671875 -0.0390625 0.507812 -0.0976562 0.375 -0.171875 L 0.375 -0.671875 C 0.519531 -0.585938 0.695312 -0.519531 0.90625 -0.46875 C 1.113281 -0.414062 1.3125 -0.390625 1.5 -0.390625 C 1.8125 -0.390625 2.0625 -0.460938 2.25 -0.609375 C 2.445312 -0.765625 2.546875 -1 2.546875 -1.3125 C 2.546875 -1.59375 2.457031 -1.804688 2.28125 -1.953125 C 2.113281 -2.109375 1.84375 -2.1875 1.46875 -2.1875 C 1.363281 -2.1875 1.238281 -2.175781 1.09375 -2.15625 C 0.945312 -2.132812 0.832031 -2.113281 0.75 -2.09375 L 0.484375 -2.265625 L 0.640625 -4.28125 L 2.796875 -4.28125 L 2.796875 -3.796875 L 1.09375 -3.796875 L 0.984375 -2.5625 C 1.054688 -2.570312 1.148438 -2.582031 1.265625 -2.59375 C 1.378906 -2.613281 1.507812 -2.625 1.65625 -2.625 Z M 1.65625 -2.625 "/> +</g> +<g id="glyph-1-0"> +<path d="M 0.09375 -3.53125 C -0.0078125 -3.53125 -0.125 -3.53125 -0.25 -3.53125 C -0.375 -3.539062 -0.484375 -3.554688 -0.578125 -3.578125 L -0.578125 -3.53125 C -0.390625 -3.40625 -0.234375 -3.234375 -0.109375 -3.015625 C 0.015625 -2.804688 0.078125 -2.53125 0.078125 -2.1875 C 0.078125 -1.664062 -0.101562 -1.242188 -0.46875 -0.921875 C -0.84375 -0.597656 -1.398438 -0.4375 -2.140625 -0.4375 C -2.867188 -0.4375 -3.421875 -0.597656 -3.796875 -0.921875 C -4.179688 -1.253906 -4.375 -1.679688 -4.375 -2.203125 C -4.375 -2.546875 -4.304688 -2.820312 -4.171875 -3.03125 C -4.046875 -3.25 -3.890625 -3.421875 -3.703125 -3.546875 L -3.703125 -3.578125 L -4.28125 -3.6875 L -4.28125 -4.234375 L 1.921875 -4.234375 L 1.921875 -3.53125 Z M -0.5 -2.3125 C -0.5 -2.757812 -0.617188 -3.070312 -0.859375 -3.25 C -1.109375 -3.4375 -1.484375 -3.535156 -1.984375 -3.546875 L -2.125 -3.546875 C -2.664062 -3.546875 -3.078125 -3.453125 -3.359375 -3.265625 C -3.640625 -3.085938 -3.78125 -2.765625 -3.78125 -2.296875 C -3.78125 -1.921875 -3.628906 -1.640625 -3.328125 -1.453125 C -3.023438 -1.265625 -2.625 -1.171875 -2.125 -1.171875 C -1.613281 -1.171875 -1.210938 -1.265625 -0.921875 -1.453125 C -0.640625 -1.640625 -0.5 -1.925781 -0.5 -2.3125 Z M -0.5 -2.3125 "/> +</g> +<g id="glyph-1-1"> +<path d="M -4.375 -2.34375 C -4.375 -2.707031 -4.289062 -3.019531 -4.125 -3.28125 C -3.96875 -3.550781 -3.742188 -3.753906 -3.453125 -3.890625 C -3.160156 -4.035156 -2.820312 -4.109375 -2.4375 -4.109375 L -2.015625 -4.109375 L -2.015625 -1.171875 C -1.523438 -1.179688 -1.148438 -1.300781 -0.890625 -1.53125 C -0.640625 -1.769531 -0.515625 -2.101562 -0.515625 -2.53125 C -0.515625 -2.800781 -0.539062 -3.039062 -0.59375 -3.25 C -0.644531 -3.46875 -0.71875 -3.6875 -0.8125 -3.90625 L -0.203125 -3.90625 C -0.109375 -3.6875 -0.0390625 -3.46875 0 -3.25 C 0.0507812 -3.039062 0.078125 -2.789062 0.078125 -2.5 C 0.078125 -2.09375 -0.00390625 -1.734375 -0.171875 -1.421875 C -0.335938 -1.109375 -0.582031 -0.863281 -0.90625 -0.6875 C -1.238281 -0.519531 -1.640625 -0.4375 -2.109375 -0.4375 C -2.578125 -0.4375 -2.976562 -0.515625 -3.3125 -0.671875 C -3.65625 -0.828125 -3.914062 -1.046875 -4.09375 -1.328125 C -4.28125 -1.617188 -4.375 -1.957031 -4.375 -2.34375 Z M -3.796875 -2.328125 C -3.796875 -1.992188 -3.6875 -1.726562 -3.46875 -1.53125 C -3.25 -1.332031 -2.945312 -1.21875 -2.5625 -1.1875 L -2.5625 -3.375 C -2.925781 -3.363281 -3.222656 -3.273438 -3.453125 -3.109375 C -3.679688 -2.941406 -3.796875 -2.679688 -3.796875 -2.328125 Z M -3.796875 -2.328125 "/> +</g> +<g id="glyph-1-2"> +<path d="M -4.375 -5.390625 C -4.375 -5.867188 -4.25 -6.226562 -4 -6.46875 C -3.75 -6.707031 -3.347656 -6.828125 -2.796875 -6.828125 L 0 -6.828125 L 0 -6.140625 L -2.765625 -6.140625 C -3.441406 -6.140625 -3.78125 -5.847656 -3.78125 -5.265625 C -3.78125 -4.847656 -3.660156 -4.550781 -3.421875 -4.375 C -3.179688 -4.195312 -2.832031 -4.109375 -2.375 -4.109375 L 0 -4.109375 L 0 -3.40625 L -2.765625 -3.40625 C -3.441406 -3.40625 -3.78125 -3.113281 -3.78125 -2.53125 C -3.78125 -2.09375 -3.644531 -1.789062 -3.375 -1.625 C -3.101562 -1.46875 -2.71875 -1.390625 -2.21875 -1.390625 L 0 -1.390625 L 0 -0.6875 L -4.28125 -0.6875 L -4.28125 -1.25 L -3.703125 -1.359375 L -3.703125 -1.390625 C -3.929688 -1.523438 -4.097656 -1.703125 -4.203125 -1.921875 C -4.316406 -2.148438 -4.375 -2.394531 -4.375 -2.65625 C -4.375 -3.320312 -4.128906 -3.757812 -3.640625 -3.96875 L -3.640625 -4.015625 C -3.890625 -4.148438 -4.070312 -4.34375 -4.1875 -4.59375 C -4.3125 -4.84375 -4.375 -5.109375 -4.375 -5.390625 Z M -4.375 -5.390625 "/> +</g> +<g id="glyph-1-3"> +<path d="M -4.28125 -4.265625 L 0 -4.265625 L 0 -3.6875 L -0.5625 -3.578125 L -0.5625 -3.546875 C -0.34375 -3.410156 -0.179688 -3.21875 -0.078125 -2.96875 C 0.0234375 -2.726562 0.078125 -2.46875 0.078125 -2.1875 C 0.078125 -1.675781 -0.0390625 -1.285156 -0.28125 -1.015625 C -0.53125 -0.753906 -0.929688 -0.625 -1.484375 -0.625 L -4.28125 -0.625 L -4.28125 -1.34375 L -1.53125 -1.34375 C -0.84375 -1.34375 -0.5 -1.660156 -0.5 -2.296875 C -0.5 -2.773438 -0.628906 -3.101562 -0.890625 -3.28125 C -1.160156 -3.46875 -1.550781 -3.5625 -2.0625 -3.5625 L -4.28125 -3.5625 Z M -4.28125 -4.265625 "/> +</g> +<g id="glyph-1-4"> +<path d="M -4.375 -2.71875 C -4.375 -3.25 -4.1875 -3.675781 -3.8125 -4 C -3.445312 -4.320312 -2.894531 -4.484375 -2.15625 -4.484375 C -1.425781 -4.484375 -0.867188 -4.320312 -0.484375 -4 C -0.109375 -3.675781 0.078125 -3.25 0.078125 -2.71875 C 0.078125 -2.382812 0.015625 -2.109375 -0.109375 -1.890625 C -0.234375 -1.671875 -0.378906 -1.503906 -0.546875 -1.390625 L -0.546875 -1.34375 C -0.453125 -1.351562 -0.332031 -1.363281 -0.1875 -1.375 C -0.0507812 -1.382812 0.0625 -1.390625 0.15625 -1.390625 L 1.921875 -1.390625 L 1.921875 -0.6875 L -4.28125 -0.6875 L -4.28125 -1.25 L -3.703125 -1.359375 L -3.703125 -1.390625 C -3.890625 -1.515625 -4.046875 -1.679688 -4.171875 -1.890625 C -4.304688 -2.097656 -4.375 -2.375 -4.375 -2.71875 Z M -3.78125 -2.59375 C -3.78125 -2.15625 -3.65625 -1.847656 -3.40625 -1.671875 C -3.164062 -1.492188 -2.789062 -1.398438 -2.28125 -1.390625 L -2.15625 -1.390625 C -1.625 -1.390625 -1.210938 -1.472656 -0.921875 -1.640625 C -0.640625 -1.816406 -0.5 -2.140625 -0.5 -2.609375 C -0.5 -2.867188 -0.570312 -3.082031 -0.71875 -3.25 C -0.863281 -3.414062 -1.0625 -3.539062 -1.3125 -3.625 C -1.5625 -3.707031 -1.84375 -3.75 -2.15625 -3.75 C -2.644531 -3.75 -3.035156 -3.65625 -3.328125 -3.46875 C -3.628906 -3.28125 -3.78125 -2.988281 -3.78125 -2.59375 Z M -3.78125 -2.59375 "/> +</g> +<g id="glyph-1-5"> +<path d="M -4.28125 -0.015625 L -4.28125 -0.765625 L -1.84375 -1.6875 C -1.632812 -1.769531 -1.429688 -1.84375 -1.234375 -1.90625 C -1.035156 -1.96875 -0.851562 -2.015625 -0.6875 -2.046875 L -0.6875 -2.078125 C -0.8125 -2.109375 -0.984375 -2.160156 -1.203125 -2.234375 C -1.421875 -2.304688 -1.640625 -2.378906 -1.859375 -2.453125 L -4.28125 -3.3125 L -4.28125 -4.078125 L 0.59375 -2.234375 C 1 -2.085938 1.320312 -1.894531 1.5625 -1.65625 C 1.800781 -1.414062 1.921875 -1.085938 1.921875 -0.671875 C 1.921875 -0.546875 1.910156 -0.429688 1.890625 -0.328125 C 1.878906 -0.234375 1.867188 -0.15625 1.859375 -0.09375 L 1.296875 -0.09375 C 1.304688 -0.144531 1.316406 -0.210938 1.328125 -0.296875 C 1.335938 -0.378906 1.34375 -0.46875 1.34375 -0.5625 C 1.34375 -0.800781 1.269531 -1 1.125 -1.15625 C 0.988281 -1.3125 0.804688 -1.429688 0.578125 -1.515625 L 0.015625 -1.734375 Z M -4.28125 -0.015625 "/> +</g> +<g id="glyph-1-6"> +<path d="M 0.078125 -2.203125 C 0.078125 -1.671875 -0.101562 -1.242188 -0.46875 -0.921875 C -0.84375 -0.597656 -1.398438 -0.4375 -2.140625 -0.4375 C -2.867188 -0.4375 -3.421875 -0.597656 -3.796875 -0.921875 C -4.179688 -1.242188 -4.375 -1.671875 -4.375 -2.203125 C -4.375 -2.535156 -4.3125 -2.804688 -4.1875 -3.015625 C -4.0625 -3.234375 -3.910156 -3.40625 -3.734375 -3.53125 L -3.734375 -3.578125 C -3.804688 -3.578125 -3.910156 -3.566406 -4.046875 -3.546875 C -4.179688 -3.535156 -4.289062 -3.53125 -4.375 -3.53125 L -6.078125 -3.53125 L -6.078125 -4.234375 L 0 -4.234375 L 0 -3.671875 L -0.578125 -3.5625 L -0.578125 -3.53125 C -0.390625 -3.40625 -0.234375 -3.234375 -0.109375 -3.015625 C 0.015625 -2.804688 0.078125 -2.535156 0.078125 -2.203125 Z M -0.5 -2.3125 C -0.5 -2.757812 -0.625 -3.078125 -0.875 -3.265625 C -1.125 -3.453125 -1.5 -3.546875 -2 -3.546875 L -2.125 -3.546875 C -2.65625 -3.546875 -3.0625 -3.457031 -3.34375 -3.28125 C -3.632812 -3.101562 -3.78125 -2.773438 -3.78125 -2.296875 C -3.78125 -1.921875 -3.628906 -1.640625 -3.328125 -1.453125 C -3.023438 -1.265625 -2.625 -1.171875 -2.125 -1.171875 C -1.613281 -1.171875 -1.210938 -1.265625 -0.921875 -1.453125 C -0.640625 -1.640625 -0.5 -1.925781 -0.5 -2.3125 Z M -0.5 -2.3125 "/> +</g> +<g id="glyph-1-7"> +<path d="M -4.375 -2.6875 C -4.375 -2.757812 -4.367188 -2.84375 -4.359375 -2.9375 C -4.347656 -3.03125 -4.332031 -3.113281 -4.3125 -3.1875 L -3.671875 -3.09375 C -3.691406 -3.019531 -3.707031 -2.941406 -3.71875 -2.859375 C -3.726562 -2.785156 -3.734375 -2.707031 -3.734375 -2.625 C -3.734375 -2.40625 -3.671875 -2.203125 -3.546875 -2.015625 C -3.429688 -1.828125 -3.265625 -1.675781 -3.046875 -1.5625 C -2.828125 -1.445312 -2.570312 -1.390625 -2.28125 -1.390625 L 0 -1.390625 L 0 -0.6875 L -4.28125 -0.6875 L -4.28125 -1.25 L -3.5 -1.34375 L -3.5 -1.375 C -3.738281 -1.507812 -3.941406 -1.6875 -4.109375 -1.90625 C -4.285156 -2.125 -4.375 -2.382812 -4.375 -2.6875 Z M -4.375 -2.6875 "/> +</g> +<g id="glyph-1-8"> +<path d="M -2.15625 -4.40625 C -1.445312 -4.40625 -0.894531 -4.222656 -0.5 -3.859375 C -0.113281 -3.503906 0.078125 -3.019531 0.078125 -2.40625 C 0.078125 -2.03125 -0.00390625 -1.691406 -0.171875 -1.390625 C -0.347656 -1.097656 -0.601562 -0.863281 -0.9375 -0.6875 C -1.269531 -0.519531 -1.675781 -0.4375 -2.15625 -0.4375 C -2.863281 -0.4375 -3.410156 -0.613281 -3.796875 -0.96875 C -4.179688 -1.332031 -4.375 -1.820312 -4.375 -2.4375 C -4.375 -2.820312 -4.285156 -3.160156 -4.109375 -3.453125 C -3.929688 -3.753906 -3.675781 -3.988281 -3.34375 -4.15625 C -3.019531 -4.320312 -2.625 -4.40625 -2.15625 -4.40625 Z M -2.15625 -1.171875 C -1.644531 -1.171875 -1.238281 -1.269531 -0.9375 -1.46875 C -0.644531 -1.664062 -0.5 -1.984375 -0.5 -2.421875 C -0.5 -2.859375 -0.644531 -3.175781 -0.9375 -3.375 C -1.238281 -3.582031 -1.644531 -3.6875 -2.15625 -3.6875 C -2.65625 -3.6875 -3.050781 -3.582031 -3.34375 -3.375 C -3.632812 -3.175781 -3.78125 -2.859375 -3.78125 -2.421875 C -3.78125 -1.984375 -3.632812 -1.664062 -3.34375 -1.46875 C -3.050781 -1.269531 -2.65625 -1.171875 -2.15625 -1.171875 Z M -2.15625 -1.171875 "/> +</g> +<g id="glyph-1-9"> +<path d="M -3.75 -2.65625 L -3.75 -1.578125 L 0 -1.578125 L 0 -0.875 L -3.75 -0.875 L -3.75 -0.125 L -4.078125 -0.125 L -4.3125 -0.875 L -4.5625 -0.875 C -5.113281 -0.875 -5.507812 -0.992188 -5.75 -1.234375 C -6 -1.484375 -6.125 -1.828125 -6.125 -2.265625 C -6.125 -2.429688 -6.109375 -2.582031 -6.078125 -2.71875 C -6.046875 -2.863281 -6.007812 -2.988281 -5.96875 -3.09375 L -5.421875 -2.90625 C -5.453125 -2.820312 -5.476562 -2.722656 -5.5 -2.609375 C -5.53125 -2.503906 -5.546875 -2.390625 -5.546875 -2.265625 C -5.546875 -2.035156 -5.46875 -1.863281 -5.3125 -1.75 C -5.15625 -1.632812 -4.90625 -1.578125 -4.5625 -1.578125 L -4.28125 -1.578125 L -4.28125 -2.65625 Z M -3.75 -2.65625 "/> +</g> +<g id="glyph-1-10"> +<path d="M -5.890625 -1.046875 C -5.890625 -1.148438 -5.851562 -1.242188 -5.78125 -1.328125 C -5.71875 -1.410156 -5.609375 -1.453125 -5.453125 -1.453125 C -5.296875 -1.453125 -5.179688 -1.410156 -5.109375 -1.328125 C -5.035156 -1.242188 -5 -1.148438 -5 -1.046875 C -5 -0.921875 -5.035156 -0.816406 -5.109375 -0.734375 C -5.179688 -0.660156 -5.296875 -0.625 -5.453125 -0.625 C -5.609375 -0.625 -5.71875 -0.660156 -5.78125 -0.734375 C -5.851562 -0.816406 -5.890625 -0.921875 -5.890625 -1.046875 Z M -4.28125 -1.390625 L 0 -1.390625 L 0 -0.6875 L -4.28125 -0.6875 Z M -4.28125 -1.390625 "/> +</g> +<g id="glyph-1-11"> +<path d="M 0 -1.390625 L 0 -0.6875 L -6.078125 -0.6875 L -6.078125 -1.390625 Z M 0 -1.390625 "/> +</g> +<g id="glyph-1-12"> +<path d="M -1.828125 -0.3125 L -2.453125 -0.3125 L -2.453125 -2.25 L -1.828125 -2.25 Z M -1.828125 -0.3125 "/> +</g> +<g id="glyph-1-13"> +<path d="M -1.1875 -3.46875 C -0.769531 -3.46875 -0.453125 -3.3125 -0.234375 -3 C -0.0234375 -2.695312 0.078125 -2.285156 0.078125 -1.765625 C 0.078125 -1.460938 0.0507812 -1.203125 0 -0.984375 C -0.0390625 -0.765625 -0.101562 -0.578125 -0.1875 -0.421875 L -0.828125 -0.421875 C -0.742188 -0.585938 -0.664062 -0.789062 -0.59375 -1.03125 C -0.519531 -1.28125 -0.484375 -1.53125 -0.484375 -1.78125 C -0.484375 -2.132812 -0.539062 -2.390625 -0.65625 -2.546875 C -0.769531 -2.710938 -0.925781 -2.796875 -1.125 -2.796875 C -1.226562 -2.796875 -1.320312 -2.765625 -1.40625 -2.703125 C -1.488281 -2.640625 -1.570312 -2.53125 -1.65625 -2.375 C -1.75 -2.226562 -1.847656 -2.015625 -1.953125 -1.734375 C -2.054688 -1.453125 -2.160156 -1.210938 -2.265625 -1.015625 C -2.378906 -0.828125 -2.507812 -0.675781 -2.65625 -0.5625 C -2.800781 -0.457031 -2.992188 -0.40625 -3.234375 -0.40625 C -3.597656 -0.40625 -3.878906 -0.550781 -4.078125 -0.84375 C -4.273438 -1.144531 -4.375 -1.535156 -4.375 -2.015625 C -4.375 -2.273438 -4.347656 -2.519531 -4.296875 -2.75 C -4.242188 -2.976562 -4.171875 -3.191406 -4.078125 -3.390625 L -3.515625 -3.140625 C -3.585938 -2.960938 -3.648438 -2.773438 -3.703125 -2.578125 C -3.765625 -2.378906 -3.796875 -2.175781 -3.796875 -1.96875 C -3.796875 -1.675781 -3.75 -1.453125 -3.65625 -1.296875 C -3.5625 -1.148438 -3.429688 -1.078125 -3.265625 -1.078125 C -3.148438 -1.078125 -3.050781 -1.109375 -2.96875 -1.171875 C -2.882812 -1.242188 -2.800781 -1.363281 -2.71875 -1.53125 C -2.644531 -1.695312 -2.554688 -1.914062 -2.453125 -2.1875 C -2.347656 -2.457031 -2.242188 -2.6875 -2.140625 -2.875 C -2.035156 -3.070312 -1.90625 -3.21875 -1.75 -3.3125 C -1.601562 -3.414062 -1.414062 -3.46875 -1.1875 -3.46875 Z M -1.1875 -3.46875 "/> +</g> +<g id="glyph-1-14"> +<path d="M -4.359375 -2.296875 C -4.359375 -2.828125 -4.242188 -3.21875 -4.015625 -3.46875 C -3.785156 -3.71875 -3.421875 -3.84375 -2.921875 -3.84375 L 0 -3.84375 L 0 -3.328125 L -0.609375 -3.1875 L -0.609375 -3.15625 C -0.367188 -2.96875 -0.191406 -2.769531 -0.078125 -2.5625 C 0.0234375 -2.363281 0.078125 -2.082031 0.078125 -1.71875 C 0.078125 -1.332031 -0.0195312 -1.007812 -0.21875 -0.75 C -0.425781 -0.5 -0.75 -0.375 -1.1875 -0.375 C -1.613281 -0.375 -1.941406 -0.539062 -2.171875 -0.875 C -2.410156 -1.207031 -2.539062 -1.722656 -2.5625 -2.421875 L -2.578125 -3.15625 L -2.84375 -3.15625 C -3.195312 -3.15625 -3.441406 -3.078125 -3.578125 -2.921875 C -3.722656 -2.765625 -3.796875 -2.546875 -3.796875 -2.265625 C -3.796875 -2.035156 -3.757812 -1.816406 -3.6875 -1.609375 C -3.625 -1.410156 -3.550781 -1.226562 -3.46875 -1.0625 L -3.984375 -0.84375 C -4.085938 -1.03125 -4.175781 -1.25 -4.25 -1.5 C -4.320312 -1.757812 -4.359375 -2.023438 -4.359375 -2.296875 Z M -2.078125 -2.515625 C -2.054688 -1.984375 -1.96875 -1.613281 -1.8125 -1.40625 C -1.664062 -1.195312 -1.457031 -1.09375 -1.1875 -1.09375 C -0.945312 -1.09375 -0.769531 -1.164062 -0.65625 -1.3125 C -0.539062 -1.457031 -0.484375 -1.644531 -0.484375 -1.875 C -0.484375 -2.238281 -0.582031 -2.539062 -0.78125 -2.78125 C -0.988281 -3.019531 -1.300781 -3.140625 -1.71875 -3.140625 L -2.09375 -3.140625 Z M -2.078125 -2.515625 "/> +</g> +<g id="glyph-1-15"> +<path d="M -6.078125 -2.578125 L -4.546875 -2.421875 L -4.96875 -3.953125 L -4.234375 -4.0625 L -4.125 -2.59375 L -2.859375 -3.546875 L -2.484375 -2.859375 L -3.875 -2.171875 L -2.484375 -1.5625 L -2.859375 -0.84375 L -4.125 -1.78125 L -4.234375 -0.328125 L -4.96875 -0.4375 L -4.546875 -1.953125 L -6.078125 -1.796875 Z M -6.078125 -2.578125 "/> +</g> +<g id="glyph-1-16"> +<path d="M -2.90625 -1.375 C -2.820312 -1.375 -2.707031 -1.367188 -2.5625 -1.359375 C -2.425781 -1.359375 -2.304688 -1.351562 -2.203125 -1.34375 L -2.203125 -1.375 C -2.242188 -1.40625 -2.304688 -1.453125 -2.390625 -1.515625 C -2.472656 -1.578125 -2.554688 -1.640625 -2.640625 -1.703125 C -2.722656 -1.773438 -2.789062 -1.835938 -2.84375 -1.890625 L -4.28125 -3.25 L -4.28125 -4.078125 L -2.453125 -2.34375 L 0 -4.203125 L 0 -3.359375 L -2 -1.859375 L -1.578125 -1.375 L 0 -1.375 L 0 -0.6875 L -6.078125 -0.6875 L -6.078125 -1.375 Z M -2.90625 -1.375 "/> +</g> +<g id="glyph-2-0"> +<path d="M 2.84375 0 L 2.15625 0 L 2.15625 -3.984375 C 2.15625 -4.222656 2.15625 -4.410156 2.15625 -4.546875 C 2.164062 -4.679688 2.175781 -4.820312 2.1875 -4.96875 C 2.101562 -4.882812 2.023438 -4.8125 1.953125 -4.75 C 1.878906 -4.695312 1.789062 -4.625 1.6875 -4.53125 L 1.078125 -4.046875 L 0.71875 -4.515625 L 2.25 -5.71875 L 2.84375 -5.71875 Z M 2.84375 0 "/> +</g> +<g id="glyph-2-1"> +<path d="M 4.1875 -2.859375 C 4.1875 -2.242188 4.117188 -1.71875 3.984375 -1.28125 C 3.859375 -0.84375 3.65625 -0.503906 3.375 -0.265625 C 3.101562 -0.0351562 2.738281 0.078125 2.28125 0.078125 C 1.632812 0.078125 1.15625 -0.179688 0.84375 -0.703125 C 0.539062 -1.222656 0.390625 -1.941406 0.390625 -2.859375 C 0.390625 -3.484375 0.453125 -4.015625 0.578125 -4.453125 C 0.703125 -4.890625 0.898438 -5.222656 1.171875 -5.453125 C 1.453125 -5.679688 1.820312 -5.796875 2.28125 -5.796875 C 2.914062 -5.796875 3.390625 -5.535156 3.703125 -5.015625 C 4.023438 -4.503906 4.1875 -3.785156 4.1875 -2.859375 Z M 1.09375 -2.859375 C 1.09375 -2.078125 1.179688 -1.488281 1.359375 -1.09375 C 1.535156 -0.707031 1.84375 -0.515625 2.28125 -0.515625 C 2.707031 -0.515625 3.007812 -0.707031 3.1875 -1.09375 C 3.375 -1.488281 3.46875 -2.078125 3.46875 -2.859375 C 3.46875 -3.640625 3.375 -4.222656 3.1875 -4.609375 C 3.007812 -5.003906 2.707031 -5.203125 2.28125 -5.203125 C 1.84375 -5.203125 1.535156 -5.003906 1.359375 -4.609375 C 1.179688 -4.222656 1.09375 -3.640625 1.09375 -2.859375 Z M 1.09375 -2.859375 "/> +</g> +<g id="glyph-3-0"> +<path d="M -1.90625 -5.015625 C -1.269531 -5.015625 -0.773438 -4.785156 -0.421875 -4.328125 C -0.078125 -3.867188 0.09375 -3.25 0.09375 -2.46875 C 0.09375 -2.070312 0.0625 -1.703125 0 -1.359375 C -0.0507812 -1.015625 -0.128906 -0.734375 -0.234375 -0.515625 L -1.09375 -0.515625 C -0.988281 -0.753906 -0.894531 -1.050781 -0.8125 -1.40625 C -0.726562 -1.757812 -0.6875 -2.128906 -0.6875 -2.515625 C -0.6875 -3.046875 -0.785156 -3.445312 -0.984375 -3.71875 C -1.191406 -3.988281 -1.472656 -4.125 -1.828125 -4.125 C -2.066406 -4.125 -2.265625 -4.070312 -2.421875 -3.96875 C -2.578125 -3.863281 -2.722656 -3.691406 -2.859375 -3.453125 C -2.992188 -3.210938 -3.140625 -2.875 -3.296875 -2.4375 C -3.515625 -1.832031 -3.785156 -1.375 -4.109375 -1.0625 C -4.429688 -0.75 -4.867188 -0.59375 -5.421875 -0.59375 C -5.796875 -0.59375 -6.117188 -0.691406 -6.390625 -0.890625 C -6.660156 -1.085938 -6.867188 -1.351562 -7.015625 -1.6875 C -7.160156 -2.03125 -7.234375 -2.425781 -7.234375 -2.875 C -7.234375 -3.269531 -7.195312 -3.628906 -7.125 -3.953125 C -7.050781 -4.285156 -6.957031 -4.582031 -6.84375 -4.84375 L -6.0625 -4.5625 C -6.175781 -4.320312 -6.269531 -4.054688 -6.34375 -3.765625 C -6.414062 -3.472656 -6.453125 -3.171875 -6.453125 -2.859375 C -6.453125 -2.410156 -6.351562 -2.070312 -6.15625 -1.84375 C -5.96875 -1.625 -5.71875 -1.515625 -5.40625 -1.515625 C -5.164062 -1.515625 -4.960938 -1.5625 -4.796875 -1.65625 C -4.640625 -1.757812 -4.5 -1.921875 -4.375 -2.140625 C -4.25 -2.367188 -4.113281 -2.675781 -3.96875 -3.0625 C -3.8125 -3.488281 -3.644531 -3.84375 -3.46875 -4.125 C -3.289062 -4.414062 -3.078125 -4.632812 -2.828125 -4.78125 C -2.585938 -4.9375 -2.28125 -5.015625 -1.90625 -5.015625 Z M -1.90625 -5.015625 "/> +</g> +<g id="glyph-3-1"> +<path d="M 0 -1.734375 L 0 -0.84375 L -7.59375 -0.84375 L -7.59375 -1.734375 Z M 0 -1.734375 "/> +</g> +<g id="glyph-3-2"> +<path d="M -2.6875 -5.515625 C -1.800781 -5.515625 -1.113281 -5.285156 -0.625 -4.828125 C -0.144531 -4.378906 0.09375 -3.773438 0.09375 -3.015625 C 0.09375 -2.535156 -0.0078125 -2.109375 -0.21875 -1.734375 C -0.4375 -1.367188 -0.753906 -1.078125 -1.171875 -0.859375 C -1.585938 -0.648438 -2.09375 -0.546875 -2.6875 -0.546875 C -3.570312 -0.546875 -4.253906 -0.769531 -4.734375 -1.21875 C -5.210938 -1.664062 -5.453125 -2.273438 -5.453125 -3.046875 C -5.453125 -3.523438 -5.34375 -3.945312 -5.125 -4.3125 C -4.914062 -4.6875 -4.601562 -4.976562 -4.1875 -5.1875 C -3.78125 -5.40625 -3.28125 -5.515625 -2.6875 -5.515625 Z M -2.6875 -1.453125 C -2.050781 -1.453125 -1.546875 -1.578125 -1.171875 -1.828125 C -0.804688 -2.078125 -0.625 -2.476562 -0.625 -3.03125 C -0.625 -3.570312 -0.804688 -3.96875 -1.171875 -4.21875 C -1.546875 -4.46875 -2.050781 -4.59375 -2.6875 -4.59375 C -3.320312 -4.59375 -3.816406 -4.46875 -4.171875 -4.21875 C -4.535156 -3.96875 -4.71875 -3.566406 -4.71875 -3.015625 C -4.71875 -2.472656 -4.535156 -2.078125 -4.171875 -1.828125 C -3.816406 -1.578125 -3.320312 -1.453125 -2.6875 -1.453125 Z M -2.6875 -1.453125 "/> +</g> +<g id="glyph-3-3"> +<path d="M -3.03125 -4.3125 C -3.300781 -4.226562 -3.566406 -4.148438 -3.828125 -4.078125 C -4.097656 -4.015625 -4.304688 -3.96875 -4.453125 -3.9375 L -4.453125 -3.90625 C -4.304688 -3.875 -4.097656 -3.828125 -3.828125 -3.765625 C -3.566406 -3.710938 -3.296875 -3.640625 -3.015625 -3.546875 L -0.015625 -2.578125 L -0.015625 -1.578125 L -5.375 -0.109375 L -5.375 -1.015625 L -2.515625 -1.765625 C -2.222656 -1.835938 -1.929688 -1.90625 -1.640625 -1.96875 C -1.347656 -2.03125 -1.101562 -2.078125 -0.90625 -2.109375 L -0.90625 -2.15625 C -1.019531 -2.175781 -1.160156 -2.203125 -1.328125 -2.234375 C -1.492188 -2.273438 -1.664062 -2.316406 -1.84375 -2.359375 C -2.03125 -2.410156 -2.195312 -2.460938 -2.34375 -2.515625 L -5.375 -3.453125 L -5.375 -4.421875 L -2.34375 -5.34375 C -2.125 -5.414062 -1.878906 -5.484375 -1.609375 -5.546875 C -1.335938 -5.617188 -1.109375 -5.671875 -0.921875 -5.703125 L -0.921875 -5.734375 C -1.085938 -5.753906 -1.316406 -5.800781 -1.609375 -5.875 C -1.898438 -5.945312 -2.203125 -6.019531 -2.515625 -6.09375 L -5.375 -6.84375 L -5.375 -7.75 L -0.015625 -6.265625 L -0.015625 -5.234375 Z M -3.03125 -4.3125 "/> +</g> +<g id="glyph-3-4"> +<path d="M 0.09375 -2.75 C 0.09375 -2.082031 -0.132812 -1.546875 -0.59375 -1.140625 C -1.0625 -0.742188 -1.753906 -0.546875 -2.671875 -0.546875 C -3.585938 -0.546875 -4.28125 -0.75 -4.75 -1.15625 C -5.21875 -1.5625 -5.453125 -2.097656 -5.453125 -2.765625 C -5.453125 -3.171875 -5.375 -3.503906 -5.21875 -3.765625 C -5.070312 -4.035156 -4.890625 -4.253906 -4.671875 -4.421875 L -4.671875 -4.484375 C -4.753906 -4.472656 -4.878906 -4.457031 -5.046875 -4.4375 C -5.222656 -4.425781 -5.359375 -4.421875 -5.453125 -4.421875 L -7.59375 -4.421875 L -7.59375 -5.296875 L 0 -5.296875 L 0 -4.59375 L -0.71875 -4.453125 L -0.71875 -4.421875 C -0.488281 -4.265625 -0.296875 -4.050781 -0.140625 -3.78125 C 0.015625 -3.507812 0.09375 -3.164062 0.09375 -2.75 Z M -0.625 -2.890625 C -0.625 -3.453125 -0.78125 -3.847656 -1.09375 -4.078125 C -1.40625 -4.316406 -1.875 -4.4375 -2.5 -4.4375 L -2.65625 -4.4375 C -3.320312 -4.4375 -3.832031 -4.320312 -4.1875 -4.09375 C -4.550781 -3.875 -4.734375 -3.46875 -4.734375 -2.875 C -4.734375 -2.40625 -4.539062 -2.050781 -4.15625 -1.8125 C -3.78125 -1.570312 -3.28125 -1.453125 -2.65625 -1.453125 C -2.007812 -1.453125 -1.507812 -1.570312 -1.15625 -1.8125 C -0.800781 -2.050781 -0.625 -2.410156 -0.625 -2.890625 Z M -0.625 -2.890625 "/> +</g> +<g id="glyph-3-5"> +<path d="M -5.453125 -3.4375 C -5.453125 -4.070312 -5.296875 -4.550781 -4.984375 -4.875 C -4.679688 -5.207031 -4.179688 -5.375 -3.484375 -5.375 L 0 -5.375 L 0 -4.5 L -3.4375 -4.5 C -4.289062 -4.5 -4.71875 -4.097656 -4.71875 -3.296875 C -4.71875 -2.703125 -4.550781 -2.289062 -4.21875 -2.0625 C -3.882812 -1.84375 -3.40625 -1.734375 -2.78125 -1.734375 L 0 -1.734375 L 0 -0.84375 L -5.359375 -0.84375 L -5.359375 -1.5625 L -4.625 -1.6875 L -4.625 -1.734375 C -4.90625 -1.910156 -5.113281 -2.148438 -5.25 -2.453125 C -5.382812 -2.765625 -5.453125 -3.09375 -5.453125 -3.4375 Z M -5.453125 -3.4375 "/> +</g> +<g id="glyph-3-6"> +</g> +<g id="glyph-3-7"> +<path d="M 0 -2.03125 L -5.359375 0 L -5.359375 -0.9375 L -2.203125 -2.078125 C -2.054688 -2.128906 -1.890625 -2.1875 -1.703125 -2.25 C -1.523438 -2.3125 -1.351562 -2.363281 -1.1875 -2.40625 C -1.03125 -2.457031 -0.894531 -2.492188 -0.78125 -2.515625 L -0.78125 -2.546875 C -0.894531 -2.578125 -1.035156 -2.613281 -1.203125 -2.65625 C -1.367188 -2.707031 -1.539062 -2.765625 -1.71875 -2.828125 C -1.894531 -2.898438 -2.054688 -2.957031 -2.203125 -3 L -5.359375 -4.140625 L -5.359375 -5.078125 L 0 -3.046875 Z M 0 -2.03125 "/> +</g> +<g id="glyph-3-8"> +<path d="M -5.453125 -2.921875 C -5.453125 -3.378906 -5.351562 -3.769531 -5.15625 -4.09375 C -4.957031 -4.425781 -4.675781 -4.679688 -4.3125 -4.859375 C -3.945312 -5.035156 -3.523438 -5.125 -3.046875 -5.125 L -2.515625 -5.125 L -2.515625 -1.453125 C -1.898438 -1.472656 -1.4375 -1.628906 -1.125 -1.921875 C -0.8125 -2.222656 -0.65625 -2.640625 -0.65625 -3.171875 C -0.65625 -3.515625 -0.6875 -3.816406 -0.75 -4.078125 C -0.8125 -4.335938 -0.898438 -4.609375 -1.015625 -4.890625 L -0.25 -4.890625 C -0.125 -4.617188 -0.0351562 -4.347656 0.015625 -4.078125 C 0.0664062 -3.816406 0.09375 -3.5 0.09375 -3.125 C 0.09375 -2.625 -0.00390625 -2.175781 -0.203125 -1.78125 C -0.410156 -1.394531 -0.71875 -1.09375 -1.125 -0.875 C -1.539062 -0.65625 -2.046875 -0.546875 -2.640625 -0.546875 C -3.222656 -0.546875 -3.722656 -0.644531 -4.140625 -0.84375 C -4.566406 -1.039062 -4.890625 -1.316406 -5.109375 -1.671875 C -5.335938 -2.023438 -5.453125 -2.441406 -5.453125 -2.921875 Z M -4.734375 -2.90625 C -4.734375 -2.488281 -4.597656 -2.15625 -4.328125 -1.90625 C -4.066406 -1.664062 -3.691406 -1.523438 -3.203125 -1.484375 L -3.203125 -4.203125 C -3.660156 -4.203125 -4.03125 -4.097656 -4.3125 -3.890625 C -4.59375 -3.679688 -4.734375 -3.351562 -4.734375 -2.90625 Z M -4.734375 -2.90625 "/> +</g> +<g id="glyph-3-9"> +<path d="M -5.453125 -3.34375 C -5.453125 -3.445312 -5.445312 -3.554688 -5.4375 -3.671875 C -5.4375 -3.785156 -5.425781 -3.890625 -5.40625 -3.984375 L -4.59375 -3.875 C -4.613281 -3.78125 -4.628906 -3.679688 -4.640625 -3.578125 C -4.648438 -3.484375 -4.65625 -3.390625 -4.65625 -3.296875 C -4.65625 -3.015625 -4.578125 -2.753906 -4.421875 -2.515625 C -4.273438 -2.273438 -4.066406 -2.082031 -3.796875 -1.9375 C -3.535156 -1.800781 -3.222656 -1.734375 -2.859375 -1.734375 L 0 -1.734375 L 0 -0.84375 L -5.359375 -0.84375 L -5.359375 -1.5625 L -4.375 -1.671875 L -4.375 -1.703125 C -4.664062 -1.878906 -4.914062 -2.101562 -5.125 -2.375 C -5.34375 -2.65625 -5.453125 -2.976562 -5.453125 -3.34375 Z M -5.453125 -3.34375 "/> +</g> +<g id="glyph-3-10"> +<path d="M -3.578125 -7.203125 C -2.703125 -7.203125 -1.957031 -7.023438 -1.34375 -6.671875 C -0.738281 -6.328125 -0.316406 -5.8125 -0.078125 -5.125 L 1.703125 -6.828125 L 1.703125 -5.546875 L 0.09375 -4.15625 C 0.09375 -4.113281 0.09375 -4.070312 0.09375 -4.03125 C 0.09375 -3.988281 0.09375 -3.945312 0.09375 -3.90625 C 0.09375 -3.164062 -0.0546875 -2.550781 -0.359375 -2.0625 C -0.660156 -1.570312 -1.085938 -1.207031 -1.640625 -0.96875 C -2.203125 -0.726562 -2.851562 -0.609375 -3.59375 -0.609375 C -4.320312 -0.609375 -4.957031 -0.726562 -5.5 -0.96875 C -6.050781 -1.207031 -6.476562 -1.570312 -6.78125 -2.0625 C -7.09375 -2.550781 -7.25 -3.171875 -7.25 -3.921875 C -7.25 -4.628906 -7.097656 -5.226562 -6.796875 -5.71875 C -6.492188 -6.207031 -6.066406 -6.578125 -5.515625 -6.828125 C -4.960938 -7.078125 -4.316406 -7.203125 -3.578125 -7.203125 Z M -3.578125 -1.5625 C -2.679688 -1.5625 -1.972656 -1.75 -1.453125 -2.125 C -0.941406 -2.507812 -0.6875 -3.101562 -0.6875 -3.90625 C -0.6875 -4.71875 -0.941406 -5.3125 -1.453125 -5.6875 C -1.972656 -6.0625 -2.679688 -6.25 -3.578125 -6.25 C -4.484375 -6.25 -5.1875 -6.0625 -5.6875 -5.6875 C -6.195312 -5.3125 -6.453125 -4.722656 -6.453125 -3.921875 C -6.453125 -3.109375 -6.195312 -2.507812 -5.6875 -2.125 C -5.1875 -1.75 -4.484375 -1.5625 -3.578125 -1.5625 Z M -3.578125 -1.5625 "/> +</g> +<g id="glyph-3-11"> +<path d="M -5.453125 -6.734375 C -5.453125 -7.335938 -5.296875 -7.789062 -4.984375 -8.09375 C -4.679688 -8.394531 -4.179688 -8.546875 -3.484375 -8.546875 L 0 -8.546875 L 0 -7.671875 L -3.453125 -7.671875 C -4.296875 -7.671875 -4.71875 -7.304688 -4.71875 -6.578125 C -4.71875 -6.054688 -4.566406 -5.679688 -4.265625 -5.453125 C -3.960938 -5.234375 -3.523438 -5.125 -2.953125 -5.125 L 0 -5.125 L 0 -4.265625 L -3.453125 -4.265625 C -4.296875 -4.265625 -4.71875 -3.894531 -4.71875 -3.15625 C -4.71875 -2.613281 -4.550781 -2.238281 -4.21875 -2.03125 C -3.882812 -1.832031 -3.40625 -1.734375 -2.78125 -1.734375 L 0 -1.734375 L 0 -0.84375 L -5.359375 -0.84375 L -5.359375 -1.5625 L -4.625 -1.6875 L -4.625 -1.734375 C -4.90625 -1.898438 -5.113281 -2.125 -5.25 -2.40625 C -5.382812 -2.695312 -5.453125 -3 -5.453125 -3.3125 C -5.453125 -4.15625 -5.15625 -4.703125 -4.5625 -4.953125 L -4.5625 -5.015625 C -4.863281 -5.191406 -5.085938 -5.429688 -5.234375 -5.734375 C -5.378906 -6.046875 -5.453125 -6.378906 -5.453125 -6.734375 Z M -5.453125 -6.734375 "/> +</g> +<g id="glyph-3-12"> +<path d="M -5.359375 -5.328125 L 0 -5.328125 L 0 -4.609375 L -0.703125 -4.484375 L -0.703125 -4.4375 C -0.429688 -4.269531 -0.226562 -4.03125 -0.09375 -3.71875 C 0.03125 -3.414062 0.09375 -3.085938 0.09375 -2.734375 C 0.09375 -2.085938 -0.0546875 -1.601562 -0.359375 -1.28125 C -0.671875 -0.957031 -1.164062 -0.796875 -1.84375 -0.796875 L -5.359375 -0.796875 L -5.359375 -1.6875 L -1.90625 -1.6875 C -1.050781 -1.6875 -0.625 -2.082031 -0.625 -2.875 C -0.625 -3.46875 -0.789062 -3.878906 -1.125 -4.109375 C -1.457031 -4.335938 -1.9375 -4.453125 -2.5625 -4.453125 L -5.359375 -4.453125 Z M -5.359375 -5.328125 "/> +</g> +<g id="glyph-4-0"> +<path d="M 4.71875 -7.171875 C 4.019531 -7.171875 3.484375 -6.910156 3.109375 -6.390625 C 2.742188 -5.867188 2.5625 -5.160156 2.5625 -4.265625 C 2.5625 -3.347656 2.734375 -2.640625 3.078125 -2.140625 C 3.421875 -1.640625 3.96875 -1.390625 4.71875 -1.390625 C 5.070312 -1.390625 5.421875 -1.425781 5.765625 -1.5 C 6.109375 -1.582031 6.488281 -1.695312 6.90625 -1.84375 L 6.90625 -0.328125 C 6.53125 -0.171875 6.15625 -0.0546875 5.78125 0.015625 C 5.414062 0.0859375 5.003906 0.125 4.546875 0.125 C 3.671875 0.125 2.945312 -0.0546875 2.375 -0.421875 C 1.800781 -0.785156 1.378906 -1.296875 1.109375 -1.953125 C 0.835938 -2.617188 0.703125 -3.390625 0.703125 -4.265625 C 0.703125 -5.128906 0.851562 -5.894531 1.15625 -6.5625 C 1.46875 -7.226562 1.921875 -7.75 2.515625 -8.125 C 3.117188 -8.5 3.851562 -8.6875 4.71875 -8.6875 C 5.144531 -8.6875 5.570312 -8.628906 6 -8.515625 C 6.425781 -8.410156 6.832031 -8.269531 7.21875 -8.09375 L 6.640625 -6.609375 C 6.316406 -6.765625 5.992188 -6.894531 5.671875 -7 C 5.347656 -7.113281 5.03125 -7.171875 4.71875 -7.171875 Z M 4.71875 -7.171875 "/> +</g> +<g id="glyph-4-1"> +<path d="M 6.890625 -3.28125 C 6.890625 -2.195312 6.601562 -1.359375 6.03125 -0.765625 C 5.457031 -0.171875 4.679688 0.125 3.703125 0.125 C 3.085938 0.125 2.539062 -0.00390625 2.0625 -0.265625 C 1.59375 -0.535156 1.222656 -0.925781 0.953125 -1.4375 C 0.679688 -1.945312 0.546875 -2.5625 0.546875 -3.28125 C 0.546875 -4.375 0.828125 -5.210938 1.390625 -5.796875 C 1.960938 -6.378906 2.742188 -6.671875 3.734375 -6.671875 C 4.347656 -6.671875 4.890625 -6.535156 5.359375 -6.265625 C 5.835938 -6.003906 6.210938 -5.625 6.484375 -5.125 C 6.753906 -4.625 6.890625 -4.007812 6.890625 -3.28125 Z M 2.359375 -3.28125 C 2.359375 -2.632812 2.460938 -2.144531 2.671875 -1.8125 C 2.890625 -1.476562 3.238281 -1.3125 3.71875 -1.3125 C 4.1875 -1.3125 4.523438 -1.476562 4.734375 -1.8125 C 4.953125 -2.144531 5.0625 -2.632812 5.0625 -3.28125 C 5.0625 -3.9375 4.953125 -4.425781 4.734375 -4.75 C 4.523438 -5.070312 4.179688 -5.234375 3.703125 -5.234375 C 3.234375 -5.234375 2.890625 -5.070312 2.671875 -4.75 C 2.460938 -4.425781 2.359375 -3.9375 2.359375 -3.28125 Z M 2.359375 -3.28125 "/> +</g> +<g id="glyph-4-2"> +<path d="M 8.625 -6.671875 C 9.375 -6.671875 9.9375 -6.476562 10.3125 -6.09375 C 10.695312 -5.71875 10.890625 -5.109375 10.890625 -4.265625 L 10.890625 0 L 9.09375 0 L 9.09375 -3.828125 C 9.09375 -4.773438 8.765625 -5.25 8.109375 -5.25 C 7.640625 -5.25 7.300781 -5.078125 7.09375 -4.734375 C 6.894531 -4.398438 6.796875 -3.914062 6.796875 -3.28125 L 6.796875 0 L 5.015625 0 L 5.015625 -3.828125 C 5.015625 -4.773438 4.6875 -5.25 4.03125 -5.25 C 3.53125 -5.25 3.1875 -5.0625 3 -4.6875 C 2.8125 -4.3125 2.71875 -3.773438 2.71875 -3.078125 L 2.71875 0 L 0.9375 0 L 0.9375 -6.546875 L 2.296875 -6.546875 L 2.546875 -5.71875 L 2.640625 -5.71875 C 2.835938 -6.050781 3.109375 -6.289062 3.453125 -6.4375 C 3.804688 -6.59375 4.171875 -6.671875 4.546875 -6.671875 C 5.023438 -6.671875 5.429688 -6.59375 5.765625 -6.4375 C 6.109375 -6.28125 6.367188 -6.039062 6.546875 -5.71875 L 6.703125 -5.71875 C 6.898438 -6.050781 7.175781 -6.289062 7.53125 -6.4375 C 7.882812 -6.59375 8.25 -6.671875 8.625 -6.671875 Z M 8.625 -6.671875 "/> +</g> +<g id="glyph-4-3"> +<path d="M 4.578125 -6.671875 C 5.316406 -6.671875 5.914062 -6.382812 6.375 -5.8125 C 6.832031 -5.238281 7.0625 -4.394531 7.0625 -3.28125 C 7.0625 -2.175781 6.820312 -1.332031 6.34375 -0.75 C 5.875 -0.164062 5.269531 0.125 4.53125 0.125 C 4.0625 0.125 3.6875 0.0390625 3.40625 -0.125 C 3.125 -0.300781 2.894531 -0.5 2.71875 -0.71875 L 2.625 -0.71875 C 2.6875 -0.382812 2.71875 -0.0664062 2.71875 0.234375 L 2.71875 2.875 L 0.9375 2.875 L 0.9375 -6.546875 L 2.390625 -6.546875 L 2.640625 -5.703125 L 2.71875 -5.703125 C 2.894531 -5.960938 3.128906 -6.1875 3.421875 -6.375 C 3.722656 -6.570312 4.109375 -6.671875 4.578125 -6.671875 Z M 4.015625 -5.25 C 3.546875 -5.25 3.21875 -5.101562 3.03125 -4.8125 C 2.84375 -4.519531 2.738281 -4.078125 2.71875 -3.484375 L 2.71875 -3.296875 C 2.71875 -2.671875 2.8125 -2.1875 3 -1.84375 C 3.1875 -1.5 3.53125 -1.328125 4.03125 -1.328125 C 4.4375 -1.328125 4.738281 -1.5 4.9375 -1.84375 C 5.132812 -2.1875 5.234375 -2.675781 5.234375 -3.3125 C 5.234375 -4.601562 4.828125 -5.25 4.015625 -5.25 Z M 4.015625 -5.25 "/> +</g> +<g id="glyph-4-4"> +<path d="M 3.625 -6.6875 C 4.5 -6.6875 5.171875 -6.492188 5.640625 -6.109375 C 6.109375 -5.734375 6.34375 -5.15625 6.34375 -4.375 L 6.34375 0 L 5.09375 0 L 4.75 -0.890625 L 4.703125 -0.890625 C 4.421875 -0.535156 4.125 -0.273438 3.8125 -0.109375 C 3.5 0.046875 3.070312 0.125 2.53125 0.125 C 1.945312 0.125 1.460938 -0.046875 1.078125 -0.390625 C 0.691406 -0.734375 0.5 -1.253906 0.5 -1.953125 C 0.5 -2.648438 0.742188 -3.164062 1.234375 -3.5 C 1.722656 -3.832031 2.457031 -4.015625 3.4375 -4.046875 L 4.578125 -4.078125 L 4.578125 -4.375 C 4.578125 -4.71875 4.484375 -4.96875 4.296875 -5.125 C 4.117188 -5.28125 3.867188 -5.359375 3.546875 -5.359375 C 3.234375 -5.359375 2.921875 -5.3125 2.609375 -5.21875 C 2.304688 -5.132812 2.003906 -5.023438 1.703125 -4.890625 L 1.109375 -6.09375 C 1.460938 -6.28125 1.851562 -6.425781 2.28125 -6.53125 C 2.707031 -6.632812 3.15625 -6.6875 3.625 -6.6875 Z M 3.875 -3.015625 C 3.300781 -2.992188 2.898438 -2.882812 2.671875 -2.6875 C 2.453125 -2.5 2.34375 -2.25 2.34375 -1.9375 C 2.34375 -1.664062 2.421875 -1.472656 2.578125 -1.359375 C 2.734375 -1.242188 2.941406 -1.1875 3.203125 -1.1875 C 3.585938 -1.1875 3.910156 -1.300781 4.171875 -1.53125 C 4.441406 -1.757812 4.578125 -2.082031 4.578125 -2.5 L 4.578125 -3.03125 Z M 3.875 -3.015625 "/> +</g> +<g id="glyph-4-5"> +<path d="M 4.59375 -6.671875 C 4.6875 -6.671875 4.789062 -6.664062 4.90625 -6.65625 C 5.03125 -6.644531 5.128906 -6.632812 5.203125 -6.625 L 5.0625 -4.9375 C 5.007812 -4.957031 4.925781 -4.972656 4.8125 -4.984375 C 4.707031 -4.992188 4.613281 -5 4.53125 -5 C 4.226562 -5 3.9375 -4.945312 3.65625 -4.84375 C 3.375 -4.738281 3.144531 -4.5625 2.96875 -4.3125 C 2.800781 -4.070312 2.71875 -3.75 2.71875 -3.34375 L 2.71875 0 L 0.9375 0 L 0.9375 -6.546875 L 2.296875 -6.546875 L 2.5625 -5.453125 L 2.640625 -5.453125 C 2.828125 -5.785156 3.085938 -6.070312 3.421875 -6.3125 C 3.765625 -6.550781 4.15625 -6.671875 4.59375 -6.671875 Z M 4.59375 -6.671875 "/> +</g> +<g id="glyph-4-6"> +<path d="M 1.84375 -9.125 C 2.101562 -9.125 2.328125 -9.0625 2.515625 -8.9375 C 2.710938 -8.8125 2.8125 -8.582031 2.8125 -8.25 C 2.8125 -7.914062 2.710938 -7.6875 2.515625 -7.5625 C 2.328125 -7.4375 2.101562 -7.375 1.84375 -7.375 C 1.5625 -7.375 1.328125 -7.4375 1.140625 -7.5625 C 0.953125 -7.6875 0.859375 -7.914062 0.859375 -8.25 C 0.859375 -8.582031 0.953125 -8.8125 1.140625 -8.9375 C 1.328125 -9.0625 1.5625 -9.125 1.84375 -9.125 Z M 2.71875 -6.546875 L 2.71875 0 L 0.9375 0 L 0.9375 -6.546875 Z M 2.71875 -6.546875 "/> +</g> +<g id="glyph-4-7"> +<path d="M 5.515625 -1.9375 C 5.515625 -1.28125 5.28125 -0.769531 4.8125 -0.40625 C 4.34375 -0.0507812 3.644531 0.125 2.71875 0.125 C 2.257812 0.125 1.863281 0.09375 1.53125 0.03125 C 1.207031 -0.03125 0.878906 -0.128906 0.546875 -0.265625 L 0.546875 -1.734375 C 0.898438 -1.578125 1.28125 -1.445312 1.6875 -1.34375 C 2.09375 -1.238281 2.453125 -1.1875 2.765625 -1.1875 C 3.117188 -1.1875 3.367188 -1.238281 3.515625 -1.34375 C 3.671875 -1.445312 3.75 -1.582031 3.75 -1.75 C 3.75 -1.863281 3.71875 -1.960938 3.65625 -2.046875 C 3.59375 -2.140625 3.460938 -2.238281 3.265625 -2.34375 C 3.066406 -2.457031 2.753906 -2.601562 2.328125 -2.78125 C 1.921875 -2.957031 1.582031 -3.128906 1.3125 -3.296875 C 1.050781 -3.472656 0.859375 -3.679688 0.734375 -3.921875 C 0.609375 -4.171875 0.546875 -4.476562 0.546875 -4.84375 C 0.546875 -5.457031 0.78125 -5.914062 1.25 -6.21875 C 1.71875 -6.519531 2.34375 -6.671875 3.125 -6.671875 C 3.539062 -6.671875 3.929688 -6.628906 4.296875 -6.546875 C 4.660156 -6.472656 5.039062 -6.34375 5.4375 -6.15625 L 4.890625 -4.875 C 4.578125 -5.007812 4.273438 -5.125 3.984375 -5.21875 C 3.691406 -5.3125 3.398438 -5.359375 3.109375 -5.359375 C 2.578125 -5.359375 2.3125 -5.210938 2.3125 -4.921875 C 2.3125 -4.816406 2.34375 -4.722656 2.40625 -4.640625 C 2.476562 -4.554688 2.613281 -4.460938 2.8125 -4.359375 C 3.007812 -4.265625 3.300781 -4.140625 3.6875 -3.984375 C 4.0625 -3.828125 4.382812 -3.664062 4.65625 -3.5 C 4.925781 -3.34375 5.132812 -3.140625 5.28125 -2.890625 C 5.4375 -2.648438 5.515625 -2.332031 5.515625 -1.9375 Z M 5.515625 -1.9375 "/> +</g> +<g id="glyph-4-8"> +<path d="M 4.65625 -6.671875 C 5.363281 -6.671875 5.925781 -6.476562 6.34375 -6.09375 C 6.769531 -5.71875 6.984375 -5.109375 6.984375 -4.265625 L 6.984375 0 L 5.203125 0 L 5.203125 -3.828125 C 5.203125 -4.296875 5.113281 -4.648438 4.9375 -4.890625 C 4.769531 -5.128906 4.503906 -5.25 4.140625 -5.25 C 3.597656 -5.25 3.222656 -5.0625 3.015625 -4.6875 C 2.816406 -4.3125 2.71875 -3.773438 2.71875 -3.078125 L 2.71875 0 L 0.9375 0 L 0.9375 -6.546875 L 2.296875 -6.546875 L 2.546875 -5.71875 L 2.640625 -5.71875 C 2.847656 -6.050781 3.132812 -6.289062 3.5 -6.4375 C 3.863281 -6.59375 4.25 -6.671875 4.65625 -6.671875 Z M 4.65625 -6.671875 "/> +</g> +<g id="glyph-4-9"> +</g> +<g id="glyph-4-10"> +<path d="M 3.015625 0.125 C 2.285156 0.125 1.691406 -0.160156 1.234375 -0.734375 C 0.773438 -1.304688 0.546875 -2.148438 0.546875 -3.265625 C 0.546875 -4.378906 0.773438 -5.222656 1.234375 -5.796875 C 1.703125 -6.378906 2.3125 -6.671875 3.0625 -6.671875 C 3.53125 -6.671875 3.914062 -6.578125 4.21875 -6.390625 C 4.53125 -6.210938 4.769531 -5.988281 4.9375 -5.71875 L 5 -5.71875 C 4.976562 -5.84375 4.953125 -6.023438 4.921875 -6.265625 C 4.890625 -6.515625 4.875 -6.765625 4.875 -7.015625 L 4.875 -9.125 L 6.65625 -9.125 L 6.65625 0 L 5.296875 0 L 4.9375 -0.859375 L 4.875 -0.859375 C 4.695312 -0.578125 4.457031 -0.34375 4.15625 -0.15625 C 3.863281 0.03125 3.484375 0.125 3.015625 0.125 Z M 3.640625 -1.3125 C 4.128906 -1.3125 4.472656 -1.457031 4.671875 -1.75 C 4.878906 -2.039062 4.984375 -2.476562 4.984375 -3.0625 L 4.984375 -3.25 C 4.984375 -3.894531 4.882812 -4.382812 4.6875 -4.71875 C 4.5 -5.050781 4.140625 -5.21875 3.609375 -5.21875 C 3.222656 -5.21875 2.914062 -5.046875 2.6875 -4.703125 C 2.46875 -4.367188 2.359375 -3.878906 2.359375 -3.234375 C 2.359375 -2.597656 2.46875 -2.117188 2.6875 -1.796875 C 2.914062 -1.472656 3.234375 -1.3125 3.640625 -1.3125 Z M 3.640625 -1.3125 "/> +</g> +<g id="glyph-4-11"> +<path d="M 3.640625 -6.671875 C 4.535156 -6.671875 5.25 -6.410156 5.78125 -5.890625 C 6.3125 -5.378906 6.578125 -4.648438 6.578125 -3.703125 L 6.578125 -2.828125 L 2.359375 -2.828125 C 2.367188 -2.328125 2.515625 -1.929688 2.796875 -1.640625 C 3.085938 -1.359375 3.484375 -1.21875 3.984375 -1.21875 C 4.410156 -1.21875 4.796875 -1.257812 5.140625 -1.34375 C 5.484375 -1.425781 5.835938 -1.554688 6.203125 -1.734375 L 6.203125 -0.34375 C 5.878906 -0.1875 5.539062 -0.0703125 5.1875 0 C 4.832031 0.0820312 4.40625 0.125 3.90625 0.125 C 3.25 0.125 2.664062 0.00390625 2.15625 -0.234375 C 1.65625 -0.484375 1.257812 -0.851562 0.96875 -1.34375 C 0.6875 -1.84375 0.546875 -2.472656 0.546875 -3.234375 C 0.546875 -3.992188 0.671875 -4.628906 0.921875 -5.140625 C 1.179688 -5.648438 1.546875 -6.03125 2.015625 -6.28125 C 2.484375 -6.539062 3.023438 -6.671875 3.640625 -6.671875 Z M 3.640625 -5.40625 C 3.296875 -5.40625 3.007812 -5.289062 2.78125 -5.0625 C 2.5625 -4.84375 2.429688 -4.492188 2.390625 -4.015625 L 4.890625 -4.015625 C 4.890625 -4.421875 4.785156 -4.753906 4.578125 -5.015625 C 4.378906 -5.273438 4.066406 -5.40625 3.640625 -5.40625 Z M 3.640625 -5.40625 "/> +</g> +<g id="glyph-4-12"> +<path d="M 0.859375 -8.25 C 0.859375 -8.582031 0.953125 -8.8125 1.140625 -8.9375 C 1.328125 -9.0625 1.5625 -9.125 1.84375 -9.125 C 2.101562 -9.125 2.328125 -9.0625 2.515625 -8.9375 C 2.710938 -8.8125 2.8125 -8.582031 2.8125 -8.25 C 2.8125 -7.914062 2.710938 -7.6875 2.515625 -7.5625 C 2.328125 -7.4375 2.101562 -7.375 1.84375 -7.375 C 1.5625 -7.375 1.328125 -7.4375 1.140625 -7.5625 C 0.953125 -7.6875 0.859375 -7.914062 0.859375 -8.25 Z M 0.40625 2.875 C 0.207031 2.875 0 2.859375 -0.21875 2.828125 C -0.4375 2.804688 -0.617188 2.773438 -0.765625 2.734375 L -0.765625 1.328125 C -0.617188 1.359375 -0.484375 1.382812 -0.359375 1.40625 C -0.234375 1.425781 -0.0859375 1.4375 0.078125 1.4375 C 0.316406 1.4375 0.519531 1.367188 0.6875 1.234375 C 0.851562 1.097656 0.9375 0.832031 0.9375 0.4375 L 0.9375 -6.546875 L 2.71875 -6.546875 L 2.71875 0.703125 C 2.71875 1.109375 2.640625 1.472656 2.484375 1.796875 C 2.335938 2.128906 2.09375 2.390625 1.75 2.578125 C 1.414062 2.773438 0.96875 2.875 0.40625 2.875 Z M 0.40625 2.875 "/> +</g> +<g id="glyph-4-13"> +<path d="M 3.0625 -6.671875 C 3.863281 -6.671875 4.492188 -6.351562 4.953125 -5.71875 L 5 -5.71875 L 5.140625 -6.546875 L 6.65625 -6.546875 L 6.65625 0.015625 C 6.65625 0.953125 6.378906 1.660156 5.828125 2.140625 C 5.273438 2.628906 4.460938 2.875 3.390625 2.875 C 2.921875 2.875 2.488281 2.847656 2.09375 2.796875 C 1.695312 2.742188 1.3125 2.644531 0.9375 2.5 L 0.9375 1.0625 C 1.738281 1.40625 2.585938 1.578125 3.484375 1.578125 C 4.410156 1.578125 4.875 1.078125 4.875 0.078125 L 4.875 -0.046875 C 4.875 -0.179688 4.878906 -0.320312 4.890625 -0.46875 C 4.898438 -0.613281 4.910156 -0.742188 4.921875 -0.859375 L 4.875 -0.859375 C 4.644531 -0.515625 4.375 -0.265625 4.0625 -0.109375 C 3.75 0.046875 3.398438 0.125 3.015625 0.125 C 2.234375 0.125 1.625 -0.171875 1.1875 -0.765625 C 0.757812 -1.367188 0.546875 -2.203125 0.546875 -3.265625 C 0.546875 -4.335938 0.769531 -5.171875 1.21875 -5.765625 C 1.664062 -6.367188 2.28125 -6.671875 3.0625 -6.671875 Z M 3.625 -5.21875 C 2.78125 -5.21875 2.359375 -4.554688 2.359375 -3.234375 C 2.359375 -1.929688 2.785156 -1.28125 3.640625 -1.28125 C 4.097656 -1.28125 4.4375 -1.410156 4.65625 -1.671875 C 4.875 -1.929688 4.984375 -2.382812 4.984375 -3.03125 L 4.984375 -3.25 C 4.984375 -3.957031 4.875 -4.460938 4.65625 -4.765625 C 4.445312 -5.066406 4.101562 -5.21875 3.625 -5.21875 Z M 3.625 -5.21875 "/> +</g> +<g id="glyph-4-14"> +<path d="M 5.8125 -2.296875 C 5.78125 -2.429688 5.734375 -2.628906 5.671875 -2.890625 C 5.617188 -3.160156 5.554688 -3.445312 5.484375 -3.75 C 5.410156 -4.0625 5.34375 -4.347656 5.28125 -4.609375 C 5.21875 -4.867188 5.171875 -5.0625 5.140625 -5.1875 L 5.09375 -5.1875 C 5.070312 -5.0625 5.03125 -4.867188 4.96875 -4.609375 C 4.914062 -4.347656 4.851562 -4.0625 4.78125 -3.75 C 4.707031 -3.445312 4.632812 -3.160156 4.5625 -2.890625 C 4.5 -2.617188 4.453125 -2.410156 4.421875 -2.265625 L 3.90625 0 L 1.984375 0 L 0.125 -6.546875 L 1.890625 -6.546875 L 2.65625 -3.640625 C 2.707031 -3.441406 2.753906 -3.203125 2.796875 -2.921875 C 2.847656 -2.648438 2.890625 -2.382812 2.921875 -2.125 C 2.960938 -1.863281 2.992188 -1.65625 3.015625 -1.5 L 3.0625 -1.5 C 3.070312 -1.613281 3.085938 -1.765625 3.109375 -1.953125 C 3.128906 -2.140625 3.15625 -2.332031 3.1875 -2.53125 C 3.226562 -2.726562 3.265625 -2.910156 3.296875 -3.078125 C 3.328125 -3.242188 3.347656 -3.351562 3.359375 -3.40625 L 4.15625 -6.546875 L 6.125 -6.546875 L 6.90625 -3.40625 C 6.9375 -3.289062 6.972656 -3.109375 7.015625 -2.859375 C 7.054688 -2.617188 7.09375 -2.367188 7.125 -2.109375 C 7.164062 -1.859375 7.1875 -1.65625 7.1875 -1.5 L 7.234375 -1.5 C 7.253906 -1.632812 7.28125 -1.832031 7.3125 -2.09375 C 7.351562 -2.351562 7.398438 -2.625 7.453125 -2.90625 C 7.503906 -3.195312 7.5625 -3.441406 7.625 -3.640625 L 8.40625 -6.546875 L 10.15625 -6.546875 L 8.265625 0 L 6.328125 0 Z M 5.8125 -2.296875 "/> +</g> +<g id="glyph-4-15"> +<path d="M 3.703125 -1.3125 C 3.898438 -1.3125 4.085938 -1.328125 4.265625 -1.359375 C 4.453125 -1.398438 4.640625 -1.453125 4.828125 -1.515625 L 4.828125 -0.1875 C 4.628906 -0.101562 4.390625 -0.03125 4.109375 0.03125 C 3.828125 0.09375 3.519531 0.125 3.1875 0.125 C 2.789062 0.125 2.4375 0.0625 2.125 -0.0625 C 1.820312 -0.195312 1.578125 -0.421875 1.390625 -0.734375 C 1.210938 -1.054688 1.125 -1.492188 1.125 -2.046875 L 1.125 -5.203125 L 0.28125 -5.203125 L 0.28125 -5.96875 L 1.265625 -6.5625 L 1.78125 -7.9375 L 2.921875 -7.9375 L 2.921875 -6.546875 L 4.75 -6.546875 L 4.75 -5.203125 L 2.921875 -5.203125 L 2.921875 -2.046875 C 2.921875 -1.804688 2.988281 -1.625 3.125 -1.5 C 3.269531 -1.375 3.460938 -1.3125 3.703125 -1.3125 Z M 3.703125 -1.3125 "/> +</g> +<g id="glyph-4-16"> +<path d="M 2.71875 -7.265625 C 2.71875 -6.941406 2.707031 -6.628906 2.6875 -6.328125 C 2.664062 -6.035156 2.648438 -5.832031 2.640625 -5.71875 L 2.734375 -5.71875 C 2.941406 -6.050781 3.207031 -6.289062 3.53125 -6.4375 C 3.863281 -6.59375 4.226562 -6.671875 4.625 -6.671875 C 5.34375 -6.671875 5.914062 -6.476562 6.34375 -6.09375 C 6.769531 -5.71875 6.984375 -5.109375 6.984375 -4.265625 L 6.984375 0 L 5.203125 0 L 5.203125 -3.828125 C 5.203125 -4.773438 4.847656 -5.25 4.140625 -5.25 C 3.609375 -5.25 3.238281 -5.0625 3.03125 -4.6875 C 2.820312 -4.3125 2.71875 -3.773438 2.71875 -3.078125 L 2.71875 0 L 0.9375 0 L 0.9375 -9.125 L 2.71875 -9.125 Z M 2.71875 -7.265625 "/> +</g> +<g id="glyph-4-17"> +<path d="M 6.953125 -6.546875 L 6.953125 0 L 5.578125 0 L 5.34375 -0.84375 L 5.25 -0.84375 C 5.039062 -0.507812 4.753906 -0.265625 4.390625 -0.109375 C 4.023438 0.046875 3.640625 0.125 3.234375 0.125 C 2.523438 0.125 1.957031 -0.0625 1.53125 -0.4375 C 1.113281 -0.820312 0.90625 -1.4375 0.90625 -2.28125 L 0.90625 -6.546875 L 2.6875 -6.546875 L 2.6875 -2.71875 C 2.6875 -2.257812 2.769531 -1.910156 2.9375 -1.671875 C 3.101562 -1.429688 3.375 -1.3125 3.75 -1.3125 C 4.289062 -1.3125 4.660156 -1.492188 4.859375 -1.859375 C 5.054688 -2.234375 5.15625 -2.769531 5.15625 -3.46875 L 5.15625 -6.546875 Z M 6.953125 -6.546875 "/> +</g> +<g id="glyph-4-18"> +<path d="M 2.71875 0 L 0.9375 0 L 0.9375 -9.125 L 2.71875 -9.125 Z M 2.71875 0 "/> +</g> +</g> +<clipPath id="clip-0"> +<path clip-rule="nonzero" d="M 53.371094 30.585938 L 643.957031 30.585938 L 643.957031 312.746094 L 53.371094 312.746094 Z M 53.371094 30.585938 "/> +</clipPath> +<clipPath id="clip-1"> +<path clip-rule="nonzero" d="M 97 312 L 157 312 L 157 312.746094 L 97 312.746094 Z M 97 312 "/> +</clipPath> +<clipPath id="clip-2"> +<path clip-rule="nonzero" d="M 245 231 L 305 231 L 305 312.746094 L 245 312.746094 Z M 245 231 "/> +</clipPath> +<clipPath id="clip-3"> +<path clip-rule="nonzero" d="M 392 63 L 453 63 L 453 312.746094 L 392 312.746094 Z M 392 63 "/> +</clipPath> +<clipPath id="clip-4"> +<path clip-rule="nonzero" d="M 540 190 L 600 190 L 600 312.746094 L 540 312.746094 Z M 540 190 "/> +</clipPath> +</defs> +<path fill-rule="nonzero" fill="rgb(100%, 100%, 100%)" fill-opacity="1" stroke-width="0.5" stroke-linecap="round" stroke-linejoin="round" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 0.25 0.25 L 647.75 0.25 L 647.75 371.75 L 0.25 371.75 Z M 0.25 0.25 "/> +<path fill-rule="nonzero" fill="rgb(100%, 100%, 100%)" fill-opacity="1" stroke-width="1" stroke-linecap="round" stroke-linejoin="round" stroke="rgb(51.764706%, 50.980392%, 51.764706%)" stroke-opacity="1" stroke-miterlimit="10" d="M 53.371094 30.585938 L 643.957031 30.585938 L 643.957031 312.746094 L 53.371094 312.746094 Z M 53.371094 30.585938 "/> +<g clip-path="url(#clip-0)"> +<path fill="none" stroke-width="0.4" stroke-linecap="round" stroke-linejoin="round" stroke="rgb(75.294118%, 75.294118%, 75.294118%)" stroke-opacity="1" stroke-miterlimit="10" d="M 53.371094 312.746094 L 643.957031 312.746094 M 53.371094 242.207031 L 643.957031 242.207031 M 53.371094 171.667969 L 643.957031 171.667969 M 53.371094 101.125 L 643.957031 101.125 M 53.371094 30.585938 L 643.957031 30.585938 "/> +</g> +<g clip-path="url(#clip-1)"> +<path fill="none" stroke-width="0.5" stroke-linecap="round" stroke-linejoin="round" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 97.667969 312.746094 L 156.726562 312.746094 Z M 97.667969 312.746094 "/> +</g> +<g clip-path="url(#clip-2)"> +<path fill-rule="nonzero" fill="rgb(61.176471%, 61.176471%, 100%)" fill-opacity="1" stroke-width="0.5" stroke-linecap="round" stroke-linejoin="round" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 245.3125 312.746094 L 304.371094 312.746094 L 304.371094 231.375 L 245.3125 231.375 Z M 245.3125 312.746094 "/> +</g> +<g clip-path="url(#clip-3)"> +<path fill-rule="nonzero" fill="rgb(61.176471%, 61.176471%, 100%)" fill-opacity="1" stroke-width="0.5" stroke-linecap="round" stroke-linejoin="round" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 392.957031 312.746094 L 452.015625 312.746094 L 452.015625 63.5625 L 392.957031 63.5625 Z M 392.957031 312.746094 "/> +</g> +<g clip-path="url(#clip-4)"> +<path fill-rule="nonzero" fill="rgb(61.176471%, 61.176471%, 100%)" fill-opacity="1" stroke-width="0.5" stroke-linecap="round" stroke-linejoin="round" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 540.605469 312.746094 L 599.664062 312.746094 L 599.664062 190.589844 L 540.605469 190.589844 Z M 540.605469 312.746094 "/> +</g> +<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> +<use xlink:href="#glyph-0-0" x="125.445741" y="309.489537"/> +</g> +<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> +<use xlink:href="#glyph-0-0" x="271.591722" y="228.118118"/> +<use xlink:href="#glyph-0-1" x="274.591722" y="228.118118"/> +</g> +<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> +<use xlink:href="#glyph-0-2" x="416.237704" y="60.304511"/> +<use xlink:href="#glyph-0-1" x="419.237704" y="60.304511"/> +<use xlink:href="#glyph-0-3" x="422.237704" y="60.304511"/> +<use xlink:href="#glyph-0-4" x="425.237704" y="60.304511"/> +</g> +<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> +<use xlink:href="#glyph-0-5" x="566.883685" y="187.332101"/> +<use xlink:href="#glyph-0-1" x="569.883685" y="187.332101"/> +</g> +<path fill="none" stroke-width="0.5" stroke-linecap="round" stroke-linejoin="round" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 53.371094 312.746094 L 643.957031 312.746094 M 53.371094 316.996094 L 53.371094 312.746094 M 201.019531 316.996094 L 201.019531 312.746094 M 348.664062 316.996094 L 348.664062 312.746094 M 496.3125 316.996094 L 496.3125 312.746094 M 643.957031 316.996094 L 643.957031 312.746094 "/> +<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> +<use xlink:href="#glyph-1-0" x="130.047852" y="341.207031"/> +<use xlink:href="#glyph-1-1" x="130.047852" y="336.207031"/> +<use xlink:href="#glyph-1-2" x="130.047852" y="331.207031"/> +<use xlink:href="#glyph-1-3" x="130.047852" y="324.207031"/> +</g> +<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> +<use xlink:href="#glyph-1-4" x="277.696289" y="368.207031"/> +<use xlink:href="#glyph-1-5" x="277.696289" y="363.207031"/> +<use xlink:href="#glyph-1-6" x="277.696289" y="359.207031"/> +<use xlink:href="#glyph-1-7" x="277.696289" y="354.207031"/> +<use xlink:href="#glyph-1-8" x="277.696289" y="351.207031"/> +<use xlink:href="#glyph-1-9" x="277.696289" y="346.207031"/> +<use xlink:href="#glyph-1-8" x="277.696289" y="343.207031"/> +<use xlink:href="#glyph-1-10" x="277.696289" y="338.207031"/> +<use xlink:href="#glyph-1-11" x="277.696289" y="336.207031"/> +<use xlink:href="#glyph-1-12" x="277.696289" y="334.207031"/> +<use xlink:href="#glyph-1-9" x="277.696289" y="331.207031"/> +<use xlink:href="#glyph-1-3" x="277.696289" y="328.207031"/> +<use xlink:href="#glyph-1-11" x="277.696289" y="323.207031"/> +<use xlink:href="#glyph-1-11" x="277.696289" y="321.207031"/> +</g> +<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> +<use xlink:href="#glyph-1-13" x="425.34082" y="335.207031"/> +<use xlink:href="#glyph-1-14" x="425.34082" y="331.207031"/> +<use xlink:href="#glyph-1-10" x="425.34082" y="327.207031"/> +<use xlink:href="#glyph-1-11" x="425.34082" y="325.207031"/> +<use xlink:href="#glyph-1-15" x="425.34082" y="323.207031"/> +</g> +<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> +<use xlink:href="#glyph-1-13" x="572.989258" y="343.207031"/> +<use xlink:href="#glyph-1-4" x="572.989258" y="339.207031"/> +<use xlink:href="#glyph-1-10" x="572.989258" y="334.207031"/> +<use xlink:href="#glyph-1-16" x="572.989258" y="332.207031"/> +<use xlink:href="#glyph-1-1" x="572.989258" y="328.207031"/> +<use xlink:href="#glyph-1-15" x="572.989258" y="323.207031"/> +</g> +<path fill="none" stroke-width="0.5" stroke-linecap="round" stroke-linejoin="round" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 53.371094 312.746094 L 53.371094 30.585938 M 49.121094 312.746094 L 53.371094 312.746094 M 49.121094 242.207031 L 53.371094 242.207031 M 49.121094 171.667969 L 53.371094 171.667969 M 49.121094 101.125 L 53.371094 101.125 M 49.121094 30.585938 L 53.371094 30.585938 "/> +<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> +<use xlink:href="#glyph-2-0" x="41.914062" y="315.602539"/> +</g> +<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> +<use xlink:href="#glyph-2-0" x="36.914062" y="245.05957"/> +<use xlink:href="#glyph-2-1" x="41.914062" y="245.05957"/> +</g> +<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> +<use xlink:href="#glyph-2-0" x="31.914062" y="174.520508"/> +<use xlink:href="#glyph-2-1" x="36.914062" y="174.520508"/> +<use xlink:href="#glyph-2-1" x="41.914062" y="174.520508"/> +</g> +<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> +<use xlink:href="#glyph-2-0" x="26.914062" y="103.977539"/> +<use xlink:href="#glyph-2-1" x="31.914062" y="103.977539"/> +<use xlink:href="#glyph-2-1" x="36.914062" y="103.977539"/> +<use xlink:href="#glyph-2-1" x="41.914062" y="103.977539"/> +</g> +<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> +<use xlink:href="#glyph-2-0" x="21.914062" y="33.438477"/> +<use xlink:href="#glyph-2-1" x="26.914062" y="33.438477"/> +<use xlink:href="#glyph-2-1" x="31.914062" y="33.438477"/> +<use xlink:href="#glyph-2-1" x="36.914062" y="33.438477"/> +<use xlink:href="#glyph-2-1" x="41.914062" y="33.438477"/> +</g> +<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> +<use xlink:href="#glyph-3-0" x="14.733398" y="223.917969"/> +<use xlink:href="#glyph-3-1" x="14.733398" y="218.917969"/> +<use xlink:href="#glyph-3-2" x="14.733398" y="215.917969"/> +<use xlink:href="#glyph-3-3" x="14.733398" y="209.917969"/> +<use xlink:href="#glyph-3-4" x="14.733398" y="201.917969"/> +<use xlink:href="#glyph-3-2" x="14.733398" y="195.917969"/> +<use xlink:href="#glyph-3-3" x="14.733398" y="189.917969"/> +<use xlink:href="#glyph-3-5" x="14.733398" y="181.917969"/> +<use xlink:href="#glyph-3-6" x="14.733398" y="175.917969"/> +<use xlink:href="#glyph-3-2" x="14.733398" y="172.917969"/> +<use xlink:href="#glyph-3-7" x="14.733398" y="166.917969"/> +<use xlink:href="#glyph-3-8" x="14.733398" y="161.917969"/> +<use xlink:href="#glyph-3-9" x="14.733398" y="155.917969"/> +<use xlink:href="#glyph-3-6" x="14.733398" y="151.917969"/> +<use xlink:href="#glyph-3-10" x="14.733398" y="148.917969"/> +<use xlink:href="#glyph-3-8" x="14.733398" y="140.917969"/> +<use xlink:href="#glyph-3-11" x="14.733398" y="134.917969"/> +<use xlink:href="#glyph-3-12" x="14.733398" y="125.917969"/> +</g> +<g fill="rgb(0%, 0%, 0%)" fill-opacity="1"> +<use xlink:href="#glyph-4-0" x="190.25" y="16.871094"/> +<use xlink:href="#glyph-4-1" x="198.25" y="16.871094"/> +<use xlink:href="#glyph-4-2" x="205.25" y="16.871094"/> +<use xlink:href="#glyph-4-3" x="217.25" y="16.871094"/> +<use xlink:href="#glyph-4-4" x="225.25" y="16.871094"/> +<use xlink:href="#glyph-4-5" x="232.25" y="16.871094"/> +<use xlink:href="#glyph-4-6" x="237.25" y="16.871094"/> +<use xlink:href="#glyph-4-7" x="241.25" y="16.871094"/> +<use xlink:href="#glyph-4-1" x="247.25" y="16.871094"/> +<use xlink:href="#glyph-4-8" x="254.25" y="16.871094"/> +<use xlink:href="#glyph-4-9" x="262.25" y="16.871094"/> +<use xlink:href="#glyph-4-10" x="265.25" y="16.871094"/> +<use xlink:href="#glyph-4-11" x="273.25" y="16.871094"/> +<use xlink:href="#glyph-4-11" x="280.25" y="16.871094"/> +<use xlink:href="#glyph-4-3" x="287.25" y="16.871094"/> +<use xlink:href="#glyph-4-12" x="295.25" y="16.871094"/> +<use xlink:href="#glyph-4-7" x="299.25" y="16.871094"/> +<use xlink:href="#glyph-4-11" x="305.25" y="16.871094"/> +<use xlink:href="#glyph-4-8" x="312.25" y="16.871094"/> +<use xlink:href="#glyph-4-13" x="320.25" y="16.871094"/> +<use xlink:href="#glyph-4-9" x="328.25" y="16.871094"/> +<use xlink:href="#glyph-4-14" x="331.25" y="16.871094"/> +<use xlink:href="#glyph-4-6" x="341.25" y="16.871094"/> +<use xlink:href="#glyph-4-15" x="345.25" y="16.871094"/> +<use xlink:href="#glyph-4-16" x="350.25" y="16.871094"/> +<use xlink:href="#glyph-4-9" x="358.25" y="16.871094"/> +<use xlink:href="#glyph-4-1" x="361.25" y="16.871094"/> +<use xlink:href="#glyph-4-15" x="368.25" y="16.871094"/> +<use xlink:href="#glyph-4-16" x="373.25" y="16.871094"/> +<use xlink:href="#glyph-4-11" x="381.25" y="16.871094"/> +<use xlink:href="#glyph-4-5" x="388.25" y="16.871094"/> +<use xlink:href="#glyph-4-9" x="393.25" y="16.871094"/> +<use xlink:href="#glyph-4-11" x="396.25" y="16.871094"/> +<use xlink:href="#glyph-4-2" x="403.25" y="16.871094"/> +<use xlink:href="#glyph-4-17" x="415.25" y="16.871094"/> +<use xlink:href="#glyph-4-18" x="423.25" y="16.871094"/> +<use xlink:href="#glyph-4-4" x="427.25" y="16.871094"/> +<use xlink:href="#glyph-4-15" x="434.25" y="16.871094"/> +<use xlink:href="#glyph-4-1" x="439.25" y="16.871094"/> +<use xlink:href="#glyph-4-5" x="446.25" y="16.871094"/> +<use xlink:href="#glyph-4-7" x="451.25" y="16.871094"/> +</g> +</svg> diff --git a/posts/2023/05/rpython-used-to-speed-up-risc-v-simulation-over-15x.txt b/posts/2023/05/rpython-used-to-speed-up-risc-v-simulation-over-15x.txt index 43714090c..aaa26765f 100644 --- a/posts/2023/05/rpython-used-to-speed-up-risc-v-simulation-over-15x.txt +++ b/posts/2023/05/rpython-used-to-speed-up-risc-v-simulation-over-15x.txt @@ -1,7 +1,7 @@ .. title: RPython-based emulator speeds up RISC-V simulation over 15x .. slug: rpython-used-to-speed-up-risc-v-simulation-over-15x .. date: 2023-05-16 11:22:35 UTC -.. tags: casestudy,performance +.. tags: casestudy,performance,pydrofoil .. category: .. link: .. description: diff --git a/posts/2025/02/pydrofoil-optimizations.md b/posts/2025/02/pydrofoil-optimizations.md new file mode 100644 index 000000000..b0c342969 --- /dev/null +++ b/posts/2025/02/pydrofoil-optimizations.md @@ -0,0 +1,823 @@ +.. title: Optimizations in Pydrofoil +.. slug: optimizations-pydrofoil +.. date: 2025-02-10 11:00:00 UTC +.. tags: emulation,performance +.. category: pydrofoil,jit +.. link: +.. description: +.. type: +.. author: CF Bolz-Tereick + + +Since summer 2022 I have been working on and off on Pydrofoil, a jitting RISC-V +(and later ARM) emulator that is automatically generated out of the +specification for these instruction sets (together with Martin Berger, John +Witulski, Matti Picus, Jubo Xu, Ryan Lin, and others). I have written [very +little](/posts/2023/05/rpython-used-to-speed-up-risc-v-simulation-over-15x.txt) +about it, so in this post I wanted to explain the architecture of Pydrofoil a +little bit better, how some of the optimizations that I have implemented for it +work, and explore which of the optimizations help how much. + + +# Background: Sail and the RISC-V model + +[Sail](https://github.com/rems-project/sail/) is a DSL for describing very +precisely how an instruction set architecture of a CPU behaves. Having a precise +description of what an instruction set is supposed to do is quite valuable, as +it provides a contract between the software and the hardware, that both sides +(ideally) can rely on in all situations. Such a description could be used to +test CPU designs against this specification, as well as testing whether a +compiler backend produces correct code. + +The [RISC-V specification](https://github.com/riscv/sail-riscv) is written using +the Sail DLS and was adopted by RISC-V International as the official spec of the +ISA. + +Sail is "a first-order imperative language, but with lightweight dependent +typing for numeric types and bitvector lengths, which are automatically checked +using the Z3 SMT solver." It has a bitvector type and arbitrary precision +integers. It also has a number of features inspired by functional languages +such as sum types and pattern matching (including over bitvectors). + +We won't go into the details of the language too much, but here's an example +specifying what happens when an `ITYPE` instruction (ie an instruction with an +immediate) in RISC-V is executed: + +``` +scattered union ast + +val execute : ast -> Retired +scattered function execute + +val encdec : ast <-> bits(32) +scattered mapping encdec + +union clause ast = ILLEGAL : word +``` + +First some type declarations: The `union ast` is the union type that represents +a decoded instruction. (Aside: I personally find using the term "AST" pretty +confusing here, because decoded instructions aren't tree-like at all, and they +aren't really "syntax" either). It's a `scattered` union, which means that the +variants can be defined sprinkled across many source code files. The function +`execute` (also scattered) takes an `ast` and returns `Retired`, which is an +enum specifying whether the instruction successfully executed or not. To map +between the encoding of instructions into bits and the more structured +representation of an `ast`, there's the (scattered) mapping `encdec`. A mapping +is a bidirectional function, meaning that you can use it to either take an `ast` +value and encode it into 32-bit bitvector, or take a bitvector and decode it +into an `ast`. + +The following are the relevant clauses of `ast`, `encdec` and `execute` for the +`ITYPE` group of instructions, which all take an immediate: + +``` +enum iop = {RISCV_ADDI, RISCV_SLTI, RISCV_SLTIU, + RISCV_XORI, RISCV_ORI, RISCV_ANDI} /* immediate ops */ + +... + +union clause ast = ITYPE : (bits(12), regidx, regidx, iop) +``` + +The `ITYPE` variant of the `ast` type contains a 12-bit bitvector (the immediate +value), two register indexes (source and destination), and an `iop` enum to +specify which `ITYPE` instruction it is. + +Now we get to specifying how `ITYPE` are encoded into bits using bidirectional +mapping functions: + +``` +mapping encdec_iop : iop <-> bits(3) = { + RISCV_ADDI <-> 0b000, + RISCV_SLTI <-> 0b010, + RISCV_SLTIU <-> 0b011, + RISCV_ANDI <-> 0b111, + RISCV_ORI <-> 0b110, + RISCV_XORI <-> 0b100 +} + +mapping clause encdec = ITYPE(imm, rs1, rd, op) + <-> imm @ rs1 @ encdec_iop(op) @ rd @ 0b0010011 +``` + +The `@` operator is used for concatenating bitvectors, so the right-hand side of +`encdec` is doing pattern matching on the `bits(32)` bitvector type to extract +the necessary information for an `ITYPE` value of the `ast` type (or to +construct the resulting bitvector when running `encdec` in the other direction). + +Finally we get to how to execute an `ITYPE` instruction: + +``` +function clause execute (ITYPE (imm, rs1, rd, op)) = { + let rs1_val = X(rs1); + let immext : xlenbits = sign_extend(imm); + let result : xlenbits = match op { + RISCV_ADDI => rs1_val + immext, + RISCV_SLTI => zero_extend(bool_to_bits(rs1_val <_s immext)), + RISCV_SLTIU => zero_extend(bool_to_bits(rs1_val <_u immext)), + RISCV_ANDI => rs1_val & immext, + RISCV_ORI => rs1_val | immext, + RISCV_XORI => rs1_val ^ immext + }; + X(rd) = result; + RETIRE_SUCCESS +} +``` + +First we load the value of the source register. Then we sign-extend the +immediate value to the register width (`xlenbits` is either 32 or 64 bits, +depending on the RISC-V variant, the specification covers both of them at once). +Otherwise we perform the actual operation with the value of the source register +and the sign-extended immediate, depending on the `op` enum value. Afterwards we +write the result into the destination register and retire the instruction. + +We will use the `execute` clause of `ITYPE` instructions as a running example in +the rest of the post. + +## Why is Sail slow + +There's a number of tools that use the specification of an ISA around the Sail +language. For example, Sail code can be compiled into Rocq in order to perform +proofs of properties of the specification. The backend that interests me +personally the most is the C backend. It can be used to turn the Sail model into +an interpreter for the ISA. The Sail model of RISC-V is fairly complete, so the +resulting interpreter can then be used to run various RISC-V binaries, including +test suites and small baremetal programs. It's also complete enough to boot +Linux and then run programs in user space. + +Unfortunately the interpreters that the C backend of Sail generates are rather +slow. Sail-RISC-V execute about 400,000 instructions per second on my laptop. +The reason for that is twofold: on the one hand Sail is quite a high-level +language that is much more focused on clearly expressing the semantics of the +ISA over being able to emulate it quickly. On the other hand there simply hasn't +been a lot of effort put into making the C code that Sail generates more +efficient, the Sail team has simply worked more on other areas. + +Let's look at some concrete C code that the backend generates to understand why +this is the case. The following is the C code that Sail generates from the +`execute` clause of `ITYPE` instructions. I've lightly edited the code to make +it simpler to read and added the Sail code as comments before the corresponding +C code lines. + +```c +... + { + uint64_t imm = ...; + ... + // let rs1_val = X(rs1); + uint64_t rs1_val; + rs1_val = zrX_bits(rs1); + // let immext : xlenbits = sign_extend(imm); + uint64_t immext; + { + sail_int sail_int_64; + CREATE(sail_int)(&sail_int_64); + CONVERT_OF(sail_int, mach_int)(&sail_int_64, INT64_C(64)); + lbits imm_lbits; + CREATE(lbits)(&imm_lbits); + CONVERT_OF(lbits, fbits)(&imm_lbits, imm, UINT64_C(12) , true); + lbits immext_lbits; + CREATE(lbits)(&immext_lbits); + zsign_extend(&immext_lbits, sail_int_64, imm_lbits); + immext = CONVERT_OF(fbits, lbits)(immext_lbits, true); + KILL(lbits)(&immext_lbits); + KILL(lbits)(&imm_lbits); + KILL(sail_int)(&sail_int_64); + } + uint64_t result; + { + __label__ case_8084, case_8085, case_8086, case_8087, case_8088, case_8089, finish_match_8083; + + /* Case with num_cases: 6 */ + { + if ((zRISCV_ADDI != op)) goto case_8084; + result = ((rs1_val + immext) & UINT64_C(0xFFFFFFFFFFFFFFFF)); + goto finish_match_8083; + } + case_8084: ; + ... // the other cases + } + { + unit zgsz38132; + zgsz38132 = zwX_bits(rd, result); + } + zcbz31056 = zRETIRE_SUCCESS; + goto finish_match_8062; + } +``` + +While the actual computation of the result in the `ADDI` case is nicely mapped +to an addition on the host machine, the sign extension of the 12-bit immediate +is done with a call to the function `zsign_extend`. The arguments of this call +are of type `lbits`, which is a heap-allocated data structure storing bitvectors +of arbitrary size. To be able to call `sign_extend`, the variable `imm` needs to +be converted to type `lbits`, which requires a call to `malloc` as part of the +`CONVERT_OF` macro. Similarly, the `sail_int` is also heap allocated and +represents integers of arbitrary division. Both `lbits` and `sail_int` use the +GMP library to represent bit bitvectors/integers. + + +More generally, here are three reasons why the emulator that Sail generates is +slow: + +**Bitvectors**: Sail tries to infer the bitwidth of the bitvector variables in +the program. If they are statically known to fit into a machine word, the C +backend will map them to C integer types. However, a lot of functions in a Sail +spec are typically written to be independent of the width of the integer types. +The bitvectors in these functions are implemented using `lbits` and thus +ultimately GMP integers. This has a number of drawbacks. It means that all +operations on these bitvectors require (de-)allocations, because GMP ints are +always heap-allocated. + +**Integers**: The integer type in Sail has arbitrary precision. Again, Sail +has an analysis to find out whether some specific integer variables can only +have values that fit into a word-sized integer. For these integer variables the +C backend will then pick a C integer type. However, for all other integer +variables in the Sail program the C backend uses GMP to store them, which +requires constant allocations on all the machine operations. + +**Interpretation Overhead**: And then there's of course the fundamental problem +that the emulator that Sail generates is an interpreter which has to re-analyze +the bits of the executed program again and again. + +We want to improve all three of these problems in Pydrofoil. + +# Architecture + +Pydrofoil reuses RPython and the RPython JIT to generate faster emulators from +Sail models. The idea is to use the Sail model for some instruction set +architecture as the input and then produce an RPython-based jitted emulator from +the same input. The hope is to get much better emulation performance out of the +result, by optimizing the Sail code better at build time, picking better data +structures for bitvectors and integer types in the Sail language and also by +using the tracing JIT compiler of RPython. + +I reuse as much of the front-end and type checker of Sail as possible by using +the JIB textual intermediate representation that another Sail-based project +([ISLA](https://github.com/rems-project/isla)) has implemented. When turning a +Sail model into JIB, all type checking has been done, all variables have +explicit types and all pattern matching is compiled away into basic blocks and +(conditional) gotos. This makes JIB easy to parse and easy to do further work +with. + +After parsing the JIB code, Pydrofoil generates its own SSA-based intermediate +representation for Sail functions. Those functions are then further optimized by +Pydrofoil's static optimization passes. Then Pydrofoil generates RPython source +code from the optimization IR. The generated code makes use of Pydrofoil's +runtime library of support functions that implement the Sail datatypes, such as +bitvectors, integers, reals. The support library also implements the emulated +RAM. This RPython code can be tested by running it on a normal Python2 +implementation. Or it can be further translated into a binary with the RPython +translation toolchain. During this process, a tracing JIT compiler can be +(optionally) inserted into the resulting binary. In the following sections we'll +go through these steps in detail. + +# Parsing JIB and generating control flow graphs + +Parsing the JIB code is straightforward, and so is generating SSA-based control +flow graphs from them. The control flow graphs consist of basic blocks and +(conditional) jumps between them. Here's a screenshot of the constructed CFG of +the `execute` clause of `ITYPE` instructions: + + + +# Static Pydrofoil IR Optimizations + +After the SSA-based IR was generated from the parsed JIB code, a number of +standard compiler optimizations are performed on it: + +- constant folding +- dead code elimination +- common subexpression elimination +- inlining +- scalar replacement of aggregates (using a simple form of partial escape + analysis) + +All of these are fairly standard, I won't talk too much about them here. + +# Static Optimizations for BitVector and Integer operations + +The most important static optimization are local rewrites to improve the cost of +bitvector and integer operations. JIB has two different kinds of static types +for each of these: + +- there are bitvector types with statically known widths, eg `%bv64` and `%bv16` +- `%bv` is a generic bitvector type where the width isn't known at runtime + (which turns into the `lbits` type we've seen in the Sail C backend code + above) + +For integers there are: + +- `%i64` for integers that were inferred to always fit into a 64 bit signed + machine integer +- ` %i` for arbitrary precision integers (which turns into `sail_int` in the C + backend code we've seen above) + +The JIB code contains a lot of casts between the two respective representations. + +As we've discussed, the generic forms `%bv` and `%i` are much less efficient at +runtime. Since their size isn't known in advanced, values of these types need to +be allocated on the heap, and operations on them are also much less efficient +since they can't be directly mapped to operations on the host CPU. + +Here's an example. The following JIB code corresponds to the beginning of +`ITYPE` `execute` fragment that we've been seen in Sail and C above. It's edited +it lightly for clarity. + +``` +fn zexecute(zmergez3var) { +... + imm : %bv12 + imm = ... + // let rs1_val = X(rs1); + rs1_val : %bv64 + rs1_val = zrX_bits(rs1) + // let immext : xlenbits = sign_extend(imm); + immext : %bv64 + sail_int_64 : %i + sail_int_64 = zz5i64zDzKz5i(64) + imm_lbits : %bv + imm_lbits = imm + immext_lbits : %bv + immext_lbits = zsign_extend(sail_int_64, imm_lbits) + immext = immext_lbits +... +``` + +In this example, to perform the `sign_extend`, the immediate value of type +`%bv12` is first cast to a generic bitvector, then sign-extended to 64 bits, +then the result is cast back to `%bv64`. Doing this sign extension alone by +default requires 3 allocations. + +To optimize operations on generic bitvectors and integers, Pydrofoil's static +optimizer has a lot of local rewrite rules that inspects the IR of a function +locally and rewrites operations on these types to more efficient forms. Ideally +it tries to remove casts between generic and specific bitvector types (as well +as machine integers and arbitrary integers) and uses specialized operations on +the types if they are available in Pydrofoil's runtime library. + +In the case of the `sign_extend` call above, it can be replaced by a version +of the function that takes a `%bv12` and a `%i64` as argument and returns a +`%bv64`, getting rid of all three allocations. + +To be able to narrow the generic integer type `%i` to the machine-word-sized +type `%i64`, Pydrofoil also performs a range analysis. If the analysis finds an +integer variable where the range fits into that of a machine word, Pydrofoil +narrows the type to `%i64`. + +## Interaction with Inlining + +Inlining helps tremendously to make bitvector and integer operation rewrites +more effective. Many small functions operate on generic bitvectors and integers, +that are passed in as arguments. After inlining these small functions into the +contexts of where they are used, the concrete bitvector widths of the argument +can often be inferred and the bitvector operations in the inlined function be +specialized to smaller bitwidths. + +We can look at another one of the `ITYPE` operations as an example for this. The +`SLTI` cases uses the `operator <_s`, to perform the signed comparison. It +is defined as follows in Sail: + +``` +val operator <_s : forall 'n, 'n > 0. (bits('n), bits('n)) -> bool +function operator <_s (x, y) = signed(x) < signed(y) +``` + +This gets compiled to the following JIB code: + +``` +val zz8operatorz0zI_sz9 : (%bv, %bv) -> %bool + +fn zz8operatorz0zI_sz9(zx, zy) { + // signed(x) < signed(y) + zz40 : %i + zz40 = zsigned(zx) + zz41 : %i + zz41 = zsigned(zy) + return = zlt_int(zz40, zz41) + end; +} +``` + +The code implements a signed comparison of bitvectors and operates on generic +bitvectors. In the concrete context where the function is called, the bitvector +sizes are mostly known. E.g. in the context of the `SLTI` instruction: + +``` + jump @neq(zRISCV_SLTI, zz415090) goto 280 + // RISCV_SLTI => zero_extend(bool_to_bits(rs1_val <_s immext)), + zz415112 : %bv1 + zz415116 : %bool + zz415117 : %bv + zz415117 = rs1_val + zz415118 : %bv + zz415118 = immext + zz415116 = zz8operatorz0zI_sz9(zz415117, zz415118) + zz415112 = zbool_to_bits(zz415116) + ... +``` + +The arguments to the operator call are cast from `%bv64` to `%bv`. After +inlining the operator, the `signed` calls can therefore be optimized to a +variant that takes a `%bv64` and returns an `%i64`, which then allows the the +`lt_int` function to be replaced by a version that operates on `%i64`. This +removes all allocations in this code sequence completely. + +After inlining and bitvector/integer operation optimization the control flow +graph of the `execute` clause for `ITYPE` instructions looks like this: + + + + +# Function Specialization + +In cases where a called function is too large to be inlined Pydrofoil tries to +specialize it to the specific bitvector widths and machine int types of its +arguments at the function's callsites. This would have happened for the +operator call above, if that function were too big. + +The specializer will go over all the non-inlinable function calls in the program +and check whether any of the arguments are either constant, or the result of +casts from more specific types. For such calls, the target function will be +cloned into a more specific version, taking this information into account. The +cloned version can then be locally optimized with the newly available bitvector +sizes, constant values, etc. + +Sometimes, as the result of specialization, the return type of a function can +also become more specific. This allows the caller of such a specialized function +to be optimized further. + +# RPython code generation + +After the Sail functions have been optimized, we generate RPython source code +from them. This is again quite straightforward, the only complexity is that the +IR flow graphs use basic blocks with (conditional) jumps between them. Pydrofoil +compiles that to the standard construction of a program counter variable and an +infinite loop with one condition for every basic block. Here's the the produced +RPython code of our running example: + +```python +def zexecute_zITYPE(zmergez3var, machine, ): + pc = 0 + while 1: + if pc == 0: + i_0_0 = Union_zast_zITYPE.convert(zmergez3var) + i_0_1 = i_0_0.ztuplez3z5bv12_z5bv5_z5bv5_z5enumz0zziop0 + i_0_2 = i_0_0.ztuplez3z5bv12_z5bv5_z5bv5_z5enumz0zziop1 + i_0_3 = i_0_0.ztuplez3z5bv12_z5bv5_z5bv5_z5enumz0zziop2 + i_0_4 = i_0_0.ztuplez3z5bv12_z5bv5_z5bv5_z5enumz0zziop3 + # inlined zrX_bits + return_0_7 = func_zrX(machine, supportcode.unsigned_bv(machine, i_0_2, 5)) + # inlined zsign_extend + return_0_9 = supportcode.sign_extend_bv_i_i(machine, i_0_1, 12, 64) + if Enum_ziop.zRISCV_ADDI == i_0_4: + i_2_0 = supportcode.add_bits_bv_bv(machine, return_0_7, return_0_9, 64) + pc = 2 + continue + # pc = 3, inlined + if Enum_ziop.zRISCV_SLTI == i_0_4: + # inlined zz8operatorz0zI_sz9 + # inlined zbool_to_bits + # inlined zbool_bits_forwards + if (supportcode.signed_bv(machine, return_0_7, 64) < supportcode.signed_bv(machine, return_0_9, 64)): + i_2_0 = r_uint(0x000000000000001L) + pc = 2 + continue + i_2_0 = r_uint(0x000000000000000L) + pc = 2 + continue + ... + if pc == 2: + # inlined zwX_bits + func_zwX(machine, supportcode.unsigned_bv(machine, i_0_3, 5), i_2_0) + return Enum_zRetired.zRETIRE_SUCCESS +``` + +# Runtime Support Library + +The static optimizations can remove the need for the generic heap-allocated +bitvector and integer types in a lot of cases, but not all of them. Therefore it +is important to pick efficient runtime representations for the generic types, +especially for generic integers (`%i` in JIB). In theory the generic integer +type can store arbitrarily large values. In practice, however, most of the +integer values in the RISC-V emulator fit into one or at most two machine words. +Our implementation of the generic integer type makes use of this fact. The type +has two different implementations, one for the case where the value of an +integer fits into a machine word, and then then generic case that can really +implement arbitrarily large integers. The decision which implementation is +chosen is deferred to integer value creation at runtime. + +To get an idea of how this looks we will sketch the implementation of integer +subtraction in the RPython code that implements the Sail integer values. A Sail +integer value is represented by an instance of the RPython class `Integer`. +`Integer` has two subclasses, `SmallInteger` represents integer values that fit +into a signed machine word, and `BigInteger` which represents arbitrary integer +values using a list of word-sized digits. + +Here's a rough sketch of the classes: + +```python +class Integer: + ... + +class SmallInteger(Integer): + def __init__(self, val): + self.val = val # a machine integer + + ... + + def sub(self, other): + if isinstance(other, SmallInteger): + try: + return SmallInteger(ovfcheck(self.val - other.val)) + except OverflowError: + pass + return self.tobigint().add(other) + + +class BigInteger(Integer): + def __init__(self, data, sign): + self.data = data # list of unsigned machine int forming the digits + self.sign = sign # 0, 1 or -1 + + ... + + def sub(self): + ... # actual subtraction of arbitrarily-sized integers +``` + +Integer subtraction on two `SmallInteger` instances performs the subtraction of +the two contained machine integers and checks whether the result fits into a +machine integer still. If yes, a new instance of `SmallInteger` is returned, +otherwise we convert the two ints to a `BigInteger` and perform the subtraction +there. + +# Adding a JIT compiler with RPython + +To get from a purely interpretation based emulator to a more efficient system we +can use RPython's meta-tracing JIT compiler. It will trace the execution of +the Pydrofoil-RISC-V through one loop of the emulated guest program and turn the +resulting traces into host machine code. In this way, RPython's tracing JIT acts +as a trace-based dynamic binary translator for the emulated instruction set +architecture. + +RPython's meta-tracing JIT needs a few annotations in the core execution loop of +the Sail model in question. In particular, the tracing JIT needs to know what +the core execution loop is, and which of the registers of the emulated machine +stores the program counter. + +After doing that, we can look at the JIT trace that is generated for a single +RISC-V addi instruction: + +``` +... +i106 = getfield_gc_i(p1, field=x20) +... +# c.addi s4. 0x8 +i144 = getarrayitem_gc_i(ConstPtr(ptr142), 26) +i146 = int_and(i144, 65535) +i148 = int_and(i144, 3) +i150 = int_eq(i148, 3) +guard_false(i150) +i152 = int_eq(i146, 1) +guard_false(i152) +i154 = uint_rshift(i146, 5) +i156 = int_and(i154, 1) +i158 = uint_rshift(i146, 6) +i160 = int_and(i158, 1) +i162 = int_lshift(i156, 1) +i163 = int_or(i162, i160) +i165 = uint_rshift(i146, 7) +i167 = int_and(i165, 15) +i169 = uint_rshift(i146, 11) +i171 = int_and(i169, 3) +i173 = int_lshift(i171, 2) +i174 = int_or(i173, i163) +i176 = int_lshift(i167, 4) +i177 = int_or(i176, i174) +i178 = int_is_zero(i177) +guard_false(i178) +i180 = uint_rshift(i146, 13) +i181 = int_is_zero(i180) +guard_true(i181) +i182 = int_is_zero(i148) +guard_false(i182) +i184 = int_and(i165, 31) +i186 = uint_rshift(i146, 12) +i188 = uint_rshift(i146, 2) +i190 = int_and(i188, 31) +i192 = int_lshift(i186, 5) +i193 = int_or(i192, i190) +i194 = int_is_zero(i193) +guard_false(i194) +i195 = int_is_zero(i184) +guard_false(i195) +i197 = int_eq(i148, 1) +guard_true(i197) +i199 = int_xor(i193, 32) +i201 = int_sub(i199, 32) +i203 = int_and(i201, 4095) +guard_value(i184, 20) +i206 = int_xor(i203, 2048) +i208 = int_sub(i206, 2048) +i209 = int_add(i106, i208) +i211 = int_add(i2, 2) +i213 = int_add(i0, 2) +setfield_gc(p1, i209, field=x20) +i215 = int_eq(i213, 10000) +guard_false(i215) +... # next guest instruction +``` + +The details of this trace are not important, just that it's really long, given +that it performs only a single guest addition. The problem is the +`getarrayitem_gc_i` instruction at the very start, which is the instruction +fetch from the emulated RAM. A large part of the trace is manipulating the +result of that memory read to do the instruction decoding. In the next section +we will look at an optimization how to get rid of those instruction decoding +trace instructions. + +## Making the RAM emulation JIT-friendly + +One big problem for the JIT compiler is that while it knows the concrete value +of the guest program counter, that is not actually enough in order to optimize +away the decoding of the instruction at that program counter. The reason for +that is that the content of the emulated RAM is obviously mutable, in general. + +In practice, however, it's very rare for code to be self-mutating. After a +program has been loaded into RAM, those parts of memory mostly do not change any +more. We want the JIT to make use of that fact. To be able to do that, we track +the status of every word of the emulated RAM. Every word in emulated RAM can be +in one of three states: `status_default`, `status_immutable`, `status_mutable`. +All the words start out in `status_default` state. If a `status_default` word is +read or written, nothing special happens. However, if a `status_default` is read +from during instruction fetch, it transitions to `status_immutable`. The JIT +will constant-fold reads from `status_immutable` words and return the concrete +value of the stored bits in the word. + +To still behave correctly in the face of self-modifying machine code, the +emulated RAM then adds a write barrier to notice modifications of +`status_immutable` words. When a `status_immutable` word is changed, the +generated host machine code is potentially no longer valid, because it was +generated under the assumption that `status_immutable` words are immutable. +Therefore all relevant host machine code is invalidated in such a situation, and +the modified word is marked as `status_mutable`. `status_mutable` are assumed to +potentially contain mutable code, so the JIT will never constant-fold reads on +them during host machine code generation. + +Here's a state diagram of the various states and transitions a machine word can +be in: + + + +The result of this approach is that instruction fetch can mostly be +constant-folded to no machine code instructions at all: the program counter is +known to the tracing JIT at every point, reading from that point in memory is +a read from a `status_immutable` word and therefore constant folded to a +constant bit pattern. Afterwards, decoding of that bit-pattern can be constant +folded too. + +For our example trace, this has the following effect: + +``` +i35 = getfield_gc_i(p1, field=x20) +... +# c.addi s4. 0x8 +i44 = int_add(i35, 8) +i64 = int_add(i0, 2) +setfield_gc(p1, i44, field=x20) +i66 = int_eq(i64, 10000) +guard_false(i66) + +``` + +Now the trace looks actually good! The `addi s4, 0x8` instruction is compiled to +a `int_add(..., 8)` instruction, which is its closest equivalent in the PyPy +trace IR. There are a few extra instructions around to read and write the value +of the register field in the `p1` struct, which contains the emulated machine's +state. In addition, there are three instructions that check whether 10000 +instructions have been executed, which would make it time to tick the emulated +clock. + + +# Various other problems and future ideas + +There are a number of known inefficiencies in Pydrofoil. I want to discuss a few +of them in this sections, together with ideas what to maybe do about +them. + +## Clocks + +The first inefficiency is that of clocks. The Sail model ticks the emulated +clock exactly every 100 instructions. This number was chosen at some point, +maybe somewhat arbitrarily. In Pydrofoil we made this number configurable but +mostly run benchmarks with a value of 10,000. + +Having to check whether the next clock tick is reached in the generated host +machine code of every single guest instruction is quite inefficient. In addition +to the cost of the checks itself, there's also the problem of the JIT compiler +making code for all the control flow edges that go from every single instruction +to the clock tick logic. + +There is existing [literature](https://dl.acm.org/doi/pdf/10.1145/2907950.2907953) +for how to improve this situation and I want to be able to find out whether I +can use some of the approaches described in Pydrofoil. + +## Address translation + +Another big source of inefficiency is address translation. If the emulated +program turns address translation on (like every operating system will +eventually do), every memory access goes through a page table walk in order to +map virtual addresses to physical addresses. This is very inefficient, since it +turns a single emulated RAM read into many emulated RAM reads. + +The RISC-V Sail model has a [translation lookaside +buffer](https://en.wikipedia.org/wiki/Translation_lookaside_buffer) (TLB), which +is a cache that caches address translation. The presence of this cache helps +Pydrofoil a lot, but it even a successful cache lookup requires dozens of host +instructions in the generated traces. + +There is also [emulation](https://www.diva-portal.org/smash/get/diva2:1041423/FULLTEXT01.pdf) +[literature](https://dl.acm.org/doi/10.1145/2837027) that describes techniques +for implementing virtual memory more efficiently in emulators, so I want to see +whether some of these could be used in Pydrofoil. + + +# Benchmarking various Pydrofoil variants + +To understand how much the various described optimizations help performance we +will run a number of Pydrofoil variants. The first variant is simply Pydrofoil +with all optimizations turned on. Every further variant disables one more of the +optimizations I described in this post. + +The variants are: + +- pydrofoil-riscv-full: The Pydrofoil RISC-V emulator with all optimization + turned on. +- pydrofoil-no-mem-immutability: Turns memory immutability tracking off. +- pydrofoil-no-jit: Additionally turns the JIT off and works only as an interpreter. +- pydrofoil-no-bv-int-opts: Additionally turns off the static optimizations that + replace generic bitvector and generic integer operations with more specialize + variants operating on machine word sizes. +- pydrofoil-no-spec: Additionally turns off inlining and function + specialization. +- pydrofoil-no-static-opt: Additionally turns of all the remaining static + optimizations. +- pydrofoil-no-runtime-smallint: Always uses `BigInteger` for Sail integers and + doesn't dynamically check whether an integer would fit into a machine word. + +In this post, I'm running only part of a single benchmark. Specifically, the +first 15 billion instructions of running deepsjeng from SPEC (which is a chess +engine going through the search tree of several chess positions), including +booting Linux to the point where it can start the benchmark. Obviously it's not +great to just stop the benchmark at a somewhat arbitrary point. However, +Pydrofoil runs the full benchmark in about five hours on my laptop and the +above Pydrofoil versions obviously become successively much slower, so it's +completely impractical to run any interesting benchmark to completion with them. + +The results look like this: + + + +We can see that the JIT is the most important component for getting Pydrofoil's +performance, it provides (together with memory immutability tracking) a 15x +performance boost over not having it. The static bitvector and integer +optimizations are the most useful static optimizations that Pydrofoil does, +disabling them slows Pydrofoil down more than 4x; inlining, function +specialization and all other static optimizations are less important. Turning +the runtime-switchable integer representation off leads to a further 2x slow +down. + +# Benchmarking QEMU, Spike, Pydrofoil and Sail + +To also get an idea of how Pydrofoil fares against actually efficient emulators, +I'm running the full deepsjeng on top of QEMU, Pydrofoil, Spike, and Sail. The +latter two were fairly slow again, so I didn't run them to completion and +instead extrapolated their instructions/second numbers, the results should +therefore be taken with a grain of salt. In any case, here are the results: + + + +Qemu is 14x faster than Pydrofoil, Sail is more than 200x slower than Pydrofoil, +Spike is more than 3x slower than Pydrofoil. + + +## Conclusion + +Pydrofoil takes the Sail RISC-V model, which is written in a fairly high-level +specification language that is generic on bitvector widths. That Sail model is +then compiled to a much more efficient interpreter, using mostly well-known +static compilation techniques (including function specialization). Afterwards, +adding some runtime data structures that make the remaining cases of generic +integer types less inefficient helps lessen the impact of functions where static +optimizations aren't possible. + +Using the RPython tracing JIT to make the emulator perform dynamic binary +translation improves the performance even more, particularly after making it +possible for the JIT to assume that the parts of RAM that store instructions are +mostly constant. + +Perhaps not surprisingly, QEMU (a hand-written emulators that does DBT) still +has much better performance. Spike, which is also hand-written but is an +interpreter, gives less performance.