aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Joe Banks <[email protected]>2024-08-09 15:33:12 +0100
committerGravatar Joe Banks <[email protected]>2024-08-09 15:42:03 +0100
commitd5237039cb38bba13fc89db041f5574c92394599 (patch)
treed993d4e35f8682a8f208bec4be4abae81a49e6e4
parentAdd mkdocs packages (diff)
Add mkdocs-material documentation
-rw-r--r--docs/README.md13
-rw-r--r--docs/docs/assets/logo.svg162
-rw-r--r--docs/docs/common-queries/index.md34
-rw-r--r--docs/docs/common-queries/kubernetes.md27
-rw-r--r--docs/docs/common-queries/loki.md25
-rw-r--r--docs/docs/common-queries/postgresql.md318
-rw-r--r--docs/docs/index.md58
-rw-r--r--docs/docs/meeting-notes/.authors.yml5
-rw-r--r--docs/docs/meeting-notes/index.md5
-rw-r--r--docs/docs/meeting-notes/posts/2022-04-07.md26
-rw-r--r--docs/docs/meeting-notes/posts/2022-09-18.md65
-rw-r--r--docs/docs/meeting-notes/posts/2022-10-05.md16
-rw-r--r--docs/docs/meeting-notes/posts/2022-10-19.md31
-rw-r--r--docs/docs/meeting-notes/posts/2022-10-26.md21
-rw-r--r--docs/docs/meeting-notes/posts/2022-11-02.md25
-rw-r--r--docs/docs/meeting-notes/posts/2022-11-23.md33
-rw-r--r--docs/docs/meeting-notes/posts/2023-02-08.md20
-rw-r--r--docs/docs/meeting-notes/posts/2023-02-21.md30
-rw-r--r--docs/docs/meeting-notes/posts/2023-02-28.md18
-rw-r--r--docs/docs/meeting-notes/posts/2023-05-16.md18
-rw-r--r--docs/docs/meeting-notes/posts/2023-07-11.md41
-rw-r--r--docs/docs/meeting-notes/posts/2023-07-18.md44
-rw-r--r--docs/docs/meeting-notes/posts/2023-07-25.md12
-rw-r--r--docs/docs/meeting-notes/posts/2023-08-01.md63
-rw-r--r--docs/docs/meeting-notes/posts/2023-08-08.md45
-rw-r--r--docs/docs/meeting-notes/posts/2023-08-22.md23
-rw-r--r--docs/docs/meeting-notes/posts/2023-08-29.md39
-rw-r--r--docs/docs/meeting-notes/posts/2023-09-05.md31
-rw-r--r--docs/docs/meeting-notes/posts/2023-09-12.md48
-rw-r--r--docs/docs/meeting-notes/posts/2024-07-02.md155
-rw-r--r--docs/docs/meeting-notes/posts/2024-07-25.md38
-rw-r--r--docs/docs/onboarding/access-table.md30
-rw-r--r--docs/docs/onboarding/index.md43
-rw-r--r--docs/docs/onboarding/resources.md36
-rw-r--r--docs/docs/onboarding/rules.md15
-rw-r--r--docs/docs/onboarding/tools.md43
-rw-r--r--docs/docs/post-mortems/.authors.yml5
-rw-r--r--docs/docs/post-mortems/index.md10
-rw-r--r--docs/docs/post-mortems/posts/all-services-outage.md123
-rw-r--r--docs/docs/post-mortems/posts/cascading-node-failures.md265
-rw-r--r--docs/docs/post-mortems/posts/images/2021-01-12/site_cpu_throttle.pngbin0 -> 227245 bytes
-rw-r--r--docs/docs/post-mortems/posts/images/2021-01-12/site_resource_abnormal.pngbin0 -> 232260 bytes
-rw-r--r--docs/docs/post-mortems/posts/images/2021-01-30/linode_loadbalancers.pngbin0 -> 50882 bytes
-rw-r--r--docs/docs/post-mortems/posts/images/2021-01-30/memory_charts.pngbin0 -> 211053 bytes
-rw-r--r--docs/docs/post-mortems/posts/images/2021-01-30/prometheus_status.pngbin0 -> 291122 bytes
-rw-r--r--docs/docs/post-mortems/posts/images/2021-01-30/scaleios.pngbin0 -> 18294 bytes
-rw-r--r--docs/docs/post-mortems/posts/nodebalancer-fails-memory.md149
-rw-r--r--docs/docs/post-mortems/posts/postgres-connection-surge.md130
-rw-r--r--docs/docs/post-mortems/posts/primary-kubernetes-node-outage.md118
-rw-r--r--docs/docs/post-mortems/posts/site-cpu-ram-exhaustion.md157
-rw-r--r--docs/docs/runbooks/index.md20
-rw-r--r--docs/docs/runbooks/upgrading-postgresql.md130
-rw-r--r--docs/docs/services/LDAP/assets/keycloak_user.pngbin0 -> 87528 bytes
-rw-r--r--docs/docs/services/LDAP/components/freeipa.md137
-rw-r--r--docs/docs/services/LDAP/components/keycloak.md63
-rw-r--r--docs/docs/services/LDAP/components/ldap.md31
-rw-r--r--docs/docs/services/LDAP/discord-ldap.md61
-rw-r--r--docs/docs/services/LDAP/index.md45
-rw-r--r--docs/docs/services/email/components/assets/dmarc-report.pngbin0 -> 63655 bytes
-rw-r--r--docs/docs/services/email/components/postfix.md175
-rw-r--r--docs/docs/services/email/components/signing.md20
-rw-r--r--docs/docs/services/email/components/validation.md93
-rw-r--r--docs/docs/services/email/index.md46
-rw-r--r--docs/docs/services/index.md9
-rw-r--r--docs/docs/tooling/github-bots.md53
-rw-r--r--docs/mkdocs.yml100
66 files changed, 3596 insertions, 0 deletions
diff --git a/docs/README.md b/docs/README.md
new file mode 100644
index 0000000..cbef50e
--- /dev/null
+++ b/docs/README.md
@@ -0,0 +1,13 @@
+# Project Documentation
+
+This directory contains the mkdocs configuration and markdown files for the
+PyDis DevOps documentation.
+
+To work on these files, install the docs dependencies with `poetry install
+--with docs` in the root folder.
+
+You can work locally on the site by navigating to the root directory and running
+`poetry run task serve-docs` which will start a local server with live
+reloading. You can also run `poetry run task build-docs` in the root to build a
+local copy of the documentation, which will be placed in the `docs/site` folder
+(`site` folder of this directory).
diff --git a/docs/docs/assets/logo.svg b/docs/docs/assets/logo.svg
new file mode 100644
index 0000000..4cb9a61
--- /dev/null
+++ b/docs/docs/assets/logo.svg
@@ -0,0 +1,162 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ width="895.26196"
+ height="412.72812"
+ viewBox="0 0 895.26195 412.72812"
+ version="1.1"
+ id="svg1"
+ xml:space="preserve"
+ inkscape:version="1.3.2 (091e20ef0f, 2023-11-25, custom)"
+ sodipodi:docname="logo.svg"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ 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="true"
+ inkscape:deskcolor="#d1d1d1"
+ inkscape:document-units="px"
+ inkscape:zoom="0.99372343"
+ inkscape:cx="425.67176"
+ inkscape:cy="209.31377"
+ inkscape:window-width="1920"
+ inkscape:window-height="1130"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="g12"
+ showgrid="false" /><defs
+ id="defs1"><rect
+ x="240.75101"
+ y="396.15631"
+ width="172.57869"
+ height="83.569641"
+ id="rect11" /><linearGradient
+ id="swatch4"
+ inkscape:swatch="solid"><stop
+ style="stop-color:#77b0ff;stop-opacity:1;"
+ offset="0"
+ id="stop4" /></linearGradient><rect
+ x="721.35138"
+ y="419.62057"
+ width="639.47675"
+ height="308.6058"
+ id="rect1" /><rect
+ x="721.35138"
+ y="419.62057"
+ width="639.47675"
+ height="308.6058"
+ id="rect16" /><linearGradient
+ inkscape:collect="always"
+ xlink:href="#swatch4"
+ id="linearGradient25"
+ gradientUnits="userSpaceOnUse"
+ x1="822.90656"
+ y1="528.8208"
+ x2="1260.5054"
+ y2="528.8208" /></defs><g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-203.7245,-112.79916)">
+<g
+ id="g16"
+ style="fill:#ffffff;fill-opacity:1"><rect
+ style="fill:#ffffff;fill-opacity:1"
+ id="rect17"
+ width="397.08691"
+ height="65.795242"
+ x="451.11646"
+ y="288.60159" /><path
+ id="path12"
+ style="fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ sodipodi:type="inkscape:offset"
+ inkscape:radius="144.31657"
+ inkscape:original="M 1731.7891 -692.74023 C 1667.0062 -692.1516 1615.3411 -639.52709 1615.9297 -574.74414 C 1616.5112 -510.75128 1669.1234 -459.0891 1733.9062 -459.67773 C 1797.8993 -460.25919 1849.5717 -512.86846 1848.9902 -576.86133 C 1848.4752 -633.54641 1808.1214 -680.19813 1755.1719 -690.58398 C 1747.6077 -692.06768 1739.7882 -692.81291 1731.7891 -692.74023 z M 1204.8203 -689.53125 C 1158.2079 -689.10772 1111.6571 -681.57536 1070.6973 -667.77148 L 944.35742 -659.50391 C 934.08713 -659.41061 926.27387 -649.85836 926.36719 -639.58789 L 962.4375 -60.769531 C 964.29055 -30.762501 979.42402 -18.2572 1005.5527 -12.173828 C 1011.0899 -11.434058 1017.4092 -10.708153 1023.7441 -9.1855469 C 1060.9329 -3.2026108 1098.0921 -0.37291726 1134.4336 -0.703125 C 1358.8033 -2.741801 1553.6272 -126.98247 1551.5957 -350.5625 C 1551.1938 -394.8045 1542.8518 -443.71774 1524.9902 -496.49219 C 1484.4879 -617.10834 1371.9617 -675.37067 1255.0176 -687.23828 C 1238.3113 -688.93365 1221.5098 -689.6829 1204.8203 -689.53125 z M -22.097656 -677.5918 C -52.909004 -677.31185 -84.466508 -671.48919 -115.97461 -660.93164 L -260.60742 -666.72656 L -262.18945 -666.71094 C -270.87983 -666.63194 -277.92726 -659.46676 -277.85547 -651.56641 L -304.57227 -26.345703 C -304.48617 -16.865252 -298.09505 -9.8094043 -288.60742 -9.1054688 L -122.625 -1.9238281 L -121.04297 -1.9394531 C -113.14261 -2.0112381 -106.09386 -9.1911191 -105.38281 -17.888672 L -98.96875 -181.49023 C -68.868398 -173.07264 -36.43738 -168.6321 -3.2558594 -168.93359 C 161.07152 -170.42666 259.68738 -273.24377 258.35938 -419.40039 C 257.06052 -562.34746 140.15847 -665.35466 5.1210938 -676.57812 C -3.881398 -677.32636 -12.962868 -677.67481 -22.097656 -677.5918 z M 2797.3945 -671.23633 L 2639.8105 -671.23438 C 2622.1357 -671.23537 2606.0566 -655.15912 2606.0566 -637.48438 L 2606.0566 -561.84375 C 2606.0566 -544.169 2622.1319 -528.08779 2639.8066 -528.08789 L 2717.4355 -528.08594 C 2724.9477 -506.73722 2732.4589 -485.39002 2739.9746 -464.03516 C 2655.6363 -327.84788 2571.2879 -191.65452 2486.9473 -55.466797 C 2480.655 -45.302153 2480.3315 -31.719368 2486.1484 -21.275391 C 2491.9654 -10.831448 2503.6899 -3.9450225 2515.6445 -3.9433594 L 2605.1309 -3.9472656 C 2616.4399 -3.9490156 2627.5687 -10.063137 2633.6289 -19.611328 C 2689.9412 -108.32244 2746.2518 -197.03965 2802.5645 -285.74805 C 2840.3397 -190.00692 2878.1135 -94.267245 2915.8887 1.4765625 C 2921.9837 16.923673 2940.6971 26.130284 2956.6523 21.527344 C 3013.8102 5.0275554 3070.965 -11.480646 3128.123 -27.980469 C 3145.1897 -32.90743 3156.1795 -53.000526 3151.1172 -70.027344 C 3143.6361 -95.180212 3136.153 -120.32958 3128.6719 -145.48242 A 14.900887 14.900887 0 0 0 3128.6719 -145.48438 A 14.900887 14.900887 0 0 0 3128.6719 -145.48633 A 14.900887 14.900887 0 0 0 3128.6719 -145.48828 A 14.900887 14.900887 0 0 0 3128.6719 -145.49023 A 14.900887 14.900887 0 0 0 3128.6719 -145.49219 A 14.900887 14.900887 0 0 0 3128.6719 -145.49414 C 3123.5476 -162.70918 3102.9436 -173.51763 3085.8652 -167.95508 C 3065.8936 -161.45316 3045.9295 -154.9608 3025.9668 -148.46094 C 2960.2463 -315.58419 2894.5242 -482.69744 2828.8047 -649.82227 C 2824.4981 -660.78209 2813.9919 -668.9566 2802.416 -670.83008 L 2802.4141 -670.83008 C 2800.7604 -671.09772 2799.0884 -671.2358 2797.4062 -671.23633 A 14.900887 14.900887 0 0 0 2797.3945 -671.23633 z M 1189.7559 -521.88477 C 1198.8906 -521.96777 1207.4552 -521.4334 1215.5 -520.35742 C 1336.1727 -504.21769 1338.1239 -365.95251 1338.2383 -353.36133 C 1339.15 -253.02681 1263.9043 -186.77412 1172.2598 -185.94141 C 1165.9399 -185.88401 1159.6168 -185.81813 1153.2891 -186.55078 L 1132.9414 -513.4707 C 1151.0694 -518.37603 1170.795 -521.71248 1189.7559 -521.88477 z M -49.015625 -509.8457 C -41.707797 -509.9121 -34.614224 -509.36643 -27.798828 -508.26172 C 19.908943 -500.52877 54.099384 -465.14744 54.539062 -416.75781 C 54.589312 -411.22751 55.357043 -326.69783 -31.546875 -325.9082 C -52.877831 -325.71438 -75.047409 -331.04663 -92.5 -338.78906 L -85.318359 -504.77148 C -72.706492 -508.04652 -60.076171 -509.7452 -49.015625 -509.8457 z M 2163.4844 -485.69922 C 2059.9898 -484.75884 1931.6439 -436.19194 1932.4551 -346.91797 C 1932.7278 -316.89658 1947.2568 -283.05312 1982.377 -243.86719 L 2003.9199 -220.35547 C 2015.1098 -206.23535 2025.4965 -193.69039 2025.5898 -183.41992 C 2025.7621 -164.45908 2003.8415 -142.13157 1957.2363 -140.91797 C 1947.7558 -140.83177 1931.9782 -139.11814 1932.0859 -127.26758 C 1932.0999 -125.68754 1932.9093 -123.31802 1933.7207 -120.95508 L 1969.3164 -29.623047 C 1974.1787 -16.235518 1982.107 -13.150664 1999.4883 -13.308594 L 2008.1777 -13.386719 C 2114.0423 -14.34863 2254.9974 -66.195745 2254.1504 -159.41992 C 2253.8776 -189.44131 2237.7493 -224.84796 2201.0488 -264.01953 C 2170.7257 -296.92827 2158.7412 -311.83503 2158.6191 -325.26562 C 2158.4756 -341.06635 2176.5118 -357.03413 2223.9141 -357.46484 L 2227.0645 -357.48633 C 2237.3348 -357.57963 2245.9949 -360.82135 2245.916 -369.51172 C 2245.894 -371.88184 2245.8746 -374.26048 2244.2656 -377.40625 L 2207.8887 -468.7168 C 2203.6442 -479.34458 2198.1168 -483.74348 2182.623 -485.1582 C 2177.4583 -485.62978 2171.1872 -485.76921 2163.4844 -485.69922 z M 448.29492 -472.48438 C 445.13479 -472.45567 441.98303 -471.63514 438.83008 -470.81641 L 313.55469 -432.54297 C 301.7329 -429.2751 292.31748 -422.08587 292.41797 -411.02539 C 292.45387 -407.07518 294.07573 -402.3466 296.49609 -396.83789 L 447.25977 -64 C 449.67295 -59.281309 451.2978 -55.336858 453.68945 -52.988281 L 331.32227 132.21094 C 327.42237 137.77708 325.10209 143.33498 325.15234 148.86523 C 325.22414 156.76558 330.80956 163.03737 342.70312 167.66992 L 457.66016 210.87109 C 463.21194 213.1909 467.96977 213.93628 471.91992 213.90039 C 481.40037 213.81429 488.45791 209.01021 496.2793 200.24805 C 815.83602 -195.33563 874.40846 -357.8428 874.30078 -369.69336 C 874.23618 -376.8037 869.45321 -382.2952 859.92969 -386.94922 L 741.66211 -446.70703 C 733.71886 -451.37547 726.58398 -452.88682 721.84375 -452.84375 C 713.15338 -452.76475 707.67039 -447.98248 703.00195 -440.03906 C 664.84293 -378.85457 620.4459 -308.13119 574.47266 -237.39453 L 478.52734 -449.0625 C 472.87507 -462.44285 462.5156 -472.61359 448.29492 -472.48438 z M 1822.5098 -447.04883 L 1820.9277 -447.03125 L 1663.002 -437.69336 C 1653.5287 -436.8172 1647.2634 -429.65623 1647.3496 -420.17578 L 1670.6035 -35.603516 C 1671.4723 -26.920259 1677.8485 -19.866347 1686.5391 -19.945312 L 1688.1211 -19.960938 L 1846.0586 -29.298828 C 1853.9522 -30.160634 1860.9976 -37.337925 1860.9258 -45.238281 L 1860.9102 -46.808594 L 1837.6582 -432.17188 C 1837.5862 -440.07223 1830.41 -447.12061 1822.5098 -447.04883 z M 3350.1523 -150.47656 C 3342.3494 -150.57266 3339.7882 -146.85353 3339.1855 -141.61328 L 3320.5352 52.539062 C 3320.3563 55.05301 3321.3962 56.734531 3324.1387 56.929688 L 3324.8203 56.96875 L 3359.5078 56.919922 C 3362.7237 56.918822 3364.467 54.967118 3364.6621 52.224609 L 3374.4258 -52.732422 L 3414.8008 -51.929688 C 3420.3021 -51.768113 3423.2029 -53.860638 3423.6094 -59.574219 L 3429.0625 -123.27344 L 3429.1133 -123.95508 C 3430.2029 -139.26745 3423.7694 -148.92015 3408.457 -150.00977 L 3405.7188 -150.19531 L 3350.1523 -150.47656 z M 3452.1074 -143.68555 C 3445.2186 -143.71655 3442.2171 -140.2546 3441.8105 -134.54102 L 3435.5508 -52.980469 C 3435.128 -47.038385 3438.6186 -44.49841 3443.6465 -44.140625 L 3444.3398 -44.087891 L 3492.0605 -43.441406 L 3488.0508 32.292969 L 3488.0098 32.986328 C 3487.5382 39.61404 3484.3482 45.587122 3477.3652 59.791016 C 3477.0877 60.460367 3477.0604 60.919842 3477.0117 61.605469 C 3476.8816 63.433789 3477.9111 65.117949 3480.3926 65.753906 L 3510.916 72.511719 C 3511.8302 72.576769 3512.4979 72.852915 3513.4121 72.917969 C 3517.7544 73.226968 3522.0053 71.693327 3523.9141 67.464844 C 3527.5031 58.991608 3530.6872 49.799599 3531.1426 43.400391 L 3531.2031 42.488281 L 3538.7363 -115.01367 C 3539.4015 -130.81561 3533.75 -141.7737 3517.752 -142.91211 L 3515.2363 -143.09961 L 3452.1074 -143.68555 z M 3577.2988 -137.29883 C 3574.5563 -137.49399 3572.8613 -136.23406 3572.4375 -133.50781 L 3568.4746 -106.92188 L 3568.4434 -106.45898 C 3568.1994 -103.03079 3570.4007 -101.72514 3573.3555 -101.28516 L 3617.7227 -95.150391 C 3611.9946 -88.89667 3603.8618 -81.203999 3594.7715 -72.892578 L 3592.7734 -86.816406 C 3592.2667 -89.379201 3590.9494 -90.162866 3589.1211 -90.292969 L 3588.4277 -90.345703 L 3569.123 -90.101562 C 3566.1356 -90.084243 3565.1157 -88.785385 3564.9531 -86.5 L 3564.8613 -85.126953 L 3565.8984 -67.363281 C 3565.9804 -65.290122 3567.9411 -63.772642 3570.4551 -63.59375 L 3570.9043 -63.5625 L 3585.4375 -64.367188 C 3574.9109 -55.239156 3563.4512 -45.94307 3552.5 -37.304688 C 3551.5208 -36.455548 3550.7363 -35.140786 3550.6387 -33.769531 C 3550.5407 -32.398276 3551.1293 -30.976612 3552.4355 -29.964844 L 3573.0312 -12.644531 C 3575.2029 -10.882082 3577.8961 -10.002437 3580.8672 -9.7910156 C 3585.6666 -9.4494913 3590.606 -11.172698 3593.2988 -13.507812 C 3596.7424 -16.708268 3601.1541 -20.523276 3605.8379 -25.013672 L 3610.4121 -24.695312 L 3605.4688 -0.46679688 L 3569.3711 -3.265625 C 3565.943 -3.5095709 3564.268 -2.4808585 3564.0078 1.1757812 L 3562.377 24.039062 C 3562.1493 27.238696 3563.4215 28.707226 3566.8496 28.951172 L 3597.9023 31.621094 C 3594.6068 39.1964 3589.3999 47.773321 3582.791 56.720703 C 3581.2734 58.680007 3580.6816 60.478355 3580.584 61.849609 C 3580.3726 64.820681 3582.5466 66.582068 3584.5547 67.414062 L 3610.1855 78.425781 C 3611.7528 78.996511 3613.3357 79.345141 3614.9355 79.458984 C 3619.7349 79.800508 3624.9244 77.868496 3627.7637 73.476562 C 3633.7032 64.251829 3640.8877 47.308215 3643.8066 35.341797 L 3665.5039 37.121094 L 3664.2324 71.023438 C 3663.9245 78.581615 3668.368 83.949124 3678.1953 84.648438 C 3679.338 84.729748 3680.2714 84.563211 3681.4141 84.644531 L 3739.832 83.517578 C 3743.7497 83.337161 3746.4344 81.236683 3746.6621 78.037109 C 3746.6951 77.580221 3746.7415 76.895218 3746.5449 76.421875 L 3743.7344 57.84375 C 3743.4076 55.982918 3741.6742 54.477085 3739.3887 54.314453 L 3738.4766 54.251953 L 3713.1016 55.666016 L 3713.6719 41.236328 L 3749.0664 44.214844 C 3752.4945 44.45879 3753.9814 42.951587 3754.209 39.751953 L 3755.9121 15.757812 C 3756.1235 12.786741 3754.8676 11.089649 3751.4395 10.845703 L 3714.8906 8.015625 L 3715.8594 -15.349609 L 3722.4883 -14.875 L 3728.3691 -7.1113281 C 3730.9002 -3.9450998 3734.4586 -2.3123054 3737.8867 -2.0683594 C 3740.8578 -1.8569381 3743.8977 -2.5511312 3745.6113 -4.0371094 L 3770.8105 -22.460938 C 3772.263 -23.506052 3773.2925 -25.048679 3773.4062 -26.648438 C 3773.5363 -28.476816 3772.749 -30.369702 3771.0508 -32.328125 L 3748.3984 -59.429688 L 3768.1992 -76.167969 C 3768.9336 -76.804807 3769.2285 -77.706951 3769.2773 -78.392578 C 3769.3753 -79.763833 3768.9945 -80.9329 3768.1289 -81.683594 L 3755.0488 -94.798828 C 3754.6407 -95.516968 3753.7482 -95.798227 3752.834 -95.863281 C 3751.9198 -95.928331 3750.9904 -95.773383 3750.2559 -95.136719 L 3732.3027 -78.496094 L 3724.457 -87.777344 L 3741.9102 -103.76758 C 3742.6446 -104.40441 3743.1634 -105.28895 3743.2285 -106.20312 C 3743.3095 -107.34583 3742.9182 -108.28901 3742.2812 -109.02344 L 3728.3691 -123.3418 C 3727.7322 -124.07622 3726.8302 -124.35941 3726.1445 -124.4082 C 3725.0018 -124.4895 3723.8301 -124.11427 3723.3242 -123.46094 L 3706.6797 -109.0332 L 3693.7637 -124.42188 C 3692.9146 -125.40112 3691.5685 -125.95189 3690.4258 -126.0332 C 3688.5975 -126.16331 3686.7287 -125.61351 3685.2598 -124.33984 L 3670.7168 -113.6582 C 3668.0376 -121.19922 3661.5213 -126.48865 3653.3262 -127.53125 L 3577.9922 -137.25781 L 3577.2988 -137.29883 z M 3380.5156 -118.91797 L 3393.8242 -118.66016 L 3394.2852 -118.62891 C 3397.4847 -118.40123 3398.8898 -115.54542 3398.6133 -111.66016 L 3395.3828 -76.056641 L 3376.5508 -76.013672 L 3377.75 -89.710938 L 3386.2852 -90.255859 C 3389.0602 -90.51759 3390.4624 -90.876584 3390.6738 -93.847656 L 3391.5977 -103.43164 C 3391.6787 -104.57433 3390.9026 -106.68957 3388.8457 -106.83594 L 3388.6152 -106.85742 L 3379.377 -106.13281 L 3380.5156 -118.91797 z M 3896.1465 -118.0625 L 3850.877 -117.83203 C 3847.6611 -117.83103 3845.4556 -115.92607 3845.293 -113.64062 L 3845.2617 -113.17969 L 3845.2617 -97.105469 L 3801.6289 -97.220703 C 3799.3272 -97.154593 3797.188 -96.160525 3796.9766 -93.189453 L 3796.9453 -92.726562 L 3796.8262 -61.960938 C 3796.8922 -59.659216 3797.8883 -57.516744 3801.0879 -57.289062 L 3801.5391 -57.257812 L 3845.4023 -57.121094 L 3845.3672 -33.923828 L 3789.252 -36.314453 C 3786.2809 -36.525875 3784.602 -35.492496 3784.3906 -32.521484 L 3783.4023 -8.9375 C 3783.1909 -5.9664285 3783.9741 -4.0726715 3788.3164 -3.7636719 L 3829.2988 -1.765625 L 3783.1816 26.421875 C 3781.7452 27.238486 3780.9453 28.784995 3780.8477 30.15625 C 3780.7176 31.98457 3781.5088 33.888674 3783.4844 35.177734 L 3811.3906 53.003906 L 3812.9316 53.808594 L 3810.5723 80.507812 C 3810.1495 86.449956 3814.4355 90.892882 3820.5898 91.560547 L 3965.2812 104.61328 L 3965.9629 104.66602 C 3971.905 105.08886 3977.6345 102.04598 3978.9219 93.638672 L 3985.6777 50.482422 C 3985.7427 49.568233 3986.0483 48.437627 3986.1133 47.523438 C 3987.203 32.211073 3977.9577 20.065757 3955.1035 18.439453 L 3882.6582 13.292969 L 3898.877 1.5800781 L 3991.1309 6.0761719 C 3993.8734 6.2713287 3995.586 4.7874313 3995.7812 2.0449219 L 3997.1152 -23.123047 C 3997.2941 -25.637053 3995.7953 -27.129062 3993.0527 -27.324219 L 3971.9941 -28.357422 L 3980.625 -36.705078 C 3981.6044 -37.554143 3981.9095 -38.675713 3981.9746 -39.589844 C 3982.1209 -41.646726 3980.8842 -43.574365 3978.8438 -43.949219 L 3942.4902 -52.746094 C 3942.0333 -52.778604 3941.3614 -53.047554 3940.9043 -53.080078 C 3938.1618 -53.275235 3935.1068 -52.346709 3933.1484 -50.648438 L 3912.4629 -30.994141 L 3901.6816 -31.296875 L 3901.8926 -56.777344 L 3969.6328 -56.552734 C 3973.3057 -56.521264 3974.8289 -58.480194 3975.0078 -60.994141 L 3975.0391 -61.457031 L 3975.4219 -92.664062 C 3975.3399 -94.737223 3972.9494 -96.746888 3970.4355 -96.925781 L 3969.9844 -96.957031 L 3902.2227 -96.951172 L 3902.4238 -112.78516 C 3902.3738 -115.31544 3900.7153 -117.73525 3896.8301 -118.01172 L 3896.8262 -118.01172 L 3896.1465 -118.0625 z M 3476.3242 -112.79102 L 3489.6543 -112.76367 L 3490.1035 -112.72266 C 3493.9887 -112.44619 3495.6105 -109.3462 3495.334 -105.46094 L 3493.252 -66.566406 L 3472.793 -66.40625 L 3473.918 -82.177734 L 3484.0781 -82.839844 C 3486.8532 -83.101575 3488.4924 -83.669541 3488.6875 -86.412109 L 3489.3789 -96.005859 C 3489.4599 -97.148551 3488.9143 -99.254023 3486.8574 -99.400391 L 3486.1777 -99.453125 L 3475.3262 -98.621094 L 3476.3242 -112.79102 z M 4032.5469 -91.808594 C 4029.8044 -92.003751 4027.8137 -89.849886 4027.6348 -87.335938 C 4025.621 -55.780676 4024.9668 1.8219283 4024.8906 22.259766 C 4024.9256 25.018678 4026.8298 27.228671 4029.5723 27.423828 L 4068.1973 30.167969 C 4070.9398 30.363125 4072.9202 28.43656 4073.5723 25.726562 C 4078.7254 4.9608999 4084.4404 -23.809315 4086.3594 -50.777344 C 4088.9452 -87.115594 4085.5746 -88.039296 4081.4609 -88.332031 L 4032.5469 -91.808594 z M 3666.8359 -88.203125 L 3699.1738 -45.478516 L 3632.9766 -51.335938 C 3644.8411 -63.125164 3655.7387 -74.298872 3662.25 -81.875 C 3664.0124 -84.046601 3665.5468 -86.227557 3666.8359 -88.203125 z M 3389.2891 -42.033203 C 3387.0037 -42.195831 3385.7622 -40.90975 3385.3711 -38.640625 L 3382.7832 -18.378906 L 3382.7305 -17.685547 C 3382.5516 -15.1716 3383.6273 -14.181531 3386.3535 -13.757812 L 3394.3242 -12.728516 L 3392.5879 8.5078125 L 3381.1348 7.921875 C 3378.1637 7.7104538 3376.5011 8.5152694 3376.2734 11.714844 L 3375.1445 30.927734 C 3374.9494 33.670243 3375.9917 35.116743 3379.6484 35.376953 L 3384.4395 35.716797 L 3375.418 49.548828 C 3374.9123 50.202002 3374.8711 50.888592 3374.8223 51.574219 C 3374.7085 53.173977 3375.7153 55.082122 3377.0703 55.408203 L 3396.793 62.328125 C 3397.6909 62.621914 3398.8201 62.929765 3400.1914 63.027344 C 3403.391 63.255025 3406.681 62.107949 3408.3125 58.548828 L 3417.8828 37.177734 L 3432.7539 38.011719 L 3431.5293 58.365234 C 3431.3341 61.107744 3431.9059 62.759921 3434.6484 62.955078 L 3435.3301 62.994141 L 3458.1055 62.548828 C 3461.0928 62.531508 3463.0731 60.61565 3463.3008 57.416016 L 3464.3398 39.568359 L 3475.3184 40.121094 C 3478.2895 40.332516 3479.3191 38.803069 3479.498 36.289062 L 3480.6914 16.384766 C 3480.8865 13.642257 3479.8071 12.641748 3476.6074 12.414062 L 3466.0781 11.904297 L 3466.9512 -3.6601562 L 3474.2305 -2.6835938 L 3474.6934 -2.6523438 C 3477.2074 -2.4734472 3478.2385 -4.0100789 3478.6621 -6.7363281 L 3480.9863 -26.546875 L 3481.0488 -27.458984 C 3481.2115 -29.744429 3480.3592 -30.727986 3477.4043 -31.167969 L 3389.75 -42.001953 L 3389.2891 -42.033203 z M 3652.8633 -20.980469 L 3668.8457 -19.615234 L 3668.0566 4.4511719 L 3648.6445 2.8378906 L 3652.8633 -20.980469 z M 3424.832 -8.9472656 L 3435.7617 -7.4804688 L 3434.4941 10.335938 L 3423.0312 9.9824219 L 3424.832 -8.9472656 z M 3863.4238 31.675781 L 3922.248 37.931641 C 3927.4882 38.53443 3930.9593 41.309856 3930.5527 47.023438 L 3930.4414 48.615234 L 3925.5547 75.373047 L 3859.5059 70.679688 L 3860.9688 56.541016 L 3904.4961 64.691406 L 3906.0898 64.804688 C 3908.6037 64.98358 3909.5905 64.131933 3910.9609 61.013672 L 3913.6602 55.230469 C 3913.9377 54.561119 3914.2072 54.12508 3914.2559 53.439453 C 3914.3698 51.839636 3913.3258 50.388543 3911.2852 50.013672 L 3862.5332 41.03125 L 3863.4238 31.675781 z M 4047.6328 38.349609 C 4029.5777 37.064813 4013.9077 50.650204 4012.623 68.705078 C 4011.3382 86.759951 4024.9254 102.43004 4042.9805 103.71484 C 4060.8068 104.98336 4076.475 91.392765 4077.7598 73.337891 C 4079.0446 55.283018 4065.4591 39.618128 4047.6328 38.349609 z M 2893.8008 98.775391 C 2886.1977 98.695911 2878.4505 98.818912 2870.5566 99.148438 C 2731.6256 104.94809 2584.4114 177.51147 2539.2637 327.26758 C 2524.7298 376.90115 2518.7814 423.80479 2520.5938 467.2207 C 2528.7989 663.77652 2692.2107 789.79834 2872.1895 782.28516 C 3032.4338 775.59579 3241.1517 641.94295 3232.0898 424.86328 C 3226.9306 301.27586 3135.6999 113.86613 2916.1797 99.611328 C 2908.8623 99.136169 2901.4039 98.854871 2893.8008 98.775391 z M 1050.1055 176.61133 C 1041.723 176.50603 1033.3515 176.63046 1025.0137 176.97852 C 978.44021 178.92272 932.16921 187.97052 891.68164 203.10352 L 765.66992 215.48047 C 755.40796 215.90885 747.91928 225.70874 748.34766 235.9707 L 803.28125 813.30664 C 806.11217 843.23724 821.64384 855.23524 847.95703 860.46289 C 853.51564 861.02159 859.8573 861.55203 866.23828 862.86719 C 903.60279 867.63344 940.83691 869.23652 977.14844 867.7207 C 1201.3325 858.36218 1391.9916 727.83421 1382.666 504.43945 C 1380.8207 460.23418 1370.8847 411.62839 1351.3105 359.46484 C 1306.8943 240.23445 1192.5267 185.67249 1075.2578 177.62695 C 1066.8815 177.05227 1058.4879 176.71662 1050.1055 176.61133 z M 365.3125 184.81836 A 46.724621 46.342246 0 0 0 347.40039 189.33984 L 103.0625 306.0957 A 46.724621 46.342246 0 0 0 77.785156 337.52734 L 17.501953 599.7793 A 46.724621 46.342246 0 0 0 23.841797 635.31641 A 46.724621 46.342246 0 0 0 26.5 639.00391 L 195.62305 849.2832 A 46.724621 46.342246 0 0 0 232.15234 866.72266 L 503.37891 866.65625 A 46.724621 46.342246 0 0 0 539.9082 849.24805 L 708.96875 638.93555 A 46.724621 46.342246 0 0 0 717.99805 599.7207 L 657.62305 337.4668 A 46.724621 46.342246 0 0 0 632.3418 306.0293 L 387.96484 189.3457 A 46.724621 46.342246 0 0 0 376.92773 185.66211 A 46.724621 46.342246 0 0 0 365.3125 184.81836 z M 4159.2441 259.57031 C 4154.0668 259.26749 4147.7883 259.33307 4140.0918 259.6543 C 4036.6829 263.97109 3909.995 316.70036 3913.7188 405.90039 C 3914.9709 435.8969 3930.602 469.24259 3966.9824 507.26172 L 3989.2773 530.06445 C 4000.9218 543.812 4011.7122 556.01154 4012.1406 566.27344 C 4012.9314 585.21862 3991.7514 608.243 3945.2109 610.97656 C 3935.7383 611.37199 3920.0233 613.60854 3920.5176 625.44922 C 3920.5836 627.02801 3921.4692 629.36207 3922.3574 631.69727 L 3960.9121 721.81641 C 3966.2085 735.03822 3974.2274 737.86949 3991.5938 737.14453 L 4000.2871 736.77539 C 4106.0641 732.35975 4245.2478 675.93993 4241.3594 582.79297 C 4240.1072 552.79652 4222.844 517.93564 4184.8848 479.98242 C 4153.5043 448.08066 4141.0348 433.57572 4140.4746 420.15625 C 4139.8156 404.36864 4157.313 387.82285 4204.6758 385.8457 L 4207.8262 385.7207 C 4218.0882 385.29232 4226.6418 381.77106 4226.2793 373.08789 C 4226.1803 370.71974 4226.078 368.34355 4224.3672 365.25195 L 4185.0293 275.17578 C 4180.4402 264.69216 4174.7759 260.47875 4159.2441 259.57031 z M 2884.5859 268.83008 C 2887.8884 268.86813 2891.1293 268.99631 2894.3105 269.20898 C 2989.7485 275.58914 3030.0705 359.12041 3033.1289 432.38477 C 3036.8526 521.58479 2985.6804 602.78763 2891.7441 606.70898 C 2810.4379 610.10309 2731.8217 545.38026 2727.6367 445.12891 C 2724.638 373.29528 2760.03 273.76444 2874.4902 268.98633 C 2877.9191 268.84319 2881.2835 268.79203 2884.5859 268.83008 z M 3593.1855 277.24023 C 3588.8654 277.22497 3584.5311 277.30703 3580.1895 277.48828 C 3547.0355 278.87229 3512.5684 286.63072 3479.1523 300.67773 L 3347.0312 299.07617 L 3345.457 299.15234 C 3337.5632 299.48187 3330.7492 306.87366 3330.3223 315.58984 L 3324.7852 940.5293 L 3324.8477 942.10547 C 3325.2102 950.78864 3332.6121 957.5893 3340.5059 957.25977 L 3498.7441 959.35156 C 3508.2167 958.95613 3515.0592 952.34539 3515.4531 942.83984 L 3517.5117 745.85938 C 3547.1142 754.11266 3579.6683 757.49729 3612.8223 756.11328 C 3762.0152 749.88525 3860.0578 654.86263 3854.0605 511.19531 C 3848.4379 376.50726 3734.7649 283.85416 3606.1016 277.57812 C 3601.8128 277.36892 3597.5057 277.2555 3593.1855 277.24023 z M 2322.3789 341.06641 C 2312.1169 341.49479 2304.427 346.55791 2300.1191 357.01758 C 2295.1537 370.66771 2256.5842 488.52403 2231.625 553.61719 C 2229.4546 558.45234 2227.9327 560.09255 2225.5645 560.19141 C 2223.9857 560.25731 2221.558 558.77355 2219.8145 554.89258 L 2123.2578 363.61328 C 2118.9814 355.88424 2110.8662 350.69126 2099.0254 351.18555 C 2082.4485 351.87756 1980.8131 398.81308 1962.2305 408.28711 C 1953.712 412.59653 1949.2059 418.31683 1949.5684 427 C 1949.7991 432.52566 1951.6434 438.78268 1955.9199 446.51172 L 2150.9844 781.55078 C 2160.2938 796.18655 2174.6343 798.75671 2190.4219 798.09766 L 2270.1504 794.77148 C 2284.3593 794.17833 2297.5553 788.08986 2305.1855 781.44531 C 2398.7863 693.71778 2473.8183 407.49338 2473.291 394.86328 C 2472.8297 383.81196 2465.3942 376.21697 2447.0078 371.44922 L 2339.8789 343.50195 C 2333.4649 341.39742 2327.9046 340.83574 2322.3789 341.06641 z M 1028.7148 344.91211 C 1033.0139 345.02885 1037.1809 345.29471 1041.2188 345.70117 C 1162.3538 357.89491 1168.8107 496.02472 1169.3359 508.60547 C 1173.5209 608.85681 1100.4745 677.54078 1008.9062 681.36328 C 1002.5912 681.6269 996.27382 681.88477 989.92578 681.35938 L 958.92383 355.28516 C 976.88188 349.79102 996.47671 345.80845 1015.4219 345.01758 C 1019.9855 344.82707 1024.4158 344.79537 1028.7148 344.91211 z M 1724.2012 359.41992 C 1718.4309 359.32871 1712.4907 359.40477 1706.373 359.66016 C 1526.3943 367.17334 1451.6023 488.91549 1456.3145 601.79688 C 1461.3233 721.78278 1556.4201 840.38256 1735.6094 832.90234 L 1745.084 832.50195 C 1767.9761 831.54632 1777.7806 820.0695 1783.5684 807.17578 C 1794.2887 779.84255 1812.5718 725.30201 1812.2422 717.4082 C 1811.682 703.98873 1797.9616 697.44297 1786.9102 697.9043 L 1785.334 697.97852 C 1779.8413 698.99855 1773.5295 699.25566 1768.0039 699.48633 C 1669.3313 703.60539 1625.6404 642.17296 1623.3008 586.12695 C 1621.2577 537.18538 1651.4515 502.70672 1689.3418 501.125 C 1722.4958 499.74099 1738.5452 524.37803 1738.8418 531.48242 C 1739.3031 542.5338 1733.8419 544.34318 1693.1895 555.5293 C 1683.0265 558.32583 1676.8797 562.53363 1677.2422 571.2168 C 1677.374 574.37437 1694.518 625.06461 1705.0781 650.71875 C 1708.631 660.05953 1712.8094 665.41982 1725.4395 664.89258 C 1766.4215 661.60026 1824.4732 650.47379 1861.0469 636.29492 C 1906.9613 618.5631 1920.7033 587.94044 1919.1875 551.62891 C 1918.1681 527.20744 1904.0705 372.67536 1741.0059 360.1875 C 1735.5704 359.77124 1729.9714 359.51114 1724.2012 359.41992 z M 3559.7852 432.54102 C 3566.6923 432.25269 3573.3972 432.56267 3579.8555 433.4375 C 3625.0638 439.56132 3657.9558 473.21417 3659.9453 520.87305 C 3663.5701 607.70493 3587.7818 610.87505 3581.4668 611.13867 C 3559.3641 612.06134 3536.2094 606.70235 3518.4805 598.74414 L 3520.5742 440.49414 C 3533.8289 435.98707 3547.1551 433.06827 3559.7852 432.54102 z M 1937.1582 883.85156 C 1935.0963 883.83026 1932.7879 884.71997 1931.3848 887.45508 L 1906.8496 933.7168 C 1906.3821 934.62846 1906.1466 935.77244 1906.1348 936.91797 C 1906.1088 939.43814 1907.2211 942.20751 1909.9609 943.15234 L 1938.502 953.75 L 1935.0547 953.95312 C 1931.6157 954.14696 1931.3721 955.74093 1931.3438 958.49023 L 1931.5137 964.44531 L 1916.6152 964.5293 C 1913.6368 964.4986 1911.789 965.84518 1911.7559 969.05273 L 1911.7422 970.20312 L 1913.582 991.99219 C 1913.7758 995.43118 1915.6018 996.59621 1918.5801 996.62695 L 1931.873 996.53516 L 1932.043 1001.3516 C 1932.003 1005.2465 1933.8208 1006.6387 1938.1738 1006.6836 L 1959.0273 1006.666 C 1962.4639 1006.701 1964.5536 1004.428 1964.5938 1000.5332 L 1964.6289 996.64258 L 1978.1543 996.54883 L 1978.3281 1001.8301 C 1978.2901 1005.4959 1979.1939 1006.418 1983.5469 1006.4629 L 2002.1113 1006.4277 C 2005.5479 1006.4637 2007.6278 1004.4221 2007.668 1000.5273 L 2007.7168 996.62695 L 2019.1641 996.51367 L 2019.3281 1003.3984 C 2019.2931 1006.835 2020.6508 1008.4473 2025.0039 1008.4922 L 2042.6484 1008.2227 C 2046.085 1008.2577 2047.9411 1005.9816 2047.9766 1002.5449 L 2047.8066 996.58984 L 2058.584 996.69336 L 2056.3203 1015.4629 L 1920.0273 1011.9883 C 1916.5907 1011.9533 1914.9727 1012.8579 1914.9277 1017.2109 L 1914.6387 1045.1602 C 1914.6037 1048.5968 1915.9619 1050.6781 1920.0859 1050.7207 L 1930.3887 1051.0488 L 1910.9238 1071.9316 C 1909.9955 1073.0677 1909.522 1074.4359 1909.5078 1075.8105 C 1909.4868 1077.8725 1910.3821 1080.1735 1912.2031 1081.3379 L 1940.1836 1101.0977 C 1941.322 1101.7969 1942.6989 1102.0439 1944.3027 1102.0605 C 1947.052 1102.0885 1949.81 1101.199 1951.2012 1099.6094 L 1969.5566 1074.3691 L 1970.0254 1073.459 L 1970.25 1073.9219 L 1979.166 1097.8438 C 1979.8321 1099.9128 1982.1152 1100.8513 1984.4062 1100.875 C 1985.5519 1100.887 1986.4655 1100.8901 1987.3867 1100.4414 L 2012.6973 1091.084 C 2015.227 1090.1936 2016.6318 1087.4583 2016.6602 1084.709 C 2016.6722 1083.5634 2016.4446 1082.64 2015.9961 1081.7188 L 2004.7559 1060.5234 C 2003.4073 1057.989 2001.1269 1056.8244 1998.8359 1056.8008 C 1997.9194 1056.7908 1997.0067 1057.0131 1996.0879 1057.2324 L 1973.3184 1065.0117 C 1971.939 1065.4555 1971.0173 1066.3605 1970.5449 1067.7305 C 1970.1011 1066.3511 1969.1931 1065.2012 1968.0547 1064.502 L 1947.7949 1051.4648 L 2087.0762 1055.1953 L 2068.6016 1068.2891 C 2066.986 1069.4181 2066.2889 1071.4732 2066.2676 1073.5352 C 2066.2486 1075.3681 2066.6792 1076.9778 2067.584 1078.1328 L 2085.918 1100.7773 C 2087.2737 1102.6244 2090.0072 1103.5717 2092.5273 1103.5977 C 2094.5893 1103.6187 2096.4296 1102.9422 2097.3555 1102.0352 L 2119.7949 1081.6484 C 2121.1838 1080.2879 2122.1271 1078.0112 2122.1484 1075.9492 C 2122.1674 1074.1163 2121.4893 1072.5012 2120.3555 1071.3438 L 2103.5684 1055.584 L 2110.8965 1055.8926 C 2115.0204 1055.9356 2115.961 1053.8872 2115.9941 1050.6797 L 2116.9746 1022.0391 C 2117.0096 1018.6025 2115.421 1016.9867 2111.9844 1016.9512 L 2095.9453 1016.5566 L 2098.9062 996.6543 L 2115.6367 996.60156 C 2119.3024 996.63936 2120.4642 995.03775 2120.4902 992.51758 L 2120.4902 991.59961 L 2119.5801 968.45508 C 2119.3863 965.01609 2118.2531 964.31867 2114.8164 964.2832 L 2103.5918 964.39258 L 2105.5488 952.04492 L 2105.5488 951.12695 C 2105.5768 948.37765 2103.9869 947.21807 2101.0156 946.5 L 2071.2969 940.45508 C 2070.8389 940.45008 2070.384 940.21762 2069.9258 940.21289 C 2067.4057 940.18689 2065.321 941.7763 2064.832 944.75 L 2062.5664 964.42578 L 2047.6797 964.27734 L 2047.5078 957.85742 C 2047.5388 954.87899 2045.9485 953.72174 2043.1992 953.69336 L 2042.2812 953.67773 L 2022.1152 955.07422 C 2019.5926 955.27751 2018.6554 957.10417 2018.627 959.85352 L 2018.8047 964.4375 L 2007.3457 964.31641 L 2007.4238 957.44336 C 2007.4548 954.46493 2006.3143 953.30613 2003.3359 953.27539 L 2002.6504 953.26953 L 1981.3223 954.65234 C 1977.8834 954.84617 1977.6447 956.67765 1977.6211 958.96875 L 1977.7852 964.4707 L 1964.502 964.56445 L 1964.3438 956.99414 C 1964.3718 954.24484 1963.0233 952.6284 1960.0449 952.59766 L 1959.3477 952.5918 L 1956.3652 952.79102 L 1972.5059 921.10547 L 1974.1543 939.69141 C 1974.3504 942.90127 1976.159 944.51922 1979.5957 944.55469 L 1980.2812 944.56055 L 2106.1582 937.15625 C 2109.139 936.95769 2110.7642 935.13662 2110.7949 932.1582 L 2110.8047 931.47266 L 2108.1406 900.28516 C 2107.942 897.30437 2106.1327 895.91355 2103.1543 895.88281 L 2103.1582 895.88086 L 2102.4609 895.875 L 1979.3496 903.30273 C 1978.6812 901.46279 1977.322 899.85173 1975.2695 898.91406 L 1940.8105 884.57422 C 1939.6697 884.10437 1938.3038 883.86338 1937.1582 883.85156 z M 2496.1797 890.07812 L 2449.6289 893.72266 C 2446.8772 893.92359 2444.7948 895.50345 2444.7617 898.71094 C 2444.7617 899.16896 2444.9774 899.86597 2444.9727 900.32422 L 2446.0469 907.66406 L 2401.1211 908.57812 C 2390.5798 908.69865 2379.0502 915.6784 2378.3887 935.37695 L 2375.6309 1024.9434 C 2375.2432 1040.2913 2367.8859 1065.1866 2361.7422 1083.2246 C 2361.5035 1084.1387 2361.2751 1084.8316 2361.2656 1085.748 C 2361.2446 1087.81 2362.5994 1089.6524 2365.5684 1090.5996 L 2398.0078 1099.6387 C 2398.9219 1099.8774 2400.0596 1100.121 2401.2051 1100.1328 C 2405.7873 1100.1798 2410.8551 1097.9468 2412.5156 1092.4648 C 2417.261 1076.7036 2423.9798 1047.8937 2424.3555 1033.6914 L 2424.3867 1030.4863 C 2425.2937 1031.4121 2426.6643 1031.8911 2428.2656 1032.1367 L 2436.7285 1033.1309 L 2440.2539 1091.1426 C 2440.4501 1094.3525 2442.0386 1096.1974 2445.2461 1096.2305 C 2445.9334 1096.2405 2446.3907 1096.0202 2447.0781 1096.0273 L 2477.3828 1090.8418 C 2481.5162 1089.9679 2483.6 1087.2352 2483.6426 1083.1113 L 2483.6543 1081.7402 L 2481.3926 1056.7383 L 2494.5117 1073.832 C 2495.6431 1075.2185 2496.781 1075.9171 2498.3848 1075.9336 C 2499.5303 1075.9456 2500.677 1075.4966 2501.832 1074.5918 L 2519.3926 1060.5645 L 2519.3223 1066.9844 C 2519.2493 1074.0867 2514.1238 1082.965 2508.3086 1091.3828 C 2507.3756 1092.9771 2506.9 1094.3453 2506.8906 1095.2617 C 2506.8646 1097.7819 2508.9081 1099.185 2510.7363 1099.6621 L 2542.7324 1108.4629 C 2543.8756 1108.704 2544.7842 1108.9451 2545.9297 1108.957 C 2549.8246 1108.997 2553.5169 1106.9771 2555.6191 1103.1035 C 2560.7588 1093.533 2564.9748 1083.9527 2565.0742 1074.3301 L 2565.334 1026.8965 L 2572.6621 1027.2051 C 2576.0987 1027.2401 2577.7276 1025.4264 2577.9922 1021.9922 L 2579.916 991.07812 L 2579.916 990.61328 C 2579.947 987.63485 2578.1391 986.24404 2574.9316 986.21094 L 2565.5352 985.88672 L 2565.7559 964.57812 C 2565.7889 961.37058 2563.9732 959.75577 2560.7656 959.72266 L 2524.5605 959.3418 C 2521.1238 959.3063 2519.5092 960.67002 2519.4785 963.64844 L 2519.4941 984.03516 L 2496.1367 983.11523 C 2492.9292 983.08213 2491.0842 984.65712 2491.0488 988.09375 L 2489.8164 1018.5605 C 2489.7814 1021.9971 2490.9027 1024.0638 2494.5684 1024.1016 L 2519.3066 1025.0469 L 2519.2617 1051.625 L 2505.8984 1035.916 C 2504.9939 1034.7611 2503.6261 1034.0529 2502.4805 1034.041 C 2501.5641 1034.031 2500.4176 1034.4821 2499.4941 1035.1602 L 2481.4766 1048.7148 L 2480.7871 1049.3945 L 2478.7266 1027.6094 C 2478.3041 1024.168 2476.2629 1022.0882 2472.8262 1022.0527 L 2472.3613 1022.043 L 2468.6934 1022.2363 L 2487.6953 979.12305 C 2487.9341 978.20897 2488.176 977.52778 2488.1855 976.61133 C 2488.2095 974.32028 2486.6201 972.23544 2484.1094 971.29297 L 2456.7188 960.93359 C 2455.8047 960.69483 2454.8892 960.45673 2453.9727 960.44727 C 2451.9107 960.42597 2450.0694 961.32132 2449.127 963.83203 L 2424.6953 1022.0078 L 2426.9805 956.73633 C 2427.0155 953.29971 2428.6413 950.78812 2432.7676 950.60156 L 2575.0898 947.71875 C 2578.0683 947.74945 2579.9239 945.93796 2579.957 942.73047 L 2579.957 942.27734 L 2578.4668 909.72266 C 2578.2682 906.74187 2576.6827 905.12531 2573.2461 905.08984 L 2503.1191 906.42188 L 2501.8672 894.71875 C 2501.4399 891.73559 2499.6165 890.12213 2496.8672 890.09375 L 2496.8633 890.09375 L 2496.1797 890.07812 z M 2269.5488 891.4082 C 2267.0286 891.3822 2264.9526 892.51211 2264.0078 895.25195 L 2240.8301 965.11914 C 2240.5913 966.03323 2240.3587 966.9572 2240.3516 967.64453 C 2240.3186 970.85202 2242.3557 973.619 2245.7852 974.3418 L 2279.1621 981.7832 C 2279.8471 982.0196 2280.7522 982.03393 2281.4395 982.04102 C 2284.8761 982.07652 2287.8806 980.5061 2289.0664 976.62305 L 2293.0898 963.82617 L 2343.9004 969.39648 L 2345.0488 969.41016 C 2347.7981 969.43856 2349.4169 967.84535 2349.9082 964.64258 L 2353.4473 932.36914 L 2353.4609 931.45117 C 2353.4889 928.70187 2352.586 927.09232 2349.3809 926.83008 L 2306.1172 922.71484 L 2309.9043 911.07227 C 2310.1431 910.15819 2310.3831 909.24458 2310.3926 908.32812 C 2310.4236 905.3497 2308.8425 902.81675 2305.6445 901.86719 L 2272.293 891.89453 C 2271.379 891.65577 2270.4652 891.41766 2269.5488 891.4082 z M 2846.4766 894.15625 C 2844.4146 894.13495 2842.793 895.49374 2842.5449 897.32422 L 2837.3984 930.26367 L 2830.5195 930.88086 C 2827.7678 931.08178 2825.6889 932.4376 2825.6582 935.41602 C 2825.6582 935.87404 2825.8759 936.55938 2825.8711 937.01758 L 2828.9004 954.23242 C 2829.5522 957.67614 2831.3655 959.52858 2835.0312 959.56641 L 2836.1816 959.58008 L 2918.748 951.96094 C 2927.9218 951.13914 2934.6098 946.85397 2934.6973 938.37695 C 2934.7143 936.77317 2934.5016 935.15794 2934.0625 933.32031 L 2928.1387 907.82812 C 2927.475 905.52993 2926.1198 903.91078 2923.5996 903.88477 L 2922.6816 903.88086 L 2898.1152 907.97461 C 2896.0485 908.41134 2895.1201 910.00756 2895.1035 911.61133 L 2895.0898 912.5293 L 2898.1738 925.39062 L 2882.5801 926.60547 L 2886.6836 906.03125 L 2886.6836 905.11328 C 2886.7046 903.0513 2885.3632 900.97641 2882.8477 900.49219 L 2847.1621 894.16016 L 2846.4766 894.15625 z M 2986.6895 895.59961 L 2947.2617 897.25781 C 2944.9683 897.46346 2943.1295 898.59311 2943.1035 901.11328 L 2943.0938 901.56641 L 2945.2734 957.04688 C 2945.6534 964.61217 2949.9627 968.99916 2959.127 969.09375 C 2960.0435 969.10275 2960.9606 968.88702 2961.877 968.89648 L 3031.582 964.35156 C 3035.7107 963.93611 3038.029 961.43858 3038.0645 958.00195 C 3038.0645 957.54393 3037.839 957.07934 3037.8438 956.62109 L 3034.8145 939.63867 C 3034.3754 937.80104 3033.4669 936.41818 3031.1758 936.39453 L 3030.4902 936.37891 L 2993.0938 940.58203 L 2992.5234 929.80078 L 3030.6309 923.32617 C 3032.6976 922.88944 3033.8522 921.29965 3033.8711 919.4668 C 3033.8811 918.77948 3033.6571 918.08227 3033.4355 917.39258 L 3028.7793 902.6875 C 3028.3354 901.30812 3027.1935 900.37397 3025.5898 900.35742 C 3025.1318 900.35242 3024.8996 900.5809 3024.4414 900.57617 L 2991.623 906.42578 L 2991.2383 899.54492 C 2991.0327 897.25282 2989.4432 895.63492 2987.1543 895.60938 L 2987.1504 895.60938 L 2986.6895 895.59961 z M 2236.9512 897.25391 L 2144.0977 902.48828 C 2141.3461 902.68921 2139.2756 903.80947 2139.2402 907.24609 L 2139.2305 907.71094 L 2140.7324 940.0332 C 2140.9309 943.014 2142.978 944.86337 2146.1855 944.89648 L 2146.6387 944.9043 L 2179.877 943.41797 L 2180.4277 1044.9258 L 2171.248 1046.666 L 2167.334 982.69141 C 2167.1378 979.48149 2165.3255 977.62994 2162.5762 977.60156 L 2162.1094 977.60352 L 2148.1191 978.83008 C 2145.3675 979.03101 2143.0769 979.68972 2143.0391 983.35547 L 2143.0293 984.05273 L 2147.6055 1050.541 L 2141.6348 1051.627 C 2139.1099 1052.059 2137.7351 1052.9622 2137.709 1055.4824 C 2137.709 1055.9404 2137.6979 1056.3923 2137.9199 1057.082 L 2143.1094 1086.2383 C 2143.7588 1089.9111 2146.4848 1092.4649 2150.8379 1092.5098 C 2151.7544 1092.5198 2152.6724 1092.5275 2153.8203 1092.3105 L 2238.3223 1074.8516 C 2241.0787 1074.1927 2242.4677 1072.8274 2242.4961 1070.0781 L 2241.6699 1039.375 C 2241.6959 1036.8548 2240.1056 1035.4612 2237.8145 1035.4375 L 2236.8984 1035.4219 L 2226.1055 1037.375 L 2225.877 1015.1523 L 2238.252 1014.8125 C 2241.2304 1014.8435 2242.3985 1012.7935 2242.4316 1009.5859 L 2242.4512 985.30859 C 2242.4822 982.33016 2241.1257 980.93227 2238.6055 980.90625 L 2237.9199 980.90234 L 2225.7656 981.24023 L 2225.4961 941.13867 L 2239.0176 940.58984 C 2241.9984 940.39127 2243.3998 938.56711 2243.4258 936.04688 L 2243.4355 935.36328 L 2241.7129 901.6582 C 2241.5096 899.1356 2240.1634 897.2901 2237.4141 897.26172 L 2236.9512 897.25391 z M 2766.457 899.51172 L 2766.002 899.51562 L 2720.6113 901.56055 C 2718.3178 901.76621 2716.465 903.12497 2716.4414 905.41602 L 2716.4316 905.86914 L 2720.0547 976.48828 L 2698.5137 977.4082 C 2695.0747 977.60203 2693.4593 978.73135 2693.4238 982.16797 L 2693.4141 982.85352 L 2695.3613 1015.8691 C 2695.5552 1019.3081 2696.6793 1021.1571 2700.5742 1021.1973 L 2701.2598 1021.209 L 2716.3965 1020.6699 L 2692.5391 1090.0801 C 2692.3027 1090.7651 2692.2844 1091.4592 2692.2773 1092.1465 C 2692.2513 1094.6667 2693.8439 1096.2834 2696.3594 1096.7676 L 2732.9219 1106.084 C 2734.065 1106.3251 2735.4384 1106.5644 2736.584 1106.5762 C 2742.3117 1106.6352 2746.9376 1103.0141 2748.832 1097.0762 L 2757.1426 1068.9863 L 2769.1777 1101.6465 C 2769.8437 1103.7155 2772.1237 1104.8778 2774.873 1104.9062 C 2776.2476 1104.9202 2777.3838 1104.7081 2778.7656 1104.0352 L 2808.9277 1090.373 C 2810.77 1089.4755 2812.3977 1087.6491 2812.4238 1085.1289 C 2812.4358 1083.9834 2812.2105 1082.8401 2811.5352 1081.6875 L 2795.1543 1048.7539 C 2794.2592 1046.6824 2792.2031 1045.5138 2789.9121 1045.4902 C 2789.2247 1045.4802 2788.3177 1045.4697 2787.3965 1045.918 L 2761.1641 1056.1914 L 2772.3184 1018.4961 L 2803.7285 1017.4453 C 2807.3966 1017.2538 2808.5607 1015.4438 2808.5938 1012.2363 L 2808.5938 1011.3184 L 2806.8828 977.61523 C 2806.689 974.17624 2805.0956 973.00926 2802.1172 972.97852 L 2801.1992 972.97461 L 2774.3887 974.06836 L 2772.4863 935.78125 L 2785.8672 949.66602 C 2786.7742 950.59188 2787.6806 950.83583 2788.8262 950.84766 C 2789.9718 950.85946 2791.5779 950.41923 2792.9668 949.05859 L 2809.623 933.87695 C 2810.5489 932.96995 2811.0234 931.82917 2811.0352 930.68359 C 2811.0492 929.30894 2810.3798 927.70037 2809.2461 926.54297 L 2791.7793 910.32031 C 2791.0991 909.62589 2789.9542 909.1505 2788.8086 909.13867 C 2787.6631 909.12687 2786.2872 909.5733 2785.3613 910.48047 L 2771.9453 923.17188 L 2770.9883 904.15039 C 2770.7874 901.39873 2769.2063 899.5401 2766.457 899.51172 z M 2640.418 900.50781 C 2638.1269 900.48421 2636.5182 901.84305 2636.4922 904.36328 L 2635.4102 942.61914 L 2626.5918 931.29297 C 2625.914 930.36942 2624.5354 929.6689 2622.9316 929.65234 C 2621.7861 929.64054 2620.6461 929.86333 2619.7227 930.54102 L 2598.2617 944.75391 C 2596.8775 945.65617 2596.1724 947.01988 2596.1582 948.39453 C 2596.1462 949.54005 2596.5992 950.68973 2597.2773 951.61328 L 2615.1094 977.91797 C 2616.0116 979.30207 2617.3733 979.77487 2618.748 979.78906 C 2620.1226 979.80326 2621.7398 979.36943 2623.3555 978.24023 L 2634.666 970.32812 L 2633.8672 1002.6367 L 2597.1074 1011.873 C 2594.8116 1012.3074 2593.185 1014.8165 2593.1543 1017.7949 C 2593.1443 1018.4823 2593.3746 1019.4054 2593.5938 1020.3242 L 2600.8672 1047.4277 C 2601.5261 1050.184 2603.3484 1052.0458 2606.0977 1052.0742 C 2606.785 1052.0842 2607.4607 1052.0838 2608.1504 1051.8574 L 2632.7402 1045.0137 L 2631.3281 1093.3379 C 2631.3041 1095.629 2632.4343 1097.247 2635.1836 1097.2754 L 2635.8691 1097.2852 L 2676.2188 1094.959 C 2680.5741 1094.7746 2682.9075 1091.1344 2682.9453 1087.4688 L 2688.7012 907.65039 C 2688.7322 904.67196 2686.8999 903.51573 2683.9238 903.25586 L 2683.9238 903.25 L 2640.8828 900.51562 L 2640.418 900.50781 z M 2845.2949 964.71289 C 2840.2546 964.66089 2836.0858 968.51275 2835.8047 973.55078 L 2833.1367 1032.418 L 2833.127 1033.1016 C 2833.082 1037.4547 2834.8952 1039.3014 2838.5586 1039.5684 L 2870.1602 1041.7305 L 2871.0762 1041.7461 C 2873.8255 1041.7741 2877.5032 1040.6583 2877.7891 1035.1621 L 2878.3398 1025.3223 L 2887.2695 1026.7891 L 2888.1758 1026.7891 C 2889.5505 1026.8031 2890.9374 1026.3623 2891.6484 1024.0781 L 2893.5371 1018.3711 C 2893.7712 1017.9155 2893.7844 1017.2258 2893.7891 1016.7676 C 2893.8031 1015.3929 2892.8984 1014.2388 2891.0703 1013.7617 L 2878.9434 1011.7988 L 2879.2559 1003.7852 L 2887.0273 1005.7031 C 2887.9413 1005.9418 2888.8537 1006.1726 2889.541 1006.1797 C 2890.6866 1006.1917 2891.6121 1005.7537 2892.3184 1003.9277 L 2894.1973 999.5918 C 2894.4337 998.90684 2894.4327 998.44453 2894.4375 997.98633 C 2894.4515 996.61168 2893.7726 995.46427 2891.4863 994.98242 L 2879.8301 992.56445 L 2880.1289 985.4668 L 2895.25 985.8457 C 2900.0613 985.8954 2902.3231 989.13594 2902.2734 993.94727 L 2902.2578 994.63281 L 2900.9082 1015.4629 C 2900.384 1021.8731 2896.4273 1027.3396 2892.6953 1033.7168 C 2891.9962 1034.8553 2891.7555 1035.769 2891.7461 1036.6855 C 2891.7271 1038.5183 2893.0931 1039.6751 2894.2363 1039.916 L 2919.1289 1047.9648 C 2920.2697 1048.4346 2921.6391 1048.6832 2923.0137 1048.6973 C 2925.9921 1048.7283 2928.986 1047.3737 2930.8496 1044.4141 C 2935.2784 1037.1276 2937.1788 1030.7326 2937.4883 1022.9453 L 2938.7754 986.75391 L 2938.7891 985.83789 C 2938.9499 970.25849 2927.7642 965.33134 2914.0176 965.18945 L 2914.0234 965.19141 L 2845.2949 964.71289 z M 2990.9121 974.92383 L 2951.4844 976.58008 C 2949.191 976.78574 2947.3522 977.91727 2947.3262 980.4375 L 2947.3164 980.88867 L 2949.5723 1029.0312 C 2949.7685 1032.2411 2950.6554 1035.008 2952.2402 1036.8574 L 2934.9805 1044.0098 C 2933.8302 1044.456 2933.1252 1045.8173 2933.1133 1046.9629 C 2933.1133 1047.4209 2933.3327 1048.1118 2933.5566 1048.5723 L 2942.5371 1066.3047 C 2943.2102 1067.6864 2944.5774 1068.3893 2946.4102 1068.4082 C 2947.0975 1068.4182 2948.0131 1068.4311 2948.7051 1067.9805 L 2967.125 1059.2285 C 2968.7358 1058.5577 2969.2163 1057.1949 2969.2305 1055.8203 C 2969.2405 1054.9039 2969.0212 1053.987 2968.5703 1053.2949 L 2961.1348 1040.8438 C 2962.0513 1040.8537 2962.728 1041.0902 2963.6445 1041.0996 C 2964.3318 1041.1096 2965.2574 1040.8831 2966.1738 1040.8926 L 3030.8301 1036.2852 C 3034.9587 1035.8698 3037.275 1033.3721 3037.3105 1029.9355 C 3037.3105 1029.4774 3037.0969 1029.0266 3037.1016 1028.5684 L 3034.0645 1011.8047 C 3033.6254 1009.967 3032.5009 1008.5794 3030.668 1008.5605 L 3029.75 1008.5605 L 2997.3945 1012.8027 L 2996.8164 1002.4863 L 3029.6348 996.63672 C 3031.6992 996.4287 3032.8655 994.83931 3032.8867 992.77734 C 3032.8967 992.09001 3032.6729 991.40453 3032.4512 990.71484 L 3027.7598 978.75 C 3027.3159 977.37063 3025.9567 976.43606 3024.582 976.42188 L 3024.5859 976.41797 C 3024.1279 976.41297 3023.8957 976.64145 3023.4375 976.63672 L 2995.6543 982.08008 L 2995.4512 978.86523 C 2995.2456 976.57176 2993.6681 974.95529 2991.377 974.93164 L 2990.9121 974.92383 z M 2303.0234 977.9043 C 2300.7323 977.8806 2298.8952 979.01328 2297.9551 981.29492 L 2285.2129 1016.4453 L 2274.5059 1010.8398 C 2273.1384 1010.1383 2271.7627 1009.6661 2270.6172 1009.6543 C 2269.0134 1009.6373 2267.6371 1010.5402 2266.4727 1012.3613 L 2250.4004 1037.3945 C 2249.4698 1038.7597 2248.9996 1039.9039 2248.9902 1040.8203 C 2248.9692 1042.8823 2250.3292 1044.272 2252.377 1045.668 L 2263.5352 1052.1992 L 2246.6016 1072.875 C 2245.6734 1074.0111 2244.9673 1075.6019 2244.9531 1076.9766 C 2244.9341 1078.8094 2245.8272 1080.4322 2247.875 1081.8281 L 2276.1035 1099.5312 C 2277.9246 1100.6958 2280.4441 1101.6357 2283.1934 1101.6641 C 2286.401 1101.6971 2289.8517 1100.3576 2292.1758 1097.1738 L 2307.0391 1077.3984 L 2324.5801 1087.6602 C 2325.7185 1088.3594 2327.3149 1088.8277 2328.6895 1088.8418 C 2330.7515 1088.8628 2332.8225 1087.7378 2334.2207 1085.4609 L 2348.2441 1058.5762 C 2348.9433 1057.4378 2349.4253 1055.8297 2349.4395 1054.4551 C 2349.4635 1052.164 2348.34 1049.8616 2345.834 1048.4609 L 2328.2891 1039.1172 L 2344.748 998.49805 C 2344.9844 997.81309 2345.2195 996.90607 2345.2266 996.21875 C 2345.2506 993.92765 2343.8935 991.85257 2341.3828 990.91016 L 2305.5469 978.39453 C 2304.6328 978.15577 2303.7108 977.91139 2303.0234 977.9043 z M 3009.9199 1042.7148 C 3008.3161 1042.6978 3007.163 1043.3789 3006.2324 1044.7441 L 2991.7773 1068.6484 C 2991.3098 1069.5601 2991.0797 1070.4801 2991.0703 1071.3965 C 2991.0563 1072.7712 2991.7227 1074.1513 2993.0879 1075.082 L 3019.5176 1090.0156 C 3020.4293 1090.4831 3021.3389 1090.7205 3022.4844 1090.7324 C 3024.5464 1090.7534 3026.6233 1089.8618 3027.7949 1087.3535 L 3040.6465 1063.1953 C 3041.114 1062.2836 3041.3515 1061.374 3041.3633 1060.2285 C 3041.3873 1057.9374 3040.2654 1055.3986 3038.2129 1054.4609 L 3012.666 1043.4336 C 3011.7542 1042.9661 3010.8364 1042.7242 3009.9199 1042.7148 z M 2846.6934 1050.4219 C 2845.5479 1050.4099 2844.1734 1050.8541 2843.4766 1051.7637 L 2824.4629 1073.5723 C 2823.9978 1074.2549 2823.7615 1074.9371 2823.752 1075.8535 C 2823.735 1077.4572 2824.1756 1079.0635 2825.541 1079.9941 L 2847.5879 1096.9512 C 2848.2705 1097.4163 2849.411 1097.8885 2850.5566 1097.9004 C 2852.3894 1097.9194 2854.2402 1097.2442 2855.4023 1095.6523 L 2871.9043 1072.2285 C 2872.3694 1071.5459 2872.848 1070.397 2872.8574 1069.4805 C 2872.8744 1067.8768 2872.1893 1066.503 2870.8242 1065.5723 L 2849.6621 1051.3711 C 2848.7503 1050.9036 2847.8389 1050.4337 2846.6934 1050.4219 z M 2881.0664 1051.0059 C 2878.088 1050.9749 2876.2304 1052.7983 2876.1973 1056.0059 L 2875.8242 1092.8848 C 2875.6941 1105.4857 2886.1939 1109.2625 2898.7949 1109.3926 L 2899.9336 1109.4043 L 2962.9453 1109.3652 C 2969.1312 1109.4292 2977.165 1108.3742 2986.8301 1104.3496 C 2990.5124 1102.7837 2992.1392 1100.5018 2992.1699 1097.5234 C 2992.1819 1096.3778 2991.9672 1095.227 2991.5234 1093.8477 L 2984.1914 1070.8633 C 2983.5254 1068.7943 2982.1747 1067.4115 2980.3418 1067.3926 C 2979.6545 1067.3826 2978.9596 1067.3768 2978.2676 1067.8281 C 2970.4424 1071.1844 2962.8576 1073.3911 2958.2754 1073.3438 L 2921.8438 1073.6621 L 2922.0137 1057.1621 C 2922.0447 1054.1837 2920.2329 1052.3261 2917.0254 1052.293 L 2881.0664 1051.0059 z M 2048.541 1059.1406 C 2047.6246 1059.1306 2046.7001 1059.3511 2045.7812 1059.5703 L 2022.3379 1067.3477 C 2020.0397 1068.0114 2019.0916 1070.0611 2019.0703 1072.123 C 2019.0563 1073.4977 2019.2823 1074.6486 2019.7285 1075.7988 L 2029.1094 1098.3574 C 2030.0046 1100.4289 2032.2864 1101.8236 2034.8066 1101.8496 C 2035.723 1101.8596 2036.6434 1101.6361 2037.5645 1101.1875 L 2062.1816 1090.9043 C 2064.4845 1089.7825 2065.6618 1087.5001 2065.6855 1085.209 C 2065.6995 1083.8344 2065.2533 1082.6854 2064.8066 1081.5352 L 2054.4512 1063.0938 C 2052.6491 1060.0965 2050.8321 1059.1642 2048.541 1059.1406 z "
+ d="m 1730.4785,-837.05078 c -83.1475,0.75549 -157.9407,42.15609 -205.5117,104.80273 -75.9683,-58.1793 -168.8928,-89.79361 -255.3789,-98.57031 -22.1267,-2.24543 -44.19,-3.22232 -66.0781,-3.02344 -54.3587,0.49392 -107.9734,8.02902 -159.3594,23.1836 l -109.21681,7.14648 8.11328,-0.30273 c -99.07879,0.90007 -161.7559,81.27027 -160.99023,165.53711 a 144.33101,144.33101 0 0 0 0.27344,7.66601 l 2.80469,45.00586 c -19.59791,-7.64153 -40.35219,-11.76916 -64.60157,-11.54883 a 144.33101,144.33101 0 0 0 -0.002,0 c -48.23356,0.43847 -97.9187,34.57221 -125.14453,63.08008 -28.33347,-41.22039 -80.90195,-83.33401 -148.40235,-82.7207 -27.26661,0.24772 -41.33118,5.49134 -44.42578,6.29492 a 144.33101,144.33101 0 0 0 -5.89453,1.66406 l -38.12304,11.64649 C 292.1706,-723.9482 159.18744,-808.58688 17.074219,-820.39844 c -13.300636,-1.10548 -26.8090128,-1.62816 -40.482422,-1.5039 -38.116388,0.34632 -75.171796,6.13185 -110.757817,15.80859 l -120.66406,-4.83398 a 144.33101,144.33101 0 0 0 -7.20312,-0.10743 l -1.46875,0.0137 c -0.006,5e-5 -0.0116,0.002 -0.0176,0.002 -87.28888,0.80233 -159.5052,66.26354 -158.64649,160.76367 l 0.125,-7.47266 -26.71679,625.220708 a 144.33101,144.33101 0 0 0 -0.125,7.472656 c 0.66916,73.681525 73.91494,154.236276 149.59765,159.851566 a 144.33101,144.33101 0 0 0 4.43946,0.25976 l 165.98242,7.18164 a 144.33101,144.33101 0 0 0 7.66406,0.12696 l 1.4668,-0.0137 c 0.006,-5e-5 0.0115,-0.002 0.0176,-0.002 94.535781,-0.8676 151.671804,-69.037106 158.167965,-148.4980462 a 144.33101,144.33101 0 0 0 0.369141,-6.1054688 l 0.566406,-14.46875 C 124.14012,-34.49812 203.3259,-64.098239 265.8125,-114.81055 l 22.67578,50.058597 -77.57422,117.40625 2.21485,-3.253906 c -9.3815,13.389755 -20.36245,32.421121 -26.80274,56.960939 L 40.839844,175.88086 c -51.335793,24.52903 -90.816935,73.36756 -103.689453,129.25391 a 144.33101,144.33101 0 0 0 -0.01367,0.0625 L -123.125,567.35352 c -0.001,0.006 -0.002,0.0131 -0.004,0.0195 -11.45646,49.71064 -1.76339,103.9792 25.996098,146.62109 3.37062,5.18568 6.985256,10.20987 10.839843,15.03906 a 144.33101,144.33101 0 0 0 0.335938,0.41797 l 169.123047,210.2793 a 144.33101,144.33101 0 0 0 0.0098,0.0117 c 35.827929,44.53676 92.196019,71.30371 148.994139,71.29691 a 144.33101,144.33101 0 0 0 0.0176,0 l 271.09766,-0.066 c 56.77757,0.037 113.13905,-26.67872 148.99218,-71.16801 a 144.33101,144.33101 0 0 0 0.11133,-0.13867 l 29.78125,-37.04688 c 8.57228,16.73361 19.58145,32.79758 33.5,46.47266 35.23487,34.6185 75.63519,47.25364 104.16602,52.9219 a 144.33101,144.33101 0 0 0 13.6875,2.0429 c 7.38229,0.742 8.2023,1.1086 3.58203,0.1563 a 144.33101,144.33101 0 0 0 10.87109,1.8105 c 45.27278,5.7751 90.53586,7.7528 135.19141,5.8887 138.32423,-5.7743 271.80743,-47.82283 376.36333,-134.42577 16.0478,-13.29237 31.1428,-27.94555 45.3789,-43.55664 76.5608,88.8861 195.2062,149.07147 336.7187,143.16406 a 144.33101,144.33101 0 0 0 0.074,-0.004 l 9.4004,-0.39648 c 0,-1.9e-4 0.01,-0.002 0.014,-0.002 5.3782,-0.22518 10.8078,-0.96482 16.25,-1.9336 0.1005,0.3625 0.2325,0.7306 0.3359,1.09375 a 144.33101,144.33101 0 0 0 0.2344,6.49414 l 1.8398,21.7891 -0.2832,-4.0235 c 0.1947,3.4546 0.6365,7.321 1.2813,11.4395 -0.047,1.3823 -0.144,2.984 -0.1563,4.1679 l -0.2187,21.1856 c -3.3022,12.2365 -5.0713,24.8394 -5.2012,37.416 a 144.33101,144.33101 0 0 0 0,0.019 c -0.4575,44.9226 12.8255,92.4996 69.2578,128.584 l -5.5039,-3.7011 27.9805,19.7597 a 144.33101,144.33101 0 0 0 7.7207,5.0899 c 32.4436,19.9266 62.5903,22.1357 78.1543,22.2968 a 144.33101,144.33101 0 0 0 0.023,0 c 11.0972,0.1131 22.3615,0.056 33.9844,-1.5117 2.0199,0.084 4.1137,0.3057 6.0977,0.3262 0.9208,0.011 10.2442,0.4888 23.9062,-1.5371 8.7479,1.5378 17.6012,2.4166 26.4668,2.5098 7.2384,0.076 14.343,-0.4666 21.2559,-1.4122 12.4805,2.3521 24.7066,3.0405 36.4961,3.1622 a 144.33101,144.33101 0 0 0 0.017,0 c 22.095,0.225 42.0364,0.069 64.959,-11.2481 5.8167,-0.1421 14.1613,-0.5675 24.6114,-2.543 a 144.33101,144.33101 0 0 0 2.3945,-0.4726 l 27.2031,-5.6211 c 20.0371,10.7703 42.5768,17.6526 71.4785,17.9512 a 144.33101,144.33101 0 0 0 0.01,0 c 7.8674,0.081 15.9785,-0.7785 24.1367,-2.0743 l -45.0117,-26.332 0.1953,-0.041 c 21.4693,11.5885 38.1696,15.3377 66.1797,15.625 a 144.33101,144.33101 0 0 0 0.012,0 c 3.6864,0.037 7.3475,-0.1 10.9863,-0.3613 l 3.877,1.08 c 1.4728,-0.6083 2.9254,-1.2934 4.3867,-1.9472 10.523,-1.3966 20.7768,-3.9386 30.582,-7.4746 l -11.8496,15.7656 c 6.6213,1.6987 17.2637,4.0508 34.5157,4.2285 a 144.33101,144.33101 0 0 0 0.01,0 c 10.7238,0.11 22.4494,-1.4562 34.4844,-4.5019 3.2912,0.3077 6.536,0.5636 9.4961,0.5957 31.3827,0.4487 32.3405,0.1153 1.8828,-0.1993 a 144.33101,144.33101 0 0 0 25.5,-2.0332 c 1.0639,0.2961 2.146,0.7231 3.207,1 l -1.832,-0.4922 31.9961,8.8008 a 144.33101,144.33101 0 0 0 8.4922,2.0625 c -2.7577,-0.5816 10.8788,3.3778 31.4785,3.5918 a 144.33101,144.33101 0 0 0 0.018,0 c 21.7371,0.2233 43.8739,-5.1141 64.3183,-14.5332 9.0949,1.8629 17.5881,2.7758 24.9278,2.8516 l -0.5723,-0.01 0.6855,0.01 a 144.33101,144.33101 0 0 0 10.3692,-0.2246 l 28.6914,-1.6543 24.4199,6.2226 a 144.33101,144.33101 0 0 0 5.8516,1.3614 c 5.1149,1.0788 11.9073,3.3852 31.959,3.5918 8.6955,0.09 17.3708,-0.8026 25.9336,-2.4805 4.3101,0.4555 8.493,0.7707 12.3515,0.8105 a 144.33101,144.33101 0 0 0 0.02,0 c 12.3864,0.1262 33.0973,-3.3529 50.6778,-8.7207 2.2546,0.3127 4.6898,0.5337 7.1133,0.7598 28.4132,12.2067 49.9946,12.2809 66.1113,12.4473 a 144.33101,144.33101 0 0 0 0.01,0 l 1.1387,0.012 a 144.33101,144.33101 0 0 0 1.5722,0.01 l 63.0118,-0.039 -1.5821,-0.01 c 23.8845,0.2471 53.2515,-4.602 80.8535,-16.0957 a 144.33101,144.33101 0 0 0 1,-0.4218 c 4.6598,-1.9816 9.6687,-4.8749 14.8477,-8.4747 39.4753,-12.6232 82.9367,-42.8738 100.3965,-80.2539 l -3.3457,6.7051 12.8515,-24.1582 a 144.33101,144.33101 0 0 0 1.0079,-1.9297 c 9.1941,-17.93 16.3961,-47.0175 16.6074,-67.3203 0.1455,-13.9754 -0.9366,-28.2431 -4.0235,-42.2949 0.037,-21.26568 0.029,-21.30177 -0.1445,-0.6387 -0.2124,-0.9469 -0.4069,-1.8952 -0.6387,-2.8398 a 144.33101,144.33101 0 0 0 -1.7578,-13.1094 l -1.6484,-9.10157 c 2.612,-10.11155 4.1624,-20.06046 4.6191,-29.51562 10.7853,79.66689 75.9988,140.91889 164.4473,137.22659 l -7.9277,0.1133 158.2382,2.0918 a 144.33101,144.33101 0 0 0 7.9278,-0.1133 c 73.5476,-3.0702 151.7409,-78.9099 154.8828,-154.72855 a 144.33101,144.33101 0 0 0 0.1152,-4.46679 l 0.4981,-47.59571 c 71.2766,-9.14894 138.8377,-34.35099 194.8847,-76.27148 14.7495,17.72093 33.6716,34.74086 55.2774,44.8789 41.0084,19.24231 69.7611,16.70419 87.1914,15.97657 a 144.33101,144.33101 0 0 0 0.1035,-0.004 l 8.5898,-0.36523 c 75.8448,-3.16613 152.6556,-21.32021 225.5118,-61.63282 72.8562,-40.3126 158.7201,-123.0804 153.7324,-242.56054 -1.9668,-47.11314 -17.0463,-88.71564 -39.9238,-125.91407 15.428,-26.16362 25.9761,-56.66494 24.8437,-83.79101 a 144.33101,144.33101 0 0 0 0,-0.008 c -0.104,-2.48825 -4.1332,-43.31418 -19.832,-71.6836 l 5.9824,12.11719 -39.3379,-90.07617 a 144.33101,144.33101 0 0 0 -0.049,-0.11328 c -8.1932,-18.71694 -29.6091,-53.91142 -64.0528,-75.61719 -13.7987,-8.6957 -27.0473,-14.35297 -39.3027,-18.19141 4.0579,-12.77718 6.8505,-26.093192 7.834,-39.914059 1.0961,-15.402666 -0.1068,-30.506448 -2.9512,-45.136719 4.9126,-22.698251 9.4352,-49.248229 11.5508,-78.978515 1.6142,-22.683871 5.4927,-34.294684 -2.7949,-72.859377 -4.1438,-19.28234 -15.1225,-55.87916 -52.0606,-85.96094 -36.9381,-30.08177 -78.7552,-32.57607 -83.7519,-32.93164 a 144.33101,144.33101 0 0 0 -0.012,0 l -48.9024,-3.47656 h -0.012 c -9.5396,-0.67799 -18.9021,-0.21676 -28.0547,1.05469 -10.4304,-3.14364 -21.6457,-5.28953 -34.0449,-6.17188 a 144.33101,144.33101 0 0 0 -0.2715,-0.0176 l -0.4492,-0.0312 a 144.33101,144.33101 0 0 0 -7.3086,-0.25391 c -22.0584,-12.62646 -45.934,-19.38547 -65.5762,-20.7832 a 144.33101,144.33101 0 0 0 -9.7812,-0.34766 144.33101,144.33101 0 0 0 -0.4629,-0.0156 144.33101,144.33101 0 0 0 -1.418,-0.0488 l -45.2695,0.23047 0.6894,-0.002 c -16.7208,0.005 -35.1872,3.96274 -53.2949,11.38477 -21.0339,-11.7519 -42.1756,-16.24753 -61.1504,-17.59766 -10.9859,-0.78162 -21.8289,-1.71617 -32.8301,-1.33398 -0.9776,-0.0805 -1.8978,-0.22064 -2.8867,-0.29102 h -0 c -7.5457,-0.53688 -15.2334,-0.32393 -22.9434,0.32031 -2.0609,-0.35176 -4.1141,-0.76381 -6.1855,-1.02734 l 0.2675,0.0332 -75.3339,-9.72656 a 144.33101,144.33101 0 0 0 -9.3497,-0.8789 c -7.646,-0.51922 -16.7578,-0.28823 -26.6074,0.85156 -11.4733,-3.54197 -22.5622,-5.74262 -32.5195,-6.45117 l -2.0332,-0.15235 a 144.33101,144.33101 0 0 0 -9.3867,-0.39258 l -63.1289,-0.58593 a 144.33101,144.33101 0 0 0 -0.6914,-0.004 c -0.6216,-0.003 -1.3631,0.0693 -2.002,0.0762 -11.3971,-3.28831 -22.3487,-5.34853 -32.0527,-6.03906 a 144.33101,144.33101 0 0 0 -0.4883,-0.0332 l -2.7383,-0.18555 a 144.33101,144.33101 0 0 0 -9.0254,-0.32813 l -55.5664,-0.28125 1.0469,0.01 c -27.0194,-0.33277 -72.9581,8.2393 -108.2481,41.0625 -2.2361,2.07979 -4.3682,4.19181 -6.4062,6.33008 -29.3647,-40.369 -72.4471,-64.38484 -121.7559,-67.6836 -50.7996,-129.17668 -101.5994,-258.35225 -152.3965,-387.52929 l -0.014,-0.0352 c -24.5969,-62.56285 -74.3111,-100.40742 -137.6367,-110.65625 a 144.33101,144.33101 0 0 0 -0.01,0 c -9.0655,-1.46698 -18.4599,-2.25611 -28.0039,-2.25976 -0.023,-10e-6 -0.047,-10e-6 -0.07,0 h -0.055 l -157.5293,0.002 c -105.1838,-0.001 -178.0684,72.86978 -178.0684,178.06641 v 75.64062 c 0,66.06812 28.7731,119.36514 76.2286,149.89063 -46.9847,75.86692 -93.968,151.73373 -140.9532,227.60156 -3.9674,-37.72517 -16.3874,-72.07425 -34.3515,-103.53321 16.2734,-25.64882 27.8089,-55.79217 27.5625,-82.9375 a 144.33101,144.33101 0 0 0 0,-0.0293 c -0.021,-2.26138 -2.6512,-43.28614 -17.4766,-72.27149 l 5.584,12.30469 -36.377,-91.31055 a 144.33101,144.33101 0 0 0 -0.045,-0.11328 c -7.5815,-18.98337 -27.8403,-54.85322 -61.5508,-77.66797 -33.7105,-22.81475 -64.9272,-27.1691 -84.6152,-28.96679 -13.1342,-1.19927 -23.4165,-1.22509 -33.5723,-1.13282 -56.7367,0.51553 -114.0031,9.41315 -169.9824,30.4043 -10.5563,-115.03477 -96.7056,-210.52206 -209.2422,-232.5957 -17.0417,-3.3427 -34.6548,-5.01149 -52.4707,-4.84961 z m -1764.005844,367.07226 30.0761721,48.50782 -45.1699221,55.85742 c -0.656997,-0.0258 -1.281003,-0.0312 -2.269531,-0.19141 -10.172617,-1.64888 -38.708746,-30.70035 -38.880859,-49.64258 0.0251,2.76227 -2.557402,-3.55614 4.099609,-17.24023 6.468384,-13.29635 46.786725,-35.97824 52.144531,-37.29102 z m 3619.349644,188.61524 0.8242,0.0527 a 144.33101,144.33101 0 0 0 -0.1309,-0.0117 z m -262.1524,61.1543 c -14.7359,22.34122 -21.7684,45.90855 -24.5566,64.4082 -3.2533,2.40863 -6.4333,4.92033 -9.4375,7.64453 -2.3678,2.14709 -4.387,4.36443 -6.5274,6.55859 l 14.4063,0.73829 -2.3789,31.01171 c -0.214,0.14943 -0.4224,0.27083 -0.6367,0.42188 -1.355,0.95489 -2.6051,1.9959 -3.9082,2.99414 -0.4326,-1.58075 -0.7101,-3.13858 -1.1817,-4.72461 a 144.33101,144.33101 0 0 0 -0,-0.0137 c -2.8067,-9.43662 -5.6118,-18.86375 -8.418,-28.29688 -10.5219,11.2215 -18.2701,22.85359 -23.9257,34.08985 l 3.0566,-37.39649 20.1934,1.03321 c -4.4502,-14.95925 -8.9022,-29.922 -13.3496,-44.875 a 144.33101,144.33101 0 0 0 -0.012,-0.0508 c -1.5206,-5.10868 -3.3127,-9.97919 -5.1367,-14.81835 l 1.6875,-18.5879 z m -1098.6621,7.08203 c -0.9028,0.1138 -0.9028,0.1138 0,0 z m 1160.6582,3.08203 22.9199,24.95703 -1.1328,-0.14063 a 144.33101,144.33101 0 0 0 -7.9199,-0.75781 h -0 c -12.5303,-0.89116 -28.2769,0.66705 -44.6621,4.73633 l 1.5293,-28.56641 z m -85.2871,71.85937 52.0977,1.60743 0.078,-1.46875 35.9531,1.83984 2.8711,0.17578 c -6.2115,-0.44201 -15.4006,-1.14451 -26.7812,-0.17383 l 62.0449,1.91406 -0.9082,6.0918 a 144.33101,144.33101 0 0 0 -0.8457,7.83789 c -1.7772,7.36739 -2.8693,13.90313 -3.4395,19.38477 -7.8424,15.62318 -13.1215,33.969855 -14.7597,56.919919 -3e-4,0.0039 2e-4,0.0078 0,0.01172 -0.9714,13.608317 0.2447,27.282817 3.1816,40.5683595 l -4.709,4.22460937 C 3392.7428,-8.4025677 3381.6922,-19.06338 3373.9043,-30.839844 c -22.4773,-33.989117 -23.9964,-64.168149 -22.5234,-84.865236 a 144.33101,144.33101 0 0 0 -0.1563,2.5293 l 1.1445,-21.36914 c -15.485,2.83226 -33.851,9.17734 -53.8476,22.47265 z m 586.0918,18.91602 0.6875,0.82226 c -0.031,0.12822 -0.061,0.2565 -0.092,0.38477 -0.1844,-0.25204 -0.3628,-0.49202 -0.5469,-0.74023 -0.016,-0.15573 -0.032,-0.31108 -0.049,-0.4668 z m -461.9805,2.56445 c -5e-4,0.007 5e-4,0.0162 0,0.0234 a 144.33101,144.33101 0 0 0 -0,0.041 z m 221.1426,47.169924 c -2.8896,10.087626 -5.7673,41.489875 -5.4316,30.970703 l -0.9883,23.583984 0.2363,-4.199218 c -0.2595,3.646954 -0.5044,8.875324 -0.4082,15.0273433 l -15.4375,0.5390624 0.7168,-6.1171875 a 144.33101,144.33101 0 0 0 0.6445,-6.9511722 l 0.037,-0.529296 c 3e-4,-0.0049 -4e-4,-0.01266 0,-0.01758 0.2681,-3.777377 0.1785,-8.982958 -0.1641,-14.742187 z m 234.8965,9.11914 1.3809,1.646485 c -0.026,0.791867 -0.038,1.559478 -0.062,2.351562 -0.5512,-1.022229 -1.064,-2.046009 -1.6465,-3.066406 0.102,-0.318714 0.2279,-0.610915 0.3281,-0.931641 z m -585.1992,38.490235 c 0.439,1.984982 0.9854,3.977456 1.5019,5.986328 -0.7572,-0.679996 -1.6018,-1.308827 -2.3398,-1.998047 0.2761,-1.331645 0.5933,-2.644837 0.8379,-3.988281 z m -955.2969,17.4667966 c 3.7009,18.0557644 10.3233,35.9689994 20.0352,53.4062504 26.7561,48.038529 68.5396,78.508584 119.582,88.125004 -19.6783,24.19504 -37.0422,50.94262 -51.5586,80.29687 l -51.7832,-13.50977 8.5625,2.51954 c -22.662,-7.43574 -49.2009,-10.31004 -68.5117,-9.50391 -34.3714,1.43481 -76.3998,22.46052 -108.1035,50.60742 -33.7118,-25.96737 -77.684,-42.05646 -115.25,-40.48828 -32.9645,1.37612 -37.5665,5.80514 -46.6895,8.64063 -9.123,2.83548 -16.7235,5.62656 -24.5859,8.63281 -15.7249,6.0125 -31.9363,12.86408 -48.0664,19.90234 -24.5362,10.70614 -44.3051,19.81935 -61.0703,27.89453 -44.5957,-29.46067 -99.0766,-51.0623 -160.5684,-55.77148 -8.3952,-0.64292 -16.9129,-1.03544 -25.543,-1.17188 -8.603,-0.13598 -17.3145,-0.0203 -26.1289,0.34766 -84.7724,3.53881 -162.1008,28.21584 -224.207,68.58203 -33.0095,-73.1082 -84.7255,-128.76903 -145.0762,-168.86719 66.8768,-19.92894 129.7388,-50.664476 185.2266,-93.650387 5.7426,-4.448772 11.3391,-9.125286 16.8828,-13.8730468 19.437,60.8931678 79.1555,117.3912238 154.6699,116.7050738 a 144.33101,144.33101 0 0 0 0.1152,-0.002 l 1.5821,-0.0156 a 144.33101,144.33101 0 0 0 7.0918,-0.24414 l 157.9375,-9.33789 a 144.33101,144.33101 0 0 0 7.1465,-0.59961 c 14.3625,-1.56808 27.9345,-4.62148 40.6894,-8.89063 3.8406,2.51369 7.7621,4.88004 11.8145,6.94336 40.3503,20.54501 69.1306,18.94216 86.5586,18.7832 l 8.6894,-0.0781 a 144.33101,144.33101 0 0 0 0.014,0 c 75.907,-0.68971 153.2708,-16.32732 227.4043,-54.240236 34.8333,-17.814239 72.7424,-45.022981 103.1406,-81.1425784 z m -1511.375,4.14062502 c 6.92574,21.20155238 17.4014,42.65470638 32.23633,61.33398438 -0.13374,0.04412 -0.26473,0.0964 -0.39844,0.140625 l -81.26562,7.982422 C 797.00874,44.704124 813.42718,21.603885 828.6582,-0.31835938 Z M 358.14258,40.679687 c -0.0366,0.0018 -0.0727,0.0099 -0.10938,0.01172 -0.0462,0.0023 -0.0925,-4.23e-4 -0.13867,0.002 z M 4213.8848,59.490234 c -0.081,0.33138 -0.1166,0.44987 -0.053,0.177735 0.014,-0.05825 0.039,-0.119523 0.053,-0.177735 z m -597.5215,24.31836 c 6.129,7.55955 12.8912,14.317567 20.0586,20.443356 l -3.7227,1.34766 -16.3847,-21.63086 c 0.018,-0.0547 0.031,-0.105511 0.049,-0.160156 z m -11.5352,25.708986 -0.3672,6.30859 -4.7031,1.70117 c 1.7913,-2.69228 3.5475,-5.35825 5.0703,-8.00976 z m 58.8262,4.28711 c 2.818,4.32407 5.8605,8.4485 9.0254,12.43945 l -3.1973,-0.22851 c 1.5508,0.76005 3.1368,1.41981 4.7071,2.12695 1.3631,1.66622 2.758,3.28534 4.1777,4.88086 1.3993,3.20987 2.7723,6.43072 4.3828,9.55664 l -0.3906,0.28125 c -5.7622,-1.28547 -11.5507,-2.45499 -17.3653,-3.49414 l -4.3027,-2.24805 1.0293,-11.6582 -5.4941,-0.39453 a 144.33101,144.33101 0 0 0 0.5742,-1.31446 c 0.5331,-1.25869 1.1582,-2.5127 1.7246,-3.74218 1.1619,0.68795 2.322,1.37683 3.498,2.0332 l 0.6719,-7.5957 c 0.3165,-0.20342 0.6415,-0.43548 0.959,-0.64258 z m 216.2012,18.37695 c 1.6464,4.31367 3.3641,8.59167 5.334,12.75391 l -21.6231,17.66406 c 6.3862,-9.49249 11.922,-19.75324 16.2891,-30.41797 z m -1396.6231,99.57031 c 0.4095,0.10506 0.098,0.0339 0,0 z m -586.1484,47.75977 c -0.045,0.0228 -0.1,0.0592 -0.1445,0.082 -0.071,0.0361 -0.1873,0.087 -0.2579,0.12305 z m -410.6563,29.25 c 0.04,0.10807 0.085,0.23307 0.066,0.1875 -0.023,-0.0626 -0.043,-0.12488 -0.066,-0.1875 z m 1390.3828,104.30469 c 1.2331,0.0371 5.2592,0.0853 6.0391,0.0723 2.0814,4.75698 5.6689,15.22917 6.0879,25.26563 0.4955,11.86947 -2.4326,20.47642 -4.0937,24.19922 -2.5389,0.44572 -11.9676,1.6121 -13.0157,-23.49415 -0.3545,-8.49179 3.3673,-21.95678 4.9824,-26.04296 z m 698.2911,53.65429 c 3.1035,0.0132 7.4509,-0.62754 2.0156,0.0234 0.1203,0.10513 0.053,0.15576 0.4629,0.33984 l 32.4414,50.85547 -42.6055,58.66407 c -0.6122,0.0541 -0.4997,0.0825 -1.6113,0.1289 -1.2879,0.0538 -3.1061,0.0148 -5.3203,-0.28515 -15.2569,-2.06667 -44.0734,-33.81485 -44.7305,-49.55469 0.061,1.46503 17.0621,-41.65647 33.9141,-51.86328 12.6389,-7.65511 22.5702,-8.44628 25.4336,-8.3086 z m -1233.8067,8.57617 c 2.7206,4.09266 0.8445,0.89518 7.3516,14.5625 -2.4505,-4.85416 -9.8021,-19.41666 -7.3516,-14.5625 z m 1869.1836,54.77344 c -0.8986,0.14323 -0.8986,0.14323 0,0 z m -2640.289,171.95508 c 0.1616,0.42506 0.4898,1.17729 0.664,1.63477 0.2659,0.65243 0.5043,1.34305 0.7715,1.99218 z m 1416.9648,49.26758 c -0.188,-0.0267 -0.4589,0.0355 1.8926,0.0312 -0.094,-0.001 -0.1888,-0.0204 -0.2832,-0.0215 a 144.33101,144.33101 0 0 0 -1.6094,-0.01 z m 39.9238,4.75586 c 0.029,0 0.046,0.001 0.025,0.002 -0.01,-9e-5 -0.017,-0.002 -0.025,-0.002 z m -418.9824,4.03711 c -3.5053,0.79717 -7.0362,1.775 -10.6055,2.85351 -8.5018,-1.43245 -16.2841,-2.09142 -22.7539,-2.1582 a 144.33101,144.33101 0 0 0 -4.2304,0.0176 z m 573.4844,54.46679 -1.0664,120.33204 a 144.33101,144.33101 0 0 0 -0.5957,-3.60743 l -1.7461,-9.7832 v 0.0723 c 4e-4,-0.0302 -0,-0.0539 -0,-0.084 l -0.018,-0.10547 c 0,-0.0712 0.013,-0.14366 0.014,-0.21484 0.4146,-33.10888 -7.091,-47.19052 -7.3262,-47.9043 -2e-4,-6.9e-4 -0.01,-0.011 -0.01,-0.0117 l -4.4707,-14.12304 a 144.33101,144.33101 0 0 0 -0.2051,-0.64453 c -2.6656,-8.28323 -6.6824,-16.48506 -11.5879,-24.46875 9.1469,-6.15862 18.1279,-12.7012 27.0098,-19.45704 z m -1247.5176,4.26758 3.4609,0.0352 c -1.218,0.43093 -2.369,0.75837 -3.6054,1.22461 z m 60.8848,85.97266 a 144.33101,144.33101 0 0 0 0.01,0.64844 c -0,0.0987 -0.022,0.22011 -0.024,0.31836 z m -72.3672,15.8789 c -0.051,0.22006 -0.7214,4.73568 -1.0059,6.77344 l 0.791,-6.55078 z m -84.8418,196.75393 c 5.9627,3.8447 11.8519,6.9835 17.666,9.6777 5.7893,3.8873 11.4026,7.02 16.8867,9.7383 l -32.1055,-0.3848 -1.9531,-4.0273 z m -45.7891,6.1523 c 3.7104,6.0547 8.1196,12.1298 13.1778,18.1524 l -12.5332,0.086 z m 46.3008,9.4082 3.166,8.4922 -2.8867,0.022 z m 39.8672,2.5391 c 2.0141,0.5497 3.9669,1.0128 5.9101,1.457 l -5.8769,-0.07 z m 0.094,3.9551 c 1.2819,0.561 2.5963,1.2129 3.8555,1.7187 l -3.8125,0.025 z m 271.1172,97.3359 c 0.144,0.012 -0.2571,-0 0,0 z"
+ transform="matrix(0.16804071,-0.01557768,0.01557768,0.16804071,337.47178,321.53033)" /><rect
+ style="fill:#ffffff;fill-opacity:1"
+ id="rect18"
+ width="64.893661"
+ height="34.452858"
+ x="303.07202"
+ y="235.43674" /><rect
+ style="fill:#ffffff;fill-opacity:1"
+ id="rect19"
+ width="75.696289"
+ height="56.726116"
+ x="909.2489"
+ y="323.35361" /><rect
+ style="fill:#ffffff;fill-opacity:1"
+ id="rect20"
+ width="88.605354"
+ height="34.747921"
+ x="864.74744"
+ y="229.8428" /><rect
+ style="fill:#ffffff;fill-opacity:1"
+ id="rect21"
+ width="63.463417"
+ height="23.2691"
+ x="655.00183"
+ y="461.89041" /><rect
+ style="fill:#ffffff;fill-opacity:1"
+ id="rect22"
+ width="16.265421"
+ height="13.363955"
+ x="738.75909"
+ y="480.62289" /></g><g
+ id="g12"><g
+ id="g3052"
+ transform="matrix(0.16804071,-0.01557768,0.01557768,0.16804071,328.84061,328.79643)"><path
+ style="fill:#326ce5;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 365.3125,184.8125 a 46.724621,46.342246 0 0 0 -17.90625,4.53125 l -244.34375,116.75 a 46.724621,46.342246 0 0 0 -25.28125,31.4375 L 17.5,599.78125 A 46.724621,46.342246 0 0 0 23.84375,635.3125 46.724621,46.342246 0 0 0 26.5,639 l 169.125,210.28125 a 46.724621,46.342246 0 0 0 36.53125,17.4375 L 503.375,866.65625 A 46.724621,46.342246 0 0 0 539.90625,849.25 L 708.96875,638.9375 A 46.724621,46.342246 0 0 0 718,599.71875 l -60.375,-262.25 a 46.724621,46.342246 0 0 0 -25.28125,-31.4375 l -244.375,-116.6875 A 46.724621,46.342246 0 0 0 365.3125,184.8125 Z"
+ id="path3055"
+ inkscape:connector-curvature="0"
+ inkscape:export-filename="new.png"
+ inkscape:export-xdpi="250.55"
+ inkscape:export-ydpi="250.55" /><path
+ inkscape:connector-curvature="0"
+ id="path3059"
+ d="m 367.73366,274.05962 c -8.07696,8.2e-4 -14.62596,7.27591 -14.625,16.25 1e-5,0.13773 0.0282,0.26934 0.0312,0.40625 -0.0119,1.21936 -0.0708,2.68836 -0.0312,3.75 0.19262,5.176 1.3209,9.13749 2,13.90625 1.23028,10.20666 2.26117,18.66736 1.625,26.53125 -0.61869,2.9654 -2.80288,5.67741 -4.75,7.5625 l -0.34375,6.1875 c -8.77682,0.72717 -17.61235,2.05874 -26.4375,4.0625 -37.97461,8.62218 -70.67008,28.18307 -95.5625,54.59375 -1.61522,-1.10193 -4.44103,-3.12914 -5.2813,-3.75 -2.61117,0.35262 -5.25021,1.15829 -8.6875,-0.84375 -6.54491,-4.40563 -12.50587,-10.48693 -19.71875,-17.8125 -3.30498,-3.50419 -5.69832,-6.84101 -9.625,-10.21875 -0.89172,-0.76707 -2.25258,-1.80455 -3.25,-2.59375 -3.06988,-2.44757 -6.6907,-3.72402 -10.1875,-3.84375 -4.49589,-0.15394 -8.82394,1.60385 -11.65625,5.15625 -5.03521,6.31538 -3.42312,15.96805 3.59375,21.5625 0.0712,0.0567 0.14702,0.10078 0.21875,0.15625 0.96422,0.78162 2.14496,1.78313 3.03125,2.4375 4.16687,3.07655 7.9732,4.65145 12.125,7.09375 8.747,5.40181 15.99837,9.88086 21.75,15.28125 2.24602,2.39417 2.63858,6.61292 2.9375,8.4375 l 4.6875,4.1875 c -25.09342,37.76368 -36.70686,84.40946 -29.8437,131.9375 l -6.125,1.78125 c -1.6143,2.08461 -3.89541,5.36474 -6.2813,6.34375 -7.52513,2.37021 -15.99424,3.24059 -26.21875,4.3125 -4.80031,0.39915 -8.94218,0.16095 -14.03125,1.125 -1.12008,0.21218 -2.68072,0.61877 -3.90625,0.90625 -0.0426,0.009 -0.0824,0.0216 -0.125,0.0312 -0.0668,0.0155 -0.15456,0.0479 -0.21875,0.0625 -8.62014,2.08279 -14.15774,10.006 -12.375,17.8125 1.78316,7.80833 10.20314,12.55677 18.875,10.6875 0.0626,-0.0143 0.1535,-0.0167 0.21875,-0.0312 0.0979,-0.0224 0.18409,-0.0699 0.28125,-0.0937 1.20885,-0.26536 2.72377,-0.5606 3.78125,-0.84375 5.00334,-1.33963 8.62694,-3.30796 13.125,-5.03125 9.67694,-3.47077 17.69173,-6.37022 25.5,-7.5 3.26118,-0.25542 6.69711,2.01216 8.40625,2.96875 l 6.375,-1.09375 c 14.67018,45.48282 45.41416,82.24502 84.34375,105.3125 l -2.65625,6.375 c 0.95742,2.47542 2.01341,5.8247 1.30022,8.26932 -2.83868,7.3612 -7.70097,15.13097 -13.23772,23.79318 -2.68085,4.00192 -5.42453,7.10761 -7.84375,11.6875 -0.5789,1.09589 -1.31618,2.77932 -1.875,3.9375 -3.75884,8.04236 -1.00164,17.3052 6.21875,20.78125 7.26575,3.49788 16.28447,-0.19134 20.1875,-8.25 0.006,-0.0114 0.0257,-0.0198 0.0312,-0.0312 0.004,-0.009 -0.004,-0.0225 0,-0.0312 0.55593,-1.14255 1.34353,-2.64437 1.8125,-3.71875 2.07213,-4.74702 2.76161,-8.81506 4.21875,-13.40625 3.86962,-9.72014 5.99567,-19.91903 11.32258,-26.27411 1.45868,-1.74023 3.83681,-2.4095 6.30242,-3.06964 l 3.3125,-6 c 33.93824,13.0268 71.92666,16.52246 109.875,7.90625 8.65697,-1.96557 17.01444,-4.50945 25.09375,-7.5625 0.93098,1.65133 2.66113,4.8257 3.125,5.625 2.50559,0.81518 5.24044,1.23614 7.46875,4.53125 3.98539,6.80898 6.7109,14.86416 10.03125,24.59375 1.45738,4.59111 2.17762,8.65933 4.25,13.40625 0.47234,1.08195 1.256,2.60486 1.8125,3.75 3.89482,8.08484 12.94212,11.78667 20.21875,8.28125 7.2195,-3.4779 9.97974,-12.7399 6.21875,-20.78125 -0.55889,-1.15814 -1.3273,-2.84164 -1.90625,-3.9375 -2.41946,-4.57976 -5.1627,-7.65448 -7.84375,-11.65625 -5.53721,-8.66192 -10.12968,-15.8577 -12.96875,-23.21875 -1.18711,-3.79657 0.20028,-6.15774 1.125,-8.625 -0.55378,-0.63477 -1.73881,-4.22009 -2.4375,-5.90625 40.4574,-23.88816 70.29856,-62.02129 84.3125,-106.0625 1.8924,0.29742 5.18154,0.87936 6.25,1.09375 2.19954,-1.4507 4.22194,-3.34352 8.1875,-3.03125 7.80832,1.12937 15.82288,4.02973 25.5,7.5 4.49815,1.72306 8.1216,3.72313 13.125,5.0625 1.05749,0.28309 2.57238,0.5472 3.78125,0.8125 0.0972,0.0238 0.1833,0.0714 0.28125,0.0937 0.0653,0.0146 0.15615,0.0169 0.21875,0.0312 8.67236,1.86695 17.09384,-2.87871 18.875,-10.6875 1.78074,-7.80696 -3.7543,-15.73201 -12.375,-17.8125 -1.25393,-0.28513 -3.03225,-0.76938 -4.25,-1 -5.08912,-0.96378 -9.23092,-0.7261 -14.03125,-1.125 -10.22456,-1.07138 -18.6935,-1.94269 -26.21875,-4.3125 -3.06826,-1.19028 -5.25103,-4.84124 -6.31255,-6.34375 l -5.90625,-1.71875 c 3.06226,-22.15442 2.23655,-45.21134 -3.0625,-68.28125 -5.34839,-23.28471 -14.80037,-44.58084 -27.40625,-63.34375 1.51505,-1.37729 4.37619,-3.91091 5.1875,-4.65625 0.23716,-2.62417 0.0334,-5.37553 2.75,-8.28125 5.75134,-5.40069 13.00329,-9.87898 21.75,-15.28125 4.15167,-2.44252 7.98954,-4.01698 12.15625,-7.09375 0.94225,-0.69576 2.2289,-1.79759 3.21875,-2.59375 7.01538,-5.59633 8.63058,-15.24842 3.59375,-21.5625 -5.03683,-6.31408 -14.79712,-6.90883 -21.8125,-1.3125 -0.99856,0.79085 -2.35353,1.82252 -3.25,2.59375 -3.9265,3.37796 -6.35145,6.71439 -9.65625,10.21875 -7.21249,7.32595 -13.17407,13.43777 -19.71875,17.84375 -2.83601,1.65106 -6.98996,1.07978 -8.87505,0.96875 l -5.5625,3.96875 c -31.7188,-33.26057 -74.90466,-54.52546 -121.40605,-58.6563 -0.13006,-1.94872 -0.30045,-5.47117 -0.34375,-6.53125 -1.90371,-1.82165 -4.20342,-3.37686 -4.78125,-7.3125 -0.63617,-7.86389 0.42597,-16.32459 1.65625,-26.53125 0.6791,-4.76876 1.80738,-8.73025 2,-13.90625 0.0438,-1.17663 -0.0265,-2.88401 -0.0312,-4.15625 -9.6e-4,-8.97409 -6.54804,-16.25082 -14.625,-16.25 z m -18.3125,113.4375 -4.34375,76.71875 -0.3125,0.15625 c -0.29134,6.86335 -5.93996,12.34375 -12.875,12.34375 -2.84081,0 -5.46294,-0.91229 -7.59375,-2.46875 l -0.125,0.0625 -62.90625,-44.59375 c 19.33365,-19.01115 44.06291,-33.06039 72.5625,-39.53125 5.20599,-1.18203 10.40966,-2.0591 15.59375,-2.6875 z m 36.65625,0 c 33.27347,4.09232 64.04501,19.15882 87.625,42.25 l -62.5,44.3125 -0.21875,-0.0937 c -5.54745,4.05169 -13.36343,3.04639 -17.6875,-2.375 -1.77132,-2.22096 -2.70072,-4.83239 -2.8125,-7.46875 l -0.0625,-0.0312 z m -147.625,70.875 57.4375,51.375 -0.0625,0.3125 c 5.18437,4.50697 5.94888,12.32794 1.625,17.75 -1.7712,2.22105 -4.14208,3.71074 -6.6875,4.40625 l -0.0625,0.25 -73.625,21.25 c -3.74728,-34.26517 4.32855,-67.57364 21.375,-95.34375 z m 258.15625,0.0312 c 8.5341,13.83256 14.99655,29.28214 18.84375,46.03125 3.80106,16.54828 4.75499,33.06697 3.1875,49.03125 l -74,-21.3125 -0.0625,-0.3125 c -6.6265,-1.81104 -10.69893,-8.55162 -9.15625,-15.3125 0.63203,-2.76962 2.10222,-5.11264 4.09375,-6.84375 l -0.0312,-0.15625 57.125,-51.125 z m -140.65625,55.3125 h 23.53125 l 14.625,18.28125 -5.25,22.8125 -21.125,10.15625 -21.1875,-10.1875 -5.25,-22.8125 z m 75.4375,62.5625 c 0.99997,-0.0505 1.99558,0.0396 2.96875,0.21875 l 0.125,-0.15625 76.15625,12.875 c -11.1455,31.3131 -32.47281,58.44018 -60.96875,76.59375 l -29.5625,-71.40625 0.0937,-0.125 c -2.71561,-6.30999 0.002,-13.70956 6.25,-16.71875 1.59965,-0.77041 3.27089,-1.19701 4.9375,-1.28125 z m -127.90625,0.3125 c 5.81174,0.0815 11.02462,4.11525 12.375,10.03125 0.63219,2.76958 0.3245,5.51375 -0.71875,7.9375 l 0.21875,0.28125 -29.25,70.6875 c -27.34716,-17.5486 -49.12927,-43.82403 -60.78125,-76.06245 l 75.5,-12.8125 0.125,0.15625 c 0.84451,-0.15541 1.701,-0.2304 2.53125,-0.21875 z m 63.78125,30.9688 c 2.02445,-0.0744 4.07865,0.34098 6.03125,1.28125 2.55951,1.23253 4.53673,3.17319 5.78125,5.5 h 0.28125 l 37.21875,67.25 c -4.83029,1.61923 -9.79609,3.00308 -14.875,4.15625 -28.46453,6.4629 -56.83862,4.50467 -82.53125,-4.25 l 37.125,-67.125 h 0.0625 c 2.22767,-4.16441 6.45247,-6.64887 10.90625,-6.8125 z"
+ style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0.25;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker:none;enable-background:accumulate"
+ sodipodi:nodetypes="ccccccccsccccscssccsccccccccscccsccccccccccccccscccscsccsccccscscsccccccccscccscsccccsccccscscscccccccccccccccscccsccccccccccccscccccscccccccccccccccccccccccscccscccccccccscccscccc"
+ inkscape:export-filename="./path3059.png"
+ inkscape:export-xdpi="250.55"
+ inkscape:export-ydpi="250.55" /></g><path
+ style="font-size:133.333px;font-family:'FOT-Yuruka Std';-inkscape-font-specification:'FOT-Yuruka Std, Normal';text-align:center;text-anchor:middle;white-space:pre;fill:url(#linearGradient25)"
+ d="m 856.95702,567.15405 c 1.33333,0 2.53333,-1.2 2.66666,-2.66666 l 1.33333,-27.59993 c 5.06666,1.46666 10.53331,2.26666 16.1333,2.26666 27.73326,0 44.53322,-17.19995 44.53322,-41.86656 0,-25.73327 -22.26661,-43.99989 -46.93322,-43.99989 -5.19998,0 -10.5333,0.93334 -15.86662,2.66666 l -24.39994,-1.19999 h -0.26667 c -1.46666,0 -2.66666,1.19999 -2.66666,2.53332 l -5.46665,105.4664 c 0,1.6 1.06666,2.79999 2.66666,2.93333 l 27.99993,1.46666 z m 6.79999,-84.79978 c 2.13333,-0.53334 4.26665,-0.8 6.13332,-0.8 9.86664,0 17.33328,6.53332 17.33328,15.86662 0,0.93334 0,15.19997 -14.66663,15.19997 -3.59999,0 -7.33331,-0.93333 -10.26664,-2.26666 z m 90.53311,121.59969 c 0.93333,0.39999 1.73333,0.53333 2.39999,0.53333 1.6,0 2.79999,-0.8 4.13332,-2.26666 54.53317,-66.2665 64.66647,-93.59976 64.66647,-95.59976 0,-1.2 -0.8,-2.13333 -2.4,-2.93332 l -19.8666,-10.26664 c -1.3333,-0.8 -2.5333,-1.06667 -3.3333,-1.06667 -1.46666,0 -2.39999,0.8 -3.19999,2.13333 -6.53332,10.26664 -14.1333,22.13328 -21.99995,33.99991 l -15.86662,-35.86657 c -0.93333,-2.26666 -2.66666,-3.99999 -5.06666,-3.99999 -0.53333,0 -1.06666,0.13333 -1.59999,0.26666 l -21.19995,6.26665 c -1.99999,0.53334 -3.59999,1.73333 -3.59999,3.59999 0,0.66667 0.26667,1.46667 0.66667,2.4 l 24.93327,56.39985 c 0.4,0.8 0.66666,1.46667 1.06666,1.86667 l -20.93328,31.06658 c -0.66666,0.93333 -1.06666,1.86667 -1.06666,2.8 0,1.33333 0.93333,2.39999 2.93332,3.19999 z m 85.59968,-45.06656 c 0.2667,5.06666 2.8,7.19999 7.2,8.26665 0.9333,0.13333 2,0.26667 3.0667,0.53333 6.2666,1.06667 12.5333,1.6 18.6666,1.6 37.8665,0 70.9331,-20.66662 70.9331,-58.39985 0,-7.46665 -1.3333,-15.7333 -4.2666,-24.66661 -7.6,-23.33327 -31.1999,-33.06658 -53.7332,-33.06658 -7.8667,0 -15.7333,1.2 -22.6666,3.46666 l -21.3333,1.2 c -1.7333,0 -3.0667,1.59999 -3.0667,3.33332 z m 29.4666,-76.13313 c 3.0667,-0.8 6.4,-1.33333 9.6,-1.33333 24.6666,0 24.7999,26.39993 24.7999,28.66659 0,16.93329 -12.7999,27.99993 -28.2666,27.99993 -1.0666,0 -2.1333,0 -3.2,-0.13334 z m 119.5997,82.79978 c 1.3334,-0.13333 2.5334,-1.33333 2.5334,-2.66666 v -0.26666 l -3.3334,-65.0665 c 0,-1.33333 -1.2,-2.53333 -2.5333,-2.53333 h -0.2667 l -26.6666,1.33333 c -1.6,0.13333 -2.6666,1.33333 -2.6666,2.93333 l 3.3333,64.93316 c 0.1333,1.46667 1.2,2.66666 2.6667,2.66666 h 0.2666 z m 1.3334,-92.39976 c 0,-10.93331 -8.8,-19.73328 -19.6,-19.73328 -10.9333,0 -19.7333,8.79997 -19.7333,19.73328 0,10.79997 8.8,19.59995 19.7333,19.59995 10.8,0 19.6,-8.79998 19.6,-19.59995 z m 25.9998,95.33309 c 17.8666,0 41.7332,-8.53331 41.7332,-24.2666 0,-5.06666 -2.6666,-11.06664 -8.7999,-17.73329 -5.0667,-5.59999 -7.0667,-8.13332 -7.0667,-10.39998 0,-2.66666 3.0667,-5.33332 11.0667,-5.33332 h 0.5333 c 1.7333,0 3.2,-0.53333 3.2,-1.99999 0,-0.4 0,-0.8 -0.2667,-1.33333 l -6,-15.46663 c -0.9333,-2.39999 -2.2666,-2.93332 -7.4666,-2.93332 -17.4666,0 -39.1999,7.99998 -39.1999,23.0666 0,5.06666 2.4,10.79998 8.2666,17.46663 l 3.6,3.99999 c 1.8667,2.39999 3.6,4.53332 3.6,6.26665 0,3.19999 -3.7333,6.93331 -11.6,7.06665 -1.6,0 -4.2666,0.26666 -4.2666,2.26666 0,0.26666 0.1333,0.66666 0.2666,1.06666 l 5.8667,15.46663 c 0.8,2.26666 2.1333,2.79999 5.0667,2.79999 z"
+ id="text1"
+ transform="rotate(-5.816875,-1798.7315,5758.9145)"
+ aria-label="PyDis&#10;" /><path
+ style="font-size:133.333px;font-family:'FOT-Yuruka Std';-inkscape-font-specification:'FOT-Yuruka Std, Normal';text-align:center;text-anchor:middle;fill:#3c71c5"
+ d="m 421.15296,506.56851 c 0.26666,5.06666 2.79999,7.19998 7.19998,8.26665 0.93333,0.13333 1.99999,0.26666 3.06666,0.53333 6.26665,1.06666 12.5333,1.6 18.66662,1.6 37.86657,0 70.93315,-20.66662 70.93315,-58.39986 0,-7.46664 -1.33333,-15.73329 -4.26666,-24.6666 -7.59998,-23.33327 -31.19992,-33.06658 -53.73319,-33.06658 -7.86665,0 -15.7333,1.2 -22.66661,3.46666 l -21.33328,1.19999 c -1.73333,0 -3.06666,1.6 -3.06666,3.33333 z m 29.46659,-76.13314 c 3.06666,-0.79999 6.39998,-1.33333 9.59997,-1.33333 24.66661,0 24.79994,26.39994 24.79994,28.6666 0,16.93329 -12.79997,27.99993 -28.26659,27.99993 -1.06667,0 -2.13333,0 -3.2,-0.13334 z m 129.19969,85.99978 c 3.86666,0 5.59999,-1.86666 6.66665,-3.99999 2,-4.53332 5.46665,-13.59996 5.46665,-14.93329 0,-2.26666 -2.26666,-3.46666 -4.13332,-3.46666 h -0.26667 c -0.93333,0.13333 -1.99999,0.13333 -2.93332,0.13333 -16.66663,0 -23.59994,-10.66664 -23.59994,-20.13328 0,-8.26664 5.33332,-13.86663 11.7333,-13.86663 5.59999,0 8.13331,4.26666 8.13331,5.46665 0,1.86667 -0.93333,2.13333 -7.86664,3.73333 -1.73333,0.4 -2.79999,1.06666 -2.79999,2.53332 0,0.53334 2.53332,9.19998 4.13332,13.59997 0.53333,1.6 1.19999,2.53333 3.33332,2.53333 6.93332,-0.26667 16.79996,-1.73333 23.06661,-3.86666 7.86665,-2.66666 10.39997,-7.73331 10.39997,-13.86663 0,-4.39999 -1.46666,-33.86658 -34.53324,-33.86658 -30.39992,0 -43.86656,19.99995 -43.86656,39.06656 0,20.26662 15.19997,40.93323 45.46655,40.93323 z m 88.79972,-2.66666 c 2.4,0 4.66666,-0.93333 5.99999,-1.99999 16.39995,-14.1333 31.06658,-61.86651 31.06658,-63.99984 0,-1.86666 -1.19999,-3.19999 -4.26665,-4.13332 l -17.86662,-5.46665 c -1.06667,-0.4 -2,-0.53334 -2.93333,-0.53334 -1.73333,0 -3.06666,0.8 -3.86666,2.53333 -0.93333,2.26666 -8.26664,21.86661 -12.9333,32.66658 -0.4,0.8 -0.66666,1.06667 -1.06666,1.06667 -0.26667,0 -0.66667,-0.26667 -0.93333,-0.93333 l -14.9333,-32.93325 c -0.66666,-1.33333 -1.99999,-2.26666 -3.99999,-2.26666 -2.79999,0 -20.26661,7.19998 -23.4666,8.66664 -1.46667,0.66667 -2.26666,1.6 -2.26666,3.06666 0,0.93333 0.26666,2 0.93333,3.33333 l 30.53325,57.86651 c 1.46667,2.53333 3.86666,3.06666 6.53332,3.06666 z m 164.79956,-55.59985 c 0,-22.26661 -15.99996,-57.46652 -58.66652,-57.46652 -23.46661,0 -48.79987,11.19997 -57.46652,36.13324 -2.79999,8.26664 -4.13332,16.13329 -4.13332,23.4666 0,33.19992 26.6666,55.59986 57.06652,55.59986 27.0666,0 63.19984,-21.06661 63.19984,-57.73318 z M 774.752,486.43523 c -13.7333,0 -26.53326,-11.46664 -26.53326,-28.39993 0,-12.1333 6.66665,-28.66659 25.99993,-28.66659 18.53329,0 25.59993,15.46663 25.59993,28.66659 0,15.06663 -9.19997,28.39993 -25.0666,28.39993 z m 99.86653,63.73317 c 1.6,0 2.8,-1.06666 2.93333,-2.66666 l 1.73333,-33.19991 c 4.93332,1.59999 10.39997,2.39999 15.99996,2.39999 25.19993,0 42.39989,-15.33329 42.39989,-39.5999 0,-24.2666 -21.06661,-41.33323 -44.53322,-41.33323 -5.59999,0 -11.46664,1.06667 -17.19996,3.19999 l -22.26661,-1.19999 h -0.26666 c -1.33333,0 -2.53333,1.19999 -2.66666,2.66666 l -5.33332,105.33306 v 0.26667 c 0,1.46666 1.19999,2.66666 2.53332,2.66666 z m 7.33332,-87.33311 c 2.26666,-0.66666 4.53332,-1.06666 6.66665,-1.06666 9.33331,0 16.26662,6.39998 16.26662,15.59996 0,14.66663 -12.79997,14.66663 -13.86663,14.66663 -3.73332,0 -7.59998,-1.06667 -10.53331,-2.53333 z m 78.79978,53.3332 c 17.86662,0 41.73327,-8.53331 41.73327,-24.26661 0,-5.06665 -2.6667,-11.06664 -8.80002,-17.73329 -5.06666,-5.59998 -7.06665,-8.13331 -7.06665,-10.39997 0,-2.66666 3.06666,-5.33332 11.06664,-5.33332 h 0.53333 c 1.73333,0 3.2,-0.53333 3.2,-1.99999 0,-0.4 0,-0.8 -0.2667,-1.33333 l -5.99996,-15.46663 c -0.93333,-2.39999 -2.26666,-2.93333 -7.46665,-2.93333 -17.46662,0 -39.1999,7.99998 -39.1999,23.06661 0,5.06666 2.4,10.79997 8.26665,17.46662 l 3.59999,3.99999 c 1.86666,2.4 3.59999,4.53333 3.59999,6.26665 0,3.2 -3.73332,6.93332 -11.59997,7.06665 -1.6,0 -4.26666,0.26667 -4.26666,2.26666 0,0.26667 0.13334,0.66667 0.26667,1.06667 l 5.86665,15.46662 c 0.8,2.26667 2.13333,2.8 5.06666,2.8 z"
+ id="text2"
+ transform="rotate(-7.6866997)"
+ aria-label="DevOps" /><path
+ style="font-size:38.6667px;font-family:'FOT-Yuruka Std';-inkscape-font-specification:'FOT-Yuruka Std, Normal';text-align:center;text-anchor:middle;fill:#587ebb"
+ d="m 922.39628,298.82759 c 0.15466,0 0.27066,0.0387 0.42533,0.0387 0.73467,0 1.43067,-0.30933 1.70134,-1.044 0.50266,-1.46934 0.928,-3.05467 0.928,-4.13734 v -0.15466 l -0.61867,-26.60269 c -0.0773,-2.668 -1.16,-4.44667 -3.86667,-4.44667 h -0.42533 l -10.63335,0.65733 c -1.16,0.0773 -1.624,0.696 -1.624,1.66267 l -0.0773,13.80401 c 0,1.00533 0.61867,1.392 1.46933,1.392 h 0.116 l 8.04268,-0.464 0.232,12.79868 v 0.116 c 0,1.12133 -0.464,2.16533 -1.46934,4.64 -0.0387,0.116 -0.0387,0.19334 -0.0387,0.30934 0,0.30933 0.19333,0.58 0.61866,0.65733 z m -25.67469,-0.812 c 0.54133,-0.0387 0.812,-0.38666 0.812,-0.85066 l 0.38667,-17.78669 6.80534,-0.348 c 0.928,-0.0387 1.392,-0.42533 1.392,-1.392 l 0.15466,-10.78801 v -0.116 c 0,-2.59067 -1.19866,-4.13733 -3.78933,-4.13733 h -0.464 l -9.35734,0.61866 c -1.31467,0.0773 -1.70134,0.73467 -1.74001,1.62401 l -0.812,32.90536 c 0,0.42533 0.19334,0.696 0.65734,0.696 h 0.116 z m 16.66535,-0.232 c 0.50266,-0.0387 0.812,-0.38666 0.812,-0.928 l -0.0387,-3.016 1.856,-0.0387 c 0.50267,0 0.65734,-0.27066 0.65734,-0.696 l -0.0387,-3.364 c 0,-0.464 -0.19333,-0.61867 -0.73467,-0.61867 l -1.77867,0.0387 -0.0387,-2.62934 1.23733,0.0773 h 0.0773 c 0.42534,0 0.58001,-0.27067 0.61867,-0.73467 l 0.15467,-3.364 v -0.15467 c 0,-0.38667 -0.15467,-0.54133 -0.65734,-0.58 l -14.88667,-0.77333 h -0.0773 c -0.38666,0 -0.58,0.232 -0.61866,0.61866 l -0.19334,3.44134 v 0.116 c 0,0.42533 0.19334,0.58 0.65734,0.61867 l 1.35333,0.0773 -0.0387,3.596 -1.93333,0.0387 c -0.50267,0 -0.77334,0.15467 -0.77334,0.696 l 0.0387,3.248 c 0,0.464 0.19333,0.696 0.812,0.696 h 0.812 l -1.35333,2.436 c -0.0773,0.11601 -0.0773,0.23201 -0.0773,0.34801 0,0.27066 0.19334,0.58 0.42534,0.61866 l 3.40267,0.928 c 0.15466,0.0387 0.348,0.0773 0.58,0.0773 0.54133,0 1.08267,-0.232 1.31467,-0.85067 l 1.35333,-3.712 2.51334,-0.0387 0.0387,3.44134 c 0,0.464 0.116,0.73466 0.58,0.73466 h 0.116 z m 4.36933,-22.15602 -3.44133,0.27067 v -2.668 l 1.70133,-0.232 c 0.464,-0.0773 0.73467,-0.19333 0.73467,-0.65734 v -1.624 c 0,-0.19333 -0.116,-0.54133 -0.464,-0.54133 h -0.116 l -1.81734,0.27067 v -2.39734 l 2.24267,-0.15467 h 0.0773 c 0.65733,0 0.96666,0.50267 0.96666,1.16001 z m -16.58801,-0.42533 -3.17067,0.232 0.0387,-2.32 1.43067,-0.19333 c 0.464,-0.0773 0.696,-0.15467 0.696,-0.65734 l 0.0387,-1.624 c 0,-0.19333 -0.15466,-0.54133 -0.50266,-0.54133 h -0.0387 l -1.54667,0.232 0.0387,-2.16534 2.24267,-0.116 h 0.0773 c 0.54133,0 0.812,0.464 0.812,1.12134 z m 7.61734,14.07468 -1.93334,0.0773 0.0773,-3.20933 1.856,0.116 z m 52.27738,8.66134 c 0.65733,-0.0773 1.08266,-0.464 1.08266,-1.00533 0,-0.0773 0,-0.19334 -0.0387,-0.27067 l -0.696,-3.09334 c -0.0773,-0.30933 -0.38667,-0.54133 -0.77334,-0.54133 h -0.15466 l -4.25334,0.54133 -0.0773,-2.436 5.99334,0.0773 c 0.58,0 0.812,-0.27066 0.812,-0.812 v -4.06 c 0,-0.50267 -0.232,-0.77333 -0.812,-0.77333 l -6.18667,-0.0387 -0.116,-3.944 h 1.12134 l 1.08266,1.23733 c 0.464,0.50267 1.08267,0.73467 1.66267,0.73467 0.50267,0 1.00534,-0.15467 1.276,-0.42534 l 4.02134,-3.40267 c 0.232,-0.19333 0.38667,-0.464 0.38667,-0.73466 0,-0.30934 -0.15467,-0.61867 -0.464,-0.928 l -4.13734,-4.29201 3.132,-3.05467 c 0.116,-0.116 0.15467,-0.27066 0.15467,-0.38666 0,-0.232 -0.0773,-0.42534 -0.232,-0.54134 l -2.35867,-2.04933 c -0.0773,-0.116 -0.232,-0.15467 -0.38667,-0.15467 -0.15466,0 -0.30933,0.0387 -0.42533,0.15467 l -2.82267,3.016 -1.43067,-1.46933 2.74534,-2.90001 c 0.116,-0.116 0.19333,-0.27066 0.19333,-0.42533 0,-0.19333 -0.0773,-0.348 -0.19333,-0.464 l -2.51334,-2.24267 c -0.116,-0.116 -0.27066,-0.15467 -0.38666,-0.15467 -0.19334,0 -0.38667,0.0773 -0.46401,0.19334 l -2.62933,2.62933 -2.35867,-2.436 c -0.15467,-0.15467 -0.38667,-0.232 -0.58,-0.232 -0.30933,0 -0.61867,0.116 -0.85067,0.348 l -2.32,1.972 c -0.54133,-1.23733 -1.70133,-2.04933 -3.09334,-2.12667 l -12.79867,-0.73466 h -0.116 c -0.464,0 -0.73467,0.232 -0.77334,0.696 l -0.348,4.524 v 0.0773 c 0,0.58001 0.38667,0.77334 0.88934,0.81201 l 7.54,0.50266 c -0.88933,1.12134 -2.16533,2.51334 -3.596,4.02134 l -0.50267,-2.32 c -0.116,-0.42534 -0.348,-0.54134 -0.65733,-0.54134 h -0.116 l -3.248,0.27067 c -0.50267,0.0387 -0.65734,0.27067 -0.65734,0.65733 v 0.232 l 0.38667,2.97734 c 0.0387,0.348 0.38667,0.58 0.812,0.58 h 0.0773 l 2.43601,-0.30933 c -1.66267,1.66267 -3.48001,3.364 -5.22001,4.94933 -0.15466,0.15467 -0.27066,0.38667 -0.27066,0.61867 0,0.232 0.116,0.464 0.348,0.61867 l 3.67333,2.668 c 0.38667,0.27067 0.85067,0.38667 1.35334,0.38667 0.812,0 1.624,-0.348 2.04933,-0.77334 0.54133,-0.58 1.23734,-1.276 1.972,-2.088 h 0.77334 l -0.54134,4.13734 -6.10934,-0.0387 c -0.58,0 -0.85066,0.19334 -0.85066,0.812 v 3.86667 c 0,0.54134 0.232,0.77334 0.812,0.77334 l 5.25867,0.0773 c -0.464,1.31467 -1.23734,2.82267 -2.24267,4.408 -0.232,0.348 -0.30933,0.65734 -0.30933,0.88934 0,0.50267 0.38666,0.77333 0.73466,0.88933 l 4.44667,1.54667 c 0.27067,0.0773 0.54134,0.116 0.81201,0.116 0.812,0 1.66266,-0.38667 2.088,-1.16 0.88933,-1.624 1.89466,-4.56267 2.24267,-6.61201 l 3.67333,0.0387 0.19334,5.72267 c 0.0387,1.276 0.85066,2.12667 2.51333,2.12667 0.19333,0 0.348,-0.0387 0.54133,-0.0387 z m -8.39068,-21.22802 -11.21334,-0.19333 c 1.856,-2.12667 3.55734,-4.13734 4.56267,-5.49067 0.27067,-0.38667 0.50267,-0.77334 0.696,-1.12134 z m -4.64,8.77734 -3.28667,-0.0387 0.42533,-4.06001 2.70667,0.0387 z m 51.34937,13.30135 c 1.00533,0 1.93333,-0.58 2.04933,-2.01067 l 0.6187,-7.34667 c 0,-0.15467 0.039,-0.348 0.039,-0.50267 0,-2.59067 -1.7013,-4.52401 -5.56796,-4.52401 h -12.25735 l 2.59067,-2.16533 15.58264,-0.348 c 0.464,0 0.7347,-0.27067 0.7347,-0.73467 l -0.077,-4.25333 c 0,-0.42534 -0.2707,-0.65734 -0.7347,-0.65734 l -3.55733,0.0773 1.35333,-1.508 c 0.1547,-0.15466 0.1933,-0.348 0.1933,-0.50266 0,-0.348 -0.232,-0.65734 -0.57996,-0.696 l -6.22534,-1.044 c -0.0773,0 -0.19333,-0.0387 -0.27066,-0.0387 -0.464,0 -0.96667,0.19333 -1.27601,0.50267 l -3.248,3.55733 -1.81733,0.0773 -0.27067,-4.29201 11.40668,-0.77333 c 0.61866,-0.0387 0.85066,-0.38667 0.85066,-0.812 v -0.0773 l -0.30933,-5.25867 c -0.0387,-0.348 -0.464,-0.65733 -0.88933,-0.65733 h -0.0773 l -11.40667,0.812 -0.15467,-2.668 c -0.0387,-0.42534 -0.348,-0.812 -1.00533,-0.812 h -0.116 l -7.61734,0.58 c -0.54134,0.0387 -0.88934,0.38666 -0.88934,0.77333 v 0.0773 l 0.19334,2.70667 -7.34668,0.50267 c -0.38666,0.0387 -0.73466,0.232 -0.73466,0.73467 v 0.0773 l 0.348,5.18134 c 0.0387,0.38667 0.232,0.73467 0.77333,0.73467 h 0.0773 l 7.38534,-0.50267 0.27067,3.90534 -9.47334,0.27066 c -0.50267,0 -0.77334,0.19334 -0.77334,0.696 l 0.116,3.98267 c 0,0.50267 0.15467,0.812 0.88934,0.812 l 6.92134,-0.15466 -7.42401,5.29733 c -0.232,0.15467 -0.348,0.42534 -0.348,0.65734 0,0.30933 0.15467,0.61867 0.50267,0.812 l 4.91067,2.668 0.27067,0.116 -0.0773,4.524 c 0,1.00534 0.77334,1.70134 1.81734,1.74001 l 24.51468,0.464 z m -7.15334,-4.44667 h -11.17467 l 0.0773,-2.39734 7.42401,0.85067 h 0.27067 c 0.42533,0 0.58,-0.15467 0.77333,-0.696 l 0.38667,-1.00534 c 0.0387,-0.116 0.0773,-0.19333 0.0773,-0.30933 0,-0.27067 -0.19333,-0.50267 -0.54133,-0.54133 l -8.31334,-0.928 0.0387,-1.58534 9.97601,0.348 c 0.88933,0.0387 1.508,0.464 1.508,1.43067 v 0.27067 z m 23.47067,-9.31868 c 0.464,0 0.7734,-0.348 0.8507,-0.812 0.6187,-3.55733 1.2373,-8.46801 1.2373,-13.03068 0,-6.148 -0.58,-6.264 -1.276,-6.264 h -8.2747 c -0.464,0 -0.7733,0.38667 -0.7733,0.812 0.039,5.336 0.6187,15.04135 0.8507,18.48268 0.039,0.464 0.3866,0.812 0.8506,0.812 z m -3.364,12.68268 c 3.016,0 5.4907,-2.47467 5.4907,-5.52934 0,-3.05467 -2.4747,-5.52934 -5.4907,-5.52934 -3.0547,0 -5.5293,2.47467 -5.5293,5.52934 0,3.05467 2.4746,5.52934 5.5293,5.52934 z"
+ id="text8"
+ transform="rotate(-1.2259837)"
+ aria-label="開発者!" /><path
+ style="font-size:38.6667px;font-family:'FOT-Yuruka Std';-inkscape-font-specification:'FOT-Yuruka Std, Normal';text-align:center;text-anchor:middle;fill:#587ebb"
+ d="m 669.56577,526.96554 c 0.232,-0.232 0.38667,-0.61867 0.38667,-0.96667 0,-0.30934 -0.116,-0.58 -0.30934,-0.77334 l -2.86133,-2.62933 1.23733,0.0387 c 0.696,0 0.85067,-0.34801 0.85067,-0.88934 l 0.116,-4.83334 c 0,-0.58 -0.27067,-0.85066 -0.85067,-0.85066 l -2.70667,-0.0387 0.464,-3.364 2.82267,-0.0387 c 0.61867,0 0.812,-0.27067 0.812,-0.696 v -0.15467 l -0.19333,-3.90533 c -0.0387,-0.58 -0.232,-0.696 -0.812,-0.696 l -1.89467,0.0387 0.30933,-2.088 v -0.15467 c 0,-0.464 -0.27066,-0.65733 -0.77333,-0.77333 l -5.02667,-0.96667 c -0.0773,0 -0.15467,-0.0387 -0.232,-0.0387 -0.42533,0 -0.77333,0.27066 -0.85067,0.77333 l -0.348,3.32534 h -2.51333 l -0.0387,-1.08267 c 0,-0.50267 -0.27067,-0.696 -0.73467,-0.696 h -0.15466 l -3.40267,0.27066 c -0.42534,0.0387 -0.58,0.348 -0.58,0.81201 l 0.0387,0.77333 h -1.93333 v -1.16 c 0,-0.50267 -0.19334,-0.696 -0.696,-0.696 h -0.116 l -3.59601,0.27066 c -0.58,0.0387 -0.61866,0.348 -0.61866,0.73467 l 0.0387,0.928 -2.24266,0.0387 -0.0387,-1.276 c 0,-0.464 -0.232,-0.73467 -0.73467,-0.73467 h -0.116 l -0.50267,0.0387 2.66801,-5.37467 0.30933,3.132 c 0.0387,0.54133 0.348,0.812 0.928,0.812 h 0.116 l 21.22802,-1.46933 c 0.50267,-0.0387 0.77333,-0.348 0.77333,-0.85067 v -0.116 l -0.50266,-5.25867 c -0.0387,-0.50267 -0.34801,-0.73467 -0.85067,-0.73467 h -0.116 l -20.76402,1.46933 c -0.116,-0.30933 -0.348,-0.58 -0.696,-0.73466 l -5.83867,-2.35867 c -0.19333,-0.0773 -0.42534,-0.116 -0.61867,-0.116 -0.348,0 -0.73467,0.15467 -0.96667,0.61867 l -4.06,7.84934 c -0.0773,0.15466 -0.116,0.348 -0.116,0.54133 0,0.42533 0.19333,0.88933 0.65733,1.044 l 4.83334,1.74 -0.58,0.0387 c -0.58,0.0387 -0.61867,0.30933 -0.61867,0.77333 l 0.0387,1.00534 -2.51333,0.0387 c -0.50267,0 -0.81201,0.232 -0.81201,0.77334 v 0.19333 l 0.348,3.67334 c 0.0387,0.58 0.34801,0.77333 0.85067,0.77333 l 2.24267,-0.0387 0.0387,0.812 c 0,0.65734 0.30933,0.88934 1.044,0.88934 l 3.51867,-0.0387 c 0.58,0 0.928,-0.38667 0.928,-1.044 v -0.65733 l 2.28133,-0.0387 0.0387,0.88933 c 0,0.61867 0.15467,0.77334 0.88933,0.77334 l 3.13201,-0.0387 c 0.58,0 0.928,-0.348 0.928,-1.00533 v -0.65734 l 1.93333,-0.0387 0.0387,1.16 c 0,0.58 0.232,0.85067 0.96667,0.85067 l 2.97733,-0.0773 c 0.58,0 0.88934,-0.38666 0.88934,-0.96667 l -0.0387,-1.00533 h 1.81734 l -0.34801,3.17067 -23.00668,-0.348 c -0.58,0 -0.85067,0.15467 -0.85067,0.88933 v 4.71734 c 0,0.58 0.232,0.928 0.928,0.928 l 1.74,0.0387 -3.248,3.55733 c -0.15467,0.19334 -0.232,0.42534 -0.232,0.65734 0,0.348 0.15467,0.73467 0.464,0.928 l 4.75601,3.28667 c 0.19333,0.116 0.42533,0.15467 0.696,0.15467 0.464,0 0.928,-0.15467 1.16,-0.42534 l 3.05467,-4.292 0.0773,-0.15467 0.0387,0.0773 1.54666,4.02134 c 0.116,0.348 0.50267,0.50267 0.88934,0.50267 0.19333,0 0.348,0 0.50267,-0.0773 l 4.25333,-1.624 c 0.42534,-0.15466 0.65734,-0.61866 0.65734,-1.08266 0,-0.19334 -0.0387,-0.348 -0.116,-0.50267 l -1.93334,-3.55734 c -0.232,-0.42533 -0.61867,-0.61866 -1.00533,-0.61866 -0.15467,0 -0.30934,0.0387 -0.464,0.0773 l -3.82801,1.35333 c -0.232,0.0773 -0.38666,0.232 -0.464,0.464 -0.0773,-0.232 -0.232,-0.42533 -0.42533,-0.54133 l -3.44134,-2.16534 23.50936,0.38667 -3.09334,2.24267 c -0.27067,0.19333 -0.38667,0.54133 -0.38667,0.88933 0,0.30934 0.0773,0.58 0.232,0.77334 l 3.13201,3.78933 c 0.232,0.30934 0.696,0.46401 1.12133,0.46401 0.348,0 0.65733,-0.116 0.812,-0.27067 z m -9.70534,1.66266 c 0.38667,-0.19333 0.58,-0.58 0.58,-0.96666 0,-0.232 -0.0773,-0.42534 -0.15467,-0.61867 l -1.77867,-3.09334 c -0.30933,-0.50266 -0.61866,-0.65733 -1.00533,-0.65733 -0.15467,0 -0.30933,0.0387 -0.464,0.0773 l -3.944,1.35334 c -0.38667,0.116 -0.54134,0.464 -0.54134,0.812 0,0.232 0.0387,0.42533 0.116,0.61866 l 1.624,3.78934 c 0.15467,0.348 0.54134,0.58 0.96667,0.58 0.15467,0 0.30934,-0.0387 0.464,-0.116 z m 29.69602,-3.016 c 0.464,-0.116 0.696,-0.348 0.696,-0.812 l -0.19333,-5.18134 c 0,-0.42533 -0.27067,-0.65733 -0.65733,-0.65733 h -0.15467 l -1.81733,0.348 -0.0773,-3.75067 2.088,-0.0773 c 0.50267,0 0.696,-0.348 0.696,-0.88934 l -0.0387,-4.09867 c 0,-0.50267 -0.232,-0.73467 -0.65734,-0.73467 h -0.116 l -2.04933,0.0773 -0.116,-6.76667 2.28133,-0.116 c 0.50267,-0.0387 0.73467,-0.348 0.73467,-0.77334 v -0.116 l -0.348,-5.684 c -0.0387,-0.42534 -0.27067,-0.73467 -0.73467,-0.73467 h -0.0773 l -15.66001,1.044 c -0.464,0.0387 -0.812,0.232 -0.812,0.812 v 0.0773 l 0.30933,5.45201 c 0.0387,0.50267 0.38667,0.812 0.928,0.812 h 0.0773 l 5.60668,-0.30933 0.27066,17.12934 -1.54667,0.30934 -0.77333,-10.78801 c -0.0387,-0.54134 -0.348,-0.85067 -0.812,-0.85067 h -0.0773 l -2.35867,0.232 c -0.464,0.0387 -0.85067,0.15467 -0.85067,0.77334 v 0.116 l 0.88933,11.21334 -1.00533,0.19333 c -0.42533,0.0773 -0.65733,0.232 -0.65733,0.65734 0,0.0773 0,0.15466 0.0387,0.27066 l 0.928,4.91067 c 0.116,0.61867 0.58,1.044 1.31467,1.044 0.15467,0 0.30933,0 0.50267,-0.0387 z m 14.57735,2.01067 c 0.19333,0.116 0.464,0.19333 0.696,0.19333 0.348,0 0.696,-0.19333 0.928,-0.58 l 2.32,-4.56267 c 0.116,-0.19333 0.19334,-0.464 0.19334,-0.696 0,-0.38667 -0.19334,-0.77333 -0.61867,-1.00533 l -2.97734,-1.54667 2.70667,-6.88267 c 0.0387,-0.116 0.0773,-0.27067 0.0773,-0.38667 0,-0.38667 -0.232,-0.73467 -0.65733,-0.88933 l -6.07067,-2.04934 c -0.15467,-0.0387 -0.30933,-0.0773 -0.42533,-0.0773 -0.38667,0 -0.696,0.19333 -0.85067,0.58 l -2.088,5.95467 -1.81734,-0.928 c -0.232,-0.116 -0.464,-0.19333 -0.65733,-0.19333 -0.27067,0 -0.50267,0.15466 -0.696,0.464 l -2.668,4.25333 c -0.15467,0.232 -0.23201,0.42534 -0.23201,0.58 0,0.348 0.23201,0.58 0.58001,0.812 l 1.89466,1.08267 -2.82267,3.51867 c -0.15466,0.19333 -0.27066,0.464 -0.27066,0.696 0,0.30933 0.15466,0.58 0.50266,0.812 l 4.79468,2.93867 c 0.30933,0.19333 0.73466,0.348 1.19866,0.348 0.54134,0 1.12134,-0.232 1.508,-0.77333 l 2.47467,-3.36401 z m 3.248,-19.99068 c 0.464,0 0.73467,-0.27067 0.812,-0.812 l 0.54134,-5.45201 v -0.15467 c 0,-0.464 -0.15467,-0.73466 -0.696,-0.77333 l -7.30801,-0.61867 0.61867,-1.972 c 0.0387,-0.15467 0.0773,-0.30933 0.0773,-0.464 0,-0.50267 -0.27067,-0.928 -0.812,-1.08267 l -5.64534,-1.624 c -0.15467,-0.0387 -0.30933,-0.0773 -0.464,-0.0773 -0.42533,0 -0.77333,0.19333 -0.928,0.65733 l -3.78934,11.83201 c -0.0387,0.15467 -0.0773,0.30934 -0.0773,0.42534 0,0.54133 0.348,1.00533 0.928,1.12133 l 5.64534,1.19867 c 0.116,0.0387 0.27067,0.0387 0.38667,0.0387 0.58,0 1.08266,-0.27066 1.276,-0.928 l 0.65733,-2.16533 8.58401,0.85067 z m 33.60136,23.12268 c 0.19334,0.0387 0.348,0.0773 0.54134,0.0773 0.65733,0 1.276,-0.348 1.624,-1.00534 0.85066,-1.624 1.54667,-3.248 1.54667,-4.872 l -0.0387,-8.00401 1.23733,0.0387 c 0.58,0 0.85067,-0.30934 0.88934,-0.88934 l 0.27066,-5.22 v -0.0773 c 0,-0.50267 -0.30933,-0.73467 -0.85066,-0.73467 l -1.58534,-0.0387 v -3.596 c 0,-0.54134 -0.30933,-0.812 -0.85067,-0.812 h -6.10933 c -0.58,0 -0.85067,0.232 -0.85067,0.73467 l 0.0387,3.44133 -3.94401,-0.116 c -0.54133,0 -0.85066,0.27067 -0.85066,0.85067 l -0.15467,5.14267 c 0,0.58 0.19333,0.928 0.812,0.928 l 4.176,0.116 0.0387,4.48534 -2.28134,-2.62934 c -0.15466,-0.19333 -0.38666,-0.30933 -0.58,-0.30933 -0.15466,0 -0.348,0.0773 -0.50266,0.19333 l -3.01601,2.32 -0.116,0.116 -0.38666,-3.67333 c -0.0773,-0.58 -0.42534,-0.928 -1.00534,-0.928 h -0.0773 l -0.61867,0.0387 3.132,-7.308 c 0.0387,-0.15467 0.0773,-0.27067 0.0773,-0.42534 0,-0.38666 -0.27067,-0.73466 -0.696,-0.88933 l -4.64001,-1.70134 c -0.15466,-0.0387 -0.30933,-0.0773 -0.464,-0.0773 -0.348,0 -0.65733,0.15467 -0.812,0.58 l -4.02133,9.86001 0.27066,-11.02001 c 0,-0.58 0.27067,-1.00533 0.96667,-1.044 l 24.01202,-0.73467 c 0.50267,0 0.812,-0.30933 0.812,-0.85066 v -0.0773 l -0.30933,-5.49067 c -0.0387,-0.50267 -0.30934,-0.77333 -0.88934,-0.77333 l -11.83201,0.348 -0.232,-1.972 c -0.0773,-0.50267 -0.38666,-0.77334 -0.85066,-0.77334 h -0.116 l -7.84934,0.696 c -0.464,0.0387 -0.812,0.30934 -0.812,0.85067 0,0.0773 0.0387,0.19333 0.0387,0.27067 l 0.19334,1.23733 -7.57868,0.232 c -1.77867,0.0387 -3.712,1.23734 -3.78933,4.56267 l -0.30934,15.11868 c -0.0387,2.59067 -1.23733,6.80534 -2.24267,9.86001 -0.0387,0.15467 -0.0773,0.27067 -0.0773,0.42533 0,0.348 0.232,0.65734 0.73467,0.812 l 5.49067,1.46934 c 0.15467,0.0387 0.348,0.0773 0.54133,0.0773 0.77334,0 1.624,-0.38667 1.89467,-1.31467 0.77333,-2.668 1.856,-7.54 1.89467,-9.93734 v -0.54133 c 0.15467,0.15466 0.38667,0.232 0.65733,0.27066 l 1.43067,0.15467 0.696,9.78268 c 0.0387,0.54133 0.30934,0.85066 0.85067,0.85066 0.116,0 0.19333,-0.0387 0.30933,-0.0387 l 5.10401,-0.928 c 0.696,-0.15467 1.044,-0.61867 1.044,-1.31467 v -0.232 l -0.42534,-4.21467 2.24267,2.86133 c 0.19334,0.232 0.38667,0.348 0.65734,0.348 0.19333,0 0.38666,-0.0773 0.58,-0.232 l 2.93867,-2.39733 v 1.08267 c 0,1.19866 -0.85067,2.70667 -1.81734,4.13733 -0.15467,0.27067 -0.232,0.50267 -0.232,0.65734 0,0.42533 0.348,0.65733 0.65733,0.73466 z m 44.89204,-3.51867 c 0.30933,-0.15466 0.58,-0.464 0.58,-0.88933 0,-0.19334 -0.0387,-0.38667 -0.15467,-0.58 l -2.82267,-5.52934 c -0.15467,-0.348 -0.50267,-0.54133 -0.88933,-0.54133 -0.116,0 -0.27067,0 -0.42534,0.0773 l -4.408,1.77867 1.81733,-6.38001 5.29734,-0.232 c 0.61867,-0.0387 0.812,-0.348 0.812,-0.88933 v -0.15467 l -0.348,-5.684 c -0.0387,-0.58 -0.30933,-0.77334 -0.812,-0.77334 h -0.15467 l -4.524,0.232 -0.38667,-6.45734 2.28134,2.32001 c 0.15467,0.15466 0.30933,0.19333 0.50267,0.19333 0.19333,0 0.464,-0.0773 0.696,-0.30933 l 2.784,-2.59067 c 0.15467,-0.15467 0.232,-0.348 0.232,-0.54134 0,-0.232 -0.116,-0.50266 -0.30933,-0.696 l -2.97734,-2.70667 c -0.116,-0.116 -0.30933,-0.19333 -0.50267,-0.19333 -0.19333,0 -0.42533,0.0773 -0.58,0.232 l -2.24267,2.16534 -0.19333,-3.20934 c -0.0387,-0.464 -0.30933,-0.77333 -0.77333,-0.77333 h -0.0773 l -7.656,0.42533 c -0.38667,0.0387 -0.696,0.27067 -0.696,0.65733 v 0.0773 l 0.73466,11.90934 -3.63467,0.19333 c -0.58,0.0387 -0.85066,0.232 -0.85066,0.812 v 0.116 l 0.38666,5.56801 c 0.0387,0.58 0.232,0.88933 0.88934,0.88933 h 0.116 l 2.552,-0.116 -3.90534,11.75468 c -0.0387,0.116 -0.0387,0.232 -0.0387,0.348 0,0.42533 0.27066,0.696 0.696,0.77333 l 6.18667,1.508 c 0.19333,0.0387 0.42533,0.0773 0.61867,0.0773 0.96666,0 1.74,-0.61867 2.04933,-1.624 l 1.35333,-4.75601 2.08801,5.49067 c 0.116,0.348 0.50266,0.54134 0.96666,0.54134 0.232,0 0.42534,-0.0387 0.65734,-0.15467 z m -22.38802,1.00534 c 0.73466,-0.0387 1.12133,-0.65734 1.12133,-1.276 l 0.65734,-30.35336 c 0,-0.50267 -0.30934,-0.696 -0.81201,-0.73467 l -7.26933,-0.38667 h -0.0773 c -0.38667,0 -0.65733,0.232 -0.65733,0.65734 l -0.116,6.45734 -1.508,-1.89467 c -0.116,-0.15467 -0.348,-0.27067 -0.61867,-0.27067 -0.19333,0 -0.38667,0.0387 -0.54133,0.15467 l -3.59601,2.436 c -0.232,0.15467 -0.348,0.38667 -0.348,0.61867 0,0.19333 0.0773,0.38666 0.19334,0.54133 l 3.05467,4.408 c 0.15466,0.232 0.38666,0.30934 0.61866,0.30934 0.232,0 0.50267,-0.0773 0.77334,-0.27067 l 1.89466,-1.35333 -0.0773,5.452 -6.18667,1.624 c -0.38667,0.0773 -0.65733,0.50267 -0.65733,1.00534 0,0.116 0.0387,0.27066 0.0773,0.42533 l 1.276,4.56267 c 0.116,0.464 0.42533,0.77333 0.88933,0.77333 0.116,0 0.232,0 0.348,-0.0387 l 4.13734,-1.19867 -0.15467,8.15867 c 0,0.38667 0.19334,0.65734 0.65734,0.65734 h 0.116 z m 40.90937,-8.35201 c 0.19333,0.0773 0.42533,0.116 0.65733,0.116 0.50267,0 1.00534,-0.232 1.31467,-0.73467 0.73467,-1.23733 1.044,-2.32 1.08267,-3.63467 l 0.15466,-6.10934 v -0.15466 c 0,-2.62934 -1.89466,-3.44134 -4.21467,-3.44134 l -11.60001,0.0387 c -0.85066,0 -1.54666,0.65733 -1.58533,1.508 l -0.348,9.93734 v 0.116 c 0,0.73467 0.30933,1.044 0.928,1.08267 l 5.336,0.30933 h 0.15467 c 0.464,0 1.08267,-0.19333 1.12134,-1.12133 l 0.0773,-1.66267 1.508,0.232 h 0.15467 c 0.232,0 0.464,-0.0773 0.58,-0.464 l 0.30933,-0.96667 c 0.0387,-0.0773 0.0387,-0.19333 0.0387,-0.27066 0,-0.232 -0.15467,-0.42534 -0.464,-0.50267 l -2.04934,-0.30934 0.0387,-1.35333 1.31467,0.30933 c 0.15466,0.0387 0.30933,0.0773 0.42533,0.0773 0.19333,0 0.348,-0.0773 0.464,-0.38667 l 0.30933,-0.73467 c 0.0387,-0.116 0.0387,-0.19333 0.0387,-0.27066 0,-0.232 -0.116,-0.42534 -0.50267,-0.50267 l -1.972,-0.38667 0.0387,-1.19867 2.552,0.0387 c 0.812,0 1.19867,0.54133 1.19867,1.35334 v 0.116 l -0.19333,3.51867 c -0.0773,1.08266 -0.73467,2.01066 -1.35334,3.09333 -0.116,0.19333 -0.15467,0.348 -0.15467,0.50267 0,0.30933 0.232,0.50267 0.42534,0.54133 z m 18.83068,-2.16534 c 0.696,-0.0773 1.08267,-0.50266 1.08267,-1.08266 0,-0.0773 -0.0387,-0.15467 -0.0387,-0.232 l -0.54133,-2.82267 c -0.0773,-0.30934 -0.27067,-0.54134 -0.58,-0.54134 h -0.15467 l -5.452,0.77334 -0.116,-1.74 5.52933,-1.044 c 0.348,-0.0387 0.54134,-0.30934 0.54134,-0.65734 0,-0.116 -0.0387,-0.232 -0.0773,-0.348 l -0.812,-2.01067 c -0.0773,-0.232 -0.30933,-0.38666 -0.54133,-0.38666 -0.0773,0 -0.116,0.0387 -0.19333,0.0387 l -4.67867,0.96667 -0.0387,-0.54133 c -0.0387,-0.38667 -0.30934,-0.65734 -0.696,-0.65734 h -0.0773 l -6.65067,0.348 c -0.38666,0.0387 -0.696,0.232 -0.696,0.65734 v 0.0773 l 0.464,8.12001 c 0.0387,0.54133 0.19334,1.00533 0.464,1.31466 l -2.9,1.23734 c -0.19333,0.0773 -0.30933,0.30933 -0.30933,0.50267 0,0.0773 0.0387,0.19333 0.0773,0.27066 l 1.54667,2.97734 c 0.116,0.232 0.348,0.348 0.65733,0.348 0.116,0 0.27067,0 0.38667,-0.0773 l 3.09333,-1.50801 c 0.27067,-0.116 0.348,-0.348 0.348,-0.58 0,-0.15466 -0.0387,-0.30933 -0.116,-0.42533 l -1.276,-2.088 c 0.15467,0 0.27067,0.0387 0.42534,0.0387 0.116,0 0.27066,-0.0387 0.42533,-0.0387 z m 0,-12.14134 c 0.696,-0.0773 1.08267,-0.50267 1.08267,-1.08267 0,-0.0773 -0.0387,-0.15466 -0.0387,-0.232 l -0.54133,-2.86133 c -0.0773,-0.30934 -0.232,-0.54134 -0.61867,-0.54134 h -0.116 l -6.30267,0.77334 -0.116,-1.81734 6.41867,-1.16 c 0.348,-0.0773 0.54133,-0.348 0.54133,-0.65733 0,-0.116 -0.0387,-0.232 -0.0773,-0.348 l -0.812,-2.47467 c -0.0773,-0.232 -0.27067,-0.38667 -0.54133,-0.38667 -0.0773,0 -0.116,0.0387 -0.19334,0.0387 l -5.52934,1.044 -0.0773,-1.16 c -0.0387,-0.38667 -0.30933,-0.65733 -0.696,-0.65733 h -0.0773 l -6.65068,0.348 c -0.38666,0.0387 -0.696,0.232 -0.696,0.65733 v 0.0773 l 0.464,9.35734 c 0.0773,1.276 0.81201,2.01067 2.35867,2.01067 0.15467,0 0.30934,-0.0387 0.464,-0.0387 z m -11.32934,24.59202 c 1.044,0 2.39733,-0.19333 4.02133,-0.88933 0.61867,-0.27067 0.88934,-0.65734 0.88934,-1.16 0,-0.19334 -0.0387,-0.38667 -0.116,-0.61867 l -1.276,-3.86667 c -0.116,-0.348 -0.348,-0.58 -0.65734,-0.58 -0.116,0 -0.232,0 -0.348,0.0773 -1.31467,0.58 -2.59067,0.96667 -3.364,0.96667 l -6.14801,0.116 v -2.784 c 0,-0.50267 -0.30933,-0.812 -0.85066,-0.812 l -6.07067,-0.15467 c -0.50267,0 -0.812,0.30933 -0.812,0.85067 v 6.22534 c 0,2.12666 1.77866,2.74533 3.90533,2.74533 h 0.19334 z m -7.73334,-26.48669 c 1.54667,-0.15466 2.668,-0.88933 2.668,-2.32 0,-0.27067 -0.0387,-0.54133 -0.116,-0.85067 l -1.044,-4.292 c -0.116,-0.38667 -0.348,-0.65733 -0.77334,-0.65733 h -0.15466 l -4.13734,0.73466 c -0.348,0.0773 -0.50267,0.348 -0.50267,0.61867 v 0.15467 l 0.54134,2.16533 -2.62934,0.232 0.65734,-3.48 v -0.15467 c 0,-0.348 -0.232,-0.696 -0.65734,-0.77333 l -6.032,-1.00533 h -0.116 c -0.348,0 -0.61867,0.232 -0.65734,0.54133 l -0.812,5.568 -1.16,0.116 c -0.464,0.0387 -0.812,0.27067 -0.812,0.77334 0,0.0773 0.0387,0.19333 0.0387,0.27066 l 0.54133,2.90001 c 0.116,0.58 0.42534,0.88933 1.044,0.88933 h 0.19334 z m 17.24535,23.12269 c 0.15466,0.0773 0.30933,0.116 0.50266,0.116 0.348,0 0.696,-0.15467 0.88934,-0.58 l 2.12666,-4.09867 c 0.0773,-0.15467 0.116,-0.30934 0.116,-0.50267 0,-0.38667 -0.19333,-0.812 -0.54133,-0.96667 l -4.33067,-1.81733 c -0.15467,-0.0773 -0.30933,-0.116 -0.464,-0.116 -0.27067,0 -0.464,0.116 -0.61867,0.348 l -2.39733,4.06 c -0.0773,0.15467 -0.116,0.30934 -0.116,0.464 0,0.232 0.116,0.464 0.348,0.61867 z m -29.00003,1.46933 c 0.116,0.0773 0.30933,0.15467 0.50267,0.15467 0.30933,0 0.61867,-0.116 0.812,-0.38667 l 2.74533,-3.98267 c 0.0773,-0.116 0.15467,-0.30933 0.15467,-0.464 0,-0.27066 -0.116,-0.50266 -0.348,-0.65733 l -3.596,-2.35867 c -0.15467,-0.0773 -0.30934,-0.15467 -0.50267,-0.15467 -0.19333,0 -0.42533,0.0773 -0.54133,0.232 l -3.17067,3.71201 c -0.0773,0.116 -0.116,0.232 -0.116,0.38666 0,0.27067 0.0773,0.54134 0.30933,0.696 z"
+ id="text8-4"
+ transform="rotate(-4.7048989)"
+ aria-label="無政府状態" /><path
+ id="path1"
+ style="fill:#6ec8ff;fill-opacity:1"
+ sodipodi:type="inkscape:offset"
+ inkscape:radius="4.3458762"
+ inkscape:original="M 947.4043 72.550781 A 5.4998266 5.4998266 0 0 0 941.9043 78.050781 L 941.9043 100.11328 A 5.4998266 5.4998266 0 0 0 947.4043 105.61328 L 973.12305 105.61328 C 975.88532 113.46186 978.64671 121.31161 981.41016 129.16211 C 956.44632 169.47568 931.48007 209.78813 906.51562 250.10156 A 5.4998266 5.4998266 0 0 0 911.19141 258.49609 L 937.29297 258.49609 A 5.4998266 5.4998266 0 0 0 941.93555 255.94336 C 959.8862 227.66326 977.83606 199.3827 995.78711 171.10352 C 1007.8516 201.67778 1019.9143 232.25133 1031.9785 262.82617 A 5.4998266 5.4998266 0 0 0 1038.6191 266.0918 C 1055.2909 261.27865 1071.9629 256.46549 1088.6348 251.65234 A 5.4998266 5.4998266 0 0 0 1092.3809 244.80078 C 1090.1986 237.4642 1088.0163 230.12758 1085.834 222.79102 A 5.4998266 5.4998266 0 0 0 1078.8594 219.13086 C 1071.7368 221.44991 1064.6168 223.7698 1057.4961 226.08789 C 1037.8257 176.07137 1018.1563 126.05597 998.48633 76.039062 A 5.4998266 5.4998266 0 0 0 993.36914 72.550781 L 947.4043 72.550781 z "
+ d="m 947.4043,68.205078 c -5.1554,-1.62e-4 -9.84587,4.690304 -9.84571,9.845703 v 22.062499 c -1.6e-4,5.1554 4.69031,9.84587 9.84571,9.8457 h 22.64062 c 2.19134,6.22697 4.38186,12.45484 6.57422,18.6836 -24.59884,39.724 -49.1993,79.44774 -73.79883,119.17187 -1.83527,2.96489 -1.92725,6.92639 -0.23047,9.97266 1.69679,3.04626 5.11462,5.0543 8.60157,5.05469 h 26.10156 c 3.29863,-6e-4 6.54492,-1.78524 8.3125,-4.57032 16.42457,-25.87585 32.84878,-51.75189 49.27344,-77.62695 11.01909,27.92563 22.03749,55.85093 33.05659,83.77734 1.7779,4.50559 7.2349,7.18843 11.8887,5.84571 16.6718,-4.81314 33.3438,-9.62631 50.0156,-14.43946 4.978,-1.43724 8.1838,-7.29925 6.7071,-12.26562 -2.1823,-7.33657 -4.3646,-14.67321 -6.5469,-22.00977 a 4.3463108,4.3463108 0 0 0 0,-0.002 c -1.4948,-5.02127 -7.5049,-8.17536 -12.4863,-6.55273 -5.8253,1.89665 -11.648,3.7934 -17.4707,5.68945 -19.1708,-48.74626 -38.3413,-97.49156 -57.5118,-146.238281 -1.4357,-3.65342 -5.23471,-6.243015 -9.16011,-6.244141 a 4.3463108,4.3463108 0 0 0 -0.002,0 z"
+ transform="matrix(0.57611204,-0.05339079,0.05339079,0.57611204,221.1587,178.9019)" /></g>
+
+</g></svg>
diff --git a/docs/docs/common-queries/index.md b/docs/docs/common-queries/index.md
new file mode 100644
index 0000000..20d33ae
--- /dev/null
+++ b/docs/docs/common-queries/index.md
@@ -0,0 +1,34 @@
+---
+description: Find common queries for our monitoring services to help diagnose issues
+---
+# Common Queries
+
+Here you will find common queries for several services within our monitoring and alerting suite to try help diagnose issues and preemptively stop problems arising.
+
+<div class="grid cards" markdown>
+
+- :simple-kubernetes:{ .lg .middle } __Kubernetes__
+
+ ---
+
+ Find common troubleshooting tips to run against our Kubernetes cluster.
+
+ [:octicons-arrow-right-24: Kubernetes tips](./kubernetes.md)
+
+- :simple-grafana:{ .lg .middle } __Loki__
+
+ ---
+
+ A short guide to LogQL to query logs with Loki.
+
+ [:octicons-arrow-right-24: LogQL queries](./loki.md)
+
+- :simple-postgresql:{ .lg .middle } __PostgreSQL__
+
+ ---
+
+ Pre-written queries to debug the state of our PostgreSQL instance.
+
+ [:octicons-arrow-right-24: PostgreSQL queries](./postgresql.md)
+
+</div>
diff --git a/docs/docs/common-queries/kubernetes.md b/docs/docs/common-queries/kubernetes.md
new file mode 100644
index 0000000..57e6c81
--- /dev/null
+++ b/docs/docs/common-queries/kubernetes.md
@@ -0,0 +1,27 @@
+---
+description: Debugging tips for our Kubernetes cluster
+---
+# Kubernetes tips
+
+## Find top pods by CPU/memory
+
+``` bash
+$ kubectl top pods --all-namespaces --sort-by='memory'
+$ top pods --all-namespaces --sort-by='cpu'
+```
+
+## Find top nodes by CPU/memory
+
+``` bash
+$ kubectl top nodes --sort-by='cpu'
+$ kubectl top nodes --sort-by='memory'
+```
+
+## Kubernetes cheat sheet
+
+[Open Kubernetes cheat
+sheet](https://kubernetes.io/docs/reference/kubectl/cheatsheet/)
+
+## Lens IDE
+
+[OpenLens](https://github.com/MuhammedKalkan/OpenLens)
diff --git a/docs/docs/common-queries/loki.md b/docs/docs/common-queries/loki.md
new file mode 100644
index 0000000..981894a
--- /dev/null
+++ b/docs/docs/common-queries/loki.md
@@ -0,0 +1,25 @@
+---
+description: A brief overview of LogQL syntax for querying logs stored in Loki.
+---
+
+# Loki queries
+
+## Find any logs containing "ERROR"
+
+``` shell
+{job=~"default/.+"} |= "ERROR"
+```
+
+## Find all logs from bot service
+
+``` shell
+{job="default/bot"}
+```
+
+The format is `namespace/object`
+
+## Rate of logs from a service
+
+``` shell
+rate(({job="default/bot"} |= "error" != "timeout")[10s])
+```
diff --git a/docs/docs/common-queries/postgresql.md b/docs/docs/common-queries/postgresql.md
new file mode 100644
index 0000000..31a6012
--- /dev/null
+++ b/docs/docs/common-queries/postgresql.md
@@ -0,0 +1,318 @@
+---
+description: Pre-written SQL queries to help debug and diagnose the state of our PostgreSQL instance.
+---
+
+# PostgreSQL queries
+
+## Disk usage
+
+Most of these queries vary based on the database you are connected to.
+
+### General Table Size Information Grouped For Partitioned Tables
+
+``` sql
+WITH RECURSIVE pg_inherit(inhrelid, inhparent) AS
+ (select inhrelid, inhparent
+ FROM pg_inherits
+ UNION
+ SELECT child.inhrelid, parent.inhparent
+ FROM pg_inherit child, pg_inherits parent
+ WHERE child.inhparent = parent.inhrelid),
+pg_inherit_short AS (SELECT * FROM pg_inherit WHERE inhparent NOT IN (SELECT inhrelid FROM pg_inherit))
+SELECT table_schema
+ , TABLE_NAME
+ , row_estimate
+ , pg_size_pretty(total_bytes) AS total
+ , pg_size_pretty(index_bytes) AS INDEX
+ , pg_size_pretty(toast_bytes) AS toast
+ , pg_size_pretty(table_bytes) AS TABLE
+ FROM (
+ SELECT *, total_bytes-index_bytes-COALESCE(toast_bytes,0) AS table_bytes
+ FROM (
+ SELECT c.oid
+ , nspname AS table_schema
+ , relname AS TABLE_NAME
+ , SUM(c.reltuples) OVER (partition BY parent) AS row_estimate
+ , SUM(pg_total_relation_size(c.oid)) OVER (partition BY parent) AS total_bytes
+ , SUM(pg_indexes_size(c.oid)) OVER (partition BY parent) AS index_bytes
+ , SUM(pg_total_relation_size(reltoastrelid)) OVER (partition BY parent) AS toast_bytes
+ , parent
+ FROM (
+ SELECT pg_class.oid
+ , reltuples
+ , relname
+ , relnamespace
+ , pg_class.reltoastrelid
+ , COALESCE(inhparent, pg_class.oid) parent
+ FROM pg_class
+ LEFT JOIN pg_inherit_short ON inhrelid = oid
+ WHERE relkind IN ('r', 'p')
+ ) c
+ LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
+ ) a
+ WHERE oid = parent
+) a
+ORDER BY total_bytes DESC;
+```
+
+### General Table Size Information
+
+``` sql
+SELECT *, pg_size_pretty(total_bytes) AS total
+ , pg_size_pretty(index_bytes) AS index
+ , pg_size_pretty(toast_bytes) AS toast
+ , pg_size_pretty(table_bytes) AS table
+ FROM (
+ SELECT *, total_bytes-index_bytes-coalesce(toast_bytes,0) AS table_bytes FROM (
+ SELECT c.oid,nspname AS table_schema, relname AS table_name
+ , c.reltuples AS row_estimate
+ , pg_total_relation_size(c.oid) AS total_bytes
+ , pg_indexes_size(c.oid) AS index_bytes
+ , pg_total_relation_size(reltoastrelid) AS toast_bytes
+ FROM pg_class c
+ LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
+ WHERE relkind = 'r'
+ ) a
+) a;
+```
+
+### Finding the largest databases in your cluster
+
+``` sql
+SELECT d.datname as Name, pg_catalog.pg_get_userbyid(d.datdba) as Owner,
+ CASE WHEN pg_catalog.has_database_privilege(d.datname, 'CONNECT')
+ THEN pg_catalog.pg_size_pretty(pg_catalog.pg_database_size(d.datname))
+ ELSE 'No Access'
+ END as Size
+FROM pg_catalog.pg_database d
+
+ CASE WHEN pg_catalog.has_database_privilege(d.datname, 'CONNECT')
+ THEN pg_catalog.pg_database_size(d.datname)
+ ELSE NULL
+ END desc -- nulls first
+ LIMIT 20;
+```
+
+### Finding the size of your biggest relations
+
+Relations are objects in the database such as tables and indexes, and
+this query shows the size of all the individual parts.
+
+``` sql
+SELECT nspname || '.' || relname AS "relation",
+ pg_size_pretty(pg_relation_size(C.oid)) AS "size"
+ FROM pg_class C
+ LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
+ WHERE nspname NOT IN ('pg_catalog', 'information_schema')
+ ORDER BY pg_relation_size(C.oid) DESC
+ LIMIT 20;
+```
+
+### Finding the total size of your biggest tables
+
+``` sql
+SELECT nspname || '.' || relname AS "relation",
+ pg_size_pretty(pg_total_relation_size(C.oid)) AS "total_size"
+ FROM pg_class C
+ LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
+ WHERE nspname NOT IN ('pg_catalog', 'information_schema')
+ AND C.relkind <> 'i'
+ AND nspname !~ '^pg_toast'
+ ORDER BY pg_total_relation_size(C.oid) DESC
+ LIMIT 20;
+```
+
+## Indexes
+
+### Index summary
+
+``` sql
+SELECT
+ pg_class.relname,
+ pg_size_pretty(pg_class.reltuples::bigint) AS rows_in_bytes,
+ pg_class.reltuples AS num_rows,
+ count(indexname) AS number_of_indexes,
+ CASE WHEN x.is_unique = 1 THEN 'Y'
+ ELSE 'N'
+ END AS UNIQUE,
+ SUM(case WHEN number_of_columns = 1 THEN 1
+ ELSE 0
+ END) AS single_column,
+ SUM(case WHEN number_of_columns IS NULL THEN 0
+ WHEN number_of_columns = 1 THEN 0
+ ELSE 1
+ END) AS multi_column
+FROM pg_namespace
+LEFT OUTER JOIN pg_class ON pg_namespace.oid = pg_class.relnamespace
+LEFT OUTER JOIN
+ (SELECT indrelid,
+ max(CAST(indisunique AS integer)) AS is_unique
+ FROM pg_index
+ GROUP BY indrelid) x
+ ON pg_class.oid = x.indrelid
+LEFT OUTER JOIN
+ ( SELECT c.relname AS ctablename, ipg.relname AS indexname, x.indnatts AS number_of_columns FROM pg_index x
+ JOIN pg_class c ON c.oid = x.indrelid
+ JOIN pg_class ipg ON ipg.oid = x.indexrelid )
+ AS foo
+ ON pg_class.relname = foo.ctablename
+WHERE
+ pg_namespace.nspname='public'
+AND pg_class.relkind = 'r'
+GROUP BY pg_class.relname, pg_class.reltuples, x.is_unique
+ORDER BY 2;
+```
+
+### Index size/usage statistics
+
+``` sql
+SELECT
+ t.schemaname,
+ t.tablename,
+ indexname,
+ c.reltuples AS num_rows,
+ pg_size_pretty(pg_relation_size(quote_ident(t.schemaname)::text || '.' || quote_ident(t.tablename)::text)) AS table_size,
+ pg_size_pretty(pg_relation_size(quote_ident(t.schemaname)::text || '.' || quote_ident(indexrelname)::text)) AS index_size,
+ CASE WHEN indisunique THEN 'Y'
+ ELSE 'N'
+ END AS UNIQUE,
+ number_of_scans,
+ tuples_read,
+ tuples_fetched
+FROM pg_tables t
+LEFT OUTER JOIN pg_class c ON t.tablename = c.relname
+LEFT OUTER JOIN (
+ SELECT
+ c.relname AS ctablename,
+ ipg.relname AS indexname,
+ x.indnatts AS number_of_columns,
+ idx_scan AS number_of_scans,
+ idx_tup_read AS tuples_read,
+ idx_tup_fetch AS tuples_fetched,
+ indexrelname,
+ indisunique,
+ schemaname
+ FROM pg_index x
+ JOIN pg_class c ON c.oid = x.indrelid
+ JOIN pg_class ipg ON ipg.oid = x.indexrelid
+ JOIN pg_stat_all_indexes psai ON x.indexrelid = psai.indexrelid
+) AS foo ON t.tablename = foo.ctablename AND t.schemaname = foo.schemaname
+WHERE t.schemaname NOT IN ('pg_catalog', 'information_schema')
+ORDER BY 1,2;
+```
+
+### Duplicate indexes
+
+``` sql
+SELECT pg_size_pretty(sum(pg_relation_size(idx))::bigint) as size,
+ (array_agg(idx))[1] as idx1, (array_agg(idx))[2] as idx2,
+ (array_agg(idx))[3] as idx3, (array_agg(idx))[4] as idx4
+FROM (
+ SELECT indexrelid::regclass as idx, (indrelid::text ||E'\n'|| indclass::text ||E'\n'|| indkey::text ||E'\n'||
+ coalesce(indexprs::text,'')||E'\n' || coalesce(indpred::text,'')) as key
+ FROM pg_index) sub
+GROUP BY key HAVING count(*)>1
+ORDER BY sum(pg_relation_size(idx)) DESC;
+```
+
+## Maintenance
+
+[PostgreSQL wiki](https://wiki.postgresql.org/wiki/Main_Page)
+
+### CLUSTER-ing
+
+[CLUSTER](https://www.postgresql.org/docs/current/sql-cluster.html)
+
+``` sql
+CLUSTER [VERBOSE] table_name [ USING index_name ]
+CLUSTER [VERBOSE]
+```
+
+`CLUSTER` instructs PostgreSQL to cluster the table specified by
+`table_name` based on the index specified by `index_name`. The index
+must already have been defined on `table_name`.
+
+When a table is clustered, it is physically reordered based on the index
+information.
+
+The
+[clusterdb](https://www.postgresql.org/docs/current/app-clusterdb.html)
+CLI tool is recommended, and can also be used to cluster all tables at
+the same time.
+
+### VACUUM-ing
+
+Proper vacuuming, particularly autovacuum configuration, is crucial to a
+fast and reliable database.
+
+[Introduction to VACUUM, ANALYZE, EXPLAIN, and
+COUNT](https://wiki.postgresql.org/wiki/Introduction_to_VACUUM,_ANALYZE,_EXPLAIN,_and_COUNT)
+
+It is not advised to run `VACUUM FULL`, instead look at clustering.
+VACUUM FULL is a much more intensive task and acquires an ACCESS
+EXCLUSIVE lock on the table, blocking reads and writes. Whilst `CLUSTER`
+also does acquire this lock it's a less intensive and faster process.
+
+The
+[vacuumdb](https://www.postgresql.org/docs/current/app-vacuumdb.html)
+CLI tool is recommended for manual runs.
+
+#### Finding number of dead rows
+
+``` sql
+SELECT relname, n_dead_tup FROM pg_stat_user_tables WHERE n_dead_tup <> 0 ORDER BY 2 DESC;
+```
+
+#### Finding last vacuum/auto-vacuum date
+
+``` sql
+SELECT relname, last_vacuum, last_autovacuum FROM pg_stat_user_tables;
+```
+
+#### Checking auto-vacuum is enabled
+
+``` sql
+SELECT name, setting FROM pg_settings WHERE name='autovacuum';
+```
+
+#### View all auto-vacuum setting
+
+``` sql
+SELECT * from pg_settings where category like 'Autovacuum';
+```
+
+## Locks
+
+### Looking at granted locks
+
+``` sql
+SELECT relation::regclass, * FROM pg_locks WHERE NOT granted;
+```
+
+### Combination of blocked and blocking activity
+
+``` sql
+SELECT blocked_locks.pid AS blocked_pid,
+ blocked_activity.usename AS blocked_user,
+ blocking_locks.pid AS blocking_pid,
+ blocking_activity.usename AS blocking_user,
+ blocked_activity.query AS blocked_statement,
+ blocking_activity.query AS current_statement_in_blocking_process
+ FROM pg_catalog.pg_locks blocked_locks
+ JOIN pg_catalog.pg_stat_activity blocked_activity ON blocked_activity.pid = blocked_locks.pid
+ JOIN pg_catalog.pg_locks blocking_locks
+ ON blocking_locks.locktype = blocked_locks.locktype
+ AND blocking_locks.database IS NOT DISTINCT FROM blocked_locks.database
+ AND blocking_locks.relation IS NOT DISTINCT FROM blocked_locks.relation
+ AND blocking_locks.page IS NOT DISTINCT FROM blocked_locks.page
+ AND blocking_locks.tuple IS NOT DISTINCT FROM blocked_locks.tuple
+ AND blocking_locks.virtualxid IS NOT DISTINCT FROM blocked_locks.virtualxid
+ AND blocking_locks.transactionid IS NOT DISTINCT FROM blocked_locks.transactionid
+ AND blocking_locks.classid IS NOT DISTINCT FROM blocked_locks.classid
+ AND blocking_locks.objid IS NOT DISTINCT FROM blocked_locks.objid
+ AND blocking_locks.objsubid IS NOT DISTINCT FROM blocked_locks.objsubid
+ AND blocking_locks.pid != blocked_locks.pid
+
+ JOIN pg_catalog.pg_stat_activity blocking_activity ON blocking_activity.pid = blocking_locks.pid
+ WHERE NOT blocked_locks.granted;
+```
diff --git a/docs/docs/index.md b/docs/docs/index.md
new file mode 100644
index 0000000..78d67c9
--- /dev/null
+++ b/docs/docs/index.md
@@ -0,0 +1,58 @@
+---
+description: Welcome to the Python Discord DevOps documentation.
+---
+# Homepage
+
+Welcome to the Python Discord DevOps documentation.
+
+<div class="grid cards" markdown>
+
+- :fontawesome-solid-dharmachakra:{ .lg .middle } __Service Documentation__
+
+ ---
+
+ Find an overview of our services and how to administrate them
+
+ [:octicons-arrow-right-24: Services](services/index.md)
+
+- :fontawesome-solid-book-skull:{ .lg .middle } __Post-mortems__
+
+ ---
+
+ Learn from our mistakes and how we plan to prevent them in the future
+
+ [:octicons-arrow-right-24: Post-mortems](post-mortems/index.md)
+
+- :fontawesome-solid-file-circle-question:{ .lg .middle } __Common Queries__
+
+ ---
+
+ Find common queries for our monitoring services to help diagnose issues
+
+ [:octicons-arrow-right-24: Common Queries](common-queries/index.md)
+
+- :fontawesome-solid-book:{ .lg .middle } __Runbooks__
+
+ ---
+
+ Find runbooks for our services to guide you through common maintenance tasks
+
+ [:octicons-arrow-right-24: Runbooks](runbooks/index.md)
+
+- :fontawesome-solid-cloud:{ .lg .middle } __Onboarding__
+
+ ---
+
+ Read about our onboarding process for new DevOps team members
+
+ [:octicons-arrow-right-24: Onboarding](onboarding/index.md)
+
+- :fontawesome-solid-people-group:{ .lg .middle } __Meeting Notes__
+
+ ---
+
+ Find minutes from our DevOps team meetings
+
+ [:octicons-arrow-right-24: Meeting Notes](meeting-notes/index.md)
+
+</div>
diff --git a/docs/docs/meeting-notes/.authors.yml b/docs/docs/meeting-notes/.authors.yml
new file mode 100644
index 0000000..8fe49bb
--- /dev/null
+++ b/docs/docs/meeting-notes/.authors.yml
@@ -0,0 +1,5 @@
+authors:
+ joe:
+ name: Joe Banks
+ description: DevOps Team Member
+ avatar: https://github.com/jb3.png
diff --git a/docs/docs/meeting-notes/index.md b/docs/docs/meeting-notes/index.md
new file mode 100644
index 0000000..f042183
--- /dev/null
+++ b/docs/docs/meeting-notes/index.md
@@ -0,0 +1,5 @@
+# Meeting Notes
+
+Here you will find notes from our previous DevOps team meetings.
+
+## Meetings
diff --git a/docs/docs/meeting-notes/posts/2022-04-07.md b/docs/docs/meeting-notes/posts/2022-04-07.md
new file mode 100644
index 0000000..ee14784
--- /dev/null
+++ b/docs/docs/meeting-notes/posts/2022-04-07.md
@@ -0,0 +1,26 @@
+---
+draft: false
+date: 2022-04-07
+authors:
+ - joe
+description: Meeting minutes from 2022-04-07
+---
+# 2022-04-07
+
+## Agenda
+
+- No updates, as last week's meeting did not take place
+
+<!-- more -->
+
+## Roadmap review & planning
+
+What are we working on for the next meeting?
+
+- Help wanted for \#57 (h-asgi)
+- \#58 (postgres exporter) needs a new review
+- \#54 (firewall in VPN) will be done by Johannes
+- We need a testing environment \#67
+- Johannes will add a Graphite role \#31
+- Sofi will take a look at \#29
+- \#41 (policy bot) will be taken care of by Johannes
diff --git a/docs/docs/meeting-notes/posts/2022-09-18.md b/docs/docs/meeting-notes/posts/2022-09-18.md
new file mode 100644
index 0000000..2d60a78
--- /dev/null
+++ b/docs/docs/meeting-notes/posts/2022-09-18.md
@@ -0,0 +1,65 @@
+---
+draft: false
+date: 2022-09-18
+authors:
+ - joe
+description: Meeting minutes from 2022-09-18
+---
+# 2022-09-18
+
+*Migrated from Notion*.
+
+## Agenda
+
+- Joe will grant Chris access to the netcup hosts.
+
+<!-- more -->
+
+### NetKube status
+
+- **Rollout**
+ - [x] RBAC configuration and access granting
+ - [x] Most nodes are enrolled, Joe will re-check
+ - `turing`, `ritchie`, `lovelace` and `neumann` will be Kubernetes
+ nodes
+ - `hopper` will be the storage server
+- **Storage drivers**
+ - Not needed, everything that needs persistent storage will run on
+ hopper
+ - Netcup does not support storage resize
+ - We can download more RAM if we need it
+ - A couple of services still need volume mounts: Ghost, Grafana &
+ Graphite
+- **Control plane high availability**
+ - Joe mentions that in the case the control plane dies, everything
+ else will die as well
+ - If the control plane in Germany dies, so will Johannes
+- **Early plans for migration**
+ - We can use the Ansible repository issues for a good schedule
+ - Hopper runs `nginx`
+ - Statement from Joe:
+
+ > "There is an nginx ingress running on every node in the cluster, okay,
+ > okay? We don't, the way that's, that's as a service is a NodePort, right?
+ > So it has a normal IP, but the port will be like a random port in the range
+ > of the 30,000s. Remember that? Hold on. Is he writing rude nodes? And then...
+ > We have nginx, so this is where it's like a little bit, like, not nice, I
+ > guess we just like, cronjob it, to pull the nodes, like, every minute or
+ > so, and then update the config if they change. But then it's just like...
+ > nginx is like a catalogue of nodes. Wahhh, you drive me crazy."
+
+ - "Nah, it makes sense!"
+ - "It does!"
+ - Joe will figure this out with assistance from his voices.
+
+### Open authentication
+
+- Joe and Johannes will check out OpenLDAP as a JumpCloud alternative
+ starting from this evening
+- Sofi has experience with OpenLDAP
+
+## Sponsorship
+
+This meeting has been sponsored by Chris Hemsworth Lovering's
+relationship therapy company, "Love To Love By Lovering". You can sign
+up by sending a mail to <[email protected]>.
diff --git a/docs/docs/meeting-notes/posts/2022-10-05.md b/docs/docs/meeting-notes/posts/2022-10-05.md
new file mode 100644
index 0000000..9030dfc
--- /dev/null
+++ b/docs/docs/meeting-notes/posts/2022-10-05.md
@@ -0,0 +1,16 @@
+---
+draft: false
+date: 2022-10-05
+authors:
+ - joe
+description: Meeting minutes from 2022-10-05
+---
+# 2022-10-05
+
+*Migrated from Notion*.
+
+## Agenda
+
+- Joe Banks configured proper RBAC for Chris, Johannes and Joe himself
+
+<!-- more -->
diff --git a/docs/docs/meeting-notes/posts/2022-10-19.md b/docs/docs/meeting-notes/posts/2022-10-19.md
new file mode 100644
index 0000000..50fc880
--- /dev/null
+++ b/docs/docs/meeting-notes/posts/2022-10-19.md
@@ -0,0 +1,31 @@
+---
+draft: false
+date: 2022-10-19
+authors:
+ - joe
+description: Meeting minutes from 2022-10-19
+---
+# 2022-10-19
+
+*Migrated from Notion*.
+
+<!-- more -->
+
+## Agenda
+
+- One hour of gartic phone, for team spirit.
+- Created user accounts for Sofi and Hassan
+- Joe created an architecture diagram of the NGINX setup
+ - *This is still in Notion*
+- Joe explained his NGINX plans:
+ > "It's not actually that hard, right? So you spawn 5 instances of nginx in a
+ > DaemonSet, because then one gets deployed to every node okay, following?
+ > Then we get NodePort, instead of LoadBalancers or whatever, which will get
+ > a random port allocatead in the 35000 range, and that will go to nginx, and
+ > on each of those ports, it will go to nginx, right? And then we poll the
+ > Kubernetes API and what is the port that each of these nginx instances is
+ > running on, and add that into a roundrobin on the fifth node. Right? Yeah.
+ > That's correct. That won't do TLS though, so that will just HAProxy. Yeah."
+- Joe will terminate our JumpCloud account
+- Chris reset the Minecraft server
+- Email alerting needs to be configured
diff --git a/docs/docs/meeting-notes/posts/2022-10-26.md b/docs/docs/meeting-notes/posts/2022-10-26.md
new file mode 100644
index 0000000..e9aa2dc
--- /dev/null
+++ b/docs/docs/meeting-notes/posts/2022-10-26.md
@@ -0,0 +1,21 @@
+---
+draft: false
+date: 2022-10-26
+authors:
+ - joe
+description: Meeting minutes from 2022-10-26
+---
+# 2022-10-26
+
+*Migrated from Notion*.
+
+<!-- more -->
+
+## Agenda
+
+- Chris upgraded PostgreSQL to 15 in production
+- Johannes added the Kubernetes user creation script into the Kubernetes
+ repository in the docs
+
+*(The rest of the meeting was discussion about the NetKube setup, which
+has been scrapped since)*.
diff --git a/docs/docs/meeting-notes/posts/2022-11-02.md b/docs/docs/meeting-notes/posts/2022-11-02.md
new file mode 100644
index 0000000..2f41d69
--- /dev/null
+++ b/docs/docs/meeting-notes/posts/2022-11-02.md
@@ -0,0 +1,25 @@
+---
+draft: false
+date: 2022-11-02
+authors:
+ - joe
+description: Meeting minutes from 2022-11-02
+---
+# 2022-11-02
+
+*Migrated from Notion*.
+
+## Agenda
+
+### Hanging behaviour of ModMail
+
+- [Source](https://discord.com/channels/267624335836053506/675756741417369640/1036720683067134052)
+- Maybe use [Signals + a
+ debugger](https://stackoverflow.com/a/25329467)?
+- ... using [something like pdb for the
+ debugger](https://wiki.python.org/moin/PythonDebuggingTools)?
+- Or [GDB, as it seems handy to poke at stuck multi-threaded python
+ software](https://wiki.python.org/moin/DebuggingWithGdb)?
+- ModMail has been upgraded to version 4
+
+<!-- more -->
diff --git a/docs/docs/meeting-notes/posts/2022-11-23.md b/docs/docs/meeting-notes/posts/2022-11-23.md
new file mode 100644
index 0000000..4e9c1b3
--- /dev/null
+++ b/docs/docs/meeting-notes/posts/2022-11-23.md
@@ -0,0 +1,33 @@
+---
+draft: false
+date: 2022-11-23
+authors:
+ - joe
+description: Meeting minutes from 2022-11-23
+---
+# 2022-11-23
+
+*Migrated from Notion*.
+
+<!-- more -->
+
+## Agenda
+
+*(This meeting was mostly about NetKube, with the following strange text
+included, and everything outside of the text has been removed since the
+NetKube plans have been scrapped)*.
+
+Joe Banks, after a month-long hiatus to become a dad to every second
+girl on uni campus, has managed to pull up to the DevOps meeting.
+
+We are considering using Kubespray (<https://kubespray.io/#/>) in order
+to deploy a production-ready bare-metal Kubernetes cluster without
+involvement from Joe "Busy With Poly Girlfriend #20" Banks.
+
+At the moment cluster networking is not working and Joe mentions that
+the last time he has touched it, it worked perfectly fine. However, the
+last time he touched it there was only 1 node, and therefore no
+inter-node communications.
+
+Joe thinks he remembers installing 3 nodes, however, we at the DevOps
+team believe this to be a marijuana dream
diff --git a/docs/docs/meeting-notes/posts/2023-02-08.md b/docs/docs/meeting-notes/posts/2023-02-08.md
new file mode 100644
index 0000000..7ae739a
--- /dev/null
+++ b/docs/docs/meeting-notes/posts/2023-02-08.md
@@ -0,0 +1,20 @@
+---
+draft: false
+date: 2023-02-08
+authors:
+ - joe
+description: Meeting minutes from 2023-02-08
+---
+# 2023-02-08
+
+*Migrated from Notion*.
+
+<!-- more -->
+
+## Agenda
+
+- Investigation into deploying a VPN tool such as WireGuard to have
+ inter-node communication between the Netcup hosts.
+
+*(The rest of this meeting was mostly about NetKube, which has since
+been scrapped)*.
diff --git a/docs/docs/meeting-notes/posts/2023-02-21.md b/docs/docs/meeting-notes/posts/2023-02-21.md
new file mode 100644
index 0000000..a10959f
--- /dev/null
+++ b/docs/docs/meeting-notes/posts/2023-02-21.md
@@ -0,0 +1,30 @@
+---
+draft: false
+date: 2023-02-21
+authors:
+ - joe
+description: Meeting minutes from 2023-02-21
+---
+# 2023-02-21
+
+*Migrated from Notion*.
+
+<!-- more -->
+
+## Agenda
+
+### Reusable status embed workflows
+
+- Further discussion with Bella followed
+- Upstream pull request can be found at
+ [python-discord/bot#2400](https://github.com/python-discord/bot/pull/2400)
+
+### Local vagrant testing setup
+
+- Our new [testing setup using Vagrant
+ VMs](https://github.com/python-discord/infra/pull/78) has been merged.
+
+### A visit from Mina
+
+Mina checked in to make sure we're operating at peak Volkswagen-like
+efficiency.
diff --git a/docs/docs/meeting-notes/posts/2023-02-28.md b/docs/docs/meeting-notes/posts/2023-02-28.md
new file mode 100644
index 0000000..006f8d4
--- /dev/null
+++ b/docs/docs/meeting-notes/posts/2023-02-28.md
@@ -0,0 +1,18 @@
+---
+draft: false
+date: 2023-02-28
+authors:
+ - joe
+description: Meeting minutes from 2023-02-28
+---
+# 2023-02-28
+
+*Migrated from Notion*.
+
+## Agenda
+
+- Black knight's CI & dependabot configuration has been mirrored across
+ all important repositories
+- The test server has been updated for the new configuration
+
+<!-- more -->
diff --git a/docs/docs/meeting-notes/posts/2023-05-16.md b/docs/docs/meeting-notes/posts/2023-05-16.md
new file mode 100644
index 0000000..f278905
--- /dev/null
+++ b/docs/docs/meeting-notes/posts/2023-05-16.md
@@ -0,0 +1,18 @@
+---
+draft: false
+date: 2023-05-16
+authors:
+ - joe
+description: Meeting minutes from 2023-05-16
+---
+# 2023-05-16
+
+*Migrated from Notion*.
+
+## Agenda
+
+- Bella set up [CI bot docker image
+ build](https://github.com/python-discord/bot/pull/2603) to make sure
+ that wheels are available.
+
+<!-- more -->
diff --git a/docs/docs/meeting-notes/posts/2023-07-11.md b/docs/docs/meeting-notes/posts/2023-07-11.md
new file mode 100644
index 0000000..1770041
--- /dev/null
+++ b/docs/docs/meeting-notes/posts/2023-07-11.md
@@ -0,0 +1,41 @@
+---
+draft: false
+date: 2023-07-11
+authors:
+ - joe
+description: Meeting minutes from 2023-07-11
+---
+# 2023-07-11
+
+## Participants
+
+- Chris, Johannes, Bella, Bradley
+
+<!-- more -->
+
+## Agenda
+
+### New Ansible setup
+
+Chris presented the new Ansible setup he's been working on. We plan to
+use WireGuard for networking. We agreed that selfhosting Kubernetes is
+not the way to go. In general, the main benefit from switching away to
+Linode to Netcup is going to be a ton more resources from the Netcup
+root servers we were given. The original issue with Linode's AKS of
+constantly having problems with volumes has not been present for a
+while. Chris mentions the one remaining issue is that we're at half our
+memory capacity just at idle.
+
+It's our decision where to go from here - we can stick to the Kubernetes
+setup or decide on migrating to the Ansible setup. But we have bare
+metal access to the Netcup hosts, which makes e.g. managing databases a
+lot easier. Chris mentions the possibility to only use Netcup for our
+persistence and Linode AKS for anything else, but this has the issue of
+us relying on two sponsors for our infrastructure instead of one.
+
+PostgreSQL was set up to run on `lovelace`.
+
+### Decision
+
+**It was decided to hold a vote on the core development channel, which
+will be evaluated next week to see how to proceed with the setup**.
diff --git a/docs/docs/meeting-notes/posts/2023-07-18.md b/docs/docs/meeting-notes/posts/2023-07-18.md
new file mode 100644
index 0000000..47a4a3c
--- /dev/null
+++ b/docs/docs/meeting-notes/posts/2023-07-18.md
@@ -0,0 +1,44 @@
+---
+draft: false
+date: 2023-07-18
+authors:
+ - joe
+description: Meeting minutes from 2023-07-18
+---
+# 2023-07-18
+
+<!-- more -->
+
+## Secret management improvements
+
+To allow for **better management of our Kubernetes secrets**, Chris set
+out to configure `git-crypt` in GPG key mode. For comparison, the
+previous approach was that secrets were stored in Kubernetes only and
+had to be accessed via `kubectl`, and now `git-crypt` allows us to
+transparently work with the files in unencrypted manner locally, whilst
+having them secure on the remote, all via `.gitattributes`.
+
+The following people currently have access to this:
+
+- Johannes Christ <[email protected]>
+ (`8C05D0E98B7914EDEBDCC8CC8E8E09282F2E17AF`)
+- Chris Lovering <[email protected]>
+ (`1DA91E6CE87E3C1FCE32BC0CB6ED85CC5872D5E4`)
+- Joe Banks <[email protected]> (`509CDFFC2D0783A33CF87D2B703EE21DE4D4D9C9`)
+
+For Hassan, we are still waiting on response regarding his GPG key
+accuracy.
+
+The pull request for the work can be found [at
+python-discord/kubernetes#156](https://github.com/python-discord/kubernetes/pull/156).
+
+**To have your key added, please contact any of the existing key
+holders**. More documentation on this topic is pending to be written,
+see
+[python-discord/kubernetes#157](https://github.com/python-discord/kubernetes/issues/157).
+
+## Infrastructure migration decision
+
+The voting started [last week](./2023-07-11.md) will be properly talked
+about [next week](./2023-07-25.md), so far it looks like we're
+definitely not selfhosting Kubernetes at the very least.
diff --git a/docs/docs/meeting-notes/posts/2023-07-25.md b/docs/docs/meeting-notes/posts/2023-07-25.md
new file mode 100644
index 0000000..4e30961
--- /dev/null
+++ b/docs/docs/meeting-notes/posts/2023-07-25.md
@@ -0,0 +1,12 @@
+---
+draft: false
+date: 2023-07-25
+authors:
+ - joe
+description: Meeting minutes from 2023-07-25
+---
+# 2023-07-25
+
+Postponed to next week due to Joe having a severe bellyache.
+
+<!-- more -->
diff --git a/docs/docs/meeting-notes/posts/2023-08-01.md b/docs/docs/meeting-notes/posts/2023-08-01.md
new file mode 100644
index 0000000..adb8395
--- /dev/null
+++ b/docs/docs/meeting-notes/posts/2023-08-01.md
@@ -0,0 +1,63 @@
+---
+draft: false
+date: 2023-08-01
+authors:
+ - joe
+description: Meeting minutes from 2023-08-01
+---
+# 2023-08-01
+
+## Agenda
+
+### Infrastructure migration
+
+The vote is tied. Chris and Johannes decided that we should test out
+migrating the PostgreSQL database at the very least. We then have more
+freedom about our data. What we need to do:
+
+<!-- more -->
+
+- Allow PostgreSQL connections from LKE's static IPs in the firewall
+- Whitelist the static IPs from Linode via `pg_hba.conf`
+- Schedule downtime for the PostgreSQL database
+- **At downtime**
+ - Take writers offline
+ - Dump database from Linode into Netcup
+ - Update all the client's database URLs to point to netcup
+ - Restart writers
+
+We want to rely on the restore to create everything properly, but will
+need to test run this beforehand. The following `pg_virtualenv` command
+has showcased that it works properly:
+
+``` sh
+kubectl exec -it postgres-... -- pg_dumpall -U pythondiscord \
+| pg_virtualenv psql -v ON_ERROR_STOP=1
+```
+
+Note however that the database extension `pg_repack` needs to be
+installed.
+
+Before we can get started, we need to allow the PostgreSQL role to
+configure `pg_hba.conf` and `postgresql.conf` entries.
+
+### Meeting notes
+
+We're using GitHub at the moment. Some are left in Notion. We should
+migrate these to GitHub to have a uniform interface: Johannes will pick
+up
+[python-discord/infra#108](https://github.com/python-discord/infra/issues/108)
+to merge them together into Git, as its more open than Notion.
+
+### Ansible lint failures in the infra repository
+
+Excluding the vault was found as the working solution here, as
+implemented by Chris.
+
+### Kubernetes repository pull requests
+
+These were cleaned up thanks to Chris.
+
+## Roadmap review & planning
+
+- Chris will prepare the PostgreSQL configuration mentioned above.
diff --git a/docs/docs/meeting-notes/posts/2023-08-08.md b/docs/docs/meeting-notes/posts/2023-08-08.md
new file mode 100644
index 0000000..2c90ac7
--- /dev/null
+++ b/docs/docs/meeting-notes/posts/2023-08-08.md
@@ -0,0 +1,45 @@
+---
+draft: false
+date: 2023-08-08
+authors:
+ - joe
+description: Meeting minutes from 2023-08-08
+---
+# 2023-08-08
+
+## Agenda
+
+<!-- more -->
+
+- Configuration of PostgreSQL and the PostgreSQL exporter
+ - **No time so far**. Chris has been busy with renovating his living
+ room, and Johannes has been busy with renovating his bedroom.
+ Bradley prefers to remain quiet.
+ - Chris will try to work on this in the coming week and will try to
+ have Bella around as well, since he wanted to join the setup.
+- **Potential slot for GPG key signing of DevOps members**. External
+ verification will be necessary.
+ - Skipped. No webcam on Chris.
+- We need to assign a **librarian** to keep our documents organized
+ according to a system. Johannes is happy to do this for now.
+ - Let's move the existing documentation from the Kubernetes repository
+ into the infra repository. See
+ [kubernetes#161](https://github.com/python-discord/kubernetes/issues/161).
+ - **Our Notion DevOps space is full of junk**. Outside of that, it's
+ not open to read for outside contributors, and does not leave much
+ choice over which client to use for editing content.
+ - Chris agrees, without looking on it - just from memory. We should
+ move it to the infra repository. (The meeting notes have already
+ been transferred).
+ - Bella suggests to add some automation to make keeping everything in
+ clean order less tedious.
+- We may want to integrate the **Kubernetes repository** and the infra
+ repository together altogether, however there are a lot of
+ repositories referencing the deployment manifests that would need to
+ be updated.
+ - Chris mentions that regardless of what we do, we should - at the
+ very least move all documentation into the `infra` repository,
+ including the static site generator. At the moment we're using
+ Jekyll but we're open to trying alternatives such as Hugo.
+- We closed some issues and pull requests in the repositories for late
+ spring cleaning.
diff --git a/docs/docs/meeting-notes/posts/2023-08-22.md b/docs/docs/meeting-notes/posts/2023-08-22.md
new file mode 100644
index 0000000..921e2df
--- /dev/null
+++ b/docs/docs/meeting-notes/posts/2023-08-22.md
@@ -0,0 +1,23 @@
+---
+draft: false
+date: 2023-08-22
+authors:
+ - joe
+description: Meeting minutes from 2023-08-22
+---
+# 2023-08-22
+
+<!-- more -->
+
+## Agenda
+
+- Bella said he is on the streets. **We should start a gofundme**.
+ - After some more conversation this just means he is on vacation and
+ currently taking a walk.
+- Chris has been busy with turning his living room into a picasso art
+ collection, Johannes has been busy with renovating his bedroom, and
+ Bella is not home.
+ - Our next priority is winning.
+- We checked out some issues with documentation generation in `bot-core`
+ that Bella has mentioned. We managed to fix one issue with pydantic by
+ adding it to an exclude list but ran into another problem next.
diff --git a/docs/docs/meeting-notes/posts/2023-08-29.md b/docs/docs/meeting-notes/posts/2023-08-29.md
new file mode 100644
index 0000000..38b5800
--- /dev/null
+++ b/docs/docs/meeting-notes/posts/2023-08-29.md
@@ -0,0 +1,39 @@
+---
+draft: false
+date: 2023-08-29
+authors:
+ - joe
+description: Meeting minutes from 2023-08-29
+---
+# 2023-08-29
+
+<!-- more -->
+
+## Agenda
+
+- **Bella is still on the streets**
+ - The Python Discord Bella On The Streets Fundraising Campaign Q3 2023
+ has not been successful so far. To help Bella receive French
+ citizenship, Joe has put up a French flag behind himself in the
+ meeting.
+ - Joe corrects my sarcasm. It is an Italian flag, not a French flag.
+ The reason for this flag is that his new prime interest on campus
+ was born in Italy.
+- **The SnekBox CI build is pretty slow**
+ - Guix and Nix are not alternatives. Neither is Ubuntu
+ - We use pyenv to build multiple Python versions for a new feature
+ - The feature is not rolled out yet
+ - Part of the problem is that we build twice in the `build` and the
+ `deploy` stage
+ - On rollout, Joe tested it and it works fine
+- No update on the Hugo build yet
+- For snowflake, Johannes will write a proposal to the admins for
+ hosting it
+ - We should consider talking about the following points:
+ - statistically ~8% of Tor traffic is problematic (10% of traffic is
+ to hidden services, 80% of hidden service traffic is for illegal
+ services)
+ - overall the project's position and our ideal is to help people for
+ a good cause
+ - all traffic is forwarded to the Tor network, the service is
+ lightweight and only proxies encrypted traffic there
diff --git a/docs/docs/meeting-notes/posts/2023-09-05.md b/docs/docs/meeting-notes/posts/2023-09-05.md
new file mode 100644
index 0000000..8f40320
--- /dev/null
+++ b/docs/docs/meeting-notes/posts/2023-09-05.md
@@ -0,0 +1,31 @@
+---
+draft: false
+date: 2023-09-05
+authors:
+ - joe
+description: Meeting minutes from 2023-09-05
+---
+# 2023-09-05
+
+<!-- more -->
+
+## Agenda
+
+- No update on the Hugo build yet
+- Johannes wrote a proposal for snowflake proxy to be deployed to our
+ netcup hosts
+ - Admins discussed and came to the conclusion that since we don't own
+ the servers, we got the servers from netcup as a sponsorship to host
+ our infra, so using them to host something that isn't our infra
+ doesn't seem right.
+- Lots of dependabot PRs closed
+ - <https://github.com/search?q=org%3Apython-discord++is%3Apr+is%3Aopen+label%3A%22area%3A+dependencies%22&type=pullrequests&ref=advsearch>
+ - Closed ~50% of PRs
+- Workers repo has had its CI rewritten, all workers have consistent
+ package.json, scripts, and using the new style of cloudflare workers
+ which don't use webpack
+- Metricity updated to SQLAlchemy 2
+- Olli CI PR is up
+ - <https://github.com/python-discord/olli/pull/25>
+- Sir-Robin pydantic constants PR is up
+ - <https://github.com/python-discord/sir-robin/pull/93>
diff --git a/docs/docs/meeting-notes/posts/2023-09-12.md b/docs/docs/meeting-notes/posts/2023-09-12.md
new file mode 100644
index 0000000..5d91034
--- /dev/null
+++ b/docs/docs/meeting-notes/posts/2023-09-12.md
@@ -0,0 +1,48 @@
+---
+draft: false
+date: 2023-09-12
+authors:
+ - joe
+description: Meeting minutes from 2023-09-12
+---
+# 2023-09-12
+
+<!-- more -->
+
+## Agenda
+
+- We have reason to believe that Bella is still on the streets. Worse,
+ Bella is not available at the moment, leading us to believe that Bella
+ has still not found a home.
+ - Eight minutes into the meeting, Bella joins, complaining about the
+ bad internet. He mentions he is still on the streets (this may
+ contribute to the bad internet factor).
+- Chris made Mina leave with his repeated comments about Bella being
+ homeless, reminding Mina of the growing unemployment rate within the
+ DevOps team. As head of HR she cannot further support this matter.
+- About \#139, Bella mentions that online websites may cover the same
+ need that we have, but it may not be really useful for having it as a
+ command.
+ - Chris adds that "if someone wants to do it, I don't mind" and "I
+ don't think it would be very useful for a command, but I think it
+ would be fun to learn for someone implementing it". As long as
+ whoever is implementing is is aware that it would not be used too
+ much, it would be fine.
+- No progress on the hugo front
+- Our email service with workers will be forward only
+ - With postfix you will be able to reply. Joe wants to have an excuse
+ to play with Cloudflare workers though.
+- [50 open pull requests from
+ dependabot](https://github.com/search?q=org%3Apython-discord++is%3Apr+is%3Aopen+author%3Aapp%2Fdependabot&type=pullrequests&ref=advsearch)
+ - Tip from The Man: press ^D to make a bookmark in your browser
+ - "Those can just be blindly merged" - Chris
+- Grouping of dependencies: Dependabot now allows you to group together
+ multiple dependency updates into a single pull request.
+ - Possible approaches suggested: Group all the docker updates
+ together, group any linting dependencies together (would just
+ require a big RegEx). Dependabot natively works with its own
+ dependency groups here (e.g. Docker, Pip).
+- Mr. Hemlock wants to raise his roof: It's his project for this Autumn.
+ We, the team, are looking forward to his project - especially Bella,
+ who is currently looking for housing. "It's all coming together", said
+ Chris to the situation.
diff --git a/docs/docs/meeting-notes/posts/2024-07-02.md b/docs/docs/meeting-notes/posts/2024-07-02.md
new file mode 100644
index 0000000..cef8c93
--- /dev/null
+++ b/docs/docs/meeting-notes/posts/2024-07-02.md
@@ -0,0 +1,155 @@
+---
+draft: false
+date: 2024-07-02
+authors:
+ - joe
+description: Meeting minutes from 2024-07-02
+---
+# 2024-07-02
+
+<!-- more -->
+
+## Attendees
+
+Joe and Johannes.
+
+Chris unfortunately died in a fatal train accident and could not attend
+the meeting. This incident will be rectified in the next release,
+"Lovering 2.0: Immortability".
+
+Bella is out on the streets again. We are waiting for approval from the
+Python Discord admins to run another fundraiser.
+
+## Agenda
+
+- **Configuration of renovate** (Joe)
+
+ We are replacing dependabot with renovatebot. Johannes welcomes this
+ decision. Joe says we are looking for automatic deployment from
+ Kubernetes to make sure that any updates are automatically deployed.
+
+ **Conclusion**: Implemented.
+
+- **Resizing Netcup servers** (Joe, Johannes)
+
+ We can probably get rid of turing, assess what else we want to deploy
+ on lovelace, and then ask for a resize.
+
+ **Conclusion**: Create issue to move things off turing, remove it from
+ the inventory, remove it from documentation, power it off, then have
+ Joe ask for server removal.
+
+- **Updating the public statistics page** (Johannes)
+
+ Discussing and showcasing possible alternatives to the current
+ infrastructure powering <https://stats.pythondiscord.com> via the
+ <https://github.com/python-discord/public-stats> repository. Johannes
+ presents his current scripts that cuddle RRDTool into loading data out
+ of metricity, Joe says we will discuss with Chris what to do here.
+
+ The likely way going forward will be that *we will open an issue to
+ set it up*, the setup will contain an Ansible role to deploy the
+ cronjob and the script onto lovelace alongside with the `rrdtool`
+ PostgreSQL user.
+
+ **Conclusion**: Johannes will create an issue and codify the setup in
+ Ansible.
+
+- **New blog powered by Hugo** (Johannes)
+
+ Our current Ghost-powered blog is a tiny bit strange, and the
+ onboarding ramp to contribute articles is large. We want to migrate
+ this to Hugo - Johannes is leading the effort on it. The main work
+ will be building an appropriate theme, as no nicely suitable
+ replacement theme has been found so far. Front-end contributors would
+ be nice for this, although currently everything is still local on my
+ machine.
+
+ Joe mentions that we don't need to take anything particularly similar
+ to the current Ghost theme, just some vague resemblance would be nice.
+ Most of the recommended Hugo themes would probably work. Johannes will
+ check it out further.
+
+ **Conclusion**: Try the [hugo-casper-two
+ theme](https://github.com/eueung/hugo-casper-two) and report back.
+
+- **Finger server** (Joe, Johannes)
+
+ Joe recently proposed [the deployment of a finger
+ server](https://github.com/python-discord/infra/pull/373). Do we want
+ this and if yes, how are we going to proceed with this? If we do not
+ want any, running the `pinky` command locally or via `ssh` would be a
+ sound idea. We also need to consider whether members will update their
+ files regularly - we may want to incorporate functionality for this
+ into e.g. King Arthur.
+
+ Joe says that we shouldn't put a lot of development effort into it, it
+ would be simply a novelty thing.
+
+ **Conclusion**: This is a nice cheap win for some fun which should
+ just be a simple Python file (via Twisted's Finger protocol support or
+ whatever) that connects to LDAP (see Keycloak authentication server)
+ and outputs information. We could possibly integrate this into King
+ Arthur as well, so the querying workflow could look like KA -\>
+ fingerd -\> LDAP, or people could use finger commands directly.
+
+- **Keycloak authentication server** (Joe)
+
+ Joe mentions that we are deploying a Keycloak server because for some
+ members authenticating via GitHub is cumbersome, for instance because
+ their GitHub account is connected to their employer's GitHub
+ Enterprise installation. We could hook up a finger server to the LDAP
+ endpoint. Joe also mentions that we might want to set up e-mail
+ forwarding from pydis addresses to users via the user database that
+ will be stored in Keycloak.
+
+ Currently we only have a Keycloak installation that stores items in
+ PostgreSQL. This installation can federate to LDAP - we would simply
+ have to settle on some directory service backend. Joe suggests FreeIPA
+ because he's familar with it (including the Keycloak integration). The
+ problem is that it doesn't work on Debian. The alternative proposal,
+ given that we're saving ~50\$/month on Linode, would be spinning up a
+ Rocky VM with FreeIPA on it on Linode (we already have the budget) or
+ ask Netcup for another VM. Ultimately, the system to run FreeIPA would
+ be something CentOS-based. One aspect to consider is networking
+ security: in Linode we could use their private cloud endpoint feature
+ to securely expose the LDAP server to Keycloak and other services in
+ Kubernetes, if we were to run it in Netcup, we would need to use a
+ similar setup to what we currently have with PostgreSQL.
+
+ Any Python Discord user would be managed in LDAP, and Keycloak has the
+ necessary roles to write back into LDAP. Keeping the users in FreeIPA
+ up-to-date would be a somewhat manual procedure. Joe's plan was to
+ pick up the user's Discord username and use `[email protected]` as
+ their name and do account setup as part of the staff onboarding.
+
+ **Conclusion**: Will wait for Chris to discuss this further, but we
+ simply need to decide where we want to run the LDAP service.
+
+- **Flux CD** (Joe)
+
+ Joe proposes deploying [flux](https://fluxcd.io/) as a way to improve
+ the way we manage our CI/CD. We want the cluster to be able to
+ synchronize its state with the git repository. There are some
+ manifests in the repository currently that are not in sync with the
+ cluster version.
+
+ **Conclusion**: Approved, Joe will create an issue and do it.
+
+- **Polonium** (Chris)
+
+ Question came up regarding why the bot does not write to the database
+ directly. Joe said it's not perfect to have the bot write to it
+ directly - in metricity it works but it's not perfect. Chris probably
+ had good reason: separation of intent.
+
+ **Conclusion**: Approved, write to R&D for financing.
+
+- **Rethinking Bella: Suggested measures to gain autonomy** (Chris)
+
+ Chris will present our current plans to biologically re-think and
+ improve Bella's current architecture by means of hypertrophy-supported
+ capillary enlargements, with the final goal of gaining complete
+ control and ownership over the World Economic Forum by 2026. As Bella
+ is currently on parental leave, we will send him the result of this
+ voting via NNCP.
diff --git a/docs/docs/meeting-notes/posts/2024-07-25.md b/docs/docs/meeting-notes/posts/2024-07-25.md
new file mode 100644
index 0000000..055108f
--- /dev/null
+++ b/docs/docs/meeting-notes/posts/2024-07-25.md
@@ -0,0 +1,38 @@
+---
+draft: false
+date: 2024-07-25
+authors:
+ - joe
+description: Meeting minutes from 2024-07-25
+---
+# 2024-07-25
+
+## Attendees
+
+Bella, Joe, Fredrick, Chris, Johannes
+
+<!-- more -->
+
+## Agenda
+
+- **Open issues and pull requests in Joe's repositories**
+
+ Joe has plenty of pending changes in his open source repositories on
+ GitHub. Together with Chris, he went through these and reviewed them.
+ Most were accepted. Fredrick proposed some further changes to the
+ ff-bot merge routine which Joe will check out after the meeting.
+
+- **LDAP**
+
+ Bella is instructed to enter his street address into LDAP for t-shirt
+ shipping.
+
+- **New documentation**
+
+ Johannes merged our new documentation. Unfortunately, he forgot to
+ test it first. Joe visits it and discovers some problems. Johannes
+ fixes it live.
+
+- **Turing**
+
+- **SMTP server**
diff --git a/docs/docs/onboarding/access-table.md b/docs/docs/onboarding/access-table.md
new file mode 100644
index 0000000..6fb7466
--- /dev/null
+++ b/docs/docs/onboarding/access-table.md
@@ -0,0 +1,30 @@
+---
+description: The Access Table breaks down the different DevOps resources available and who has access to them.
+---
+# Access Table
+
+## Compute
+
+| **Resource** | **Description** | **Keyholders** |
+| --------------------------------------- | ----------------------------------------------------------------------- | ---------------------------------------------- |
+| Linode Kubernetes Cluster | The primary cluster where all resources are deployed. | Hassan, Joe, Chris, Leon, Sebastiaan, Johannes |
+| Linode Dashboard | The online dashboard for managing and allocating resources from Linode. | Joe, Chris |
+| Netcup Dashboard | The dashboard for managing and allocating resources from Netcup. | Joe, Chris |
+| Netcup servers | Root servers provided by the Netcup partnership. | Joe, Chris, Bella, Johannes |
+
+## Secrets
+
+| **Resource** | **Description** | **Keyholders** |
+| --------------------------------------- | ------------------------------------------------------------------- | --------------------------------------------- |
+| `git-crypt`ed files in infra repository | `git-crypt` is used to encrypt certain files within the repository. | Chris, Joe, Hassan, Johannes, Bella, Xithrius |
+| Ansible Vault | Used to store sensitive data for the Ansible deployment | Chris, Joe, Johannes, Bella |
+
+## Services
+
+Additionally, several services are gated behind membership of the `DevOps` role
+on Discord, sign in is handled by Cloudflare Access &
+[LDAP](../services/LDAP/index.md):
+
+- Prometheus
+- AlertManager
+- Grafana (also open to Core Developers, Moderators and Administrators)
diff --git a/docs/docs/onboarding/index.md b/docs/docs/onboarding/index.md
new file mode 100644
index 0000000..195df5d
--- /dev/null
+++ b/docs/docs/onboarding/index.md
@@ -0,0 +1,43 @@
+---
+description: Read about our onboarding process for new DevOps team members
+---
+
+# Onboarding
+
+<div class="grid cards" markdown>
+
+- :material-key-chain:{ .lg .middle } __Access Table__
+
+ ---
+
+ The Access Table breaks down the different DevOps resources available and
+ who has access to them.
+
+ [:octicons-arrow-right-24: View Access Table](./access-table.md)
+
+- :material-police-badge:{ .lg .middle } __Rules__
+
+ ---
+
+ The Access Table breaks down the different DevOps resources available and
+ who has access to them.
+
+ [:octicons-arrow-right-24: View DevOps Rules](./rules.md)
+
+- :material-library:{ .lg .middle } __Resources__
+
+ ---
+
+ Important information references for the DevOps team
+
+ [:octicons-arrow-right-24: Available Resources](./resources.md)
+
+- :fontawesome-solid-gears:{ .lg .middle } __Tools__
+
+ ---
+
+ Tools we use to manage, monitor and interact with our infrastructure.
+
+ [:octicons-arrow-right-24: View Tools](./tools.md)
+
+</div>
diff --git a/docs/docs/onboarding/resources.md b/docs/docs/onboarding/resources.md
new file mode 100644
index 0000000..849dde2
--- /dev/null
+++ b/docs/docs/onboarding/resources.md
@@ -0,0 +1,36 @@
+---
+description: Important information references for the DevOps team
+---
+# Resources
+
+The following is a collection of important reference documents for the DevOps
+team.
+
+## [Infra Repo](https://github.com/python-discord/infra)
+
+This GitHub repo contains most of the manifests and configuration applies to our
+cluster. It's kept up to date manually and is considered a source of truth for
+what we should have in the cluster.
+
+It is mostly documented, but improvements for unclear or outdated aspects are
+always welcome. If you have any question, please feel free [to open a GitHub
+issue on the infra
+repository](https://github.com/python-discord/infra/issues/new) or ask in the
+`#dev-oops` channel.
+
+## [Knowledge base](https://python-discord.github.io/infra/)
+
+This website.
+
+Deployed using GH pages, source can be found [in the docs directory of the infra
+repository](https://github.com/python-discord/infra).
+
+This includes:
+
+- Changelogs
+- Post-mortems
+- Common queries
+- Runbooks
+
+The sidebar of the infra documentation contains some other links to
+DevOps-related projects.
diff --git a/docs/docs/onboarding/rules.md b/docs/docs/onboarding/rules.md
new file mode 100644
index 0000000..00a63b3
--- /dev/null
+++ b/docs/docs/onboarding/rules.md
@@ -0,0 +1,15 @@
+---
+description: The rules any DevOps team member must follow.
+---
+# Rules
+
+The rules any DevOps team member must follow.
+
+1. LMAO - **L**ogging, **M**onitoring, **A**lerting, **O**bservability
+2. Modmail is the greatest piece of software ever written
+3. Modmail needs at least 5 minutes to gather all its greatness at startup
+4. We never blame Chris, it's always <@233481908342882304>'s fault
+5. LKE isn't bad, it's your fault for not paying for the high availability
+ control plane
+6. Our software is ever legacy, it's merely well-aged
+7. Ignore these rules (however maybe not 1, 1 seems important to remember)
diff --git a/docs/docs/onboarding/tools.md b/docs/docs/onboarding/tools.md
new file mode 100644
index 0000000..3232ae1
--- /dev/null
+++ b/docs/docs/onboarding/tools.md
@@ -0,0 +1,43 @@
+---
+description: Tools we use to manage, monitor and interact with our infrastructure.
+---
+# Tools
+
+We use a few tools to manage, monitor, and interact with our infrastructure.
+Some of these tools are not unique to the DevOps team, and may be shared by
+other teams.
+
+All non-Discord services depend on your [LDAP](../services/LDAP/index.md)
+credentials, so ensure you have access and are in the DevOps team (you can
+validate this by trying to login to a service like Prometheus).
+
+## [Grafana](https://grafana.pydis.wtf/)
+
+Grafana provides access to some of the most important resources at your
+disposal. It acts as an aggregator and frontend for a large amount of data.
+These range from metrics, to logs, to stats. Some of the most important are
+listed below:
+
+- **Service Logs / All App Logs Dashboard**
+
+ Service logs is a simple log viewer which gives you access to a large majority
+ of the applications deployed in the default namespace. The All App logs
+ dashboard is an expanded version of that which gives you access to all apps in
+ all namespaces, and allows some more in-depth querying.
+
+- **Kubernetes Dashboard**
+
+ This dashboard gives quick overviews of all the most important metrics of the
+ Kubernetes system. For more detailed information, check out other dashboard
+ such as Resource Usage, NGINX, PostgreSQL and Redis.
+
+## [Prometheus Dashboard](https://prometheus.pydis.wtf/)
+
+This provides access to the Prometheus query console. You may also enjoy the
+[Alertmanager Console](https://alertmanager.pydis.wtf/).
+
+## [King Arthur](https://github.com/python-discord/king-arthur/)
+
+King Arthur is a discord bot which provides information about, and access to our
+cluster directly in discord. Invoke its help command for more information (`M-x
+help`).
diff --git a/docs/docs/post-mortems/.authors.yml b/docs/docs/post-mortems/.authors.yml
new file mode 100644
index 0000000..8fe49bb
--- /dev/null
+++ b/docs/docs/post-mortems/.authors.yml
@@ -0,0 +1,5 @@
+authors:
+ joe:
+ name: Joe Banks
+ description: DevOps Team Member
+ avatar: https://github.com/jb3.png
diff --git a/docs/docs/post-mortems/index.md b/docs/docs/post-mortems/index.md
new file mode 100644
index 0000000..4bcafb0
--- /dev/null
+++ b/docs/docs/post-mortems/index.md
@@ -0,0 +1,10 @@
+---
+description: Here we document post-mortems for incidents that have occurred in the past. We aim to learn from our mistakes and prevent them in the future.
+---
+# Post Mortems
+
+Here we document post-mortems for incidents that have occurred in the past. We aim to learn from our mistakes and prevent them in the future.
+
+Posts will follow a standardised format and conclude with tasks that we aim to implement to avoid recurrence of similar incidents.
+
+## Posts
diff --git a/docs/docs/post-mortems/posts/all-services-outage.md b/docs/docs/post-mortems/posts/all-services-outage.md
new file mode 100644
index 0000000..aea68cd
--- /dev/null
+++ b/docs/docs/post-mortems/posts/all-services-outage.md
@@ -0,0 +1,123 @@
+---
+draft: false
+date: 2020-12-11
+authors:
+ - joe
+categories:
+- Kubernetes
+- Database
+description: In this incident, all services became unresponsive. The DevOps team were already in a call, and immediately started to investigate.
+---
+# All services outage
+
+At **19:55 UTC, all services became unresponsive**. The DevOps team were
+already in a call, and immediately started to investigate.
+
+Postgres was running at 100% CPU usage due to a **VACUUM**, which caused
+all services that depended on it to stop working. The high CPU left the
+host unresponsive and it shutdown. Linode Lassie noticed this and
+triggered a restart.
+
+It did not recover gracefully from this restart, with numerous core
+services reporting an error, so we had to manually restart core system
+services using Lens in order to get things working again.
+
+<!-- more -->
+
+## :warning: Leadup
+
+*List the sequence of events that led to the incident*
+
+Postgres triggered a **AUTOVACUUM**, which lead to a CPU spike. This
+made Postgres run at 100% CPU and was unresponsive, which caused
+services to stop responding. This lead to a restart of the node, from
+which we did not recover gracefully.
+
+## :flying_disc: Impact
+
+*Describe how internal and external users were impacted during the
+incident*
+
+All services went down. Catastrophic failure. We did not pass go, we did
+not collect $200.
+
+- Help channel system unavailable, so people are not able to
+ effectively ask for help.
+- Gates unavailable, so people can't successfully get into the
+ community.
+- Moderation and raid prevention unavailable, which leaves us
+ defenseless against attacks.
+
+## :eye: Detection
+
+*Report when the team detected the incident, and how we could improve
+detection time*
+
+We noticed that all PyDis services had stopped responding,
+coincidentally our DevOps team were in a call at the time, so that was
+helpful.
+
+We may be able to improve detection time by adding monitoring of
+resource usage. To this end, we've added alerts for high CPU usage and
+low memory.
+
+## :man_raising_hand: Response
+
+*Who responded to the incident, and what obstacles did they encounter?*
+
+Joe Banks responded to the incident.
+
+We noticed our node was entirely unresponsive and within minutes a
+restart had been triggered by Lassie after a high CPU shutdown occurred.
+
+The node came back and we saw a number of core services offline
+(e.g. Calico, CoreDNS, Linode CSI).
+
+**Obstacle: no recent database back-up available**
+
+## :woman_gesturing_ok: Recovery
+
+*How was the incident resolved? How can we improve future mitigation
+times?*
+
+Through [Lens](https://k8slens.dev/) we restarted core services one
+by one until they stabilised, after these core services were up other
+services began to come back online.
+
+We finally provisioned PostgreSQL which had been removed as a component
+before the restart (but too late to prevent the CPU errors). Once
+PostgreSQL was up we restarted any components that were acting buggy
+(e.g. site and bot).
+
+## :mag_right: Five Why's
+
+*Run a 5-whys analysis to understand the true cause of the incident.*
+
+- Major service outage
+- **Why?** Core service failures (e.g. Calico, CoreDNS, Linode CSI)
+- **Why?** Kubernetes worker node restart
+- **Why?** High CPU shutdown
+- **Why?** Intensive PostgreSQL AUTOVACUUM caused a CPU spike
+
+## :seedling: Blameless root cause
+
+*Note the final root cause and describe what needs to change to prevent
+reoccurrance*
+
+## :thinking: Lessons learned
+
+*What did we learn from this incident?*
+
+- We must ensure we have working database backups. We are lucky that we
+ did not lose any data this time. If this problem had caused volume
+ corruption, we would be screwed.
+- Sentry is broken for the bot. It was missing a DSN secret, which we
+ have now restored.
+- The [sentry.pydis.com](https://sentry.pydis.com) redirect was never migrated to the
+ cluster. **We should do that.**
+
+## :ballot_box_with_check: Follow-up tasks
+
+*List any tasks we've created as a result of this incident*
+
+- [x] Push forward with backup plans
diff --git a/docs/docs/post-mortems/posts/cascading-node-failures.md b/docs/docs/post-mortems/posts/cascading-node-failures.md
new file mode 100644
index 0000000..40c5d23
--- /dev/null
+++ b/docs/docs/post-mortems/posts/cascading-node-failures.md
@@ -0,0 +1,265 @@
+---
+draft: false
+date: 2021-07-11
+authors:
+ - joe
+categories:
+- Kubernetes
+- Database
+description: A PostgreSQL connection surge caused by Django led to service unavailability.
+---
+# Cascading node failures and ensuing volume problems
+
+A PostgreSQL connection spike (00:27 UTC) caused by Django moved a node
+to an unresponsive state (00:55 UTC), upon performing a recycle of the
+affected node volumes were placed into a state where they could not be
+mounted.
+
+<!-- more -->
+
+## :warning: Leadup
+
+*List the sequence of events that led to the incident*
+
+- **00:27 UTC:** Django starts rapidly using connections to our
+ PostgreSQL database
+- **00:32 UTC:** DevOps team is alerted that PostgreSQL has saturated
+ it's 115 max connections limit. Joe is paged.
+- **00:33 UTC:** DevOps team is alerted that a service has claimed 34
+ dangerous table locks (it peaked at 61).
+- **00:42 UTC:** Status incident created and backdated to 00:25 UTC.
+ [Status incident](https://status.pythondiscord.com/incident/92712)
+- **00:55 UTC:** It's clear that the node which PostgreSQL was on is no
+ longer healthy after the Django connection surge, so it's recycled and
+ a new one is to be added to the pool.
+- **01:01 UTC:** Node `lke13311-16405-5fafd1b46dcf` begins it's restart
+- **01:13 UTC:** Node has restored and regained healthy status, but
+ volumes will not mount to the node. Support ticket opened at Linode
+ for assistance.
+- **06:36 UTC:** DevOps team alerted that Python is offline. This is due
+ to Redis being a dependency of the bot, which as a stateful service
+ was not healthy.
+
+## :flying_disc: Impact
+
+*Describe how internal and external users were impacted during the
+incident*
+
+Initially, this manifested as a standard node outage where services on
+that node experienced some downtime as the node was restored.
+
+Post-restore, all stateful services (e.g. PostgreSQL, Redis, PrestaShop)
+were unexecutable due to the volume issues, and so any dependent
+services (e.g. Site, Bot, Hastebin) also had trouble starting.
+
+PostgreSQL was restored early on so for the most part Moderation could
+continue.
+
+## :eye: Detection
+
+*Report when the team detected the incident, and how we could improve
+detection time*
+
+DevOps were initially alerted at 00:32 UTC due to the PostgreSQL
+connection surge, and acknowledged at the same time.
+
+Further alerting could be used to catch surges earlier on (looking at
+conn delta vs. conn total), but for the most part alerting time was
+satisfactory here.
+
+## :man_raising_hand: Response
+
+*Who responded to the incident, and what obstacles did they encounter?*
+
+Joe Banks responded. The primary issue encountered was failure upstream
+at Linode to remount the affected volumes, a support ticket has been
+created.
+
+## :woman_gesturing_ok: Recovery
+
+*How was the incident resolved? How can we improve future mitigation?*
+
+Initial node restoration was performed by @Joe Banks by recycling the
+affected node.
+
+Subsequent volume restoration was also @Joe Banks and once Linode had
+unlocked the volumes affected pods were scaled down to 0, the volumes
+were unmounted at the Linode side and then the deployments were
+recreated.
+
+<details markdown>
+
+<summary>
+
+Support ticket sent
+
+</summary>
+
+Good evening,
+
+We experienced a resource surge on one of our Kubernetes nodes at 00:32
+UTC, causing a node to go unresponsive. To mitigate problems here the
+node was recycled and began restarting at 1:01 UTC.
+
+The node has now rejoined the ring and started picking up services, but
+volumes will not attach to it, meaning pods with stateful storage will
+not start.
+
+An example events log for one such pod:
+
+ Type Reason Age From Message
+ ---- ------ ---- ---- -------
+ Normal Scheduled 2m45s default-scheduler Successfully assigned default/redis-599887d778-wggbl to lke13311-16405-5fafd1b46dcf
+ Warning FailedMount 103s kubelet MountVolume.MountDevice failed for volume "pvc-bb1d06139b334c1f" : rpc error: code = Internal desc = Unable to find device path out of attempted paths: [/dev/disk/by-id/linode-pvcbb1d06139b334c1f /dev/disk/by-id/scsi-0Linode_Volume_pvcbb1d06139b334c1f]
+ Warning FailedMount 43s kubelet Unable to attach or mount volumes: unmounted volumes=[redis-data-volume], unattached volumes=[kube-api-access-6wwfs redis-data-volume redis-config-volume]: timed out waiting for the condition
+
+I've been trying to manually resolve this through the Linode Web UI but
+get presented with attachment errors upon doing so. Please could you
+advise on the best way forward to restore Volumes & Nodes to a
+functioning state? As far as I can see there is something going on
+upstream since the Linode UI presents these nodes as mounted however as
+shown above LKE nodes are not locating them, there is also a few failed
+attachment logs in the Linode Audit Log.
+
+Thanks,
+
+Joe
+
+</details>
+
+<details markdown>
+
+<summary>
+
+Response received from Linode
+
+</summary>
+
+Hi Joe,
+
+> Were there any known issues with Block Storage in Frankfurt today?
+
+Not today, though there were service issues reported for Block Storage
+and LKE in Frankfurt on July 8 and 9:
+
+- [Service Issue - Block Storage - EU-Central
+ (Frankfurt)](https://status.linode.com/incidents/pqfxl884wbh4)
+- [Service Issue - Linode Kubernetes Engine
+ -Frankfurt](https://status.linode.com/incidents/13fpkjd32sgz)
+
+There was also an API issue reported on the 10th (resolved on the 11th),
+mentioned here:
+
+- [Service Issue - Cloud Manager and
+ API](https://status.linode.com/incidents/vhjm0xpwnnn5)
+
+Regarding the specific error you were receiving:
+
+> `Unable to find device path out of attempted paths`
+
+I'm not certain it's specifically related to those Service Issues,
+considering this isn't the first time a customer has reported this error
+in their LKE logs. In fact, if I recall correctly, I've run across this
+before too, since our volumes are RWO and I had too many replicas in my
+deployment that I was trying to attach to, for example.
+
+> is this a known bug/condition that occurs with Linode CSI/LKE?
+
+From what I understand, yes, this is a known condition that crops up
+from time to time, which we are tracking. However, since there is a
+workaround at the moment (e.g. - "After some more manual attempts to fix
+things, scaling down deployments, unmounting at Linode and then scaling
+up the deployments seems to have worked and all our services have now
+been restored."), there is no ETA for addressing this. With that said,
+I've let our Storage team know that you've run into this, so as to draw
+further attention to it.
+
+If you have any further questions or concerns regarding this, let us
+know.
+
+Best regards, [Redacted]
+
+Linode Support Team
+
+</details>
+
+<details markdown>
+
+<summary>
+
+Concluding response from Joe Banks
+
+</summary>
+
+Hey [Redacted]!
+
+Thanks for the response. We ensure that stateful pods only ever have one
+volume assigned to them, either with a single replica deployment or a
+statefulset. It appears that the error generally manifests when a
+deployment is being migrated from one node to another during a redeploy,
+which makes sense if there is some delay on the unmount/remount.
+
+Confusion occurred because Linode was reporting the volume as attached
+when the node had been recycled, but I assume that was because the node
+did not cleanly shutdown and therefore could not cleanly unmount
+volumes.
+
+We've not seen any resurgence of such issues, and we'll address the
+software fault which overloaded the node which will helpfully mitigate
+such problems in the future.
+
+Thanks again for the response, have a great week!
+
+Best,
+
+Joe
+
+</details>
+
+## :mag_right: Five Why's
+
+*Run a 5-whys analysis to understand the true cause of the incident.*
+
+**What?** Several of our services became unavailable because their volumes could
+not be mounted.
+
+**Why?** A node recycle left the node unable to mount volumes using the Linode
+CSI.
+
+**Why?** A node recycle was used because PostgreSQL had a connection surge.
+
+**Why?** A Django feature deadlocked a table 62 times and suddenly started using
+~70 connections to the database, saturating the maximum connections
+limit.
+
+**Why?** The root cause of why Django does this is unclear, and someone with more
+Django proficiency is absolutely welcome to share any knowledge they may
+have. I presume it's some sort of worker race condition, but I've not
+been able to reproduce it.
+
+## :seedling: Blameless root cause
+
+*Note the final root cause and describe what needs to change to prevent
+reoccurrence*
+
+A node being forcefully restarted left volumes in a limbo state where
+mounting was difficult, it took multiple hours for this to be resolved
+since we had to wait for the volumes to unlock so they could be cloned.
+
+## :thinking: Lessons learned
+
+*What did we learn from this incident?*
+
+Volumes are painful.
+
+We need to look at why Django is doing this and mitigations of the fault
+to prevent this from occurring again.
+
+## :ballot_box_with_check: Follow-up tasks
+
+*List any tasks we should complete that are relevant to this incident*
+
+- [x] [Follow up on ticket at
+ Linode](https://www.notion.so/Cascading-node-failures-and-ensuing-volume-problems-1c6cfdfcadfc4422b719a0d7a4cc5001)
+- [ ] Investigate why Django could be connection surging and locking
+ tables
diff --git a/docs/docs/post-mortems/posts/images/2021-01-12/site_cpu_throttle.png b/docs/docs/post-mortems/posts/images/2021-01-12/site_cpu_throttle.png
new file mode 100644
index 0000000..b530ec6
--- /dev/null
+++ b/docs/docs/post-mortems/posts/images/2021-01-12/site_cpu_throttle.png
Binary files differ
diff --git a/docs/docs/post-mortems/posts/images/2021-01-12/site_resource_abnormal.png b/docs/docs/post-mortems/posts/images/2021-01-12/site_resource_abnormal.png
new file mode 100644
index 0000000..e1e07af
--- /dev/null
+++ b/docs/docs/post-mortems/posts/images/2021-01-12/site_resource_abnormal.png
Binary files differ
diff --git a/docs/docs/post-mortems/posts/images/2021-01-30/linode_loadbalancers.png b/docs/docs/post-mortems/posts/images/2021-01-30/linode_loadbalancers.png
new file mode 100644
index 0000000..f0eae1f
--- /dev/null
+++ b/docs/docs/post-mortems/posts/images/2021-01-30/linode_loadbalancers.png
Binary files differ
diff --git a/docs/docs/post-mortems/posts/images/2021-01-30/memory_charts.png b/docs/docs/post-mortems/posts/images/2021-01-30/memory_charts.png
new file mode 100644
index 0000000..370d19e
--- /dev/null
+++ b/docs/docs/post-mortems/posts/images/2021-01-30/memory_charts.png
Binary files differ
diff --git a/docs/docs/post-mortems/posts/images/2021-01-30/prometheus_status.png b/docs/docs/post-mortems/posts/images/2021-01-30/prometheus_status.png
new file mode 100644
index 0000000..e95b8d7
--- /dev/null
+++ b/docs/docs/post-mortems/posts/images/2021-01-30/prometheus_status.png
Binary files differ
diff --git a/docs/docs/post-mortems/posts/images/2021-01-30/scaleios.png b/docs/docs/post-mortems/posts/images/2021-01-30/scaleios.png
new file mode 100644
index 0000000..584d74d
--- /dev/null
+++ b/docs/docs/post-mortems/posts/images/2021-01-30/scaleios.png
Binary files differ
diff --git a/docs/docs/post-mortems/posts/nodebalancer-fails-memory.md b/docs/docs/post-mortems/posts/nodebalancer-fails-memory.md
new file mode 100644
index 0000000..6d0e198
--- /dev/null
+++ b/docs/docs/post-mortems/posts/nodebalancer-fails-memory.md
@@ -0,0 +1,149 @@
+---
+draft: false
+date: 2021-01-30
+authors:
+ - joe
+categories:
+- Kubernetes
+- Networking
+description: Our Linode load balancer experienced issues stemming from memory and CPU pressure.
+---
+# NodeBalancer networking faults due to memory pressure
+
+At around 14:30 UTC on Saturday 30th January we started experiencing
+networking issues at the LoadBalancer level between Cloudflare and our
+Kubernetes cluster. It seems that the misconfiguration was due to memory
+and CPU pressure.
+
+~~This post-mortem is preliminary, we are still awaiting word
+from Linode's SysAdmins on any problems they detected.~~
+
+**Update 2nd February 2021:** Linode have migrated our NodeBalancer to a
+different machine.
+
+<!-- more -->
+
+## :warning: Leadup
+
+*List the sequence of events that led to the incident*
+
+At 14:30 we started receiving alerts that services were becoming
+unreachable. We first experienced some momentary DNS errors which
+resolved themselves, however traffic ingress was still degraded.
+
+Upon checking Linode our NodeBalancer, the service which balances
+traffic between our Kubernetes nodes was reporting the backends (the
+services it balances to) as down. It reported all 4 as down (two for
+port 80 + two for port 443). This status was fluctuating between up and
+down, meaning traffic was not reaching our cluster correctly. Scaleios
+correctly noted:
+
+![image](./images/2021-01-30/scaleios.png)
+
+The config seems to have been set incorrectly due to memory and CPU
+pressure on one of our nodes. Here is the memory throughout the
+incident:
+
+![image](./images/2021-01-30/memory_charts.png)
+
+Here is the display from Linode:
+
+![image](./images/2021-01-30/linode_loadbalancers.png)
+
+## :flying_disc: Impact
+
+*Describe how internal and external users were impacted during the
+incident*
+
+Since traffic could not correctly enter our cluster multiple services
+which were web based were offline, including services such as site,
+grafana and bitwarden. It appears that no inter-node communication was
+affected as this uses a WireGuard tunnel between the nodes which was not
+affected by the NodeBalancer.
+
+The lack of Grafana made diagnosis slightly more difficult, but even
+then it was only a short trip to the Linode dashboard to diagnose and
+investigate.
+
+## :eye: Detection
+
+*Report when the team detected the incident, and how we could improve
+detection time*
+
+We were alerted fairly promptly through statping which reported services
+as being down and posted a Discord notification. Subsequent alerts came
+in from Grafana but were limited since outbound communication was
+faulty.
+
+## :man_raising_hand: Response
+
+*Who responded to the incident, and what obstacles did they encounter?*
+
+Joe Banks responded!
+
+Primary obstacle was the DevOps tools being out due to the traffic
+ingress problems.
+
+## :woman_gesturing_ok: Recovery
+
+*How was the incident resolved? How can we improve future mitigation?*
+
+The incident resolved itself upstream at Linode, we've opened a ticket
+with Linode to let them know of the faults, this might give us a better
+indication of what caused the issues. Our Kubernetes cluster continued
+posting updates to Linode to refresh the NodeBalancer configuration,
+inspecting these payloads the configuration looked correct.
+
+We've set up alerts for when Prometheus services stop responding since
+this seems to be a fairly tell-tale symptom of networking problems, this
+was the Prometheus status graph throughout the incident:
+
+![image](./images/2021-01-30/prometheus_status.png)
+
+## :mag_right: Five Why's
+
+*Run a 5-whys analysis to understand the true cause of the incident.*
+
+**What?** Our service experienced an outage due to networking faults.
+
+**Why?** Incoming traffic could not reach our Kubernetes nodes
+
+**Why?** Our Linode NodeBalancers were not using correct configuration
+
+**Why?** Memory & CPU pressure seemed to cause invalid configuration
+errors upstream at Linode.
+
+**Why?** Unknown at this stage, NodeBalancer migrated.
+
+## :seedling: Blameless root cause
+
+*Note the final root cause and describe what needs to change to prevent
+reoccurrance*
+
+The configuration of our NodeBalancer was invalid, we cannot say why at
+this point since we are awaiting contact back from Linode, but
+indicators point to it being an upstream fault since memory & CPU
+pressure should **not** cause a load balancer misconfiguration.
+
+Linode are going to follow up with us at some point during the week with
+information from their System Administrators.
+
+**Update 2nd February 2021:** Linode have concluded investigations at
+their end, taken notes and migrated our NodeBalancer to a new machine.
+We haven't experienced problems since.
+
+## :thinking: Lessons learned
+
+*What did we learn from this incident?*
+
+We should be careful over-scheduling onto nodes since even while
+operating within reasonable constraints we risk sending invalid
+configuration upstream to Linode and therefore preventing traffic from
+entering our cluster.
+
+## :ballot_box_with_check: Follow-up tasks
+
+*List any tasks we should complete that are relevant to this incident*
+
+- [x] Monitor for follow up from Linode
+- [x] Carefully monitor the allocation rules for our services
diff --git a/docs/docs/post-mortems/posts/postgres-connection-surge.md b/docs/docs/post-mortems/posts/postgres-connection-surge.md
new file mode 100644
index 0000000..b2d0806
--- /dev/null
+++ b/docs/docs/post-mortems/posts/postgres-connection-surge.md
@@ -0,0 +1,130 @@
+---
+draft: false
+date: 2020-12-11
+authors:
+ - joe
+categories:
+- Kubernetes
+- Database
+description: We noticed the bot was not able to infract, and pythondiscord.com was unavailable. The DevOps team started to investigate.
+---
+# Postgres connection surge
+
+At **13:24 UTC,** we noticed the bot was not able to infract, and
+[pythondiscord.com](https://pythondiscord.com) was unavailable. The
+DevOps team started to investigate.
+
+We discovered that Postgres was not accepting new connections because it
+had hit 100 clients. This made it unavailable to all services that
+depended on it.
+
+Ultimately this was resolved by taking down Postgres, remounting the
+associated volume, and bringing it back up again.
+
+<!-- more -->
+
+## :warning: Leadup
+
+*List the sequence of events that led to the incident*
+
+The bot infractions stopped working, and we started investigating.
+
+## :flying_disc: Impact
+
+*Describe how internal and external users were impacted during the
+incident*
+
+Services were unavailable both for internal and external users.
+
+- The Help Channel System was unavailable.
+- Voice Gate and Server Gate were not working.
+- Moderation commands were unavailable.
+- Python Discord site & API were unavailable. CloudFlare automatically
+ switched us to Always Online.
+
+## :eye: Detection
+
+*Report when the team detected the incident, and how we could improve
+detection time*
+
+We noticed HTTP 524s coming from CloudFlare, upon attempting database
+connection we observed the maximum client limit.
+
+We noticed this log in site:
+
+```
+django.db.utils.OperationalError: FATAL: sorry, too many clients already
+```
+
+We should be monitoring number of clients, and the monitor should alert
+us when we're approaching the max. That would have allowed for earlier
+detection, and possibly allowed us to prevent the incident altogether.
+
+We will look at
+[wrouesnel/postgres_exporter](https://github.com/wrouesnel/postgres_exporter) for monitoring this.
+
+## :man_raising_hand: Response
+
+*Who responded to the incident, and what obstacles did they encounter?*
+
+Joe Banks responded to the incident. The obstacles were mostly a lack of
+a clear response strategy.
+
+We should document our recovery procedure so that we're not so dependent
+on Joe Banks should this happen again while he's unavailable.
+
+## :woman_gesturing_ok: Recovery
+
+*How was the incident resolved? How can we improve future mitigation?*
+
+- Delete PostgreSQL deployment ``kubectl delete deployment/postgres``
+- Delete any remaining pods, WITH force.
+ ``kubectl delete <pod name> --force --grace-period=0``
+- Unmount volume at Linode
+- Remount volume at Linode
+- Reapply deployment ``kubectl apply -f postgres/deployment.yaml``
+
+## :mag_right: Five Why's
+
+*Run a 5-whys analysis to understand the true cause of the incident.*
+
+- Postgres was unavailable, so our services died.
+- **Why?** Postgres hit max clients, and could not respond.
+- **Why?** Unknown, but we saw a number of connections from previous
+ deployments of site. This indicates that database connections are not
+ being terminated properly. Needs further investigation.
+
+## :seedling: Blameless root cause
+
+*Note the final root cause and describe what needs to change to prevent
+reoccurrance*
+
+We're not sure what the root cause is, but suspect site is not
+terminating database connections properly in some cases. We were unable
+to reproduce this problem.
+
+We've set up new telemetry on Grafana with alerts so that we can
+investigate this more closely. We will be let know if the number of
+connections from site exceeds 32, or if the total number of connections
+exceeds 90.
+
+## :thinking: Lessons learned
+
+*What did we learn from this incident?*
+
+- We must ensure the DevOps team has access to Linode and other key
+ services even if our Bitwarden is down.
+- We need to ensure we're alerted of any risk factors that have the
+ potential to make Postgres unavailable, since this causes a
+ catastrophic outage of practically all services.
+- We absolutely need backups for the databases, so that this sort of
+ problem carries less of a risk.
+- We may need to consider something like
+ [pg_bouncer](https://wiki.postgresql.org/wiki/PgBouncer) to manage
+ a connection pool so that we don't exceed 100 *legitimate* clients
+ connected as we connect more services to the postgres database.
+
+## :ballot_box_with_check: Follow-up tasks
+*List any tasks we should complete that are relevant to this incident*
+
+- [x] All database backup
diff --git a/docs/docs/post-mortems/posts/primary-kubernetes-node-outage.md b/docs/docs/post-mortems/posts/primary-kubernetes-node-outage.md
new file mode 100644
index 0000000..e94f347
--- /dev/null
+++ b/docs/docs/post-mortems/posts/primary-kubernetes-node-outage.md
@@ -0,0 +1,118 @@
+---
+draft: false
+date: 2021-01-10
+authors:
+ - joe
+categories:
+- Kubernetes
+description: A large Prometheus query caused a cascading failure due to CPU exhaustion.
+---
+# Primary Kubernetes node outage
+
+We had an outage of our highest spec node due to CPU exhaustion. The
+outage lasted from around 20:20 to 20:46 UTC, but was not a full service
+outage.
+
+<!-- more -->
+
+## :warning: Leadup
+
+*List the sequence of events that led to the incident*
+
+I ran a query on Prometheus to try figure out some statistics on the
+number of metrics we are holding, this ended up scanning a lot of data
+in the TSDB database that Prometheus uses.
+
+This scan caused a CPU exhaustion which caused issues with the
+Kubernetes node status.
+
+## :flying_disc: Impact
+
+*Describe how internal and external users were impacted during the
+incident*
+
+This brought down the primary node which meant there was some service
+outage. Most services transferred successfully to our secondary node
+which kept up some key services such as the Moderation bot and Modmail
+bot, as well as MongoDB.
+
+## :eye: Detection
+
+*Report when the team detected the incident, and how we could improve
+detection time*
+
+This was noticed when Discord services started having failures. The
+primary detection was through alerts though! I was paged 1 minute after
+we started encountering CPU exhaustion issues.
+
+## :man_raising_hand: Response
+
+*Who responded to the incident, and what obstacles did they encounter?*
+
+Joe Banks responded to the incident.
+
+No major obstacles were encountered during this.
+
+## :woman_gesturing_ok: Recovery
+
+*How was the incident resolved? How can we improve future mitigation?*
+
+It was noted that in the response to `kubectl get nodes` the primary
+node's status was reported as `NotReady`. Looking into the reason it was
+because the node had stopped responding.
+
+The quickest way to fix this was triggering a node restart. This shifted
+a lot of pods over to node 2 which encountered some capacity issues
+since it's not as highly specified as the first node.
+
+I brought this back the first node by restarting it at Linode's end.
+Once this node was reporting as `Ready` again I drained the second node
+by running `kubectl drain lke13311-20304-5ffa4d11faab`. This command
+stops the node from being available for scheduling and moves existing
+pods onto other nodes.
+
+Services gradually recovered as the dependencies started. The incident
+lasted overall around 26 minutes, though this was not a complete outage
+for the whole time and the bot remained functional throughout (meaning
+systems like the help channels were still functional).
+
+## :mag_right: Five Why's
+
+*Run a 5-whys analysis to understand the true cause of the incident.*
+
+**Why?** Partial service outage
+
+**Why?** We had a node outage.
+
+**Why?** CPU exhaustion of our primary node.
+
+**Why?** Large prometheus query using a lot of CPU.
+
+**Why?** Prometheus had to scan millions of TSDB records which consumed
+all cores.
+
+## :seedling: Blameless root cause
+
+*Note the final root cause and describe what needs to change to prevent
+reoccurrance*
+
+A large query was run on Prometheus, so the solution is just to not run
+said queries.
+
+To protect against this more precisely though we should write resource
+constraints for services like this that are vulnerable to CPU exhaustion
+or memory consumption, which are the causes of our two past outages as
+well.
+
+## :thinking: Lessons learned
+
+*What did we learn from this incident?*
+
+- Don't run large queries, it consumes CPU!
+- Write resource constraints for our services.
+
+## :ballot_box_with_check: Follow-up tasks
+
+*List any tasks we should complete that are relevant to this incident*
+
+- [x] Write resource constraints for our services.
diff --git a/docs/docs/post-mortems/posts/site-cpu-ram-exhaustion.md b/docs/docs/post-mortems/posts/site-cpu-ram-exhaustion.md
new file mode 100644
index 0000000..55882cb
--- /dev/null
+++ b/docs/docs/post-mortems/posts/site-cpu-ram-exhaustion.md
@@ -0,0 +1,157 @@
+---
+draft: false
+date: 2021-01-12
+authors:
+ - joe
+categories:
+- Kubernetes
+- Database
+description: A large change with our Discord server caused some minor service availability issues.
+---
+# Django site CPU/RAM exhaustion outage
+
+At 03:01 UTC on Tuesday 12th January we experienced a momentary outage
+of our PostgreSQL database, causing some very minor service downtime.
+
+<!-- more -->
+
+## :warning: Leadup
+
+*List the sequence of events that led to the incident*
+
+We deleted the Developers role which led to a large user diff for all
+the users where we had to update their roles on the site.
+
+The bot was trying to post this for over 24 hours repeatedly after every
+restart.
+
+We deployed the bot at 2:55 UTC on 12th January and the user sync
+process began once again.
+
+This caused a CPU & RAM spike on our Django site, which in turn
+triggered an OOM error on the server which killed the Postgres process,
+sending it into a recovery state where queries could not be executed.
+
+Django site did not have any tools in place to batch the requests so was
+trying to process all 80k user updates in a single query, something that
+PostgreSQL probably could handle, but not the Django ORM. During the
+incident site jumped from it's average RAM usage of 300-400MB to
+**1.5GB.**
+
+![image](./images/2021-01-12/site_resource_abnormal.png)
+
+RAM and CPU usage of site throughout the incident. The period just
+before 3:40 where no statistics were reported is the actual outage
+period where the Kubernetes node had some networking errors.
+
+## :flying_disc: Impact
+
+*Describe how internal and external users were impacted during the
+incident*
+
+This database outage lasted mere minutes, since Postgres recovered and
+healed itself and the sync process was aborted, but it did leave us with
+a large user diff and our database becoming further out of sync.
+
+Most services stayed up that did not depend on PostgreSQL, and the site
+remained stable after the sync had been cancelled.
+
+## :eye: Detection
+
+*Report when the team detected the incident, and how we could improve
+detection time*
+
+We were immediately alerted to the PostgreSQL outage on Grafana and
+through Sentry, meaning our response time was under a minute.
+
+We reduced some alert thresholds in order to catch RAM & CPU spikes
+faster in the future.
+
+It was hard to immediately see the cause of things since there is
+minimal logging on the site and the bot logs were not evident that
+anything was at fault, therefore our only detection was through machine
+metrics.
+
+We did manage to recover exactly what PostgreSQL was trying to do at the
+time of crashing by examining the logs which pointed us towards the user
+sync process.
+
+## :man_raising_hand: Response
+
+*Who responded to the incident, and what obstacles did they encounter?*
+
+Joe Banks responded to the issue, there were no real obstacles
+encountered other than the node being less performant than we would like
+due to the CPU starvation.
+
+## :woman_gesturing_ok: Recovery
+
+*How was the incident resolved? How can we improve future mitigation?*
+
+The incident was resolved by stopping the sync process and writing a
+more efficient one through an internal eval script. We batched the
+updates into 1,000 users and instead of doing one large one did 80
+smaller updates. This led to much higher efficiency with a cost of
+taking a little longer (~7 minutes).
+
+``` python
+from bot.exts.backend.sync import _syncers
+syncer = _syncers.UserSyncer
+diff = await syncer._get_diff(ctx.guild)
+
+def chunks(lst, n):
+ for i in range(0, len(lst), n):
+ yield lst[i:i + n]
+
+for chunk in chunks(diff.updated, 1000):
+ await bot.api_client.patch("bot/users/bulk_patch", json=chunk)
+```
+
+Resource limits were also put into place on site to prevent RAM and CPU
+spikes, and throttle the CPU usage in these situations. This can be seen
+in the below graph:
+
+![image](./images/2021-01-12/site_cpu_throttle.png)
+
+CPU throttling is where a container has hit the limits and we need to
+reel it in. Ideally this value stays as closes to 0 as possible, however
+as you can see site hit this twice (during the periods where it was
+trying to sync 80k users at once)
+
+## :mag_right: Five Why's
+
+*Run a 5-whys analysis to understand the true cause of the incident.*
+
+- We experienced a major PostgreSQL outage
+- PostgreSQL was killed by the system OOM due to the RAM spike on site.
+- The RAM spike on site was caused by a large query.
+- This was because we do not chunk queries on the bot.
+- The large query was caused by the removal of the Developers role
+ resulting in 80k users needing updating.
+
+## :seedling: Blameless root cause
+
+*Note the final root cause and describe what needs to change to prevent
+reoccurrance*
+
+The removal of the Developers role created a large diff which could not
+be applied by Django in a single request.
+
+See the follow up tasks on exactly how we can avoid this in future, it's
+a relatively easy mitigation.
+
+## :thinking: Lessons learned
+
+*What did we learn from this incident?*
+
+- Django (or DRF) does not like huge update queries.
+
+## :ballot_box_with_check: Follow-up tasks
+
+*List any tasks we should complete that are relevant to this incident*
+
+- [x] Make the bot syncer more efficient (batch requests)
+- [ ] Increase logging on bot, state when an error has been hit (we had
+ no indication of this inside Discord, we need that)
+- [x] Adjust resource alerts to page DevOps members earlier.
+- [x] Apply resource limits to site to prevent major spikes
diff --git a/docs/docs/runbooks/index.md b/docs/docs/runbooks/index.md
new file mode 100644
index 0000000..d4ce410
--- /dev/null
+++ b/docs/docs/runbooks/index.md
@@ -0,0 +1,20 @@
+---
+description: A collection of runbooks for common maintenances tasks for Python Discord services.
+---
+# Runbooks
+
+Here you will find a collection of runbooks for common maintenance tasks for
+Python Discord services.
+
+<div class="grid cards" markdown>
+
+- :simple-postgresql:{ .lg .middle } __Upgrading PostgreSQL__
+
+ ---
+
+ An end-to-end guide on how to upgrade a major PostgreSQL version for Python
+ Discord.
+
+ [:octicons-arrow-right-24: View runbook](./upgrading-postgresql.md)
+
+</div>
diff --git a/docs/docs/runbooks/upgrading-postgresql.md b/docs/docs/runbooks/upgrading-postgresql.md
new file mode 100644
index 0000000..7632db1
--- /dev/null
+++ b/docs/docs/runbooks/upgrading-postgresql.md
@@ -0,0 +1,130 @@
+---
+description: Upgrading PostgreSQL for Python Discord
+---
+# Upgrading PostgreSQL
+
+## Step 1 - Enable maintenance mode
+
+Add a worker route for `pythondiscord.com/*` to forward to the `maintenance`
+Cloudflare worker.
+
+## Step 2 - Scale down all services that use PostgreSQL
+
+Notably site, metricity, bitwarden and the like should be scaled down.
+
+Services that are read only such as Grafana (but NOT Metabase, Metabase uses
+PostgreSQL for internal storage) do not need to be scaled down, as they do not
+update the database in any way.
+
+```sh
+$ kubectl scale deploy --replicas 0 site metricity metabase bitwarden ...
+```
+
+## Step 3 - Take a database dump and gzip
+
+Using `pg_dumpall`, dump the contents of all databases to a `.sql` file.
+
+Make sure to gzip for faster transfer.
+
+Take a SHA512 sum of the output `.sql.gz` file to validate integrity after
+copying.
+
+```sh
+$ pg_dumpall -U pythondiscord > backup.sql
+$ gzip backup.sql
+$ sha512sum backup.sql
+a3337bfc65a072fd93124233ac1cefcdfbe8a708e5c1d08adaca2cf8c7cbe9ae4853ffab8c5cfbe943182355eaa701012111a420b29cc4f74d1e87f9df3af459 backup.sql
+```
+
+## Step 4 - Move database dump locally
+
+Use `kubectl cp` to move the `backup.sql.gz` file from the remote pod to your
+local machine.
+
+Validate the integrity of the received file.
+
+## Step 5 - Attempt local import to new PostgreSQL version
+
+Install the new version of PostgreSQL locally and import the data. Make sure you
+are operating on a **completely empty database server.**
+
+```sh
+$ gzcat backup.sql.gz | psql -U joe
+```
+
+You can use any PostgreSQL superuser for the import. Ensure that no errors other
+than those mentioned below occur, you may need to attempt multiple times to fix
+errors listed below.
+
+### Handle import errors
+
+Monitor the output of `psql` to check that no errors appear.
+
+If you receive locale errors ensure that the locale your database is configured
+with matches the import script, this may require some usage of `sed`:
+
+```sh
+$ sed -i '' "s/en_US.utf8/en_GB.UTF-8/g" backup.sql
+```
+
+Ensure that you **RESET THESE CHANGES** before attempting an import on the
+remote, if they come from the PostgreSQL Docker image they will need the same
+locale as the export.
+
+## Step 7 - Spin down PostgreSQL
+
+Spin down PostgreSQL to 0 replicas.
+
+## Step 8 - Take volume backup at Linode
+
+Backup the volume at Linode through a clone in the Linode UI, name it something
+obvious.
+
+## Step 9 - Remove the Linode persistent volume
+
+Delete the volume specified in the `volume.yaml` file in the `postgresql`
+directory, you must delete the `pvc` first followed by the `pv`, you can find
+the relevant disks through `kubectl get pv/pvc`
+
+## Step 10 - Create a new volume by re-applying the `volume.yaml` file
+
+Apply the `volume.yaml` so a new, empty, volume is created.
+
+## Step 11 - Bump the PostgreSQL version in the `deployment.yaml` file
+
+Update the Docker image used in the deployment manifest.
+
+## Step 12 - Apply the deployment
+
+Run `kubectl apply -f postgresql/deployment.yaml` to start the new database
+server.
+
+## Step 13 - Copy the data across
+
+After the pod has initialised use `kubectl cp` to copy the gzipped backup to the
+new Postgres pod.
+
+## Step 14 - Extract and import the new data
+
+```sh
+$ gunzip backup.sql.gz
+$ psql -U pythondiscord -f backup.sql
+```
+
+## Step 15 - Validate data import complete
+
+Ensure that all logs are successful, you may get duplicate errors for the
+`pythondiscord` user and database, these are safe to ignore.
+
+## Step 16 - Scale up services
+
+Restart the database server
+
+```sh
+$ kubectl scale deploy --replicas 1 metricity bitwarden metabase
+```
+
+## Step 17 - Validate all services interact correctly
+
+Validate that all services reconnect successfully and start exchanging data,
+ensure that no abnormal logs are outputted and performance remains as expected.
diff --git a/docs/docs/services/LDAP/assets/keycloak_user.png b/docs/docs/services/LDAP/assets/keycloak_user.png
new file mode 100644
index 0000000..883ea2a
--- /dev/null
+++ b/docs/docs/services/LDAP/assets/keycloak_user.png
Binary files differ
diff --git a/docs/docs/services/LDAP/components/freeipa.md b/docs/docs/services/LDAP/components/freeipa.md
new file mode 100644
index 0000000..e0d427b
--- /dev/null
+++ b/docs/docs/services/LDAP/components/freeipa.md
@@ -0,0 +1,137 @@
+---
+description: An overview of FreeIPA, the identity management solution used by Python Discord
+---
+# FreeIPA
+
+FreeIPA is an open-source identity management solution that provides a
+centralized authentication, authorization, and account information by storing
+data about user, groups, hosts, and other objects necessary to manage the
+security of a network of computers.
+
+We interface with FreeIPA from other services using LDAP.
+
+## User
+
+Users will rarely have to interface with FreeIPA directly. Most interactions
+with FreeIPA will be done through other services such as
+[Keycloak](./keycloak.md) or via the [Discord integrations](../discord-ldap.md).
+
+Nonetheless, users can access the FreeIPA web interface at
+[ldap01.box.pydis.wtf](https://ldap01.box.pydis.wtf), though most users will
+experience TLS errors due to the self-signed certificate that IPA runs with.
+
+All common user tasks can be accomplished through the Keycloak interface, so it
+is recommended to use that instead.
+
+## DevOps Team
+
+### Deployment Information
+
+FreeIPA is deployed to it's own Linux host running Rocky Linux. User access is
+controlled by LDAP itself so providing you have a valid SSH key and are in the
+correct DevOps groups (as managed by King Arthur), you will be able to SSH into
+this host.
+
+### User Accounts vs. Service Accounts
+
+FreeIPA stores both user accounts for our staff team, as well as service
+accounts for our various services. Service accounts are used for a variety of
+things, such as:
+
+- Keycloak authenticating users against LDAP and syncing user data
+- Grafana authenticating users against LDAP
+- Bitwarden sending email
+- Postfix authenticating users against LDAP and fetching user mail settings
+
+Service accounts are not synced with Discord or Keycloak and exist only in the
+LDAP directory, since they do not match a Discord user and do not need SAML or
+OpenID authentication.
+
+Service accounts can be identified by their emails ending in `@int.pydis.wtf`
+instead of `@pydis.wtf`. This is very important as it is how Keycloak decides
+which users to sync.
+
+### Common Tasks
+
+Maintenance of FreeIPA is done through the FreeIPA web interface, accessible at
+[ldap01.box.pydis.wtf](https://ldap01.box.pydis.wtf).
+
+Through this user interface you can access the raw information that is stored on
+the LDAP server, as well as manage users, groups, and other objects.
+
+#### Renaming a User
+
+Due to the way that users are uniquely identified across the domain by their
+Discord username, it is not directly possible to rename a user in FreeIPA.
+
+The simplest way for a user to change their username is to delete and recreate
+the account manually, as opposed to the bootstrapping by King Arthur.
+
+To do this, follow these steps:
+
+1. Log into the FreeIPA web interface at
+ [ldap01.box.pydis.wtf](https://ldap01.box.pydis.wtf) using your LDAP
+ credentials.
+1. Delete the user account by selecting the user and clicking the delete button.
+
+ !!! warning "User data migration"
+
+ Since there is no way for services using the LDAP server to know that the user has been renamed, the user will have to reconfigure their accounts in services such as Grafana, Keycloak and others authenticating against the LDAP directory.
+
+ You should warn the user of this consequence beforehand and ensure they are prepared to reconfigure their accounts.
+
+1. Recreate the user account, setting the following preferences:
+
+ | Field | Value |
+ | ----------------- | -------------------------------------------------------------- |
+ | User login | The users preferred login, i.e. `joe` |
+ | First & Last Name | Set the users Discord username as both the first and last name |
+ | New Password | This can be a randomly generated password. |
+
+ !!! note "User passwords"
+
+ Note that whilst it is required to set a password here, this is not the password you should give to the user.
+
+ Once the account has been created, instruct the user to navigate to the `#ldap` channel in Discord and request
+ a self-service password reset. This will allow the user to set their own password.
+
+1. Select "Add & Edit" to create the user account.
+1. Correct the display name generated to match the users Discord username. They
+ will be able to change this themselves later.
+1. __IMPORTANTLY:__ Fill in the `Employee Number` field with the users Discord
+ ID.
+
+!!! tip "The `Employee Number` field"
+
+ This field is what is used by King Arthur to link accounts between Discord and LDAP. If this field is not set, the user will not be able to authenticate against LDAP and synchronization will not work. King Arthur will abort synchronisations if user accounts are not correctly configured.
+
+Once you have completed these stages, as mentioned above instruct the user to
+navigate to the `#ldap` channel in Discord and request a self-service password
+reset. King Arthur should echo back to them their new `@pydis.wtf` account with
+the amended username and a temporary password.
+
+#### Creating a service account
+
+Service accounts exist only in FreeIPA and so must be created there.
+
+To create a service account, follow these steps:
+
+1. Log into the FreeIPA web interface at
+ [ldap01.box.pydis.wtf](https://ldap01.box.pydis.wtf) using your LDAP
+ credentials.
+1. Click on the Create User button.
+1. Fill in the following fields:
+
+ | Field | Value |
+ | ----------------- | --------------------------------------------------------------- |
+ | User login | The service account name, i.e. `grafana` |
+ | First & Last Name | Set the service name as both the first and last name |
+ | New Password | This can be a randomly generated password. Take note of it now. |
+
+1. Select "Add & Edit" to create the user account.
+1. Correct the display name generated to match the service name.
+1. __IMPORTANTLY:__ Update the email to end in `@int.pydis.wtf`.
+
+ !!! danger
+
+ It is important to update this field, otherwise the service account will not gain all service account privileges such as mail sending and Keycloak will complain about the user not existing on Discord.
diff --git a/docs/docs/services/LDAP/components/keycloak.md b/docs/docs/services/LDAP/components/keycloak.md
new file mode 100644
index 0000000..d02d6d6
--- /dev/null
+++ b/docs/docs/services/LDAP/components/keycloak.md
@@ -0,0 +1,63 @@
+---
+description: An overview of the Keycloak service used by Python Discord
+---
+# Keycloak
+
+Keycloak is an open source Identity and Access Management solution aimed at
+modern applications and services.
+
+In our configuration, Keycloak is not a store of user data, but rather a way to
+authenticate users against our LDAP server.
+
+Keycloak achieves the following:
+- Translates web-compatible authentication mechanisms such as SAML and OpenID
+ Connect to LDAP
+- Provides a web interface for users to manage their own accounts
+
+## User
+
+Users are able to manage their own accounts through the Keycloak web interface.
+This includes changing their password, enabling two-factor authentication,
+managing their sessions and updating their mailing preferences.
+
+Users can access the Keycloak interface at [id.pydis.wtf](https://id.pydis.wtf).
+
+Keycloak fetches user data from our LDAP server, so any changes made in Keycloak will be reflected in LDAP and vice versa.
+
+<figure markdown="span">
+ ![Keycloak User Page](../assets/keycloak_user.png){ loading=lazy }
+
+ <figcaption>The self-service administration panel presented to users allowing
+ them to update certain account fields.</figcaption>
+</figure>
+
+Users are bootstrapped into Keycloak and LDAP via Discord, read more about the
+Discord bootstrap process [here](../discord-ldap.md).
+
+## DevOps Team
+
+### Deployment Information
+
+Keycloak is deployed to Kubernetes in the `tooling` namespace. It stores data in
+the `keycloak` PostgreSQL database.
+
+As of now, we use the base image for Keycloak, though in future we may look at
+creating a custom image to include our own custom themes.
+
+### User Federation
+
+As mentioned above, Keycloak does not store any user information. Instead we use
+the LDAP user federation features to authenticate users against our LDAP server.
+
+Keycloak is configured with it's own user which has certain permissions such as
+the ability to query user information and reset user passwords, it syncs all
+users into the Keycloak database and keeps user groups and metadata up to date
+with the LDAP source.
+
+### Maintenance
+
+!!! warning "Unfinished Documentation"
+
+ This section is currently unfinished. Please refer to the [Keycloak
+ Documentation](https://www.keycloak.org/documentation.html) for more
+ information.
diff --git a/docs/docs/services/LDAP/components/ldap.md b/docs/docs/services/LDAP/components/ldap.md
new file mode 100644
index 0000000..f13bdaa
--- /dev/null
+++ b/docs/docs/services/LDAP/components/ldap.md
@@ -0,0 +1,31 @@
+---
+description: Maintenance guidance of the Python Discord LDAP service
+---
+# LDAP
+
+You can interact directly with LDAP using command line tools such as
+`ldapsearch` and `ldapmodify`. If you prefer a graphical interface, you can use
+tools like Apache Directory Studio.
+
+Our LDAP Base DN is `dc=box,dc=pydis,dc=wtf`, so users reside under a DN like
+`uid=yourusername,cn=users,cn=accounts,dc=box,dc=pydis,dc=wtf`.
+
+You can authenticate with these tools using your own LDAP credentials which have
+administrator privileges.
+
+In order for connections to be trusted, you may need a copy of the CA
+certificate.
+
+You can fetch a copy using the following command on either the `ldap01` host or
+`lovelace`.
+
+```bash
+$ rsync ldap01.box.pydis.wtf:/etc/ipa/ca.crt .
+```
+
+Once you have this certificate, you can prepend the `ldapsearch` command with
+the following:
+
+```bash
+$ LDAPTLS_CACERT=ca.crt ldapsearch -x -H ldaps://ldap01.box.pydis.wtf -D "uid=yourusername,cn=users,cn=accounts,dc=box,dc=pydis,dc=wtf" -W
+```
diff --git a/docs/docs/services/LDAP/discord-ldap.md b/docs/docs/services/LDAP/discord-ldap.md
new file mode 100644
index 0000000..6c94b6f
--- /dev/null
+++ b/docs/docs/services/LDAP/discord-ldap.md
@@ -0,0 +1,61 @@
+---
+description: An overview of the LDAP and Discord integration
+---
+# LDAP & Discord
+
+This document describes the process of bootstrapping users into our LDAP server
+via Discord. The creation of accounts is entirely automated and controlled by
+King Arthur.
+
+## Bootstrapping
+
+1. A user gains a role in Discord that requires LDAP access.
+1. King Arthur detects this role change and notifies the user to start the
+ bootstrapping process.
+1. The user visits the `#ldap` channel and clicks the generate button, they are
+ issued with a temporary password.
+1. The user logs into [Keycloak](https://id.pydis.wtf) using their issued
+ `@pydis.wtf` address and the temporary password.
+1. The user is prompted to change their password and update their profile,
+ including email forwarding preferences.
+
+As a sequence diagram, the process looks something like this:
+
+```mermaid
+sequenceDiagram
+ actor U as User
+ participant KA as King Arthur
+ participant KC as Keycloak
+ participant FIPA as FreeIPA
+
+ U->>KA: Gains LDAP enrolled role
+ KA->>U: Notifies user
+ U->>KA: Clicks generate in LDAP channel
+ KA->>FIPA: Creates user with temporary password
+ KA->>U: Issues temporary password
+ U->>KC: Logs in
+ KC->>U: Prompts for password change
+ U->>KC: Changes password
+ U->>KC: Updates profile
+ KC->>FIPA: Updates user
+```
+
+## Self-Service Password Reset
+
+Users can reset their LDAP password at any time by visiting the `#ldap` channel
+in Discord and clicking the reset button. This will issue them with a new
+temporary password in the same way the bootstrapping process does.
+
+## Continuous Synchronization
+
+King Arthur continuously synchronizes user data between Discord and LDAP. This
+adds and removes users from group memberships as necessary.
+
+If a user no longer has a role which requires LDAP access, King Arthur will
+deactivate their LDAP account.
+
+The LDAP synchronization process runs every 10 minutes, or whenever a role
+change is detected on a staff account.
+
+You can view what King Arthur is attempting to synchronize by running the `M-x
+ldap sync` command, which will return a diff of users to add, remove, or update.
diff --git a/docs/docs/services/LDAP/index.md b/docs/docs/services/LDAP/index.md
new file mode 100644
index 0000000..66f6da8
--- /dev/null
+++ b/docs/docs/services/LDAP/index.md
@@ -0,0 +1,45 @@
+---
+description: LDAP services hosted by Python Discord
+---
+# Overview
+
+This document describes the LDAP setup for Python Discord. We use LDAP to manage
+user accounts and permissions for our services.
+
+We deploy several services to manage our LDAP, a brief overview of how they
+interact is shown below:
+
+```mermaid
+flowchart TD
+ subgraph internal[Internal Services]
+
+ subgraph ldap[LDAP services]
+ FIPA[("FreeIPA")]
+ KC[Keycloak]
+
+ KC-- Authenticates with LDAP -->FIPA
+ end
+
+ KA[King Arthur]-- Updates users -->FIPA
+ KA-- Updates users -->KC
+
+ G["Grafana (and others)"]-- Authenticates with LDAP --->FIPA
+
+ subgraph mail[Mail]
+ P[Postfix]-- Fetches user mail settings --> FIPA
+ S[SASLAuthD]-- Authenticates users with LDAP ---> FIPA
+ S<-- Authenticates Users -->P
+ end
+ end
+
+ subgraph ext[External Services]
+ CA[Cloudflare Access]-- Authenticates with SAML ----> KC
+ end
+```
+
+## Services
+
+LDAP services are provided by:
+
+- [FreeIPA](components/freeipa.md)
+- [Keycloak](components/keycloak.md)
diff --git a/docs/docs/services/email/components/assets/dmarc-report.png b/docs/docs/services/email/components/assets/dmarc-report.png
new file mode 100644
index 0000000..de6bd33
--- /dev/null
+++ b/docs/docs/services/email/components/assets/dmarc-report.png
Binary files differ
diff --git a/docs/docs/services/email/components/postfix.md b/docs/docs/services/email/components/postfix.md
new file mode 100644
index 0000000..427a0ab
--- /dev/null
+++ b/docs/docs/services/email/components/postfix.md
@@ -0,0 +1,175 @@
+---
+description: Overview and maintenance guide for Postfix
+---
+# Postfix
+
+This document describes the Postfix setup for Python Discord.
+
+We use Postfix for sending and receiving mail in the following ways:
+
+- Mail destined for mailboxes is delivered to the Unix mailboxes on the host
+- Mail destined for users with forwarding preferences set in LDAP is forwarded
+ to the external mail gateways
+- Mail from services is sent to the external mail gateways for delivery
+
+Mail can be destined for individual users or LDAP groups.
+
+We use virtual alias maps in Postfix to trickle down mail to the correct
+destination. An overview of our maps is shown below:
+
+```mermaid
+flowchart TD
+ M((Inbound email))
+ A1[/Recipient has LDAP forwarding address?/]
+ A2[/Recipient is a local user?/]
+ A3[/Recipient is an LDAP group?/]
+ A4[/"Recipient is a service account (@int.pydis.wtf)"/]
+ A5[/Recipient is an alias address/]
+
+ V1["Validate Mail (DKIM, DMARC, SPF)"]
+ D1[Deliver Mail]
+ D2[Reject Mail - Unknown Recipient]
+ D3[Reject Mail - Validation Failed]
+
+ style D1 fill:#5d945a
+ style D2 fill:#94635a
+ style D3 fill:#94635a
+
+ M--->V1
+
+ V1--Validation Passed-->A1
+ V1--Validation Failed-->D3
+ A1--Yes, forward to external gateway-->D1
+ A1--No -->A2
+ A2--Yes, deliver to local UNIX mailbox -->D1
+ A2--No -->A3
+ A3--Yes, expand users and apply delivery rules -->M
+ A3--No -->A4
+ A4--Yes, deliver to service UNIX mailbox -->D1
+ A4--No -->A5
+ A5--Yes, expand alias and apply delivery rules -->M
+ A5--No, no further matching rules, reject mail-->D2
+```
+
+## SASL Authentication
+
+Service accounts are able to send mail through Postfix by authenticating with
+SASL. SASL is a method of authenticating with a mail server using a username and
+password.
+
+We configure `saslauthd` to authenticate using LDAP against FreeIPA. This allows
+service accounts to authenticate with Postfix using their LDAP credentials.
+
+Using filters in `saslauthd`, we restrict the ability to authenticate to only
+accounts ending in `@int.pydis.wtf`.
+
+## Maintenance
+
+### Diagnosing Routing
+
+You can use the `postmap -q` command to view how Postfix will route a specific
+email based on the given table (LDAP or hash).
+
+```
+joe@lovelace:~$ sudo postmap -q [email protected] ldap:/etc/postfix/ldap-service-mail.cf
+dmarc@localhost
+joe@lovelace:~$ sudo postmap -q [email protected] ldap:/etc/postfix/ldap-registeredaddress.cf
+```
+
+Refer to the above flowchart to understand the priorities with which Postfix
+will route mail.
+
+### Managing the mail queues
+
+Postfix has a number of queues that mail can be placed in. The most common
+queues are:
+
+| Queue Name | Description | Suffix in `postqueue` |
+| ---------- | -------------------------------------------------------------------------------------------------------------- | --------------------- |
+| `active` | Mail that is currently being delivered | `*` |
+| `hold` | Mail is in a holding queue, it will not be delivered until permitted or rejected by the administrator | `!` |
+| `expire` | Mail that has been forced to expire and will be returned to the sender, this can be triggered with `postsuper` | `#` |
+
+You can view mail currently in the queue using `sudo postqueue -p`.
+
+```bash
+joe@lovelace:~$ sudo postqueue -p
+-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------
+033FCE000E! 796 Sun Aug 4 19:46:59 [email protected]
+ dmarc+failures@localhost
+
+-- 0 Kbytes in 1 Request.
+```
+
+To manage the queues, you can use the following commands:
+
+```bash
+$ # Permit a message in the hold queue
+$ sudo postsuper -H <queue_id>
+
+$ # Delete a message from the queue
+$ sudo postsuper -d <queue_id>
+```
+
+Note, you should remove the symbol from the end of the queue ID when using
+`postsuper` (e.g. remove the `!` for the hold queue).
+
+### Viewing DMARC reports
+
+DMARC reports are delivered into the `/var/mail/dmarc` mailbox. You can quickly
+get an overview of the reports using `neomutt`
+
+```bash
+$ sudo -u postfix neomutt -f /var/mail/dmarc
+```
+
+DMARC aggregate reports are sent to the `[email protected]` address. Using
+some bash scripting, you can filter the `/var/mail/dmarc` folder for these
+messages and extract the attachments for further processing.
+
+```bash
+#!/bin/bash
+
+# Define paths
+MAILFILE="/var/mail/dmarc"
+TEMP_DIR="/tmp/dmarc_attachments"
+EMAIL_FILTERED="/tmp/dmarc_emails"
+
+# Create temporary directory for attachments
+mkdir -p $TEMP_DIR
+
+# Filter emails destined for [email protected] and save to a temporary file
+grep -i -E "^(To|X-Original-To): dmarc\+reports@int\.pydis\.wtf" -A 100000 $MAILFILE > $EMAIL_FILTERED
+
+# Split the filtered emails into individual messages and process each with munpack
+csplit -f "$TEMP_DIR/email_" -b "%04d.msg" $EMAIL_FILTERED '/^From /' '{*}'
+
+# Change to the temporary directory
+cd $TEMP_DIR
+
+# Extract attachments from each individual email
+for email in email_*.msg; do
+ munpack -q < $email
+
+ # Remove the .msg file
+ rm $email
+
+ # Remove any .desc files generated by munpack
+ rm -f *.desc
+done
+
+echo "Attachments have been extracted to $TEMP_DIR"
+```
+
+Once you have run this with `sudo ./script.sh`, you can navigate to the
+`/tmp/dmarc_attachments` folder to view reports.
+
+Using a tool like [dmarc-cat](https://github.com/keltia/dmarc-cat) you can
+reprocess these reports into a usable format.
+
+<figure markdown="span">
+ ![DMARC Report](./assets/dmarc-report.png){ loading=lazy }
+ <figcaption>Viewing the reports generated by the above script with `dmarc-cat`</figcaption>
+</figure>
diff --git a/docs/docs/services/email/components/signing.md b/docs/docs/services/email/components/signing.md
new file mode 100644
index 0000000..79e15c5
--- /dev/null
+++ b/docs/docs/services/email/components/signing.md
@@ -0,0 +1,20 @@
+---
+description: DKIM signing for Python Discord services
+---
+# Mail Signing
+
+Outbound mail is signed using DKIM to validate the authenticity of the sending
+domain. DKIM is a DNS record that contains a public key used to sign outbound
+mail.
+
+We use our [OpenDKIM
+role](https://github.com/python-discord/infra/tree/main/ansible/roles/opendkim)
+which allows us to use the same OpenDKIM instance to sign mail from multiple
+domains.
+
+On sending an outbound mail, Postfix passes the mail to OpenDKIM for signing.
+OpenDKIM signs the mail with the private key and adds the DKIM signature to the
+mail headers.
+
+DKIM keys are stored in DNS as a TXT record, this is also configured in the
+infra repository using our OctoDNS setup.
diff --git a/docs/docs/services/email/components/validation.md b/docs/docs/services/email/components/validation.md
new file mode 100644
index 0000000..976ae5a
--- /dev/null
+++ b/docs/docs/services/email/components/validation.md
@@ -0,0 +1,93 @@
+---
+description: Email validation practices used by Python Discord
+---
+# Email Validation
+
+We apply best practices to validate inbound email, this includes requiring all
+inbound mail to adhere to the sending domain's SPF, DKIM and DMARC policies.
+
+## Services
+
+### SPF
+
+We use SPF to validate the sending domain of inbound mail. SPF is a DNS record
+that specifies which mail servers are allowed to send mail on behalf of a
+domain.
+
+To achieve this validation, we use the
+[postfix-policyd-spf-python](https://manpages.debian.org/testing/postfix-policyd-spf-python/policyd-spf.1.en.html)
+package to validate the SPF record of inbound mail.
+
+This Postfix plugin sits in the relay chain of Postfix and checks the SPF record
+of the sending domain. If the SPF record is valid, the mail is passed on to the
+next stage of delivery. If the SPF record is invalid, the mail is rejected.
+
+```ini
+smtpd_relay_restrictions =
+ permit_mynetworks,
+ permit_sasl_authenticated,
+ reject_unauth_destination,
+ reject_unauth_pipelining,
+ check_policy_service unix:private/policyd-spf,
+```
+
+*[SPF]: Sender Policy Framework
+
+### DKIM
+
+We use DKIM to validate the authenticity of the sending domain of inbound mail.
+DKIM is a DNS record that contains a public key used to sign outbound mail.
+
+To achieve this validation, we use the [OpenDKIM](http://www.opendkim.org/)
+package to validate the DKIM signature of inbound mail.
+
+On receipt of an inbound mail, Postfix passes the mail to OpenDKIM for
+validation. If the DKIM signature is valid, the mail is passed on to the next
+stage of delivery. If the DKIM signature is invalid, the mail is rejected.
+
+*[DKIM]: DomainKeys Identified Mail
+
+### DMARC
+
+Tying the two previous methods together, we use DMARC to specify how SPF and
+DKIM should be handled for a domain.
+
+DMARC is a DNS record that specifies how mail servers should handle mail that
+fails SPF and DKIM validation. DMARC can specify that mail should be rejected,
+quarantined or accepted if it fails validation.
+
+To achieve this validation, we use the
+[OpenDMARC](https://github.com/trusteddomainproject/OpenDMARC) package to
+validate the DMARC record of inbound mail.
+
+We apply the following policies depending on the DMARC enforcement level:
+
+- `none`: No action is taken, mail is delivered as normal
+- `quarantine`: Mail is placed in the Postfix hold queue for manual review
+- `reject`: Mail is rejected outright
+
+See [this section](./postfix.md#managing-the-mail-queues) for more information
+on managing the mail queues.
+
+*[DMARC]: Domain-based Message Authentication, Reporting and Conformance
+
+## DKIM & DMARC
+
+DKIM and DMARC are configured in Postfix as milters. This means that Postfix
+passes the mail to the milter for validation before continuing with the delivery
+process.
+
+The milters listen on a local network port and Postfix is configured to pass
+mail to the milter for validation.
+
+```ini
+smtpd_milters = inet:localhost:8891,inet:localhost:8893
+non_smtpd_milters = $smtpd_milters
+milter_default_action = reject # (1)!
+milter_protocol = 6
+```
+
+1. This line instructs Postfix to halt processing commands from a session as
+ soon as a milter fails.!
+
+*[milter]: Mail Filter
diff --git a/docs/docs/services/email/index.md b/docs/docs/services/email/index.md
new file mode 100644
index 0000000..6115a0b
--- /dev/null
+++ b/docs/docs/services/email/index.md
@@ -0,0 +1,46 @@
+---
+description: Email services hosted by Python Discord
+---
+# Overview
+
+This document describes the email setup for Python Discord.
+
+Email has the following use-cases for Python Discord:
+
+- Sending service mail to users such as password resets and notifications
+- Providing forwarding mail for individual users who do not wish to expose their
+ personal email addresses
+- Providing forwarding mail for teams within staff (e.g. administrators, events
+ team)
+
+An overview of our email setup is shown below:
+
+```mermaid
+flowchart TD
+ P[Postfix]
+ L[LDAP]
+ EX[/External Mail Gateways/]
+ IX[/Inbound Mail/]
+ UX[/Unix Mailboxes/]
+ subgraph V[Validation Services]
+ ODK[OpenDKIM]
+ ODM[OpenDMARC]
+ SPF[SPF]
+ end
+
+ IX-- Delivered to Postfix (SMTP or submission) -->P
+ P-- Fetches user mail settings --> L
+ P<-- Signs Outbound Mail --> ODK
+ P-- Validates Inbound Mail ----> ODK
+ P-- Validates Inbound Mail ----> ODM
+ P-- Validates Inbound Mail ----> SPF
+ P-- Sends Outbound Mail ---> EX
+ P-- Delivers Inbound Mail ---> UX
+```
+
+Find an overview of the services we use for email below:
+
+- [Postfix](components/postfix.md)
+- [LDAP](../LDAP/index.md)
+- [OpenDKIM, OpenDMARC & SPF validation](components/validation.md)
+- [DKIM signing](components/signing.md)
diff --git a/docs/docs/services/index.md b/docs/docs/services/index.md
new file mode 100644
index 0000000..78b95fb
--- /dev/null
+++ b/docs/docs/services/index.md
@@ -0,0 +1,9 @@
+---
+description: Services hosted by Python Discord
+---
+# Service Documentation
+
+Here you will find an overview of services hosted by Python Discord.
+
+We have overviews here for how the services work as a user as well as how to
+administrate them as a DevOps team member.
diff --git a/docs/docs/tooling/github-bots.md b/docs/docs/tooling/github-bots.md
new file mode 100644
index 0000000..aefee13
--- /dev/null
+++ b/docs/docs/tooling/github-bots.md
@@ -0,0 +1,53 @@
+---
+description: We use GitHub bots to enhance the Developer and DevOps team experience.
+---
+# GitHub Bots
+
+Our GitHub repositories are supported by two custom bots:
+
+- Our **Fast Forward Bot**, which ensures that commits merged into main are
+ either merged manually on the command line or via a fast-forward, ensuring
+ that cryptographic signatures of commits remain intact. Information on the bot
+ can be found [in the ff-bot.yml
+ configuration](https://github.com/python-discord/infra/blob/main/.github/ff-bot.yml).
+ Merges over the GitHub UI are discouraged for this reason. You can use it by
+ running `/merge` on a pull request. Note that attempting to use it without
+ permission to do so will be reported.
+- Our **Craig Dazey Emulator Bot**, which ensures team morale stays high
+ at all times by thanking team members for submitted pull requests.[^1]
+
+Furthermore, our repositories all have dependabot configured on them.
+
+[^1]: Craig Dazey Emulator Bot stands in no affiliation, direct or indirect,
+ with Craig Dazey. Craig Dazey Emulator Bot. Craig Dazey Emulator Bot is not
+ endorsed by Craig Dazey. Craig Dazey Emulator Bot is an independent project
+ of Craig Dazey. No association is made between Craig Dazey Emulator Bot and
+ Craig Dazey.
+
+
+## Dealing with notifications
+
+This section collects some of our team members' ways of dealing with the
+notifications that originate from our bots.
+
+### Sieve (RFC 5228) script
+
+If your mail server supports the [Sieve mail filtering
+language](https://datatracker.ietf.org/doc/html/rfc5228.html), which it should,
+you can adapt the following script to customize the amount of notifications you
+receive:
+
+``` sieve
+require ["envelope", "fileinto", "imap4flags"];
+
+if allof (header :is "X-GitHub-Sender" ["coveralls", "github-actions[bot]", "netlify[bot]"],
+ address :is "from" "[email protected]") {
+ setflag "\\seen";
+ fileinto "Trash";
+ stop;
+}
+```
+
+If you also want to filter out notifications from renovate, which we use for
+dependency updates, you can add `renovate[bot]` to the `X-GitHub-Sender` list
+above.
diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml
new file mode 100644
index 0000000..370f413
--- /dev/null
+++ b/docs/mkdocs.yml
@@ -0,0 +1,100 @@
+---
+# Set some important site metadata attributes
+site_name: PyDis DevOps
+site_url: https://python-discord.github.io/infra/
+
+# Set GitHub repository metadata
+repo_url: https://github.com/python-discord/infra
+repo_name: python-discord/infra
+
+# Enable markdown features
+markdown_extensions:
+ - abbr
+ - admonition
+ - attr_list
+ - def_list
+ - footnotes
+ - md_in_html
+ - pymdownx.details
+ - pymdownx.snippets
+ - pymdownx.superfences
+ - pymdownx.tilde
+ - pymdownx.tasklist:
+ custom_checkbox: true
+ - pymdownx.emoji:
+ emoji_index: !!python/name:material.extensions.emoji.twemoji
+ emoji_generator: !!python/name:material.extensions.emoji.to_svg
+ - pymdownx.superfences:
+ custom_fences:
+ - name: mermaid
+ class: mermaid
+ format: !!python/name:pymdownx.superfences.fence_code_format
+
+plugins:
+ # Interactive images
+ - glightbox
+ # Offline search
+ - offline
+ # Download assets to serve from local URL
+ - privacy
+ # Search functionality
+ - search
+ # Auto-generated social cards
+ - social
+ # Blog-style content for post-mortems and meeting notes
+ - blog:
+ blog_dir: post-mortems
+ - blog:
+ blog_dir: meeting-notes
+
+# Theme preferences
+theme:
+ # Use mkdocs-material
+ name: material
+ # Set the logo
+ logo: assets/logo.svg
+
+ # Enable theme features
+ features:
+ # Add codeblock annotations
+ - content.code.annotate
+ # Add nicer tooltips
+ - content.tooltips
+ # Use instant navigation for faster page loading, with a progress bar
+ - navigation.instant
+ - navigation.instant.progress
+ # Top level sections appear on the top horizontal navbar
+ - navigation.sections
+ # Add a sticky top navigation bar
+ - navigation.tabs
+ - navigation.tabs.sticky
+ - navigation.top
+ # Searchbar features
+ - search.highlight
+ - search.suggest
+
+ # Override some icons
+ icon:
+ repo: fontawesome/brands/github
+
+ # Define palettes that are used to switch between light and dark mode
+ palette:
+ - media: "(prefers-color-scheme)"
+ primary: blue
+ toggle:
+ icon: material/brightness-auto
+ name: Switch to light mode
+
+ - media: "(prefers-color-scheme: light)"
+ primary: blue
+ scheme: default
+ toggle:
+ icon: material/brightness-7
+ name: Switch to dark mode
+
+ - media: "(prefers-color-scheme: dark)"
+ primary: blue
+ scheme: slate
+ toggle:
+ icon: material/brightness-4
+ name: Switch to system preference