Compare commits
	
		
			1 Commits
		
	
	
		
			master
			...
			e8090b2915
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| e8090b2915 | 
							
								
								
									
										302
									
								
								flake.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										302
									
								
								flake.lock
									
									
									
										generated
									
									
									
								
							@@ -8,7 +8,7 @@
 | 
			
		||||
          "ragenix",
 | 
			
		||||
          "nixpkgs"
 | 
			
		||||
        ],
 | 
			
		||||
        "systems": "systems_6"
 | 
			
		||||
        "systems": "systems_7"
 | 
			
		||||
      },
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1723293904,
 | 
			
		||||
@@ -31,27 +31,29 @@
 | 
			
		||||
        "nixpkgs": [
 | 
			
		||||
          "nixpkgs-unstable"
 | 
			
		||||
        ],
 | 
			
		||||
        "pyproject-nix": "pyproject-nix"
 | 
			
		||||
        "poetry2nix": "poetry2nix"
 | 
			
		||||
      },
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1757170758,
 | 
			
		||||
        "narHash": "sha256-FyO+Brz5eInmdAkG8B2rJAfrNGMCsDQ8BPflKV2+r5g=",
 | 
			
		||||
        "owner": "devplayer0",
 | 
			
		||||
        "repo": "boardie",
 | 
			
		||||
        "rev": "ed5fd520d5bf122871b5508dd3c1eda28d6e515d",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
        "lastModified": 1718746012,
 | 
			
		||||
        "narHash": "sha256-sp9vGl3vWXvD/C2JeMDi5nbW6CkKIC3Q2JMGKwexYEs=",
 | 
			
		||||
        "ref": "refs/heads/master",
 | 
			
		||||
        "rev": "ea24100bd4a914b9e044a2085a3785a6bd3a3833",
 | 
			
		||||
        "revCount": 5,
 | 
			
		||||
        "type": "git",
 | 
			
		||||
        "url": "https://git.nul.ie/dev/boardie"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
        "owner": "devplayer0",
 | 
			
		||||
        "repo": "boardie",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
        "type": "git",
 | 
			
		||||
        "url": "https://git.nul.ie/dev/boardie"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "borgthin": {
 | 
			
		||||
      "inputs": {
 | 
			
		||||
        "devshell": "devshell_2",
 | 
			
		||||
        "flake-utils": "flake-utils_4",
 | 
			
		||||
        "nixpkgs": "nixpkgs_3"
 | 
			
		||||
        "flake-utils": "flake-utils_5",
 | 
			
		||||
        "nixpkgs": [
 | 
			
		||||
          "nixpkgs-mine"
 | 
			
		||||
        ]
 | 
			
		||||
      },
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1732994213,
 | 
			
		||||
@@ -67,27 +69,6 @@
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "copyparty": {
 | 
			
		||||
      "inputs": {
 | 
			
		||||
        "flake-utils": "flake-utils_5",
 | 
			
		||||
        "nixpkgs": [
 | 
			
		||||
          "nixpkgs-unstable"
 | 
			
		||||
        ]
 | 
			
		||||
      },
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1757362872,
 | 
			
		||||
        "narHash": "sha256-juUSWjxX8y2gueU34BpkQipUlhZRFJNLFccdprle0iM=",
 | 
			
		||||
        "owner": "9001",
 | 
			
		||||
        "repo": "copyparty",
 | 
			
		||||
        "rev": "e09f3c9e2c3dccf8f3912539e04dd840b10b51ee",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
        "owner": "9001",
 | 
			
		||||
        "repo": "copyparty",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "crane": {
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1725409566,
 | 
			
		||||
@@ -135,11 +116,11 @@
 | 
			
		||||
        "utils": "utils"
 | 
			
		||||
      },
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1756719547,
 | 
			
		||||
        "narHash": "sha256-N9gBKUmjwRKPxAafXEk1EGadfk2qDZPBQp4vXWPHINQ=",
 | 
			
		||||
        "lastModified": 1727447169,
 | 
			
		||||
        "narHash": "sha256-3KyjMPUKHkiWhwR91J1YchF6zb6gvckCAY1jOE+ne0U=",
 | 
			
		||||
        "owner": "serokell",
 | 
			
		||||
        "repo": "deploy-rs",
 | 
			
		||||
        "rev": "125ae9e3ecf62fb2c0fd4f2d894eb971f1ecaed2",
 | 
			
		||||
        "rev": "aa07eb05537d4cd025e2310397a6adcedfe72c76",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
@@ -188,8 +169,8 @@
 | 
			
		||||
    },
 | 
			
		||||
    "devshell_2": {
 | 
			
		||||
      "inputs": {
 | 
			
		||||
        "flake-utils": "flake-utils_3",
 | 
			
		||||
        "nixpkgs": "nixpkgs_2"
 | 
			
		||||
        "flake-utils": "flake-utils_4",
 | 
			
		||||
        "nixpkgs": "nixpkgs_3"
 | 
			
		||||
      },
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1671489820,
 | 
			
		||||
@@ -212,11 +193,11 @@
 | 
			
		||||
        ]
 | 
			
		||||
      },
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1741473158,
 | 
			
		||||
        "narHash": "sha256-kWNaq6wQUbUMlPgw8Y+9/9wP0F8SHkjy24/mN3UAppg=",
 | 
			
		||||
        "lastModified": 1735644329,
 | 
			
		||||
        "narHash": "sha256-tO3HrHriyLvipc4xr+Ewtdlo7wM1OjXNjlWRgmM7peY=",
 | 
			
		||||
        "owner": "numtide",
 | 
			
		||||
        "repo": "devshell",
 | 
			
		||||
        "rev": "7c9e793ebe66bcba8292989a68c0419b737a22a0",
 | 
			
		||||
        "rev": "f7795ede5b02664b57035b3b757876703e2c3eac",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
@@ -228,11 +209,11 @@
 | 
			
		||||
    "flake-compat": {
 | 
			
		||||
      "flake": false,
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1733328505,
 | 
			
		||||
        "narHash": "sha256-NeCCThCEP3eCl2l/+27kNNK7QrwZB1IJCrXfrbv5oqU=",
 | 
			
		||||
        "lastModified": 1696426674,
 | 
			
		||||
        "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=",
 | 
			
		||||
        "owner": "edolstra",
 | 
			
		||||
        "repo": "flake-compat",
 | 
			
		||||
        "rev": "ff81ac966bb2cae68946d5ed5fc4994f96d0ffec",
 | 
			
		||||
        "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
@@ -261,7 +242,7 @@
 | 
			
		||||
    },
 | 
			
		||||
    "flake-utils_10": {
 | 
			
		||||
      "inputs": {
 | 
			
		||||
        "systems": "systems_9"
 | 
			
		||||
        "systems": "systems_10"
 | 
			
		||||
      },
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1705309234,
 | 
			
		||||
@@ -311,6 +292,24 @@
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "flake-utils_3": {
 | 
			
		||||
      "inputs": {
 | 
			
		||||
        "systems": "systems_3"
 | 
			
		||||
      },
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1710146030,
 | 
			
		||||
        "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=",
 | 
			
		||||
        "owner": "numtide",
 | 
			
		||||
        "repo": "flake-utils",
 | 
			
		||||
        "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
        "owner": "numtide",
 | 
			
		||||
        "repo": "flake-utils",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "flake-utils_4": {
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1642700792,
 | 
			
		||||
        "narHash": "sha256-XqHrk7hFb+zBvRg6Ghl+AZDq03ov6OshJLiSWOoX5es=",
 | 
			
		||||
@@ -325,7 +324,7 @@
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "flake-utils_4": {
 | 
			
		||||
    "flake-utils_5": {
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1667395993,
 | 
			
		||||
        "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
 | 
			
		||||
@@ -340,24 +339,9 @@
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "flake-utils_5": {
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1678901627,
 | 
			
		||||
        "narHash": "sha256-U02riOqrKKzwjsxc/400XnElV+UtPUQWpANPlyazjH0=",
 | 
			
		||||
        "owner": "numtide",
 | 
			
		||||
        "repo": "flake-utils",
 | 
			
		||||
        "rev": "93a2b84fc4b70d9e089d029deacc3583435c2ed6",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
        "owner": "numtide",
 | 
			
		||||
        "repo": "flake-utils",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "flake-utils_6": {
 | 
			
		||||
      "inputs": {
 | 
			
		||||
        "systems": "systems_4"
 | 
			
		||||
        "systems": "systems_6"
 | 
			
		||||
      },
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1731533236,
 | 
			
		||||
@@ -374,15 +358,12 @@
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "flake-utils_7": {
 | 
			
		||||
      "inputs": {
 | 
			
		||||
        "systems": "systems_5"
 | 
			
		||||
      },
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1731533236,
 | 
			
		||||
        "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
 | 
			
		||||
        "lastModified": 1659877975,
 | 
			
		||||
        "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
 | 
			
		||||
        "owner": "numtide",
 | 
			
		||||
        "repo": "flake-utils",
 | 
			
		||||
        "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
 | 
			
		||||
        "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
@@ -393,7 +374,7 @@
 | 
			
		||||
    },
 | 
			
		||||
    "flake-utils_8": {
 | 
			
		||||
      "inputs": {
 | 
			
		||||
        "systems": "systems_7"
 | 
			
		||||
        "systems": "systems_8"
 | 
			
		||||
      },
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1710146030,
 | 
			
		||||
@@ -411,7 +392,7 @@
 | 
			
		||||
    },
 | 
			
		||||
    "flake-utils_9": {
 | 
			
		||||
      "inputs": {
 | 
			
		||||
        "systems": "systems_8"
 | 
			
		||||
        "systems": "systems_9"
 | 
			
		||||
      },
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1709126324,
 | 
			
		||||
@@ -456,16 +437,16 @@
 | 
			
		||||
        ]
 | 
			
		||||
      },
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1756679287,
 | 
			
		||||
        "narHash": "sha256-Xd1vOeY9ccDf5VtVK12yM0FS6qqvfUop8UQlxEB+gTQ=",
 | 
			
		||||
        "lastModified": 1739757849,
 | 
			
		||||
        "narHash": "sha256-Gs076ot1YuAAsYVcyidLKUMIc4ooOaRGO0PqTY7sBzA=",
 | 
			
		||||
        "owner": "nix-community",
 | 
			
		||||
        "repo": "home-manager",
 | 
			
		||||
        "rev": "07fc025fe10487dd80f2ec694f1cd790e752d0e8",
 | 
			
		||||
        "rev": "9d3d080aec2a35e05a15cedd281c2384767c2cfe",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
        "id": "home-manager",
 | 
			
		||||
        "ref": "release-25.05",
 | 
			
		||||
        "ref": "release-24.11",
 | 
			
		||||
        "type": "indirect"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
@@ -476,11 +457,11 @@
 | 
			
		||||
        ]
 | 
			
		||||
      },
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1757075491,
 | 
			
		||||
        "narHash": "sha256-a+NMGl5tcvm+hyfSG2DlVPa8nZLpsumuRj1FfcKb2mQ=",
 | 
			
		||||
        "lastModified": 1741457641,
 | 
			
		||||
        "narHash": "sha256-HIoSAfme6BReJI8wbtZxSuALfI21OqagDPlbGkeVX0c=",
 | 
			
		||||
        "owner": "nix-community",
 | 
			
		||||
        "repo": "home-manager",
 | 
			
		||||
        "rev": "f56bf065f9abedc7bc15e1f2454aa5c8edabaacf",
 | 
			
		||||
        "rev": "2c87a6475fba12c9eb04ccb7375da0e32da48dc1",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
@@ -503,19 +484,25 @@
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "libnetRepo": {
 | 
			
		||||
      "flake": false,
 | 
			
		||||
    "nix-github-actions": {
 | 
			
		||||
      "inputs": {
 | 
			
		||||
        "nixpkgs": [
 | 
			
		||||
          "boardie",
 | 
			
		||||
          "poetry2nix",
 | 
			
		||||
          "nixpkgs"
 | 
			
		||||
        ]
 | 
			
		||||
      },
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1745053097,
 | 
			
		||||
        "narHash": "sha256-BEW57utyWCqP4U+MzCXFqbvEC8LE3iZv5dsPMrmTJ9Q=",
 | 
			
		||||
        "owner": "oddlama",
 | 
			
		||||
        "repo": "nixos-extra-modules",
 | 
			
		||||
        "rev": "7565d8554b0fc9d621851150e7939d34a3a8cd6c",
 | 
			
		||||
        "lastModified": 1703863825,
 | 
			
		||||
        "narHash": "sha256-rXwqjtwiGKJheXB43ybM8NwWB8rO2dSRrEqes0S7F5Y=",
 | 
			
		||||
        "owner": "nix-community",
 | 
			
		||||
        "repo": "nix-github-actions",
 | 
			
		||||
        "rev": "5163432afc817cf8bd1f031418d1869e4c9d5547",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
        "owner": "oddlama",
 | 
			
		||||
        "repo": "nixos-extra-modules",
 | 
			
		||||
        "owner": "nix-community",
 | 
			
		||||
        "repo": "nix-github-actions",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
@@ -527,11 +514,11 @@
 | 
			
		||||
        ]
 | 
			
		||||
      },
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1752054764,
 | 
			
		||||
        "narHash": "sha256-Ob/HuUhANoDs+nvYqyTKrkcPXf4ZgXoqMTQoCK0RFgQ=",
 | 
			
		||||
        "lastModified": 1713543440,
 | 
			
		||||
        "narHash": "sha256-lnzZQYG0+EXl/6NkGpyIz+FEOc/DSEG57AP1VsdeNrM=",
 | 
			
		||||
        "owner": "nix-community",
 | 
			
		||||
        "repo": "nixGL",
 | 
			
		||||
        "rev": "a8e1ce7d49a149ed70df676785b07f63288f53c5",
 | 
			
		||||
        "rev": "310f8e49a149e4c9ea52f1adf70cdc768ec53f8a",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
@@ -558,11 +545,11 @@
 | 
			
		||||
    },
 | 
			
		||||
    "nixpkgs-mine": {
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1757173087,
 | 
			
		||||
        "narHash": "sha256-NYXuC8xUUbvtwbaC1aLdpQKHzQtQ2XB3VkK0hfYTPd8=",
 | 
			
		||||
        "lastModified": 1741543477,
 | 
			
		||||
        "narHash": "sha256-CIXkalXwVcUFxb2TF33j45GlWWVHGmHu0GaMvVM/f6M=",
 | 
			
		||||
        "owner": "devplayer0",
 | 
			
		||||
        "repo": "nixpkgs",
 | 
			
		||||
        "rev": "06e4c8cd503ed73806744b39368393df38b36bb7",
 | 
			
		||||
        "rev": "811543d59a6dec53bd025bb17be0896f3c37c03a",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
@@ -574,11 +561,11 @@
 | 
			
		||||
    },
 | 
			
		||||
    "nixpkgs-mine-stable": {
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1757173155,
 | 
			
		||||
        "narHash": "sha256-aDNAiQQsrgS/coVOqLbtILpOUouE6jp/wqAsO8Dta/o=",
 | 
			
		||||
        "lastModified": 1741456679,
 | 
			
		||||
        "narHash": "sha256-5f6f3yFT4+KDV02PXlKxhJ7ig++oa+NzGwlW8vxWPHk=",
 | 
			
		||||
        "owner": "devplayer0",
 | 
			
		||||
        "repo": "nixpkgs",
 | 
			
		||||
        "rev": "8a1a03f2d17918a6d51746371031a8fe4014c549",
 | 
			
		||||
        "rev": "c82613e3e6a22d4cc1e80e1e91bea15c601dbbe7",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
@@ -590,26 +577,26 @@
 | 
			
		||||
    },
 | 
			
		||||
    "nixpkgs-stable": {
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1757020766,
 | 
			
		||||
        "narHash": "sha256-PLoSjHRa2bUbi1x9HoXgTx2AiuzNXs54c8omhadyvp0=",
 | 
			
		||||
        "lastModified": 1741332913,
 | 
			
		||||
        "narHash": "sha256-ri1e8ZliWS3Jnp9yqpKApHaOo7KBN33W8ECAKA4teAQ=",
 | 
			
		||||
        "owner": "NixOS",
 | 
			
		||||
        "repo": "nixpkgs",
 | 
			
		||||
        "rev": "fe83bbdde2ccdc2cb9573aa846abe8363f79a97a",
 | 
			
		||||
        "rev": "20755fa05115c84be00b04690630cb38f0a203ad",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
        "id": "nixpkgs",
 | 
			
		||||
        "ref": "nixos-25.05",
 | 
			
		||||
        "ref": "nixos-24.11",
 | 
			
		||||
        "type": "indirect"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "nixpkgs-unstable": {
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1756787288,
 | 
			
		||||
        "narHash": "sha256-rw/PHa1cqiePdBxhF66V7R+WAP8WekQ0mCDG4CFqT8Y=",
 | 
			
		||||
        "lastModified": 1741246872,
 | 
			
		||||
        "narHash": "sha256-Q6pMP4a9ed636qilcYX8XUguvKl/0/LGXhHcRI91p0U=",
 | 
			
		||||
        "owner": "NixOS",
 | 
			
		||||
        "repo": "nixpkgs",
 | 
			
		||||
        "rev": "d0fc30899600b9b3466ddb260fd83deb486c32f1",
 | 
			
		||||
        "rev": "10069ef4cf863633f57238f179a0297de84bd8d3",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
@@ -619,6 +606,22 @@
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "nixpkgs_2": {
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1718632497,
 | 
			
		||||
        "narHash": "sha256-YtlyfqOdYMuu7gumZtK0Kg7jr4OKfHUhJkZfNUryw68=",
 | 
			
		||||
        "owner": "NixOS",
 | 
			
		||||
        "repo": "nixpkgs",
 | 
			
		||||
        "rev": "c58b4a9118498c1055c5908a5bbe666e56abe949",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
        "owner": "NixOS",
 | 
			
		||||
        "ref": "nixos-unstable-small",
 | 
			
		||||
        "repo": "nixpkgs",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "nixpkgs_3": {
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1643381941,
 | 
			
		||||
        "narHash": "sha256-pHTwvnN4tTsEKkWlXQ8JMY423epos8wUOhthpwJjtpc=",
 | 
			
		||||
@@ -634,20 +637,6 @@
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "nixpkgs_3": {
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1673606088,
 | 
			
		||||
        "narHash": "sha256-wdYD41UwNwPhTdMaG0AIe7fE1bAdyHe6bB4HLUqUvck=",
 | 
			
		||||
        "owner": "NixOS",
 | 
			
		||||
        "repo": "nixpkgs",
 | 
			
		||||
        "rev": "37b97ae3dd714de9a17923d004a2c5b5543dfa6d",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
        "id": "nixpkgs",
 | 
			
		||||
        "type": "indirect"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "nixpkgs_4": {
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1709309926,
 | 
			
		||||
@@ -680,24 +669,25 @@
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "pyproject-nix": {
 | 
			
		||||
    "poetry2nix": {
 | 
			
		||||
      "inputs": {
 | 
			
		||||
        "nixpkgs": [
 | 
			
		||||
          "boardie",
 | 
			
		||||
          "nixpkgs"
 | 
			
		||||
        ]
 | 
			
		||||
        "flake-utils": "flake-utils_3",
 | 
			
		||||
        "nix-github-actions": "nix-github-actions",
 | 
			
		||||
        "nixpkgs": "nixpkgs_2",
 | 
			
		||||
        "systems": "systems_4",
 | 
			
		||||
        "treefmt-nix": "treefmt-nix"
 | 
			
		||||
      },
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1756395552,
 | 
			
		||||
        "narHash": "sha256-5aJM14MpoLk2cdZAetu60OkLQrtFLWTICAyn1EP7ZpM=",
 | 
			
		||||
        "owner": "pyproject-nix",
 | 
			
		||||
        "repo": "pyproject.nix",
 | 
			
		||||
        "rev": "030dffc235dcf240d918c651c78dc5f158067b51",
 | 
			
		||||
        "lastModified": 1718726452,
 | 
			
		||||
        "narHash": "sha256-w4hJSYvACz0i5XHtxc6XNyHwbxpisN13M2kA2Y7937o=",
 | 
			
		||||
        "owner": "nix-community",
 | 
			
		||||
        "repo": "poetry2nix",
 | 
			
		||||
        "rev": "53e534a08c0cd2a9fa7587ed1c3e7f6aeb804a2c",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
        "owner": "pyproject-nix",
 | 
			
		||||
        "repo": "pyproject.nix",
 | 
			
		||||
        "owner": "nix-community",
 | 
			
		||||
        "repo": "poetry2nix",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
@@ -730,14 +720,12 @@
 | 
			
		||||
      "inputs": {
 | 
			
		||||
        "boardie": "boardie",
 | 
			
		||||
        "borgthin": "borgthin",
 | 
			
		||||
        "copyparty": "copyparty",
 | 
			
		||||
        "deploy-rs": "deploy-rs",
 | 
			
		||||
        "devshell": "devshell_3",
 | 
			
		||||
        "flake-utils": "flake-utils_6",
 | 
			
		||||
        "home-manager-stable": "home-manager-stable",
 | 
			
		||||
        "home-manager-unstable": "home-manager-unstable",
 | 
			
		||||
        "impermanence": "impermanence",
 | 
			
		||||
        "libnetRepo": "libnetRepo",
 | 
			
		||||
        "nixGL": "nixGL",
 | 
			
		||||
        "nixpkgs-mine": "nixpkgs-mine",
 | 
			
		||||
        "nixpkgs-mine-stable": "nixpkgs-mine-stable",
 | 
			
		||||
@@ -825,6 +813,21 @@
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "systems_10": {
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1681028828,
 | 
			
		||||
        "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
 | 
			
		||||
        "owner": "nix-systems",
 | 
			
		||||
        "repo": "default",
 | 
			
		||||
        "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
        "owner": "nix-systems",
 | 
			
		||||
        "repo": "default",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "systems_2": {
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1681028828,
 | 
			
		||||
@@ -865,9 +868,8 @@
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
        "owner": "nix-systems",
 | 
			
		||||
        "repo": "default",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
        "id": "systems",
 | 
			
		||||
        "type": "indirect"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "systems_5": {
 | 
			
		||||
@@ -945,16 +947,38 @@
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "utils": {
 | 
			
		||||
    "treefmt-nix": {
 | 
			
		||||
      "inputs": {
 | 
			
		||||
        "systems": "systems_3"
 | 
			
		||||
        "nixpkgs": [
 | 
			
		||||
          "boardie",
 | 
			
		||||
          "poetry2nix",
 | 
			
		||||
          "nixpkgs"
 | 
			
		||||
        ]
 | 
			
		||||
      },
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1731533236,
 | 
			
		||||
        "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
 | 
			
		||||
        "lastModified": 1718522839,
 | 
			
		||||
        "narHash": "sha256-ULzoKzEaBOiLRtjeY3YoGFJMwWSKRYOic6VNw2UyTls=",
 | 
			
		||||
        "owner": "numtide",
 | 
			
		||||
        "repo": "treefmt-nix",
 | 
			
		||||
        "rev": "68eb1dc333ce82d0ab0c0357363ea17c31ea1f81",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
        "owner": "numtide",
 | 
			
		||||
        "repo": "treefmt-nix",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "utils": {
 | 
			
		||||
      "inputs": {
 | 
			
		||||
        "systems": "systems_5"
 | 
			
		||||
      },
 | 
			
		||||
      "locked": {
 | 
			
		||||
        "lastModified": 1701680307,
 | 
			
		||||
        "narHash": "sha256-kAuep2h5ajznlPMD9rnQyffWG8EM/C73lejGofXvdM8=",
 | 
			
		||||
        "owner": "numtide",
 | 
			
		||||
        "repo": "flake-utils",
 | 
			
		||||
        "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
 | 
			
		||||
        "rev": "4022d587cbbfd70fe950c1e2083a02621806a725",
 | 
			
		||||
        "type": "github"
 | 
			
		||||
      },
 | 
			
		||||
      "original": {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										24
									
								
								flake.nix
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								flake.nix
									
									
									
									
									
								
							@@ -3,22 +3,17 @@
 | 
			
		||||
 | 
			
		||||
  inputs = {
 | 
			
		||||
    flake-utils.url = "github:numtide/flake-utils";
 | 
			
		||||
    # libnet.url = "github:reo101/nix-lib-net";
 | 
			
		||||
    libnetRepo = {
 | 
			
		||||
      url = "github:oddlama/nixos-extra-modules";
 | 
			
		||||
      flake = false;
 | 
			
		||||
    };
 | 
			
		||||
    devshell.url = "github:numtide/devshell";
 | 
			
		||||
    devshell.inputs.nixpkgs.follows = "nixpkgs-unstable";
 | 
			
		||||
 | 
			
		||||
    nixpkgs-unstable.url = "nixpkgs/nixos-unstable";
 | 
			
		||||
    nixpkgs-stable.url = "nixpkgs/nixos-25.05";
 | 
			
		||||
    nixpkgs-stable.url = "nixpkgs/nixos-24.11";
 | 
			
		||||
    nixpkgs-mine.url = "github:devplayer0/nixpkgs/devplayer0";
 | 
			
		||||
    nixpkgs-mine-stable.url = "github:devplayer0/nixpkgs/devplayer0-stable";
 | 
			
		||||
 | 
			
		||||
    home-manager-unstable.url = "home-manager";
 | 
			
		||||
    home-manager-unstable.inputs.nixpkgs.follows = "nixpkgs-unstable";
 | 
			
		||||
    home-manager-stable.url = "home-manager/release-25.05";
 | 
			
		||||
    home-manager-stable.url = "home-manager/release-24.11";
 | 
			
		||||
    home-manager-stable.inputs.nixpkgs.follows = "nixpkgs-stable";
 | 
			
		||||
 | 
			
		||||
    # Stuff used by the flake for build / deployment
 | 
			
		||||
@@ -30,7 +25,7 @@
 | 
			
		||||
 | 
			
		||||
    # Stuff used by systems
 | 
			
		||||
    impermanence.url = "github:nix-community/impermanence";
 | 
			
		||||
    boardie.url = "github:devplayer0/boardie";
 | 
			
		||||
    boardie.url = "git+https://git.nul.ie/dev/boardie";
 | 
			
		||||
    boardie.inputs.nixpkgs.follows = "nixpkgs-unstable";
 | 
			
		||||
    nixGL.url = "github:nix-community/nixGL";
 | 
			
		||||
    nixGL.inputs.nixpkgs.follows = "nixpkgs-unstable";
 | 
			
		||||
@@ -39,10 +34,7 @@
 | 
			
		||||
    sharry.url = "github:eikek/sharry";
 | 
			
		||||
    sharry.inputs.nixpkgs.follows = "nixpkgs-unstable";
 | 
			
		||||
    borgthin.url = "github:devplayer0/borg";
 | 
			
		||||
    # TODO: Update borgthin so this works
 | 
			
		||||
    # borgthin.inputs.nixpkgs.follows = "nixpkgs-mine";
 | 
			
		||||
    copyparty.url = "github:9001/copyparty";
 | 
			
		||||
    copyparty.inputs.nixpkgs.follows = "nixpkgs-unstable";
 | 
			
		||||
    borgthin.inputs.nixpkgs.follows = "nixpkgs-mine";
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  outputs =
 | 
			
		||||
@@ -65,7 +57,7 @@
 | 
			
		||||
      # Extend a lib with extras that _must not_ internally reference private nixpkgs. flake-utils doesn't, but many
 | 
			
		||||
      # other flakes (e.g. home-manager) probably do internally.
 | 
			
		||||
      libOverlay = final: prev: {
 | 
			
		||||
        my = import ./lib { inherit inputs; lib = final; };
 | 
			
		||||
        my = import ./lib { lib = final; };
 | 
			
		||||
        flake = flake-utils.lib;
 | 
			
		||||
      };
 | 
			
		||||
      pkgsLibOverlay = final: prev: { lib = prev.lib.extend libOverlay; };
 | 
			
		||||
@@ -96,11 +88,10 @@
 | 
			
		||||
        (_: path: mkDefaultSystemsPkgs path (system: {
 | 
			
		||||
          overlays = [
 | 
			
		||||
            pkgsLibOverlay
 | 
			
		||||
 | 
			
		||||
            myPkgsOverlay
 | 
			
		||||
            inputs.devshell.overlays.default
 | 
			
		||||
            inputs.ragenix.overlays.default
 | 
			
		||||
            inputs.deploy-rs.overlays.default
 | 
			
		||||
            inputs.deploy-rs.overlay
 | 
			
		||||
            (flakePackageOverlay inputs.home-manager-unstable system)
 | 
			
		||||
          ];
 | 
			
		||||
        }))
 | 
			
		||||
@@ -111,7 +102,6 @@
 | 
			
		||||
        (_: path: mkDefaultSystemsPkgs path (_: {
 | 
			
		||||
          overlays = [
 | 
			
		||||
            pkgsLibOverlay
 | 
			
		||||
 | 
			
		||||
            myPkgsOverlay
 | 
			
		||||
          ];
 | 
			
		||||
 | 
			
		||||
@@ -167,7 +157,7 @@
 | 
			
		||||
    # Platform independent stuff
 | 
			
		||||
    {
 | 
			
		||||
      nixpkgs = pkgs';
 | 
			
		||||
      inherit inputs lib nixfiles;
 | 
			
		||||
      inherit lib nixfiles;
 | 
			
		||||
 | 
			
		||||
      overlays.default = myPkgsOverlay;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -66,7 +66,7 @@ in
 | 
			
		||||
 | 
			
		||||
        lsd = {
 | 
			
		||||
          enable = mkDefault true;
 | 
			
		||||
          enableFishIntegration = mkDefault true;
 | 
			
		||||
          enableAliases = mkDefault true;
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        starship = {
 | 
			
		||||
@@ -132,8 +132,6 @@ in
 | 
			
		||||
 | 
			
		||||
        ssh = {
 | 
			
		||||
          enable = mkDefault true;
 | 
			
		||||
          # TODO: Set after 25.11 releases
 | 
			
		||||
          # enableDefaultConfig = false;
 | 
			
		||||
          matchBlocks = {
 | 
			
		||||
            nix-dev-vm = {
 | 
			
		||||
              user = "dev";
 | 
			
		||||
@@ -228,7 +226,7 @@ in
 | 
			
		||||
      # Note: If globalPkgs mode is on, then these will be overridden by the NixOS equivalents of these options
 | 
			
		||||
      nixpkgs = {
 | 
			
		||||
        overlays = [
 | 
			
		||||
          inputs.deploy-rs.overlays.default
 | 
			
		||||
          inputs.deploy-rs.overlay
 | 
			
		||||
          inputs.boardie.overlays.default
 | 
			
		||||
          inputs.nixGL.overlays.default
 | 
			
		||||
        ];
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,7 @@
 | 
			
		||||
{ lib, pkgs', pkgs, config, ... }:
 | 
			
		||||
let
 | 
			
		||||
  inherit (lib) genAttrs mkIf mkMerge mkForce mapAttrs mkOptionDefault;
 | 
			
		||||
  inherit (lib.my) mkOpt' mkBoolOpt';
 | 
			
		||||
  inherit (lib.my.c) pubDomain;
 | 
			
		||||
  inherit (lib.my) mkBoolOpt';
 | 
			
		||||
 | 
			
		||||
  cfg = config.my.gui;
 | 
			
		||||
 | 
			
		||||
@@ -16,42 +15,24 @@ let
 | 
			
		||||
    url = "https://distro.ibiblio.org/slitaz/sources/packages/d/doom1.wad";
 | 
			
		||||
    hash = "sha256-HX1DvlAeZ9kn5BXguPPinDvzMHXoWXIYFvZSpSbKx3E=";
 | 
			
		||||
  };
 | 
			
		||||
  subwaySurfers = pkgs.fetchurl {
 | 
			
		||||
    url = "https://p.${pubDomain}/video/subway-surfers-smol.mkv";
 | 
			
		||||
    hash = "sha256-fMe7TDRNTymRHIJOi7qG3trzu4GP8a3gCDz+FMkX1dY=";
 | 
			
		||||
  };
 | 
			
		||||
  minecraftParkour = pkgs.fetchurl {
 | 
			
		||||
    url = "https://p.${pubDomain}/video/minecraft-parkour-smol.mkv";
 | 
			
		||||
    hash = "sha256-723pRm4AsIjY/WFUyAHzTJp+JvH4Pn5hvzF9wHTnOPA=";
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  genLipsum = pkgs.writeScript "lipsum" ''
 | 
			
		||||
    #!${pkgs.python3.withPackages (ps: [ ps.python-lorem ])}/bin/python
 | 
			
		||||
    import lorem
 | 
			
		||||
    print(lorem.get_paragraph(count=5, sep='\n\n'))
 | 
			
		||||
  '';
 | 
			
		||||
  doomsaver' = brainrotTextCommand: pkgs.runCommand "doomsaver" {
 | 
			
		||||
    inherit (pkgs) windowtolayer tmux terminaltexteffects;
 | 
			
		||||
  doomsaver = pkgs.runCommand "doomsaver" {
 | 
			
		||||
    inherit (pkgs) windowtolayer;
 | 
			
		||||
    chocoDoom = pkgs.chocolate-doom2xx;
 | 
			
		||||
    ffmpeg = pkgs.ffmpeg-full;
 | 
			
		||||
    python = pkgs.python3.withPackages (ps: [ ps.filelock ]);
 | 
			
		||||
 | 
			
		||||
    inherit doomWad;
 | 
			
		||||
    enojy = ./enojy.jpg;
 | 
			
		||||
    inherit brainrotTextCommand subwaySurfers minecraftParkour;
 | 
			
		||||
  } ''
 | 
			
		||||
    mkdir -p "$out"/bin
 | 
			
		||||
    substituteAll ${./screensaver.py} "$out"/bin/doomsaver
 | 
			
		||||
    chmod +x "$out"/bin/doomsaver
 | 
			
		||||
  '';
 | 
			
		||||
  doomsaver = doomsaver' cfg.screensaver.brainrotTextCommand;
 | 
			
		||||
in
 | 
			
		||||
{
 | 
			
		||||
  options.my.gui = with lib.types; {
 | 
			
		||||
  options.my.gui = {
 | 
			
		||||
    enable = mkBoolOpt' true "Enable settings and packages meant for graphical systems";
 | 
			
		||||
    manageGraphical = mkBoolOpt' false "Configure the graphical session";
 | 
			
		||||
    standalone = mkBoolOpt' false "Enable settings for fully Nix managed systems";
 | 
			
		||||
    screensaver.brainrotTextCommand = mkOpt' (either path str) genLipsum "Command to generate brainrot text.";
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  config = mkIf cfg.enable (mkMerge [
 | 
			
		||||
@@ -83,7 +64,6 @@ in
 | 
			
		||||
            cmatrix
 | 
			
		||||
            doomsaver
 | 
			
		||||
 | 
			
		||||
            ffmpeg-full
 | 
			
		||||
            xournalpp
 | 
			
		||||
          ];
 | 
			
		||||
        };
 | 
			
		||||
 
 | 
			
		||||
@@ -73,7 +73,7 @@ class TTESaver(Screensaver):
 | 
			
		||||
 | 
			
		||||
    def wait(self):
 | 
			
		||||
        while self.running:
 | 
			
		||||
            effect_cmd = ['@terminaltexteffects@/bin/tte', random.choice(self.effects)]
 | 
			
		||||
            effect_cmd = ['tte', random.choice(self.effects)]
 | 
			
		||||
            print(f"$ {self.cmd} | {' '.join(effect_cmd)}")
 | 
			
		||||
            content = subprocess.check_output(self.cmd, shell=True, env=self.env, stderr=subprocess.DEVNULL)
 | 
			
		||||
 | 
			
		||||
@@ -86,51 +86,6 @@ class TTESaver(Screensaver):
 | 
			
		||||
        self.running = False
 | 
			
		||||
        self.proc.terminate()
 | 
			
		||||
 | 
			
		||||
class FFmpegCACASaver(Screensaver):
 | 
			
		||||
    @staticmethod
 | 
			
		||||
    def command(video, size):
 | 
			
		||||
        return ['@ffmpeg@/bin/ffmpeg', '-hide_banner', '-loglevel', 'error',
 | 
			
		||||
                '-stream_loop', '-1', '-i', video,
 | 
			
		||||
                '-pix_fmt', 'rgb24', '-window_size', f'{size}x{size}',
 | 
			
		||||
                '-f', 'caca', '-']
 | 
			
		||||
 | 
			
		||||
    def __init__(self, video, weight=2):
 | 
			
		||||
        cols, lines = os.get_terminal_size()
 | 
			
		||||
        # IDK if it's reasonable to do this as "1:1"
 | 
			
		||||
        size = lines - 4
 | 
			
		||||
        super().__init__(
 | 
			
		||||
            self.command(video, size),
 | 
			
		||||
            env={'CACA_DRIVER': 'ncurses'},
 | 
			
		||||
            weight=weight,
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
    def stop(self):
 | 
			
		||||
        super().stop(kill=True)
 | 
			
		||||
 | 
			
		||||
class BrainrotStorySaver(Screensaver):
 | 
			
		||||
    def __init__(self, video, text_command, weight=2):
 | 
			
		||||
        cols, lines = os.get_terminal_size()
 | 
			
		||||
        video_size = lines - 1
 | 
			
		||||
        video_command = ' '.join(FFmpegCACASaver.command(video, video_size))
 | 
			
		||||
        text_command = (
 | 
			
		||||
            f'while true; do {text_command} | '
 | 
			
		||||
            f'@terminaltexteffects@/bin/tte --wrap-text --canvas-width=80 --canvas-height={video_size//2} --anchor-canvas=c '
 | 
			
		||||
            'print --final-gradient-stops=ffffff; clear; done' )
 | 
			
		||||
        self.tmux_session = f'screensaver-{os.urandom(4).hex()}'
 | 
			
		||||
        super().__init__(
 | 
			
		||||
            ['@tmux@/bin/tmux', 'new-session', '-s', self.tmux_session, '-n', 'brainrot',
 | 
			
		||||
             text_command, ';', 'split-window', '-hbl', str(lines), video_command],
 | 
			
		||||
            # ['sh', '-c', text_command],
 | 
			
		||||
            env={
 | 
			
		||||
                'CACA_DRIVER': 'ncurses',
 | 
			
		||||
                'SHELL': '/bin/sh',
 | 
			
		||||
            },
 | 
			
		||||
            weight=weight,
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
    def stop(self):
 | 
			
		||||
        subprocess.check_call(['@tmux@/bin/tmux', 'kill-session', '-t', self.tmux_session])
 | 
			
		||||
 | 
			
		||||
class MultiSaver:
 | 
			
		||||
    savers = [
 | 
			
		||||
        DoomSaver(0),
 | 
			
		||||
@@ -145,9 +100,6 @@ class MultiSaver:
 | 
			
		||||
        TTESaver('ss -nltu'),
 | 
			
		||||
        TTESaver('ss -ntu'),
 | 
			
		||||
        TTESaver('jp2a --width=100 @enojy@'),
 | 
			
		||||
 | 
			
		||||
        BrainrotStorySaver('@subwaySurfers@', '@brainrotTextCommand@'),
 | 
			
		||||
        BrainrotStorySaver('@minecraftParkour@', '@brainrotTextCommand@'),
 | 
			
		||||
    ]
 | 
			
		||||
    state_filename = 'screensaver.json'
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -13,7 +13,6 @@ rec {
 | 
			
		||||
      kea = 404;
 | 
			
		||||
      keepalived_script = 405;
 | 
			
		||||
      photoprism = 406;
 | 
			
		||||
      copyparty = 408;
 | 
			
		||||
    };
 | 
			
		||||
    gids = {
 | 
			
		||||
      matrix-syncv3 = 400;
 | 
			
		||||
@@ -24,13 +23,12 @@ rec {
 | 
			
		||||
      keepalived_script = 405;
 | 
			
		||||
      photoprism = 406;
 | 
			
		||||
      adbusers = 407;
 | 
			
		||||
      copyparty = 408;
 | 
			
		||||
    };
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  kernel = {
 | 
			
		||||
    lts = pkgs: pkgs.linuxKernel.packages.linux_6_12;
 | 
			
		||||
    latest = pkgs: pkgs.linuxKernel.packages.linux_6_16;
 | 
			
		||||
    latest = pkgs: pkgs.linuxKernel.packages.linux_6_13;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  nginx = rec {
 | 
			
		||||
@@ -142,13 +140,6 @@ rec {
 | 
			
		||||
        v4 = subnet 8 4 all.v4;
 | 
			
		||||
      };
 | 
			
		||||
 | 
			
		||||
      p2pTunnels = {
 | 
			
		||||
        v4 = subnet 8 5 all.v4;
 | 
			
		||||
      };
 | 
			
		||||
      hillcrest = {
 | 
			
		||||
        v4 = subnet 6 0 p2pTunnels.v4;
 | 
			
		||||
      };
 | 
			
		||||
 | 
			
		||||
      cust = {
 | 
			
		||||
        v4 = subnet 8 100 all.v4; # single ip for routing only
 | 
			
		||||
        v6 = "2a0e:97c0:4d2:2000::/56";
 | 
			
		||||
@@ -213,10 +204,6 @@ rec {
 | 
			
		||||
        port = 25567;
 | 
			
		||||
        dst = aa.kevcraft-oci.internal.ipv4.address;
 | 
			
		||||
      }
 | 
			
		||||
      {
 | 
			
		||||
        port = 25568;
 | 
			
		||||
        dst = aa.kinkcraft-oci.internal.ipv4.address;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      # RCON... unsafe?
 | 
			
		||||
      # {
 | 
			
		||||
@@ -249,12 +236,6 @@ rec {
 | 
			
		||||
      {
 | 
			
		||||
        port = 25567;
 | 
			
		||||
        dst = aa.kevcraft-oci.internal.ipv4.address;
 | 
			
		||||
        proto = "udp";
 | 
			
		||||
      }
 | 
			
		||||
      {
 | 
			
		||||
        port = 25568;
 | 
			
		||||
        dst = aa.kinkcraft-oci.internal.ipv4.address;
 | 
			
		||||
        proto = "udp";
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      {
 | 
			
		||||
@@ -421,11 +402,6 @@ rec {
 | 
			
		||||
      ctrs.v4 = subnet 4 0 all.v4;
 | 
			
		||||
    };
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  hillcrest = {
 | 
			
		||||
    vpn.port = 51822;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  sshKeyFiles = {
 | 
			
		||||
    me = ../.keys/me.pub;
 | 
			
		||||
    deploy = ../.keys/deploy.pub;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,11 +1,11 @@
 | 
			
		||||
{ inputs, lib }:
 | 
			
		||||
{ lib }:
 | 
			
		||||
let
 | 
			
		||||
  inherit (builtins) length match elemAt filter replaceStrings substring;
 | 
			
		||||
  inherit (lib)
 | 
			
		||||
    genAttrs mapAttrsToList filterAttrsRecursive nameValuePair types
 | 
			
		||||
    mkOption mkOverride mkForce mkIf mergeEqualOption optional
 | 
			
		||||
    showWarnings concatStringsSep flatten unique optionalAttrs
 | 
			
		||||
    mkBefore toLower splitString last;
 | 
			
		||||
    mkBefore toLower;
 | 
			
		||||
  inherit (lib.flake) defaultSystems;
 | 
			
		||||
in
 | 
			
		||||
rec {
 | 
			
		||||
@@ -23,7 +23,7 @@ rec {
 | 
			
		||||
 | 
			
		||||
  attrsToNVList = mapAttrsToList nameValuePair;
 | 
			
		||||
 | 
			
		||||
  inherit ((import "${inputs.libnetRepo}/lib/netu.nix" { inherit lib; }).lib) net;
 | 
			
		||||
  inherit (import ./net.nix { inherit lib; }) net;
 | 
			
		||||
  dns = import ./dns.nix { inherit lib; };
 | 
			
		||||
  c = import ./constants.nix { inherit lib; };
 | 
			
		||||
 | 
			
		||||
@@ -248,13 +248,12 @@ rec {
 | 
			
		||||
  in
 | 
			
		||||
  {
 | 
			
		||||
    trivial = prev.trivial // {
 | 
			
		||||
      release = "25.09:u-${prev.trivial.release}";
 | 
			
		||||
      codeName = "Giving";
 | 
			
		||||
      release = "25.03:u-${prev.trivial.release}";
 | 
			
		||||
      codeName = "Frick";
 | 
			
		||||
      revisionWithDefault = default: self.rev or default;
 | 
			
		||||
      versionSuffix = ".${date}.${revCode self}:u-${revCode pkgsFlake}";
 | 
			
		||||
    };
 | 
			
		||||
  };
 | 
			
		||||
  upstreamRelease = last (splitString "-" lib.trivial.release);
 | 
			
		||||
 | 
			
		||||
  netbootKeaClientClasses = { tftpIP, hostname, systems }:
 | 
			
		||||
  let
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1322
									
								
								lib/net.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1322
									
								
								lib/net.nix
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -4,6 +4,22 @@ let
 | 
			
		||||
  inherit (lib.my.c) pubDomain;
 | 
			
		||||
  inherit (lib.my.c.britway) prefixes domain;
 | 
			
		||||
 | 
			
		||||
  # Can't use overrideAttrs because we need to override `vendorHash` within `buildGoModule`
 | 
			
		||||
  headscale' = (pkgs.headscale.override {
 | 
			
		||||
    buildGoModule = args: pkgs.buildGoModule (args // rec {
 | 
			
		||||
      version = "0.23.0-alpha12";
 | 
			
		||||
      src = pkgs.fetchFromGitHub {
 | 
			
		||||
        owner = "juanfont";
 | 
			
		||||
        repo = "headscale";
 | 
			
		||||
        rev = "v${version}";
 | 
			
		||||
        hash = "sha256-kZZK0cXnFARxblSMz01TDcBbTorkHGAwGpR+a4/mYfU=";
 | 
			
		||||
      };
 | 
			
		||||
      patches = [];
 | 
			
		||||
      vendorHash = "sha256-EorT2AVwA3usly/LcNor6r5UIhLCdj3L4O4ilgTIC2o=";
 | 
			
		||||
      doCheck = false;
 | 
			
		||||
    });
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  advRoutes = concatStringsSep "," [
 | 
			
		||||
    lib.my.c.home.prefixes.all.v4
 | 
			
		||||
    lib.my.c.home.prefixes.all.v6
 | 
			
		||||
@@ -36,7 +52,6 @@ in
 | 
			
		||||
          noise.private_key_path = "/var/lib/headscale/noise_private.key";
 | 
			
		||||
          prefixes = with lib.my.c.tailscale.prefix; { inherit v4 v6; };
 | 
			
		||||
          dns = {
 | 
			
		||||
            override_local_dns = false;
 | 
			
		||||
            # Use IPs that will route inside the VPN to prevent interception
 | 
			
		||||
            # (e.g. DNS rebinding filtering)
 | 
			
		||||
            nameservers.split = {
 | 
			
		||||
 
 | 
			
		||||
@@ -251,87 +251,41 @@ in
 | 
			
		||||
            neighbor 2001:7f8:10f::dc49:254 as 56393;
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          protocol bgp ixp4_frysix_rs3 from ixp_bgp4 {
 | 
			
		||||
            description "Frys-IX route server 3 (IPv4)";
 | 
			
		||||
            neighbor 185.1.160.255 as 56393;
 | 
			
		||||
          }
 | 
			
		||||
          protocol bgp ixp6_frysix_rs3 from ixp_bgp6 {
 | 
			
		||||
            description "Frys-IX route server 3 (IPv6)";
 | 
			
		||||
            neighbor 2001:7f8:10f::dc49:1 as 56393;
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          protocol bgp ixp4_frysix_rs4 from ixp_bgp4 {
 | 
			
		||||
            description "Frys-IX route server 4 (IPv4)";
 | 
			
		||||
            neighbor 185.1.161.0 as 56393;
 | 
			
		||||
          }
 | 
			
		||||
          protocol bgp ixp6_frysix_rs4 from ixp_bgp6 {
 | 
			
		||||
            description "Frys-IX route server 4 (IPv6)";
 | 
			
		||||
            neighbor 2001:7f8:10f::dc49:2 as 56393;
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          protocol bgp peer4_frysix_luje from peer_bgp4 {
 | 
			
		||||
            description "LUJE.net (on Frys-IX, IPv4)";
 | 
			
		||||
            neighbor 185.1.160.152 as 212855;
 | 
			
		||||
            neighbor 185.1.203.152 as 212855;
 | 
			
		||||
          }
 | 
			
		||||
          protocol bgp peer6_frysix_luje from peer_bgp6 {
 | 
			
		||||
            description "LUJE.net (on Frys-IX, IPv6)";
 | 
			
		||||
            neighbor 2001:7f8:10f::3:3f95:152 as 212855;
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          protocol bgp peer4_frysix_he from peer_bgp4 {
 | 
			
		||||
            description "Hurricane Electric (on Frys-IX, IPv4)";
 | 
			
		||||
            neighbor 185.1.160.154 as 6939;
 | 
			
		||||
            neighbor 185.1.203.154 as 6939;
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          protocol bgp peer4_frysix_cloudflare1_old from peer_bgp4 {
 | 
			
		||||
            description "Cloudflare 1 (on Frys-IX, IPv4)";
 | 
			
		||||
          protocol bgp peer4_frysix_cloudflare from peer_bgp4 {
 | 
			
		||||
            description "Cloudflare (on Frys-IX, IPv4)";
 | 
			
		||||
            neighbor 185.1.203.217 as 13335;
 | 
			
		||||
          }
 | 
			
		||||
          protocol bgp peer4_frysix_cloudflare2_old from peer_bgp4 {
 | 
			
		||||
            description "Cloudflare 2 (on Frys-IX, IPv4)";
 | 
			
		||||
            neighbor 185.1.203.109 as 13335;
 | 
			
		||||
          }
 | 
			
		||||
          protocol bgp peer4_frysix_cloudflare1 from peer_bgp4 {
 | 
			
		||||
            description "Cloudflare 1 (on Frys-IX, IPv4)";
 | 
			
		||||
            neighbor 185.1.160.217 as 13335;
 | 
			
		||||
          }
 | 
			
		||||
          protocol bgp peer4_frysix_cloudflare2 from peer_bgp4 {
 | 
			
		||||
            description "Cloudflare 2 (on Frys-IX, IPv4)";
 | 
			
		||||
            neighbor 185.1.160.109 as 13335;
 | 
			
		||||
          }
 | 
			
		||||
          protocol bgp peer6_frysix_cloudflare1 from peer_bgp6 {
 | 
			
		||||
            description "Cloudflare 1 (on Frys-IX, IPv6)";
 | 
			
		||||
          protocol bgp peer6_frysix_cloudflare from peer_bgp6 {
 | 
			
		||||
            description "Cloudflare (on Frys-IX, IPv6)";
 | 
			
		||||
            neighbor 2001:7f8:10f::3417:217 as 13335;
 | 
			
		||||
          }
 | 
			
		||||
          protocol bgp peer6_frysix_cloudflare2 from peer_bgp6 {
 | 
			
		||||
            description "Cloudflare 2 (on Frys-IX, IPv6)";
 | 
			
		||||
            neighbor 2001:7f8:10f::3417:109 as 13335;
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          protocol bgp peer4_frysix_jurrian from peer_bgp4 {
 | 
			
		||||
            description "AS212635 aka jurrian (on Frys-IX, IPv4)";
 | 
			
		||||
            neighbor 185.1.160.134 as 212635;
 | 
			
		||||
            neighbor 185.1.203.134 as 212635;
 | 
			
		||||
          }
 | 
			
		||||
          protocol bgp peer6_frysix_jurrian from peer_bgp6 {
 | 
			
		||||
            description "AS212635 aka jurrian (on Frys-IX, IPv6)";
 | 
			
		||||
            neighbor 2001:7f8:10f::3:3e9b:134 as 212635;
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          protocol bgp peer4_frysix_meta1_old from peer_bgp4 {
 | 
			
		||||
          protocol bgp peer4_frysix_meta1 from peer_bgp4 {
 | 
			
		||||
            description "Meta 1 (on Frys-IX, IPv4)";
 | 
			
		||||
            neighbor 185.1.203.225 as 32934;
 | 
			
		||||
          }
 | 
			
		||||
          protocol bgp peer4_frysix_meta2_old from peer_bgp4 {
 | 
			
		||||
            description "Meta 2 (on Frys-IX, IPv4)";
 | 
			
		||||
            neighbor 185.1.203.226 as 32934;
 | 
			
		||||
          }
 | 
			
		||||
          protocol bgp peer4_frysix_meta1 from peer_bgp4 {
 | 
			
		||||
            description "Meta 1 (on Frys-IX, IPv4)";
 | 
			
		||||
            neighbor 185.1.160.225 as 32934;
 | 
			
		||||
          }
 | 
			
		||||
          protocol bgp peer4_frysix_meta2 from peer_bgp4 {
 | 
			
		||||
            description "Meta 2 (on Frys-IX, IPv4)";
 | 
			
		||||
            neighbor 185.1.160.226 as 32934;
 | 
			
		||||
            neighbor 185.1.203.226 as 32934;
 | 
			
		||||
          }
 | 
			
		||||
          protocol bgp peer6_frysix_meta1 from peer_bgp6 {
 | 
			
		||||
            description "Meta 1 (on Frys-IX, IPv6)";
 | 
			
		||||
@@ -364,36 +318,36 @@ in
 | 
			
		||||
            ipv6 { preference (PREFIXP-1); };
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          # protocol bgp peer4_nlix_cloudflare1 from peer_bgp4 {
 | 
			
		||||
          #   description "Cloudflare NL-ix 1 (IPv4)";
 | 
			
		||||
          #   neighbor 193.239.117.14 as 13335;
 | 
			
		||||
          #   ipv4 { preference (PREFPEER-1); };
 | 
			
		||||
          # }
 | 
			
		||||
          # protocol bgp peer4_nlix_cloudflare2 from peer_bgp4 {
 | 
			
		||||
          #   description "Cloudflare NL-ix 2 (IPv4)";
 | 
			
		||||
          #   neighbor 193.239.117.114 as 13335;
 | 
			
		||||
          #   ipv4 { preference (PREFPEER-1); };
 | 
			
		||||
          # }
 | 
			
		||||
          # protocol bgp peer4_nlix_cloudflare3 from peer_bgp4 {
 | 
			
		||||
          #   description "Cloudflare NL-ix 3 (IPv4)";
 | 
			
		||||
          #   neighbor 193.239.118.138 as 13335;
 | 
			
		||||
          #   ipv4 { preference (PREFPEER-1); };
 | 
			
		||||
          # }
 | 
			
		||||
          # protocol bgp peer6_nlix_cloudflare1 from peer_bgp6 {
 | 
			
		||||
          #   description "Cloudflare NL-ix 1 (IPv6)";
 | 
			
		||||
          #   neighbor 2001:7f8:13::a501:3335:1 as 13335;
 | 
			
		||||
          #   ipv6 { preference (PREFPEER-1); };
 | 
			
		||||
          # }
 | 
			
		||||
          # protocol bgp peer6_nlix_cloudflare2 from peer_bgp6 {
 | 
			
		||||
          #   description "Cloudflare NL-ix 2 (IPv6)";
 | 
			
		||||
          #   neighbor 2001:7f8:13::a501:3335:2 as 13335;
 | 
			
		||||
          #   ipv6 { preference (PREFPEER-1); };
 | 
			
		||||
          # }
 | 
			
		||||
          # protocol bgp peer6_nlix_cloudflare3 from peer_bgp6 {
 | 
			
		||||
          #   description "Cloudflare NL-ix 3 (IPv6)";
 | 
			
		||||
          #   neighbor 2001:7f8:13::a501:3335:3 as 13335;
 | 
			
		||||
          #   ipv6 { preference (PREFPEER-1); };
 | 
			
		||||
          # }
 | 
			
		||||
          protocol bgp peer4_nlix_cloudflare1 from peer_bgp4 {
 | 
			
		||||
            description "Cloudflare NL-ix 1 (IPv4)";
 | 
			
		||||
            neighbor 193.239.117.14 as 13335;
 | 
			
		||||
            ipv4 { preference (PREFPEER-1); };
 | 
			
		||||
          }
 | 
			
		||||
          protocol bgp peer4_nlix_cloudflare2 from peer_bgp4 {
 | 
			
		||||
            description "Cloudflare NL-ix 2 (IPv4)";
 | 
			
		||||
            neighbor 193.239.117.114 as 13335;
 | 
			
		||||
            ipv4 { preference (PREFPEER-1); };
 | 
			
		||||
          }
 | 
			
		||||
          protocol bgp peer4_nlix_cloudflare3 from peer_bgp4 {
 | 
			
		||||
            description "Cloudflare NL-ix 3 (IPv4)";
 | 
			
		||||
            neighbor 193.239.118.138 as 13335;
 | 
			
		||||
            ipv4 { preference (PREFPEER-1); };
 | 
			
		||||
          }
 | 
			
		||||
          protocol bgp peer6_nlix_cloudflare1 from peer_bgp6 {
 | 
			
		||||
            description "Cloudflare NL-ix 1 (IPv6)";
 | 
			
		||||
            neighbor 2001:7f8:13::a501:3335:1 as 13335;
 | 
			
		||||
            ipv6 { preference (PREFPEER-1); };
 | 
			
		||||
          }
 | 
			
		||||
          protocol bgp peer6_nlix_cloudflare2 from peer_bgp6 {
 | 
			
		||||
            description "Cloudflare NL-ix 2 (IPv6)";
 | 
			
		||||
            neighbor 2001:7f8:13::a501:3335:2 as 13335;
 | 
			
		||||
            ipv6 { preference (PREFPEER-1); };
 | 
			
		||||
          }
 | 
			
		||||
          protocol bgp peer6_nlix_cloudflare3 from peer_bgp6 {
 | 
			
		||||
            description "Cloudflare NL-ix 3 (IPv6)";
 | 
			
		||||
            neighbor 2001:7f8:13::a501:3335:3 as 13335;
 | 
			
		||||
            ipv6 { preference (PREFPEER-1); };
 | 
			
		||||
          }
 | 
			
		||||
          protocol bgp peer4_nlix_jurrian from peer_bgp4 {
 | 
			
		||||
            description "AS212635 aka jurrian (on NL-ix, IPv4)";
 | 
			
		||||
            neighbor 193.239.117.55 as 212635;
 | 
			
		||||
 
 | 
			
		||||
@@ -171,25 +171,6 @@ in
 | 
			
		||||
                    ];
 | 
			
		||||
                  };
 | 
			
		||||
                }
 | 
			
		||||
                {
 | 
			
		||||
                  "30-hillcrest" = {
 | 
			
		||||
                    netdevConfig = {
 | 
			
		||||
                      Name = "hillcrest";
 | 
			
		||||
                      Kind = "wireguard";
 | 
			
		||||
                    };
 | 
			
		||||
                    wireguardConfig = {
 | 
			
		||||
                      PrivateKeyFile = config.age.secrets."estuary/hillcrest-wg.key".path;
 | 
			
		||||
                      ListenPort = lib.my.c.hillcrest.vpn.port;
 | 
			
		||||
                    };
 | 
			
		||||
                    wireguardPeers = [
 | 
			
		||||
                      {
 | 
			
		||||
                        PublicKey = "+67Ks+ZRk1ssNCfg5BFKmIE9NtLasAxRE6XMqufx5GY=";
 | 
			
		||||
                        AllowedIPs = [ (net.cidr.host 2 prefixes.hillcrest.v4) ];
 | 
			
		||||
                        PersistentKeepalive = 25;
 | 
			
		||||
                      }
 | 
			
		||||
                    ];
 | 
			
		||||
                  };
 | 
			
		||||
                }
 | 
			
		||||
              ];
 | 
			
		||||
 | 
			
		||||
              links = {
 | 
			
		||||
@@ -238,9 +219,6 @@ in
 | 
			
		||||
              mkMerge
 | 
			
		||||
              [
 | 
			
		||||
                (mkIXPConfig "frys-ix" "185.1.203.196/24" "2001:7f8:10f::3:3850:196/64")
 | 
			
		||||
                # FrysIX is migrating to a /23
 | 
			
		||||
                { "85-frys-ix".address = [ "185.1.160.196/23" ]; }
 | 
			
		||||
 | 
			
		||||
                (mkIXPConfig "nl-ix" "193.239.116.145/22" "2001:7f8:13::a521:1024:1/64")
 | 
			
		||||
                (mkIXPConfig "fogixp" "185.1.147.159/24" "2001:7f8:ca:1::159/64")
 | 
			
		||||
              {
 | 
			
		||||
@@ -368,16 +346,6 @@ in
 | 
			
		||||
                    }
 | 
			
		||||
                  ];
 | 
			
		||||
                };
 | 
			
		||||
                "95-hillcrest" = {
 | 
			
		||||
                  matchConfig.Name = "hillcrest";
 | 
			
		||||
                  address = [ (net.cidr.host 1 prefixes.hillcrest.v4) ];
 | 
			
		||||
                  routes = [
 | 
			
		||||
                    {
 | 
			
		||||
                      Destination = net.cidr.host 2 prefixes.hillcrest.v4;
 | 
			
		||||
                      Scope = "link";
 | 
			
		||||
                    }
 | 
			
		||||
                  ];
 | 
			
		||||
                };
 | 
			
		||||
              } ];
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
@@ -388,9 +356,6 @@ in
 | 
			
		||||
                  "estuary/kelder-wg.key" = {
 | 
			
		||||
                    owner = "systemd-network";
 | 
			
		||||
                  };
 | 
			
		||||
                  "estuary/hillcrest-wg.key" = {
 | 
			
		||||
                    owner = "systemd-network";
 | 
			
		||||
                  };
 | 
			
		||||
                  "l2mesh/as211024.key" = {};
 | 
			
		||||
                };
 | 
			
		||||
              };
 | 
			
		||||
@@ -402,7 +367,7 @@ in
 | 
			
		||||
                };
 | 
			
		||||
              };
 | 
			
		||||
              firewall = {
 | 
			
		||||
                udp.allowed = [ 5353 lib.my.c.kelder.vpn.port lib.my.c.hillcrest.vpn.port ];
 | 
			
		||||
                udp.allowed = [ 5353 lib.my.c.kelder.vpn.port ];
 | 
			
		||||
                tcp.allowed = [ 5353 "bgp" ];
 | 
			
		||||
                nat = {
 | 
			
		||||
                  enable = true;
 | 
			
		||||
@@ -437,7 +402,6 @@ in
 | 
			
		||||
                      ip6 daddr ${aa.simpcraft-oci.internal.ipv6.address} tcp dport 25565 accept
 | 
			
		||||
                      ip6 daddr ${aa.simpcraft-staging-oci.internal.ipv6.address} tcp dport 25565 accept
 | 
			
		||||
                      ip6 daddr ${aa.kevcraft-oci.internal.ipv6.address} tcp dport 25567 accept
 | 
			
		||||
                      ip6 daddr ${aa.kinkcraft-oci.internal.ipv6.address} tcp dport 25568 accept
 | 
			
		||||
                      return
 | 
			
		||||
                    }
 | 
			
		||||
                    chain routing-udp {
 | 
			
		||||
@@ -446,7 +410,6 @@ in
 | 
			
		||||
                      ip6 daddr ${aa.simpcraft-oci.internal.ipv6.address} udp dport 25565 accept
 | 
			
		||||
                      ip6 daddr ${aa.enshrouded-oci.internal.ipv6.address} udp dport { 15636-15637 } accept
 | 
			
		||||
                      ip6 daddr ${aa.kevcraft-oci.internal.ipv6.address} udp dport 25567 accept
 | 
			
		||||
                      ip6 daddr ${aa.kinkcraft-oci.internal.ipv6.address} udp dport 25568 accept
 | 
			
		||||
                      return
 | 
			
		||||
                    }
 | 
			
		||||
                    chain filter-routing {
 | 
			
		||||
@@ -467,7 +430,7 @@ in
 | 
			
		||||
                      iifname { wan, as211024, $ixps } oifname base jump filter-routing
 | 
			
		||||
                      oifname $ixps jump ixp
 | 
			
		||||
                      iifname base oifname { base, wan, $ixps } accept
 | 
			
		||||
                      oifname { as211024, kelder, hillcrest } accept
 | 
			
		||||
                      oifname { as211024, kelder } accept
 | 
			
		||||
                    }
 | 
			
		||||
                    chain output {
 | 
			
		||||
                      oifname ifog ether type != vlan reject
 | 
			
		||||
@@ -479,7 +442,6 @@ in
 | 
			
		||||
                      ${matchInet "meta l4proto { udp, tcp } th dport domain redirect to :5353" "estuary"}
 | 
			
		||||
                    }
 | 
			
		||||
                    chain postrouting {
 | 
			
		||||
                      oifname hillcrest snat ip to ${net.cidr.host 1 prefixes.hillcrest.v4}
 | 
			
		||||
                      ip saddr ${prefixes.all.v4} oifname != as211024 snat to ${assignments.internal.ipv4.address}
 | 
			
		||||
                    }
 | 
			
		||||
                  }
 | 
			
		||||
 
 | 
			
		||||
@@ -14,7 +14,7 @@ in
 | 
			
		||||
          owner = "pdns";
 | 
			
		||||
          group = "pdns";
 | 
			
		||||
        };
 | 
			
		||||
        "estuary/pdns/recursor.yml" = {
 | 
			
		||||
        "estuary/pdns/recursor.conf" = {
 | 
			
		||||
          owner = "pdns-recursor";
 | 
			
		||||
          group = "pdns-recursor";
 | 
			
		||||
        };
 | 
			
		||||
@@ -31,7 +31,7 @@ in
 | 
			
		||||
 | 
			
		||||
      pdns.recursor = {
 | 
			
		||||
        enable = true;
 | 
			
		||||
        extraSettingsFile = config.age.secrets."estuary/pdns/recursor.yml".path;
 | 
			
		||||
        extraSettingsFile = config.age.secrets."estuary/pdns/recursor.conf".path;
 | 
			
		||||
      };
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
@@ -44,55 +44,45 @@ in
 | 
			
		||||
      };
 | 
			
		||||
 | 
			
		||||
      pdns-recursor = {
 | 
			
		||||
        yaml-settings = {
 | 
			
		||||
          incoming = {
 | 
			
		||||
            listen = [
 | 
			
		||||
              "127.0.0.1" "::1"
 | 
			
		||||
              assignments.base.ipv4.address assignments.base.ipv6.address
 | 
			
		||||
            ];
 | 
			
		||||
            allow_from = [
 | 
			
		||||
              "127.0.0.0/8" "::1/128"
 | 
			
		||||
              prefixes.all.v4 prefixes.all.v6
 | 
			
		||||
            ] ++ (with lib.my.c.tailscale.prefix; [ v4 v6 ]);
 | 
			
		||||
        dns = {
 | 
			
		||||
          address = [
 | 
			
		||||
            "127.0.0.1" "::1"
 | 
			
		||||
            assignments.base.ipv4.address assignments.base.ipv6.address
 | 
			
		||||
          ];
 | 
			
		||||
          allowFrom = [
 | 
			
		||||
            "127.0.0.0/8" "::1/128"
 | 
			
		||||
            prefixes.all.v4 prefixes.all.v6
 | 
			
		||||
          ] ++ (with lib.my.c.tailscale.prefix; [ v4 v6 ]);
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
            # DNS NOTIFY messages override TTL
 | 
			
		||||
            allow_notify_for = authZones;
 | 
			
		||||
            allow_notify_from = [ "127.0.0.0/8" "::1/128" ];
 | 
			
		||||
          };
 | 
			
		||||
        settings = {
 | 
			
		||||
          query-local-address = [
 | 
			
		||||
            assignments.internal.ipv4.address
 | 
			
		||||
            assignments.internal.ipv6.address
 | 
			
		||||
            assignments.base.ipv6.address
 | 
			
		||||
          ];
 | 
			
		||||
          forward-zones = map (z: "${z}=127.0.0.1:5353") authZones;
 | 
			
		||||
 | 
			
		||||
          outgoing = {
 | 
			
		||||
            source_address = [
 | 
			
		||||
              assignments.internal.ipv4.address
 | 
			
		||||
              assignments.internal.ipv6.address
 | 
			
		||||
              assignments.base.ipv6.address
 | 
			
		||||
            ];
 | 
			
		||||
          };
 | 
			
		||||
          # DNS NOTIFY messages override TTL
 | 
			
		||||
          allow-notify-for = authZones;
 | 
			
		||||
          allow-notify-from = [ "127.0.0.0/8" "::1/128" ];
 | 
			
		||||
 | 
			
		||||
          recursor = {
 | 
			
		||||
            forward_zones = map (z: {
 | 
			
		||||
              zone = z;
 | 
			
		||||
              forwarders = [ "127.0.0.1:5353" ];
 | 
			
		||||
            }) authZones;
 | 
			
		||||
          webserver = true;
 | 
			
		||||
          webserver-address = "::";
 | 
			
		||||
          webserver-allow-from = [ "127.0.0.1" "::1" ];
 | 
			
		||||
 | 
			
		||||
            lua_dns_script = pkgs.writeText "pdns-script.lua" ''
 | 
			
		||||
              function preresolve(dq)
 | 
			
		||||
                if dq.qname:equal("nix-cache.nul.ie") then
 | 
			
		||||
                  dq:addAnswer(pdns.CNAME, "http.${config.networking.domain}.")
 | 
			
		||||
                  dq.rcode = 0
 | 
			
		||||
                  dq.followupFunction = "followCNAMERecords"
 | 
			
		||||
                  return true
 | 
			
		||||
                end
 | 
			
		||||
 | 
			
		||||
                return false
 | 
			
		||||
          lua-dns-script = pkgs.writeText "pdns-script.lua" ''
 | 
			
		||||
            function preresolve(dq)
 | 
			
		||||
              if dq.qname:equal("nix-cache.nul.ie") then
 | 
			
		||||
                dq:addAnswer(pdns.CNAME, "http.${config.networking.domain}.")
 | 
			
		||||
                dq.rcode = 0
 | 
			
		||||
                dq.followupFunction = "followCNAMERecords"
 | 
			
		||||
                return true
 | 
			
		||||
              end
 | 
			
		||||
            '';
 | 
			
		||||
          };
 | 
			
		||||
 | 
			
		||||
          webservice = {
 | 
			
		||||
            webserver = true;
 | 
			
		||||
            address = "::";
 | 
			
		||||
            allow_from = [ "127.0.0.1" "::1" ];
 | 
			
		||||
          };
 | 
			
		||||
              return false
 | 
			
		||||
            end
 | 
			
		||||
          '';
 | 
			
		||||
        };
 | 
			
		||||
      };
 | 
			
		||||
    };
 | 
			
		||||
@@ -166,8 +156,6 @@ in
 | 
			
		||||
            enshrouded IN A ${assignments.internal.ipv4.address}
 | 
			
		||||
            kevcraft IN A ${assignments.internal.ipv4.address}
 | 
			
		||||
            kevcraft IN AAAA ${allAssignments.kevcraft-oci.internal.ipv6.address}
 | 
			
		||||
            kinkcraft IN A ${assignments.internal.ipv4.address}
 | 
			
		||||
            kinkcraft IN AAAA ${allAssignments.kinkcraft-oci.internal.ipv6.address}
 | 
			
		||||
 | 
			
		||||
            mail-vm IN A ${net.cidr.host 0 prefixes.mail.v4}
 | 
			
		||||
            mail-vm IN AAAA ${net.cidr.host 1 prefixes.mail.v6}
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@ let
 | 
			
		||||
  inherit (lib) mkMerge mkDefault;
 | 
			
		||||
  inherit (lib.my) net;
 | 
			
		||||
  inherit (lib.my.c) pubDomain;
 | 
			
		||||
  inherit (lib.my.c.colony) domain prefixes firewallForwards;
 | 
			
		||||
  inherit (lib.my.c.colony) domain prefixes;
 | 
			
		||||
  inherit (lib.my.c.nginx) baseHttpConfig proxyHeaders;
 | 
			
		||||
in
 | 
			
		||||
{
 | 
			
		||||
@@ -197,7 +197,6 @@ in
 | 
			
		||||
 | 
			
		||||
              firewall = {
 | 
			
		||||
                tcp.allowed = [ 19999 "http" "https" ];
 | 
			
		||||
                nat.forwardPorts."${allAssignments.estuary.internal.ipv4.address}" = firewallForwards allAssignments;
 | 
			
		||||
                extraRules = ''
 | 
			
		||||
                  table inet filter {
 | 
			
		||||
                    chain forward {
 | 
			
		||||
 
 | 
			
		||||
@@ -328,7 +328,6 @@ in
 | 
			
		||||
                    };
 | 
			
		||||
                    permissions = {
 | 
			
		||||
                      "@dev:nul.ie" = "admin";
 | 
			
		||||
                      "@adzerq:nul.ie" = "user";
 | 
			
		||||
                    };
 | 
			
		||||
                  };
 | 
			
		||||
                };
 | 
			
		||||
 
 | 
			
		||||
@@ -23,7 +23,7 @@ in
 | 
			
		||||
      };
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    configuration = { lib, pkgs, config, allAssignments, ... }:
 | 
			
		||||
    configuration = { lib, pkgs, config, ... }:
 | 
			
		||||
    let
 | 
			
		||||
      inherit (lib) mkForce;
 | 
			
		||||
    in
 | 
			
		||||
@@ -39,18 +39,8 @@ in
 | 
			
		||||
            key = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPUv1ntVrZv5ripsKpcOAnyDQX2PHjowzyhqWK10Ml53";
 | 
			
		||||
            files = {
 | 
			
		||||
              "jackflix/photoprism-pass.txt" = {};
 | 
			
		||||
              "jackflix/copyparty-pass.txt" = {
 | 
			
		||||
                owner = "copyparty";
 | 
			
		||||
                group = "copyparty";
 | 
			
		||||
              };
 | 
			
		||||
            };
 | 
			
		||||
          };
 | 
			
		||||
 | 
			
		||||
          firewall = {
 | 
			
		||||
            tcp.allowed = [
 | 
			
		||||
              3923
 | 
			
		||||
            ];
 | 
			
		||||
          };
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        users = with lib.my.c.ids; {
 | 
			
		||||
@@ -70,16 +60,11 @@ in
 | 
			
		||||
              uid = uids.photoprism;
 | 
			
		||||
              group = "photoprism";
 | 
			
		||||
            };
 | 
			
		||||
            copyparty = {
 | 
			
		||||
              uid = uids.copyparty;
 | 
			
		||||
              extraGroups = [ "media" ];
 | 
			
		||||
            };
 | 
			
		||||
          };
 | 
			
		||||
          groups = {
 | 
			
		||||
            media.gid = 2000;
 | 
			
		||||
            jellyseerr.gid = gids.jellyseerr;
 | 
			
		||||
            photoprism.gid = gids.photoprism;
 | 
			
		||||
            copyparty.gid = gids.copyparty;
 | 
			
		||||
          };
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
@@ -109,6 +94,14 @@ in
 | 
			
		||||
          };
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        nixpkgs.config.permittedInsecurePackages = [
 | 
			
		||||
          # FIXME: This is needed for Sonarr
 | 
			
		||||
          "aspnetcore-runtime-wrapped-6.0.36"
 | 
			
		||||
          "aspnetcore-runtime-6.0.36"
 | 
			
		||||
          "dotnet-sdk-wrapped-6.0.428"
 | 
			
		||||
          "dotnet-sdk-6.0.428"
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        services = {
 | 
			
		||||
          netdata.enable = true;
 | 
			
		||||
 | 
			
		||||
@@ -138,7 +131,6 @@ in
 | 
			
		||||
            };
 | 
			
		||||
          };
 | 
			
		||||
 | 
			
		||||
          flaresolverr.enable = true;
 | 
			
		||||
          jackett.enable = true;
 | 
			
		||||
          radarr.enable = true;
 | 
			
		||||
          sonarr.enable = true;
 | 
			
		||||
@@ -166,50 +158,6 @@ in
 | 
			
		||||
              PHOTOPRISM_DATABASE_DRIVER = "sqlite";
 | 
			
		||||
            };
 | 
			
		||||
          };
 | 
			
		||||
 | 
			
		||||
          copyparty = {
 | 
			
		||||
            enable = true;
 | 
			
		||||
            package = pkgs.copyparty.override {
 | 
			
		||||
              withMagic = true;
 | 
			
		||||
            };
 | 
			
		||||
            settings = {
 | 
			
		||||
              name = "dev-stuff";
 | 
			
		||||
              no-reload = true;
 | 
			
		||||
              j = 8; # cores
 | 
			
		||||
              http-only = true;
 | 
			
		||||
              xff-src =
 | 
			
		||||
                with allAssignments.middleman.internal;
 | 
			
		||||
                [ "${ipv4.address}/32" prefixes.ctrs.v6 ];
 | 
			
		||||
              rproxy = 1; # get if from x-forwarded-for
 | 
			
		||||
              magic = true; # enable checking file magic on upload
 | 
			
		||||
              hist = "/var/cache/copyparty";
 | 
			
		||||
              shr = "/share"; # enable share creation
 | 
			
		||||
              ed = true; # enable dotfiles
 | 
			
		||||
              chmod-f = 664;
 | 
			
		||||
              chmod-d = 775;
 | 
			
		||||
              e2dsa = true; # file indexing
 | 
			
		||||
              e2t = true; # metadata indexing
 | 
			
		||||
              og-ua = "(Discord|Twitter|Slack)bot"; # embeds
 | 
			
		||||
              theme = 6;
 | 
			
		||||
            };
 | 
			
		||||
            accounts.dev.passwordFile = config.age.secrets."jackflix/copyparty-pass.txt".path;
 | 
			
		||||
            volumes = {
 | 
			
		||||
              "/" = {
 | 
			
		||||
                path = "/mnt/media/public";
 | 
			
		||||
                access = {
 | 
			
		||||
                  A = "dev";
 | 
			
		||||
                  "r." = "*";
 | 
			
		||||
                };
 | 
			
		||||
                flags = {
 | 
			
		||||
                  shr_who = "no"; # no reason to have shares here
 | 
			
		||||
                };
 | 
			
		||||
              };
 | 
			
		||||
              "/priv" = {
 | 
			
		||||
                path = "/mnt/media/stuff";
 | 
			
		||||
                access.A = "dev"; # dev has admin access
 | 
			
		||||
              };
 | 
			
		||||
            };
 | 
			
		||||
          };
 | 
			
		||||
        };
 | 
			
		||||
      };
 | 
			
		||||
    };
 | 
			
		||||
 
 | 
			
		||||
@@ -72,13 +72,6 @@ in
 | 
			
		||||
 | 
			
		||||
            firewall = {
 | 
			
		||||
              tcp.allowed = [ "http" "https" 8448 ];
 | 
			
		||||
              extraRules = ''
 | 
			
		||||
                table inet nat {
 | 
			
		||||
                  chain postrouting {
 | 
			
		||||
                    oifname host0 snat ip6 to ${assignments.internal.ipv6.address}
 | 
			
		||||
                  }
 | 
			
		||||
                }
 | 
			
		||||
              '';
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            nginx-sso = {
 | 
			
		||||
@@ -258,9 +251,6 @@ in
 | 
			
		||||
              proxyResolveWhileRunning = true;
 | 
			
		||||
              sslDhparam = config.age.secrets."dhparams.pem".path;
 | 
			
		||||
 | 
			
		||||
              appendConfig = ''
 | 
			
		||||
                worker_processes auto;
 | 
			
		||||
              '';
 | 
			
		||||
              # Based on recommended*Settings, but probably better to be explicit about these
 | 
			
		||||
              appendHttpConfig = ''
 | 
			
		||||
                ${baseHttpConfig}
 | 
			
		||||
 
 | 
			
		||||
@@ -347,7 +347,12 @@ in
 | 
			
		||||
 | 
			
		||||
      "stuff.${pubDomain}" = {
 | 
			
		||||
        locations."/" = {
 | 
			
		||||
          proxyPass = "http://jackflix-ctr.${domain}:3923";
 | 
			
		||||
          basicAuthFile = config.age.secrets."middleman/htpasswd".path;
 | 
			
		||||
          root = "/mnt/media/stuff";
 | 
			
		||||
          extraConfig = ''
 | 
			
		||||
            fancyindex on;
 | 
			
		||||
            fancyindex_show_dotfiles on;
 | 
			
		||||
          '';
 | 
			
		||||
        };
 | 
			
		||||
        useACMEHost = pubDomain;
 | 
			
		||||
      };
 | 
			
		||||
@@ -374,11 +379,6 @@ in
 | 
			
		||||
        useACMEHost = pubDomain;
 | 
			
		||||
      };
 | 
			
		||||
 | 
			
		||||
      "mc-map-kink.${pubDomain}" = {
 | 
			
		||||
        locations."/".proxyPass = "http://kinkcraft-oci.${domain}:8100";
 | 
			
		||||
        useACMEHost = pubDomain;
 | 
			
		||||
      };
 | 
			
		||||
 | 
			
		||||
      "librespeed.${domain}" = {
 | 
			
		||||
        locations."/".proxyPass = "http://localhost:8989";
 | 
			
		||||
      };
 | 
			
		||||
@@ -429,14 +429,6 @@ in
 | 
			
		||||
        }
 | 
			
		||||
        (ssoServer "generic")
 | 
			
		||||
      ];
 | 
			
		||||
      "hass.${pubDomain}" = {
 | 
			
		||||
        locations."/" = {
 | 
			
		||||
          proxyPass = "http://hass-ctr.${home.domain}:8123";
 | 
			
		||||
          proxyWebsockets = true;
 | 
			
		||||
          extraConfig = proxyHeaders;
 | 
			
		||||
        };
 | 
			
		||||
        useACMEHost = pubDomain;
 | 
			
		||||
      };
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    minio =
 | 
			
		||||
 
 | 
			
		||||
@@ -87,7 +87,7 @@ in
 | 
			
		||||
            netdata.enable = true;
 | 
			
		||||
            mastodon = mkMerge [
 | 
			
		||||
              rec {
 | 
			
		||||
                enable = false;
 | 
			
		||||
                enable = true;
 | 
			
		||||
                localDomain = extraConfig.WEB_DOMAIN; # for nginx config
 | 
			
		||||
                extraConfig = {
 | 
			
		||||
                  LOCAL_DOMAIN = "nul.ie";
 | 
			
		||||
@@ -95,9 +95,7 @@ in
 | 
			
		||||
                };
 | 
			
		||||
 | 
			
		||||
                secretKeyBaseFile = config.age.secrets."toot/secret-key.txt".path;
 | 
			
		||||
                # TODO: This was removed at some point.
 | 
			
		||||
                # If we want to bring Mastodon back, this will probably need to be addressd.
 | 
			
		||||
                # otpSecretFile = config.age.secrets."toot/otp-secret.txt".path;
 | 
			
		||||
                otpSecretFile = config.age.secrets."toot/otp-secret.txt".path;
 | 
			
		||||
                vapidPrivateKeyFile = config.age.secrets."toot/vapid-key.txt".path;
 | 
			
		||||
                vapidPublicKeyFile = toString (pkgs.writeText
 | 
			
		||||
                  "vapid-pubkey.txt"
 | 
			
		||||
@@ -166,7 +164,7 @@ in
 | 
			
		||||
              };
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            bluesky-pds = {
 | 
			
		||||
            pds = {
 | 
			
		||||
              enable = true;
 | 
			
		||||
              environmentFiles = [ config.age.secrets."toot/pds.env".path ];
 | 
			
		||||
              settings = {
 | 
			
		||||
 
 | 
			
		||||
@@ -54,7 +54,6 @@ in
 | 
			
		||||
      simpcraft-staging-oci = 4;
 | 
			
		||||
      enshrouded-oci = 5;
 | 
			
		||||
      kevcraft-oci = 6;
 | 
			
		||||
      kinkcraft-oci = 7;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    configuration = { lib, pkgs, modulesPath, config, assignments, allAssignments, ... }:
 | 
			
		||||
 
 | 
			
		||||
@@ -5,13 +5,12 @@ let
 | 
			
		||||
 | 
			
		||||
  # devplayer0
 | 
			
		||||
  op = "6d7d971b-ce10-435b-85c5-c99c0d8d288c";
 | 
			
		||||
  kev = "703b378a-09f9-4c1d-9876-1c9305728c49";
 | 
			
		||||
  whitelist = concatStringsSep "," [
 | 
			
		||||
    op
 | 
			
		||||
    "dcd2ecb9-2b5e-49cb-9d4f-f5a76162df56" # Elderlypug
 | 
			
		||||
    "fcb26db2-c3ce-41aa-b588-efec79d37a8a" # Jesthral_
 | 
			
		||||
    "1d366062-12c0-4e29-aba7-6ab5d8c6bb05" # shr3kas0ras
 | 
			
		||||
    kev
 | 
			
		||||
    "703b378a-09f9-4c1d-9876-1c9305728c49" # OROURKEIRE
 | 
			
		||||
    "f105bbe6-eda6-4a13-a8cf-894e77cab77b" # Adzerq
 | 
			
		||||
    "1fc94979-41fb-497a-81e9-34ae24ca537a" # johnnyscrims
 | 
			
		||||
    "d53c91df-b6e6-4463-b106-e8427d7a8d01" # BossLonus
 | 
			
		||||
@@ -125,7 +124,7 @@ in
 | 
			
		||||
          EXISTING_WHITELIST_FILE = "SYNCHRONIZE";
 | 
			
		||||
          WHITELIST = whitelist;
 | 
			
		||||
          EXISTING_OPS_FILE = "SYNCHRONIZE";
 | 
			
		||||
          OPS = concatStringsSep "," [ op kev ];
 | 
			
		||||
          OPS = op;
 | 
			
		||||
          DIFFICULTY = "normal";
 | 
			
		||||
          SPAWN_PROTECTION = "0";
 | 
			
		||||
          # VIEW_DISTANCE = "20";
 | 
			
		||||
@@ -145,47 +144,6 @@ in
 | 
			
		||||
          ''--network=colony:${dockerNetAssignment allAssignments "kevcraft-oci"}''
 | 
			
		||||
        ];
 | 
			
		||||
      };
 | 
			
		||||
 | 
			
		||||
      kinkcraft = {
 | 
			
		||||
        # 2025.5.1-java21-alpine
 | 
			
		||||
        image = "itzg/minecraft-server@sha256:de26c7128e3935f3be48fd30283f0b5a6da1b3d9f1a10c9f92502ee1ba072f7b";
 | 
			
		||||
 | 
			
		||||
        environment = {
 | 
			
		||||
          TYPE = "MODRINTH";
 | 
			
		||||
          SERVER_PORT = "25568";
 | 
			
		||||
          QUERY_PORT = "25568";
 | 
			
		||||
 | 
			
		||||
          EULA = "true";
 | 
			
		||||
          ENABLE_QUERY = "true";
 | 
			
		||||
          ENABLE_RCON = "true";
 | 
			
		||||
          MOTD = "§4§k----- §9K§ai§bn§ck§dc§er§fa§6f§5t §4§k-----";
 | 
			
		||||
          ICON = "/ext/icon.png";
 | 
			
		||||
 | 
			
		||||
          EXISTING_WHITELIST_FILE = "SYNCHRONIZE";
 | 
			
		||||
          WHITELIST = whitelist;
 | 
			
		||||
          EXISTING_OPS_FILE = "SYNCHRONIZE";
 | 
			
		||||
          OPS = op;
 | 
			
		||||
          DIFFICULTY = "normal";
 | 
			
		||||
          SPAWN_PROTECTION = "0";
 | 
			
		||||
          VIEW_DISTANCE = "20";
 | 
			
		||||
 | 
			
		||||
          MAX_MEMORY = "6G";
 | 
			
		||||
          MODRINTH_MODPACK = "https://cdn.modrinth.com/data/CIYf3Hk8/versions/NGutsQSd/Simpcraft-0.2.1.mrpack";
 | 
			
		||||
 | 
			
		||||
          TZ = "Europe/Dublin";
 | 
			
		||||
        };
 | 
			
		||||
        environmentFiles = [ config.age.secrets."whale2/simpcraft.env".path ];
 | 
			
		||||
 | 
			
		||||
        volumes = [
 | 
			
		||||
          "kinkcraft_data:/data"
 | 
			
		||||
          "${./icon.png}:/ext/icon.png:ro"
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        extraOptions = [
 | 
			
		||||
          ''--network=colony:${dockerNetAssignment allAssignments "kinkcraft-oci"}''
 | 
			
		||||
        ];
 | 
			
		||||
      };
 | 
			
		||||
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    services = {
 | 
			
		||||
 
 | 
			
		||||
@@ -188,13 +188,6 @@
 | 
			
		||||
                hostBDF = "44:00.4";
 | 
			
		||||
              };
 | 
			
		||||
            };
 | 
			
		||||
            qemuFlags = [
 | 
			
		||||
              "device qemu-xhci,id=xhci"
 | 
			
		||||
              # Front-right port?
 | 
			
		||||
              "device usb-host,hostbus=1,hostport=4"
 | 
			
		||||
              # Front-left port
 | 
			
		||||
              "device usb-host,hostbus=1,hostport=3"
 | 
			
		||||
            ];
 | 
			
		||||
          };
 | 
			
		||||
        };
 | 
			
		||||
      };
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,5 @@
 | 
			
		||||
{
 | 
			
		||||
  imports = [
 | 
			
		||||
    ./unifi.nix
 | 
			
		||||
    ./hass.nix
 | 
			
		||||
  ];
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,262 +0,0 @@
 | 
			
		||||
{ lib, ... }:
 | 
			
		||||
let
 | 
			
		||||
  inherit (lib.my) net;
 | 
			
		||||
  inherit (lib.my.c) pubDomain;
 | 
			
		||||
  inherit (lib.my.c.home) domain prefixes vips hiMTU;
 | 
			
		||||
in
 | 
			
		||||
{
 | 
			
		||||
  nixos.systems.hass = { config, ... }: {
 | 
			
		||||
    system = "x86_64-linux";
 | 
			
		||||
    nixpkgs = "mine";
 | 
			
		||||
    rendered = config.configuration.config.my.asContainer;
 | 
			
		||||
 | 
			
		||||
    assignments = {
 | 
			
		||||
      hi = {
 | 
			
		||||
        name = "hass-ctr";
 | 
			
		||||
        altNames = [ "frigate" ];
 | 
			
		||||
        inherit domain;
 | 
			
		||||
        mtu = hiMTU;
 | 
			
		||||
        ipv4 = {
 | 
			
		||||
          address = net.cidr.host 103 prefixes.hi.v4;
 | 
			
		||||
          mask = 22;
 | 
			
		||||
          gateway = vips.hi.v4;
 | 
			
		||||
        };
 | 
			
		||||
        ipv6 = {
 | 
			
		||||
          iid = "::5:3";
 | 
			
		||||
          address = net.cidr.host (65536*5+3) prefixes.hi.v6;
 | 
			
		||||
        };
 | 
			
		||||
      };
 | 
			
		||||
      lo = {
 | 
			
		||||
        name = "hass-ctr-lo";
 | 
			
		||||
        inherit domain;
 | 
			
		||||
        mtu = 1500;
 | 
			
		||||
        ipv4 = {
 | 
			
		||||
          address = net.cidr.host 103 prefixes.lo.v4;
 | 
			
		||||
          mask = 21;
 | 
			
		||||
          gateway = null;
 | 
			
		||||
        };
 | 
			
		||||
        ipv6 = {
 | 
			
		||||
          iid = "::5:3";
 | 
			
		||||
          address = net.cidr.host (65536*5+3) prefixes.lo.v6;
 | 
			
		||||
        };
 | 
			
		||||
      };
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    configuration = { lib, config, pkgs, assignments, allAssignments, ... }:
 | 
			
		||||
    let
 | 
			
		||||
      inherit (lib) mkMerge mkIf mkForce;
 | 
			
		||||
      inherit (lib.my) networkdAssignment;
 | 
			
		||||
 | 
			
		||||
      hassCli = pkgs.writeShellScriptBin "hass-cli" ''
 | 
			
		||||
        export HASS_SERVER="http://localhost:${toString config.services.home-assistant.config.http.server_port}"
 | 
			
		||||
        export HASS_TOKEN="$(< ${config.age.secrets."hass/cli-token.txt".path})"
 | 
			
		||||
        exec ${pkgs.home-assistant-cli}/bin/hass-cli "$@"
 | 
			
		||||
      '';
 | 
			
		||||
    in
 | 
			
		||||
    {
 | 
			
		||||
      config = {
 | 
			
		||||
        my = {
 | 
			
		||||
          deploy.enable = false;
 | 
			
		||||
          server.enable = true;
 | 
			
		||||
 | 
			
		||||
          secrets = {
 | 
			
		||||
            key = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGpYX2WbYwUqHp8bFFf0eHFrqrR8xp8IheguA054F8V4";
 | 
			
		||||
            files = {
 | 
			
		||||
              "hass/cli-token.txt" = {
 | 
			
		||||
                owner = config.my.user.config.name;
 | 
			
		||||
              };
 | 
			
		||||
            };
 | 
			
		||||
          };
 | 
			
		||||
 | 
			
		||||
          firewall = {
 | 
			
		||||
            tcp.allowed = [ "http" 1883 ];
 | 
			
		||||
          };
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        environment = {
 | 
			
		||||
          systemPackages = with pkgs; [
 | 
			
		||||
            usbutils
 | 
			
		||||
            hassCli
 | 
			
		||||
          ];
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        systemd = {
 | 
			
		||||
          network.networks = {
 | 
			
		||||
            "80-container-host0" = networkdAssignment "host0" assignments.hi;
 | 
			
		||||
            "80-container-lan-lo" = networkdAssignment "lan-lo" assignments.lo;
 | 
			
		||||
          };
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        services = {
 | 
			
		||||
          mosquitto = {
 | 
			
		||||
            enable = true;
 | 
			
		||||
            listeners = [
 | 
			
		||||
              {
 | 
			
		||||
                omitPasswordAuth = true;
 | 
			
		||||
                settings = {
 | 
			
		||||
                  allow_anonymous = true;
 | 
			
		||||
                };
 | 
			
		||||
              }
 | 
			
		||||
            ];
 | 
			
		||||
          };
 | 
			
		||||
 | 
			
		||||
          go2rtc = {
 | 
			
		||||
            enable = true;
 | 
			
		||||
            settings = {
 | 
			
		||||
              streams = {
 | 
			
		||||
                reolink_living_room = [
 | 
			
		||||
                  # "http://reolink-living-room.${domain}/flv?port=1935&app=bcs&stream=channel0_main.bcs&user=admin#video=copy#audio=copy#audio=opus"
 | 
			
		||||
                  "rtsp://admin:@reolink-living-room:554/h264Preview_01_main"
 | 
			
		||||
                ];
 | 
			
		||||
                webcam_office = [
 | 
			
		||||
                  "ffmpeg:device?video=/dev/video0&video_size=1024x576#video=h264"
 | 
			
		||||
                ];
 | 
			
		||||
              };
 | 
			
		||||
            };
 | 
			
		||||
          };
 | 
			
		||||
 | 
			
		||||
          frigate = {
 | 
			
		||||
            enable = true;
 | 
			
		||||
            hostname = "frigate.${domain}";
 | 
			
		||||
            settings = {
 | 
			
		||||
              mqtt = {
 | 
			
		||||
                enabled = true;
 | 
			
		||||
                host = "localhost";
 | 
			
		||||
                topic_prefix = "frigate";
 | 
			
		||||
              };
 | 
			
		||||
 | 
			
		||||
              cameras = {
 | 
			
		||||
                reolink_living_room = {
 | 
			
		||||
                  ffmpeg.inputs = [
 | 
			
		||||
                    {
 | 
			
		||||
                      path = "rtsp://127.0.0.1:8554/reolink_living_room";
 | 
			
		||||
                      input_args = "preset-rtsp-restream";
 | 
			
		||||
                      roles = [ "record" "detect" ];
 | 
			
		||||
                    }
 | 
			
		||||
                  ];
 | 
			
		||||
                  detect = {
 | 
			
		||||
                    enabled = false;
 | 
			
		||||
                  };
 | 
			
		||||
                  record = {
 | 
			
		||||
                    enabled = true;
 | 
			
		||||
                    retain.days = 1;
 | 
			
		||||
                  };
 | 
			
		||||
                };
 | 
			
		||||
 | 
			
		||||
                webcam_office = {
 | 
			
		||||
                  ffmpeg.inputs = [
 | 
			
		||||
                    {
 | 
			
		||||
                      path = "rtsp://127.0.0.1:8554/webcam_office";
 | 
			
		||||
                      input_args = "preset-rtsp-restream";
 | 
			
		||||
                      roles = [ "record" "detect" ];
 | 
			
		||||
                    }
 | 
			
		||||
                  ];
 | 
			
		||||
                  detect.enabled = false;
 | 
			
		||||
                  record = {
 | 
			
		||||
                    enabled = true;
 | 
			
		||||
                    retain.days = 1;
 | 
			
		||||
                  };
 | 
			
		||||
                };
 | 
			
		||||
              };
 | 
			
		||||
            };
 | 
			
		||||
          };
 | 
			
		||||
 | 
			
		||||
          home-assistant =
 | 
			
		||||
          let
 | 
			
		||||
            cfg = config.services.home-assistant;
 | 
			
		||||
 | 
			
		||||
            pyirishrail = ps: ps.buildPythonPackage rec {
 | 
			
		||||
              pname = "pyirishrail";
 | 
			
		||||
              version = "0.0.2";
 | 
			
		||||
              src = pkgs.fetchFromGitHub {
 | 
			
		||||
                owner = "ttroy50";
 | 
			
		||||
                repo = "pyirishrail";
 | 
			
		||||
                tag = version;
 | 
			
		||||
                hash = "sha256-NgARqhcXP0lgGpgBRiNtQaSn9JcRNtCcZPljcL7t3Xc=";
 | 
			
		||||
              };
 | 
			
		||||
 | 
			
		||||
              dependencies = with ps; [
 | 
			
		||||
                requests
 | 
			
		||||
              ];
 | 
			
		||||
 | 
			
		||||
              pyproject = true;
 | 
			
		||||
              build-system = [ ps.setuptools ];
 | 
			
		||||
            };
 | 
			
		||||
          in
 | 
			
		||||
          {
 | 
			
		||||
            enable = true;
 | 
			
		||||
 | 
			
		||||
            extraComponents = [
 | 
			
		||||
              "default_config"
 | 
			
		||||
              "esphome"
 | 
			
		||||
              "google_translate"
 | 
			
		||||
 | 
			
		||||
              "met"
 | 
			
		||||
              "zha"
 | 
			
		||||
              "denonavr"
 | 
			
		||||
              "webostv"
 | 
			
		||||
              "androidtv_remote"
 | 
			
		||||
              "heos"
 | 
			
		||||
              "mqtt"
 | 
			
		||||
              "wled"
 | 
			
		||||
            ];
 | 
			
		||||
            extraPackages = python3Packages: with python3Packages; [
 | 
			
		||||
              zlib-ng
 | 
			
		||||
              isal
 | 
			
		||||
 | 
			
		||||
              gtts
 | 
			
		||||
              (pyirishrail python3Packages)
 | 
			
		||||
            ];
 | 
			
		||||
            customComponents = with pkgs.home-assistant-custom-components; [
 | 
			
		||||
              alarmo
 | 
			
		||||
              frigate
 | 
			
		||||
            ];
 | 
			
		||||
 | 
			
		||||
            configWritable = false;
 | 
			
		||||
            openFirewall = true;
 | 
			
		||||
            config = {
 | 
			
		||||
              default_config = {};
 | 
			
		||||
              homeassistant = {
 | 
			
		||||
                name = "Home";
 | 
			
		||||
                unit_system = "metric";
 | 
			
		||||
                currency = "EUR";
 | 
			
		||||
                country = "IE";
 | 
			
		||||
                time_zone = "Europe/Dublin";
 | 
			
		||||
                external_url = "https://hass.${pubDomain}";
 | 
			
		||||
                internal_url = "http://hass-ctr.${domain}:${toString cfg.config.http.server_port}";
 | 
			
		||||
              };
 | 
			
		||||
              http = {
 | 
			
		||||
                use_x_forwarded_for = true;
 | 
			
		||||
                trusted_proxies = with allAssignments.middleman.internal; [
 | 
			
		||||
                  ipv4.address
 | 
			
		||||
                  ipv6.address
 | 
			
		||||
                ];
 | 
			
		||||
                ip_ban_enabled = false;
 | 
			
		||||
              };
 | 
			
		||||
              automation = "!include automations.yaml";
 | 
			
		||||
              script = "!include scripts.yaml";
 | 
			
		||||
              scene = "!include scenes.yaml";
 | 
			
		||||
 | 
			
		||||
              sensor = [
 | 
			
		||||
                {
 | 
			
		||||
                  platform = "irish_rail_transport";
 | 
			
		||||
                  name = "To Work from Home";
 | 
			
		||||
                  station = "Glenageary";
 | 
			
		||||
                  stops_at = "Dublin Connolly";
 | 
			
		||||
                  direction = "Northbound";
 | 
			
		||||
                }
 | 
			
		||||
                {
 | 
			
		||||
                  platform = "irish_rail_transport";
 | 
			
		||||
                  name = "To Home from Work";
 | 
			
		||||
                  station = "Dublin Connolly";
 | 
			
		||||
                  stops_at = "Glenageary";
 | 
			
		||||
                  direction = "Southbound";
 | 
			
		||||
                }
 | 
			
		||||
              ];
 | 
			
		||||
            };
 | 
			
		||||
          };
 | 
			
		||||
        };
 | 
			
		||||
      };
 | 
			
		||||
    };
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
@@ -55,8 +55,8 @@ in
 | 
			
		||||
          unifi = {
 | 
			
		||||
            enable = true;
 | 
			
		||||
            openFirewall = true;
 | 
			
		||||
            unifiPackage = pkgs.unifi;
 | 
			
		||||
            mongodbPackage = pkgs.mongodb-7_0;
 | 
			
		||||
            unifiPackage = pkgs.unifi8;
 | 
			
		||||
            mongodbPackage = pkgs.mongodb-6_0;
 | 
			
		||||
          };
 | 
			
		||||
        };
 | 
			
		||||
      };
 | 
			
		||||
 
 | 
			
		||||
@@ -29,7 +29,7 @@ in
 | 
			
		||||
 | 
			
		||||
    configuration = { lib, modulesPath, pkgs, config, assignments, allAssignments, ... }:
 | 
			
		||||
    let
 | 
			
		||||
      inherit (lib) mapAttrs mkMerge mkForce;
 | 
			
		||||
      inherit (lib) mapAttrs mkMerge;
 | 
			
		||||
      inherit (lib.my) networkdAssignment;
 | 
			
		||||
      inherit (lib.my.c) networkd;
 | 
			
		||||
      inherit (lib.my.c.home) domain;
 | 
			
		||||
@@ -83,12 +83,6 @@ in
 | 
			
		||||
          };
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        environment = {
 | 
			
		||||
          systemPackages = with pkgs; [
 | 
			
		||||
            usbutils
 | 
			
		||||
          ];
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        systemd.network = {
 | 
			
		||||
          links = {
 | 
			
		||||
            "10-lan-hi" = {
 | 
			
		||||
@@ -111,13 +105,6 @@ in
 | 
			
		||||
                MTUBytes = toString lib.my.c.home.hiMTU;
 | 
			
		||||
              };
 | 
			
		||||
            };
 | 
			
		||||
            "10-lan-lo-ctrs" = {
 | 
			
		||||
              matchConfig = {
 | 
			
		||||
                Driver = "virtio_net";
 | 
			
		||||
                PermanentMACAddress = "52:54:00:a5:7e:93";
 | 
			
		||||
              };
 | 
			
		||||
              linkConfig.Name = "lan-lo-ctrs";
 | 
			
		||||
            };
 | 
			
		||||
          };
 | 
			
		||||
 | 
			
		||||
          networks = {
 | 
			
		||||
@@ -131,29 +118,9 @@ in
 | 
			
		||||
              linkConfig.RequiredForOnline = "no";
 | 
			
		||||
              networkConfig = networkd.noL3;
 | 
			
		||||
            };
 | 
			
		||||
            "30-lan-lo-ctrs" = {
 | 
			
		||||
              matchConfig.Name = "lan-lo-ctrs";
 | 
			
		||||
              linkConfig.RequiredForOnline = "no";
 | 
			
		||||
              networkConfig = networkd.noL3;
 | 
			
		||||
            };
 | 
			
		||||
          };
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        systemd.nspawn = {
 | 
			
		||||
          hass = {
 | 
			
		||||
            networkConfig = {
 | 
			
		||||
              MACVLAN = mkForce "lan-hi-ctrs:host0 lan-lo-ctrs:lan-lo";
 | 
			
		||||
            };
 | 
			
		||||
          };
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        systemd.services = {
 | 
			
		||||
          "systemd-nspawn@hass".serviceConfig.DeviceAllow = [
 | 
			
		||||
            "char-ttyUSB rw"
 | 
			
		||||
            "char-video4linux rw"
 | 
			
		||||
          ];
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        my = {
 | 
			
		||||
          secrets = {
 | 
			
		||||
            key = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAAaav5Se1E/AbqEXmADryVszYfNDscyP6jrWioN57R7";
 | 
			
		||||
@@ -175,16 +142,6 @@ in
 | 
			
		||||
          let
 | 
			
		||||
            instances = {
 | 
			
		||||
              # unifi = {};
 | 
			
		||||
              hass = {
 | 
			
		||||
                bindMounts = {
 | 
			
		||||
                  "/dev/bus/usb/001/002".readOnly = false;
 | 
			
		||||
                  "/dev/video0".readOnly = false;
 | 
			
		||||
                  "/dev/serial/by-id/usb-Nabu_Casa_Home_Assistant_Connect_ZBT-1_ce549704fe38ef11a2c2e5d154516304-if00-port0" = {
 | 
			
		||||
                    readOnly = false;
 | 
			
		||||
                    mountPoint = "/dev/ttyUSB0";
 | 
			
		||||
                  };
 | 
			
		||||
                };
 | 
			
		||||
              };
 | 
			
		||||
            };
 | 
			
		||||
          in
 | 
			
		||||
          mkMerge [
 | 
			
		||||
 
 | 
			
		||||
@@ -141,8 +141,8 @@ in
 | 
			
		||||
                  onState = [ "configured" ];
 | 
			
		||||
                  script = ''
 | 
			
		||||
                  #!${pkgs.runtimeShell}
 | 
			
		||||
                  if [ "$IFACE" = "wan-ifb" ]; then
 | 
			
		||||
                    ${pkgs.iproute2}/bin/tc filter add dev wan parent ffff: matchall action mirred egress redirect dev "$IFACE"
 | 
			
		||||
                  if [ $IFACE = "wan-ifb" ]; then
 | 
			
		||||
                    ${pkgs.iproute2}/bin/tc filter add dev wan parent ffff: matchall action mirred egress redirect dev $IFACE
 | 
			
		||||
                  fi
 | 
			
		||||
                  '';
 | 
			
		||||
                };
 | 
			
		||||
 
 | 
			
		||||
@@ -1,74 +0,0 @@
 | 
			
		||||
# Blocklist for LG WebOS Services (US)
 | 
			
		||||
ad.lgappstv.com
 | 
			
		||||
ibis.lgappstv.com
 | 
			
		||||
info.lgsmartad.com
 | 
			
		||||
lgtvsdp.com
 | 
			
		||||
ngfts.lge.com
 | 
			
		||||
rdx2.lgtvsdp.com
 | 
			
		||||
smartshare.lgtvsdp.com
 | 
			
		||||
lgappstv.com
 | 
			
		||||
us.ad.lgsmartad.com
 | 
			
		||||
us.ibs.lgappstv.com
 | 
			
		||||
us.info.lgsmartad.com
 | 
			
		||||
us.lgtvsdp.com
 | 
			
		||||
 | 
			
		||||
# Community Contributions
 | 
			
		||||
lgad.cjpowercast.com
 | 
			
		||||
edgesuite.net
 | 
			
		||||
yumenetworks.com
 | 
			
		||||
smartclip.net
 | 
			
		||||
smartclip.com
 | 
			
		||||
 | 
			
		||||
# Non-US Entries
 | 
			
		||||
rdx2.lgtvsdp.com
 | 
			
		||||
info.lgsmartad.com
 | 
			
		||||
ibs.lgappstv.com
 | 
			
		||||
lgtvsdp.com
 | 
			
		||||
lgappstv.com
 | 
			
		||||
smartshare.lgtvsdp.com
 | 
			
		||||
 | 
			
		||||
# Full Block for Europe and Other Regions
 | 
			
		||||
de.ad.lgsmartad.com
 | 
			
		||||
de.emp.lgsmartplatform.com
 | 
			
		||||
de.ibs.lgappstv.com
 | 
			
		||||
de.info.lgsmartad.com
 | 
			
		||||
de.lgeapi.com
 | 
			
		||||
de.lgtvsdp.com
 | 
			
		||||
de.rdx2.lgtvsdp.com
 | 
			
		||||
eu.ad.lgsmartad.com
 | 
			
		||||
eu.ibs.lgappstv.com
 | 
			
		||||
eu.info.lgsmartad.com
 | 
			
		||||
app-lgwebos.pluto.tv
 | 
			
		||||
it.lgtvsdp.com
 | 
			
		||||
it.lgeapi.com
 | 
			
		||||
it.emp.lgsmartplatform.com
 | 
			
		||||
 | 
			
		||||
# LG ThinQ Services
 | 
			
		||||
eic.common.lgthinq.com
 | 
			
		||||
eic.iotservice.lgthinq.com
 | 
			
		||||
eic.service.lgthinq.com
 | 
			
		||||
eic.ngfts.lge.com
 | 
			
		||||
eic.svc-lgthinq-com.aws-thinq-prd.net
 | 
			
		||||
eic.cdpsvc.lgtvcommon.com
 | 
			
		||||
eic.cdpbeacon.lgtvcommon.com
 | 
			
		||||
eic.cdplauncher.lgtvcommon.com
 | 
			
		||||
eic.homeprv.lgtvcommon.com
 | 
			
		||||
eic.lgtviot.com
 | 
			
		||||
eic.nudge.lgtvcommon.com
 | 
			
		||||
eic.rdl.lgtvcommon.com
 | 
			
		||||
eic.recommend.lgtvcommon.com
 | 
			
		||||
eic.service.lgtvcommon.com
 | 
			
		||||
gb-lgeapi-com.esi-prd.net
 | 
			
		||||
gb.lgeapi.com
 | 
			
		||||
lgtvonline.lge.com
 | 
			
		||||
lg-channelplus-de-beacons.xumo.com
 | 
			
		||||
lg-channelplus-de-mds.xumo.com
 | 
			
		||||
lg-channelplus-eu-beacons.xumo.com
 | 
			
		||||
lg-channelplus-eu-mds.xumo.com
 | 
			
		||||
kr-op-v2.lgthinqhome.com
 | 
			
		||||
ngfts.lge.com
 | 
			
		||||
noti.lgthinq.com
 | 
			
		||||
objectcontent.lgthinq.com
 | 
			
		||||
 | 
			
		||||
# Update Server Block
 | 
			
		||||
#snu.lge.com
 | 
			
		||||
@@ -19,7 +19,7 @@ in
 | 
			
		||||
          owner = "pdns";
 | 
			
		||||
          group = "pdns";
 | 
			
		||||
        };
 | 
			
		||||
        "home/pdns/recursor.yml" = {
 | 
			
		||||
        "home/pdns/recursor.conf" = {
 | 
			
		||||
          owner = "pdns-recursor";
 | 
			
		||||
          group = "pdns-recursor";
 | 
			
		||||
        };
 | 
			
		||||
@@ -28,78 +28,52 @@ in
 | 
			
		||||
 | 
			
		||||
      pdns.recursor = {
 | 
			
		||||
        enable = true;
 | 
			
		||||
        extraSettingsFile = config.age.secrets."home/pdns/recursor.yml".path;
 | 
			
		||||
        extraSettingsFile = config.age.secrets."home/pdns/recursor.conf".path;
 | 
			
		||||
      };
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    services = {
 | 
			
		||||
      pdns-recursor = {
 | 
			
		||||
        yaml-settings = {
 | 
			
		||||
          incoming = {
 | 
			
		||||
            listen = [
 | 
			
		||||
              "127.0.0.1" "::1"
 | 
			
		||||
              assignments.hi.ipv4.address assignments.hi.ipv6.address
 | 
			
		||||
              assignments.lo.ipv4.address assignments.lo.ipv6.address
 | 
			
		||||
            ];
 | 
			
		||||
            allow_from = [
 | 
			
		||||
              "127.0.0.0/8" "::1/128"
 | 
			
		||||
              prefixes.hi.v4 prefixes.hi.v6
 | 
			
		||||
              prefixes.lo.v4 prefixes.lo.v6
 | 
			
		||||
            ] ++ (with lib.my.c.tailscale.prefix; [ v4 v6 ]);
 | 
			
		||||
        dns = {
 | 
			
		||||
          address = [
 | 
			
		||||
            "127.0.0.1" "::1"
 | 
			
		||||
            assignments.hi.ipv4.address assignments.hi.ipv6.address
 | 
			
		||||
            assignments.lo.ipv4.address assignments.lo.ipv6.address
 | 
			
		||||
          ];
 | 
			
		||||
          allowFrom = [
 | 
			
		||||
            "127.0.0.0/8" "::1/128"
 | 
			
		||||
            prefixes.hi.v4 prefixes.hi.v6
 | 
			
		||||
            prefixes.lo.v4 prefixes.lo.v6
 | 
			
		||||
          ] ++ (with lib.my.c.tailscale.prefix; [ v4 v6 ]);
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
            # DNS NOTIFY messages override TTL
 | 
			
		||||
            allow_notify_for = authZones;
 | 
			
		||||
            allow_notify_from = [ "127.0.0.0/8" "::1/128" ];
 | 
			
		||||
          };
 | 
			
		||||
        settings = {
 | 
			
		||||
          query-local-address = [
 | 
			
		||||
            "0.0.0.0"
 | 
			
		||||
            "::"
 | 
			
		||||
          ];
 | 
			
		||||
          forward-zones = map (z: "${z}=127.0.0.1:5353") authZones;
 | 
			
		||||
 | 
			
		||||
          outgoing = {
 | 
			
		||||
            source_address = [ "0.0.0.0" "::" ];
 | 
			
		||||
          };
 | 
			
		||||
          # DNS NOTIFY messages override TTL
 | 
			
		||||
          allow-notify-for = authZones;
 | 
			
		||||
          allow-notify-from = [ "127.0.0.0/8" "::1/128" ];
 | 
			
		||||
 | 
			
		||||
          recursor = {
 | 
			
		||||
            forward_zones = map (z: {
 | 
			
		||||
              zone = z;
 | 
			
		||||
              forwarders = [ "127.0.0.1:5353" ];
 | 
			
		||||
            }) authZones;
 | 
			
		||||
          webserver = true;
 | 
			
		||||
          webserver-address = "::";
 | 
			
		||||
          webserver-allow-from = [ "127.0.0.1" "::1" ];
 | 
			
		||||
 | 
			
		||||
            lua_dns_script = pkgs.writeText "pdns-script.lua" ''
 | 
			
		||||
              blocklist = newDS()
 | 
			
		||||
 | 
			
		||||
              function preresolve(dq)
 | 
			
		||||
                local name = dq.qname:toString()
 | 
			
		||||
 | 
			
		||||
                -- Disney+ doesn't like our IP space...
 | 
			
		||||
                if dq.qtype == pdns.AAAA and (string.find(name, "disneyplus") or string.find(name, "disney-plus") or string.find(name , "disney.api")) then
 | 
			
		||||
                  dq.rcode = 0
 | 
			
		||||
                  return true
 | 
			
		||||
                end
 | 
			
		||||
 | 
			
		||||
                if blocklist:check(dq.qname) then
 | 
			
		||||
                  if dq.qtype == pdns.A then
 | 
			
		||||
                    dq:addAnswer(dq.qtype, "127.0.0.1")
 | 
			
		||||
                  elseif dq.qtype == pdns.AAAA then
 | 
			
		||||
                    dq:addAnswer(dq.qtype, "::1")
 | 
			
		||||
                  end
 | 
			
		||||
                  return true
 | 
			
		||||
                end
 | 
			
		||||
 | 
			
		||||
                return false
 | 
			
		||||
          lua-dns-script = pkgs.writeText "pdns-script.lua" ''
 | 
			
		||||
            -- Disney+ doesn't like our IP space...
 | 
			
		||||
            function preresolve(dq)
 | 
			
		||||
              local name = dq.qname:toString()
 | 
			
		||||
              if dq.qtype == pdns.AAAA and (string.find(name, "disneyplus") or string.find(name, "disney-plus") or string.find(name , "disney.api")) then
 | 
			
		||||
                dq.rcode = 0
 | 
			
		||||
                return true
 | 
			
		||||
              end
 | 
			
		||||
 | 
			
		||||
              for line in io.lines("${./dns-blocklist.txt}") do
 | 
			
		||||
                entry = line:gsub("%s+", "")
 | 
			
		||||
                if entry ~= "" and string.sub(entry, 1, 1) ~= "#" then
 | 
			
		||||
                  blocklist:add(entry)
 | 
			
		||||
                end
 | 
			
		||||
              end
 | 
			
		||||
            '';
 | 
			
		||||
          };
 | 
			
		||||
 | 
			
		||||
          webservice = {
 | 
			
		||||
            webserver = true;
 | 
			
		||||
            address = "::";
 | 
			
		||||
            allow_from = [ "127.0.0.1" "::1" ];
 | 
			
		||||
          };
 | 
			
		||||
              return false
 | 
			
		||||
            end
 | 
			
		||||
          '';
 | 
			
		||||
        };
 | 
			
		||||
      };
 | 
			
		||||
    };
 | 
			
		||||
@@ -232,9 +206,6 @@ in
 | 
			
		||||
            ups IN A ${net.cidr.host 20 prefixes.lo.v4}
 | 
			
		||||
            palace-kvm IN A ${net.cidr.host 21 prefixes.lo.v4}
 | 
			
		||||
 | 
			
		||||
            reolink-living-room IN A ${net.cidr.host 45 prefixes.lo.v4}
 | 
			
		||||
            nixlight IN A ${net.cidr.host 46 prefixes.lo.v4}
 | 
			
		||||
 | 
			
		||||
            ${lib.my.dns.fwdRecords {
 | 
			
		||||
              inherit allAssignments names;
 | 
			
		||||
              domain = config.networking.domain;
 | 
			
		||||
 
 | 
			
		||||
@@ -132,37 +132,6 @@ in
 | 
			
		||||
                  hw-address = "24:8a:07:a8:fe:3a";
 | 
			
		||||
                  ip-address = net.cidr.host 40 prefixes.lo.v4;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                {
 | 
			
		||||
                  # avr
 | 
			
		||||
                  hw-address = "8c:a9:6f:30:03:6b";
 | 
			
		||||
                  ip-address = net.cidr.host 41 prefixes.lo.v4;
 | 
			
		||||
                }
 | 
			
		||||
                {
 | 
			
		||||
                  # tv
 | 
			
		||||
                  hw-address = "00:a1:59:b8:4d:86";
 | 
			
		||||
                  ip-address = net.cidr.host 42 prefixes.lo.v4;
 | 
			
		||||
                }
 | 
			
		||||
                {
 | 
			
		||||
                  # android tv
 | 
			
		||||
                  hw-address = "b8:7b:d4:95:c6:74";
 | 
			
		||||
                  ip-address = net.cidr.host 43 prefixes.lo.v4;
 | 
			
		||||
                }
 | 
			
		||||
                {
 | 
			
		||||
                  # hass-panel
 | 
			
		||||
                  hw-address = "80:30:49:cd:d7:51";
 | 
			
		||||
                  ip-address = net.cidr.host 44 prefixes.lo.v4;
 | 
			
		||||
                }
 | 
			
		||||
                {
 | 
			
		||||
                  # reolink-living-room
 | 
			
		||||
                  hw-address = "ec:71:db:30:69:a4";
 | 
			
		||||
                  ip-address = net.cidr.host 45 prefixes.lo.v4;
 | 
			
		||||
                }
 | 
			
		||||
                {
 | 
			
		||||
                  # nixlight
 | 
			
		||||
                  hw-address = "00:4b:12:3b:d3:14";
 | 
			
		||||
                  ip-address = net.cidr.host 46 prefixes.lo.v4;
 | 
			
		||||
                }
 | 
			
		||||
              ];
 | 
			
		||||
            }
 | 
			
		||||
          ];
 | 
			
		||||
 
 | 
			
		||||
@@ -24,8 +24,8 @@ in
 | 
			
		||||
        onState = [ "routable" ];
 | 
			
		||||
        script = ''
 | 
			
		||||
          #!${pkgs.runtimeShell}
 | 
			
		||||
          if [ "$IFACE" = "lan" ]; then
 | 
			
		||||
            ${mstpd}/sbin/mstpctl setforcevers "$IFACE" rstp
 | 
			
		||||
          if [ $IFACE = "lan" ]; then
 | 
			
		||||
            ${mstpd}/sbin/mstpctl setforcevers $IFACE rstp
 | 
			
		||||
          fi
 | 
			
		||||
        '';
 | 
			
		||||
      };
 | 
			
		||||
 
 | 
			
		||||
@@ -92,8 +92,7 @@ in
 | 
			
		||||
 | 
			
		||||
          nextcloud = {
 | 
			
		||||
            enable = true;
 | 
			
		||||
            # TODO: Might need to do some bullshit to go from Nextcloud 28 (?) to 30
 | 
			
		||||
            package = pkgs.nextcloud30;
 | 
			
		||||
            package = pkgs.nextcloud29;
 | 
			
		||||
            datadir = "/mnt/storage/nextcloud";
 | 
			
		||||
            hostName = "cloud.${domain}";
 | 
			
		||||
            https = true;
 | 
			
		||||
 
 | 
			
		||||
@@ -31,10 +31,8 @@
 | 
			
		||||
            server.enable = true;
 | 
			
		||||
          };
 | 
			
		||||
 | 
			
		||||
          image = {
 | 
			
		||||
            baseName = "jackos-installer";
 | 
			
		||||
          };
 | 
			
		||||
          isoImage = {
 | 
			
		||||
            isoBaseName = "jackos-installer";
 | 
			
		||||
            volumeID = "jackos-${config.system.nixos.release}-${pkgs.stdenv.hostPlatform.uname.processor}";
 | 
			
		||||
            edition = "devplayer0";
 | 
			
		||||
            appendToMenuLabel = " /dev/player0 Installer";
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
{ inputs, lib, pkgs, config, ... }:
 | 
			
		||||
{ lib, pkgs, config, ... }:
 | 
			
		||||
let
 | 
			
		||||
  inherit (builtins) substring match;
 | 
			
		||||
  inherit (lib)
 | 
			
		||||
@@ -127,9 +127,7 @@ in
 | 
			
		||||
    enable = mkBoolOpt' false "Whether to enable borgthin jobs";
 | 
			
		||||
    lvmPackage = mkOpt' package pkgs.lvm2 "Packge containing LVM tools";
 | 
			
		||||
    thinToolsPackage = mkOpt' package pkgs.thin-provisioning-tools "Package containing thin-provisioning-tools";
 | 
			
		||||
    # Really we should use the version from the overlay, but the package is quite far behind...
 | 
			
		||||
    # Not bothering to update until Borg 2.0 releases
 | 
			
		||||
    package = mkOpt' package inputs.borgthin.packages.${config.nixpkgs.system}.borgthin "borgthin package";
 | 
			
		||||
    package = mkOpt' package pkgs.borgthin "borgthin package";
 | 
			
		||||
    jobs = mkOpt' (attrsOf jobType) { } "borgthin jobs";
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -221,8 +221,8 @@ in
 | 
			
		||||
      memorySize = dummyOption;
 | 
			
		||||
      qemu.options = dummyOption;
 | 
			
		||||
    };
 | 
			
		||||
    image.baseName = dummyOption;
 | 
			
		||||
    isoImage = {
 | 
			
		||||
      isoBaseName = dummyOption;
 | 
			
		||||
      volumeID = dummyOption;
 | 
			
		||||
      edition = dummyOption;
 | 
			
		||||
      appendToMenuLabel = dummyOption;
 | 
			
		||||
 
 | 
			
		||||
@@ -12,7 +12,6 @@ in
 | 
			
		||||
    inputs.impermanence.nixosModule
 | 
			
		||||
    inputs.ragenix.nixosModules.age
 | 
			
		||||
    inputs.sharry.nixosModules.default
 | 
			
		||||
    inputs.copyparty.nixosModules.default
 | 
			
		||||
  ];
 | 
			
		||||
 | 
			
		||||
  config = mkMerge [
 | 
			
		||||
@@ -66,12 +65,10 @@ in
 | 
			
		||||
      };
 | 
			
		||||
      nixpkgs = {
 | 
			
		||||
        overlays = [
 | 
			
		||||
          inputs.deploy-rs.overlays.default
 | 
			
		||||
          inputs.deploy-rs.overlay
 | 
			
		||||
          inputs.sharry.overlays.default
 | 
			
		||||
          # TODO: Re-enable when borgthin is updated
 | 
			
		||||
          # inputs.borgthin.overlays.default
 | 
			
		||||
          inputs.borgthin.overlays.default
 | 
			
		||||
          inputs.boardie.overlays.default
 | 
			
		||||
          inputs.copyparty.overlays.default
 | 
			
		||||
        ];
 | 
			
		||||
        config = {
 | 
			
		||||
          allowUnfree = true;
 | 
			
		||||
 
 | 
			
		||||
@@ -15,7 +15,6 @@ let
 | 
			
		||||
    passAsFile = [ "code" ];
 | 
			
		||||
    code = ''
 | 
			
		||||
      #include <stdio.h>
 | 
			
		||||
      #include <stdlib.h>
 | 
			
		||||
      #include <signal.h>
 | 
			
		||||
      #include <unistd.h>
 | 
			
		||||
      #include <systemd/sd-daemon.h>
 | 
			
		||||
 
 | 
			
		||||
@@ -56,7 +56,6 @@ in
 | 
			
		||||
      gnome = {
 | 
			
		||||
        gnome-keyring.enable = true;
 | 
			
		||||
      };
 | 
			
		||||
      udisks2.enable = true;
 | 
			
		||||
 | 
			
		||||
      udev = {
 | 
			
		||||
        packages = [
 | 
			
		||||
 
 | 
			
		||||
@@ -15,8 +15,8 @@ let
 | 
			
		||||
      hash = "sha256-TKZ4WjNV2oZIYNefch7E7m1JpeoC/d7O1kofoNv8G40=";
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    # This upstream patch (in newer versions) is needed for newer GCC
 | 
			
		||||
    patches = (if (o ? patches) then o.patches else []) ++ [ ./fix-uninitialised-var.patch ];
 | 
			
		||||
    # Newer GCC requires this upstream patch
 | 
			
		||||
    patches = (if (o ? patches) then o.patches else [ ]) ++ [ ./fix-uninitialised-var.patch ];
 | 
			
		||||
  });
 | 
			
		||||
  tftpRoot = pkgs.linkFarm "tftp-root" [
 | 
			
		||||
    {
 | 
			
		||||
@@ -30,25 +30,23 @@ let
 | 
			
		||||
    substituteAll ${./menu.ipxe} "$out"
 | 
			
		||||
  '';
 | 
			
		||||
 | 
			
		||||
  bootBuilder = pkgs.replaceVarsWith {
 | 
			
		||||
  bootBuilder = pkgs.substituteAll {
 | 
			
		||||
    src = ./netboot-loader-builder.py;
 | 
			
		||||
    isExecutable = true;
 | 
			
		||||
 | 
			
		||||
    replacements = {
 | 
			
		||||
      inherit (pkgs) python3;
 | 
			
		||||
      bootspecTools = pkgs.bootspec;
 | 
			
		||||
      nix = config.nix.package.out;
 | 
			
		||||
    inherit (pkgs) python3;
 | 
			
		||||
    bootspecTools = pkgs.bootspec;
 | 
			
		||||
    nix = config.nix.package.out;
 | 
			
		||||
 | 
			
		||||
      inherit (config.system.nixos) distroName;
 | 
			
		||||
      systemName = config.system.name;
 | 
			
		||||
      inherit (cfg.client) configurationLimit;
 | 
			
		||||
      checkMountpoints = pkgs.writeShellScript "check-mountpoints" ''
 | 
			
		||||
        if ! ${pkgs.util-linuxMinimal}/bin/findmnt /boot > /dev/null; then
 | 
			
		||||
          echo "/boot is not a mounted partition. Is the path configured correctly?" >&2
 | 
			
		||||
          exit 1
 | 
			
		||||
        fi
 | 
			
		||||
      '';
 | 
			
		||||
    };
 | 
			
		||||
    inherit (config.system.nixos) distroName;
 | 
			
		||||
    systemName = config.system.name;
 | 
			
		||||
    inherit (cfg.client) configurationLimit;
 | 
			
		||||
    checkMountpoints = pkgs.writeShellScript "check-mountpoints" ''
 | 
			
		||||
      if ! ${pkgs.util-linuxMinimal}/bin/findmnt /boot > /dev/null; then
 | 
			
		||||
        echo "/boot is not a mounted partition. Is the path configured correctly?" >&2
 | 
			
		||||
        exit 1
 | 
			
		||||
      fi
 | 
			
		||||
    '';
 | 
			
		||||
  };
 | 
			
		||||
in
 | 
			
		||||
{
 | 
			
		||||
 
 | 
			
		||||
@@ -12,6 +12,16 @@ in
 | 
			
		||||
        useNetworkd = mkDefault true;
 | 
			
		||||
      };
 | 
			
		||||
 | 
			
		||||
      systemd = {
 | 
			
		||||
        additionalUpstreamSystemUnits = mkIf (config.system.nixos.release == "24.12:u-24.11") [
 | 
			
		||||
          # TODO: NixOS has its own version of this, but with `network` instead of `networkd`. Is this just a typo? It
 | 
			
		||||
          # hasn't been updated in 2 years...
 | 
			
		||||
          # This has been done upstream now :)
 | 
			
		||||
          # TODO: Remove when 25.05 releases
 | 
			
		||||
          "systemd-networkd-wait-online@.service"
 | 
			
		||||
        ];
 | 
			
		||||
      };
 | 
			
		||||
 | 
			
		||||
      services.resolved = {
 | 
			
		||||
        domains = [ config.networking.domain ];
 | 
			
		||||
        # Explicitly unset fallback DNS (Nix module will not allow for a blank config)
 | 
			
		||||
 
 | 
			
		||||
@@ -4,6 +4,19 @@ let
 | 
			
		||||
  inherit (lib.my) mkOpt';
 | 
			
		||||
 | 
			
		||||
  cfg = config.my.nvme;
 | 
			
		||||
  nvme-cli = pkgs.nvme-cli.override {
 | 
			
		||||
    libnvme = pkgs.libnvme.overrideAttrs (o: rec {
 | 
			
		||||
      # TODO: Remove when 1.11.1 releases (see https://github.com/linux-nvme/libnvme/pull/914)
 | 
			
		||||
      version = "1.11.1";
 | 
			
		||||
      src = pkgs.fetchFromGitHub {
 | 
			
		||||
        owner = "linux-nvme";
 | 
			
		||||
        repo = "libnvme";
 | 
			
		||||
        rev = "v${version}";
 | 
			
		||||
        hash = "sha256-CEGr7PDOVRi210XvICH8iLYDKn8S9bGruBO4tycvsT8=";
 | 
			
		||||
      };
 | 
			
		||||
      patches = (if (o ? patches) then o.patches else [ ]) ++ [ ./libnvme-hostconf.patch ];
 | 
			
		||||
    });
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  hostNQN = "nqn.2014-08.org.nvmexpress:uuid:${cfg.uuid}";
 | 
			
		||||
  etc = prefix: {
 | 
			
		||||
@@ -23,7 +36,7 @@ in
 | 
			
		||||
  config = mkIf (cfg.uuid != null) {
 | 
			
		||||
    environment = {
 | 
			
		||||
      systemPackages = [
 | 
			
		||||
        pkgs.nvme-cli
 | 
			
		||||
        nvme-cli
 | 
			
		||||
      ];
 | 
			
		||||
      etc = etc "";
 | 
			
		||||
    };
 | 
			
		||||
@@ -39,6 +52,10 @@ in
 | 
			
		||||
            ip = "${iproute2}/bin/ip";
 | 
			
		||||
            nvme = "${nvme-cli}/bin/nvme";
 | 
			
		||||
          };
 | 
			
		||||
          extraConfig = ''
 | 
			
		||||
            DefaultTimeoutStartSec=20
 | 
			
		||||
            DefaultDeviceTimeoutSec=20
 | 
			
		||||
          '';
 | 
			
		||||
 | 
			
		||||
          network = {
 | 
			
		||||
            enable = true;
 | 
			
		||||
@@ -53,25 +70,14 @@ in
 | 
			
		||||
 | 
			
		||||
            serviceConfig = {
 | 
			
		||||
              Type = "oneshot";
 | 
			
		||||
              ExecStart = "${pkgs.nvme-cli}/bin/nvme connect -t rdma -a ${cfg.boot.address} -n ${cfg.boot.nqn} -q ${hostNQN}";
 | 
			
		||||
              ExecStart = "${nvme-cli}/bin/nvme connect -t rdma -a ${cfg.boot.address} -n ${cfg.boot.nqn}";
 | 
			
		||||
              Restart = "on-failure";
 | 
			
		||||
              RestartSec = 10;
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            wantedBy = [ "initrd-root-device.target" ];
 | 
			
		||||
          };
 | 
			
		||||
        # TODO: Remove when 25.11 releases
 | 
			
		||||
        } // (if (lib.versionAtLeast lib.my.upstreamRelease "25.11") then {
 | 
			
		||||
          settings.Manager = {
 | 
			
		||||
            DefaultTimeoutStartSec = 20;
 | 
			
		||||
            DefaultDeviceTimeoutSec = 20;
 | 
			
		||||
          };
 | 
			
		||||
        } else {
 | 
			
		||||
          extraConfig = ''
 | 
			
		||||
            DefaultTimeoutStartSec=20
 | 
			
		||||
            DefaultDeviceTimeoutSec=20
 | 
			
		||||
          '';
 | 
			
		||||
        });
 | 
			
		||||
        };
 | 
			
		||||
      };
 | 
			
		||||
    };
 | 
			
		||||
  };
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
{ lib, pkgs, config, ... }:
 | 
			
		||||
let
 | 
			
		||||
  inherit (builtins) isList;
 | 
			
		||||
  inherit (lib) mkMerge mkIf mkDefault mapAttrsToList concatMapStringsSep concatStringsSep getExe;
 | 
			
		||||
  inherit (lib) mkMerge mkIf mkDefault mapAttrsToList concatMapStringsSep concatStringsSep;
 | 
			
		||||
  inherit (lib.my) mkBoolOpt' mkOpt';
 | 
			
		||||
 | 
			
		||||
  # Yoinked from nixos/modules/services/networking/pdns-recursor.nix
 | 
			
		||||
@@ -165,7 +165,7 @@ let
 | 
			
		||||
 | 
			
		||||
  extraSettingsOpt = with lib.types; mkOpt' (nullOr str) null "Path to extra settings (e.g. for secrets).";
 | 
			
		||||
  baseAuthSettings = pkgs.writeText "pdns.conf" (settingsToLines cfg.auth.settings);
 | 
			
		||||
  baseRecursorSettings = (pkgs.formats.yaml { }).generate "pdns-recursor.yaml" config.services.pdns-recursor.yaml-settings;
 | 
			
		||||
  baseRecursorSettings = pkgs.writeText "pdns-recursor.conf" (settingsToLines config.services.pdns-recursor.settings);
 | 
			
		||||
  generateSettings = type: base: dst: if (cfg."${type}".extraSettingsFile != null) then ''
 | 
			
		||||
    oldUmask="$(umask)"
 | 
			
		||||
    umask 006
 | 
			
		||||
@@ -174,14 +174,6 @@ let
 | 
			
		||||
  '' else ''
 | 
			
		||||
    cp "${base}" "${dst}"
 | 
			
		||||
  '';
 | 
			
		||||
  generateYamlSettings = type: base: dst: if (cfg."${type}".extraSettingsFile != null) then ''
 | 
			
		||||
    oldUmask="$(umask)"
 | 
			
		||||
    umask 006
 | 
			
		||||
    ${getExe pkgs.yaml-merge} "${base}" "${cfg."${type}".extraSettingsFile}" > "${dst}"
 | 
			
		||||
    umask "$oldUmask"
 | 
			
		||||
  '' else ''
 | 
			
		||||
    cp "${base}" "${dst}"
 | 
			
		||||
  '';
 | 
			
		||||
 | 
			
		||||
  namedConf = pkgs.writeText "pdns-named.conf" ''
 | 
			
		||||
    options {
 | 
			
		||||
@@ -323,9 +315,9 @@ in
 | 
			
		||||
    (mkIf cfg.recursor.enable {
 | 
			
		||||
      systemd.services.pdns-recursor = {
 | 
			
		||||
        preStart = ''
 | 
			
		||||
          ${generateYamlSettings "recursor" baseRecursorSettings "/run/pdns-recursor/recursor.yml"}
 | 
			
		||||
          ${generateSettings "recursor" baseRecursorSettings "/run/pdns-recursor/recursor.conf"}
 | 
			
		||||
        '';
 | 
			
		||||
        serviceConfig.ExecStart = [ "" "${pkgs.pdns-recursor}/bin/pdns_recursor --config-dir=/run/pdns-recursor --daemon=no --write-pid=no --disable-syslog --log-timestamp=no" ];
 | 
			
		||||
        serviceConfig.ExecStart = [ "" "${pkgs.pdns-recursor}/bin/pdns_recursor --config-dir=/run/pdns-recursor" ];
 | 
			
		||||
      };
 | 
			
		||||
 | 
			
		||||
      services.pdns-recursor = {
 | 
			
		||||
 
 | 
			
		||||
@@ -551,7 +551,7 @@ in
 | 
			
		||||
          ];
 | 
			
		||||
        });
 | 
			
		||||
      })
 | 
			
		||||
      (mkIf (config.services ? "bluesky-pds" && config.services.bluesky-pds.enable) {
 | 
			
		||||
      (mkIf (config.services ? "pds" && config.services.pds.enable) {
 | 
			
		||||
        my.tmproot.persistence.config.directories = [
 | 
			
		||||
          {
 | 
			
		||||
            directory = "/var/lib/pds";
 | 
			
		||||
@@ -561,48 +561,6 @@ in
 | 
			
		||||
          }
 | 
			
		||||
        ];
 | 
			
		||||
      })
 | 
			
		||||
      (mkIf config.services.home-assistant.enable {
 | 
			
		||||
        my.tmproot.persistence.config.directories = [
 | 
			
		||||
          {
 | 
			
		||||
            directory = config.services.home-assistant.configDir;
 | 
			
		||||
            mode = "0750";
 | 
			
		||||
            user = "hass";
 | 
			
		||||
            group = "hass";
 | 
			
		||||
          }
 | 
			
		||||
        ];
 | 
			
		||||
      })
 | 
			
		||||
      (mkIf config.services.frigate.enable {
 | 
			
		||||
        my.tmproot.persistence.config.directories = [
 | 
			
		||||
          {
 | 
			
		||||
            directory = "/var/lib/frigate";
 | 
			
		||||
            mode = "0755";
 | 
			
		||||
            user = "frigate";
 | 
			
		||||
            group = "frigate";
 | 
			
		||||
          }
 | 
			
		||||
          {
 | 
			
		||||
            directory = "/var/cache/frigate";
 | 
			
		||||
            mode = "0755";
 | 
			
		||||
            user = "frigate";
 | 
			
		||||
            group = "frigate";
 | 
			
		||||
          }
 | 
			
		||||
        ];
 | 
			
		||||
      })
 | 
			
		||||
      (mkIf config.services.copyparty.enable {
 | 
			
		||||
        my.tmproot.persistence.config.directories = [
 | 
			
		||||
          {
 | 
			
		||||
            directory = "/var/lib/copyparty";
 | 
			
		||||
            mode = "0755";
 | 
			
		||||
            user = "copyparty";
 | 
			
		||||
            group = "copyparty";
 | 
			
		||||
          }
 | 
			
		||||
          {
 | 
			
		||||
            directory = "/var/cache/copyparty";
 | 
			
		||||
            mode = "0755";
 | 
			
		||||
            user = "copyparty";
 | 
			
		||||
            group = "copyparty";
 | 
			
		||||
          }
 | 
			
		||||
        ];
 | 
			
		||||
      })
 | 
			
		||||
    ]))
 | 
			
		||||
  ]);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
{ lib, stdenv, autoreconfHook, pkg-config, SDL1, SDL_mixer, SDL_net
 | 
			
		||||
{ lib, stdenv, autoreconfHook, pkg-config, SDL, SDL_mixer, SDL_net
 | 
			
		||||
, fetchFromGitHub, fetchpatch, python3 }:
 | 
			
		||||
 | 
			
		||||
stdenv.mkDerivation rec {
 | 
			
		||||
@@ -35,7 +35,7 @@ stdenv.mkDerivation rec {
 | 
			
		||||
    # for documentation
 | 
			
		||||
    python3
 | 
			
		||||
  ];
 | 
			
		||||
  buildInputs = [ (SDL1.override { cacaSupport = true; }) SDL_mixer SDL_net ];
 | 
			
		||||
  buildInputs = [ (SDL.override { cacaSupport = true; }) SDL_mixer SDL_net ];
 | 
			
		||||
  enableParallelBuilding = true;
 | 
			
		||||
 | 
			
		||||
  meta = {
 | 
			
		||||
 
 | 
			
		||||
@@ -11,4 +11,5 @@ in
 | 
			
		||||
  chocolate-doom2xx = callPackage ./chocolate-doom2xx { };
 | 
			
		||||
  windowtolayer = callPackage ./windowtolayer.nix { };
 | 
			
		||||
  swaylock-plugin = callPackage ./swaylock-plugin.nix { };
 | 
			
		||||
  terminaltexteffects = callPackage ./terminaltexteffects.nix { };
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										19
									
								
								pkgs/terminaltexteffects.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								pkgs/terminaltexteffects.nix
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,19 @@
 | 
			
		||||
{ lib
 | 
			
		||||
, python3Packages
 | 
			
		||||
, fetchPypi
 | 
			
		||||
}:
 | 
			
		||||
 | 
			
		||||
python3Packages.buildPythonApplication rec {
 | 
			
		||||
  pname = "terminaltexteffects";
 | 
			
		||||
  version = "0.10.1";
 | 
			
		||||
  pyproject = true;
 | 
			
		||||
 | 
			
		||||
  src = fetchPypi {
 | 
			
		||||
    inherit pname version;
 | 
			
		||||
    hash = "sha256-NyWPfdgLeXAxKPJOzB7j4aT+zjrURN59CGcv0Vt99y0=";
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  build-system = with python3Packages; [
 | 
			
		||||
    poetry-core
 | 
			
		||||
  ];
 | 
			
		||||
}
 | 
			
		||||
@@ -1,25 +1,18 @@
 | 
			
		||||
{ lib
 | 
			
		||||
, fetchFromGitLab
 | 
			
		||||
, rustPlatform
 | 
			
		||||
, python3
 | 
			
		||||
, rustfmt
 | 
			
		||||
}:
 | 
			
		||||
rustPlatform.buildRustPackage rec {
 | 
			
		||||
  pname = "windowtolayer";
 | 
			
		||||
  version = "97ebd079";
 | 
			
		||||
 | 
			
		||||
  nativeBuildInputs = [
 | 
			
		||||
    python3
 | 
			
		||||
    rustfmt
 | 
			
		||||
  ];
 | 
			
		||||
  version = "a5b89c3c";
 | 
			
		||||
 | 
			
		||||
  src = fetchFromGitLab {
 | 
			
		||||
    domain = "gitlab.freedesktop.org";
 | 
			
		||||
    owner = "mstoeckl";
 | 
			
		||||
    repo = pname;
 | 
			
		||||
    rev = "97ebd0790b13bf00afb0c53a768397882fd2e831";
 | 
			
		||||
    hash = "sha256-XjbhZEoE5NPBofyJe7OSsE7MWgzjyRjBqiEzaQEuRrU=";
 | 
			
		||||
    rev = "a5b89c3c047297fd574932860a6c89e9ea02ba5d";
 | 
			
		||||
    hash = "sha256-rssL2XkbTqUvJqfUFhzULeE4/VBzjeBC5iZWSJ8MJ+M=";
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  cargoHash = "sha256-M0BVSUEFGvjgX+vSpwzvaEGs0i80XOTCzvbV4SzYpLc=";
 | 
			
		||||
  cargoHash = "sha256-XHmLsx9qdjlBz4xJFFiO24bR9CMw1o5368K+YMpMIBA=";
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,13 +0,0 @@
 | 
			
		||||
-----BEGIN AGE ENCRYPTED FILE-----
 | 
			
		||||
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IG44Q3BVdyBSN09X
 | 
			
		||||
Nkc3cVJrMGl0K3BVRjlWWXpkMzdoS0Y2RjFVQ2VOaWlEczlCQ1d3CldGcmtVdzg2
 | 
			
		||||
dWR6WkRTOXFMeFRML2R3WFJPK2hpREVZS1FJdXJrVFRwOWcKLT4gWDI1NTE5IG0x
 | 
			
		||||
d29QalcweGhhWkYyUlNaeExmVXNZT0dlU21uamZYWkdTR1g5WnBPbkkKZXBZZmli
 | 
			
		||||
dEtMdHB5UlpkRFVzUUlnSnlCeFRiU3JuZzJWMTBnZVMwL2d0ZwotPiBgLWdyZWFz
 | 
			
		||||
ZSAwWSBjSmFnIDx2CjN1NVRpbnRJNHF3QlhheE9hL1RjemcvbjlBVnRTRmhlVXN1
 | 
			
		||||
Nng2TWlseGhrQ3FselhFcUZjV2FRNnZyQml2OWkKYkc3dUw5MVZObGt3RHQ2U0Fz
 | 
			
		||||
eUVtUGR5Q2lVRnFCWGhHUVVaWTkwcEt5VnlVYkhXCi0tLSBiWVFUVUI5aGZHSG5o
 | 
			
		||||
bWIwdGR5YjdjWXZNYXRqSktFREkwWFNlY2xqcEZjChor89j+2SFeCpVkx7CsST7l
 | 
			
		||||
0z4z6EGD2gDl3rRXbfqi50gVoAWJud2psglnKkGeiSfW5pIaI1DC1Wt6bEFEo9Lw
 | 
			
		||||
GzbIa6gYGcKW3J+w
 | 
			
		||||
-----END AGE ENCRYPTED FILE-----
 | 
			
		||||
							
								
								
									
										12
									
								
								secrets/estuary/pdns/recursor.conf.age
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								secrets/estuary/pdns/recursor.conf.age
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,12 @@
 | 
			
		||||
-----BEGIN AGE ENCRYPTED FILE-----
 | 
			
		||||
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IG44Q3BVdyA4bGQr
 | 
			
		||||
dzJZbU4reWI1Sk45QTR3UkRoc0NvaDBFcUwrVWlCYWUrcWtYZGpNCm1PWjVzRVlt
 | 
			
		||||
UDFKY2ZSZTg4S2pVZ0pDNzR1WklYQ3pEclJZLy9kKzdGTGsKLT4gWDI1NTE5IHFO
 | 
			
		||||
TXVRK2d3azg2cHpRanhUNXp6YnRsZW1MUDJqc3l1bnNYNUhHaTIzMVkKWXp1M09H
 | 
			
		||||
TnJIazRmb0tOSnE1Q0E1dERiaHZCQkh2YzE1cS9zRUhwaEovMAotPiBzPj5nLWdy
 | 
			
		||||
ZWFzZQozSThRWnJCcVFFRHpoSi9tZnZMdnJoRlFud2VISHBHSThMem9qZVVWdS9C
 | 
			
		||||
VFBDVEVzbUVCdFU2Qy9PaGdyc0FaCmk3UFZma2ZiR3hmWG1sa053bDBnY04yZ1VZ
 | 
			
		||||
TW9jZwotLS0gMDVSaE5aakxHenFPVXpXa1JxczlWQ2x2VGNuQzdwaWZFTTFTaUp6
 | 
			
		||||
cnRmZwoomylfwjD5A3N21/mk1Wtt8f4bsK747iZz7KT34kqmoX597rbGYxyip5lg
 | 
			
		||||
VLZV6CY4LLRjnnSKoC2hIXU0dgudAmvxhztuaQ42fOc=
 | 
			
		||||
-----END AGE ENCRYPTED FILE-----
 | 
			
		||||
@@ -1,12 +0,0 @@
 | 
			
		||||
-----BEGIN AGE ENCRYPTED FILE-----
 | 
			
		||||
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IG44Q3BVdyB0RnVq
 | 
			
		||||
RUpSZy9qZ29DemdnWjdscHMvelRYUGF0YVZlNDFtdzFRdVljbGpZCjdWcE50ck44
 | 
			
		||||
NVBsbVk3SmR6cHhHdkJ0TWI2S2ppOUtnK3pMK28xeTc0KzgKLT4gWDI1NTE5IHIy
 | 
			
		||||
SEUxOCtjK3VFMEozblB1T00yRTE3c3dRSXIydmJHdmEvL25yMStOUVEKbE1XdU4z
 | 
			
		||||
L1lLcEJWY2w2WXRWbmVIN0ZBRVl1R1dhNk10MWtheTRCYjloZwotPiBXXXRKcS1n
 | 
			
		||||
cmVhc2UgRUBEWyBwamZsOVQKZ09pVGdWUG02WmxUcGNBN3RnbE42V05xRDE2azMr
 | 
			
		||||
WHd3VEt0NmwvZnI1dXdiSjNvaStsNTZmUEhwbUp5cVlieQpSYmhUVm1GbEJVdXo3
 | 
			
		||||
ZwotLS0gSkFZMFdiRHBjWFJsR3pqcytYZkEza3dsZ0ZyaDkxdmliZ3RUOFErUXlt
 | 
			
		||||
cwq9gj+Fg4p2D1548J+bhvJ0re9uVm9TZ9lJSqmj5tMxWRS9aN1j9BlhmK/RnEG9
 | 
			
		||||
KcodvBiyqibzauS4KC18xLLu986hK2gn3857waXn/AIp+p8BIA2J9M2M
 | 
			
		||||
-----END AGE ENCRYPTED FILE-----
 | 
			
		||||
@@ -1,16 +0,0 @@
 | 
			
		||||
-----BEGIN AGE ENCRYPTED FILE-----
 | 
			
		||||
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IFQrc2JHQSBmTlVp
 | 
			
		||||
RnlKNE9ySGo4L2h3VXBXRzIyZGdqU0RtUWk4ZmJVcGNKZ3BqTmpjCjJtQjUyTmJN
 | 
			
		||||
dkpsbVI3M01mQlNPSEI0U1lVeUJTMVlXUlpheGxVblhUbUkKLT4gWDI1NTE5IG5K
 | 
			
		||||
K0F3QWxJaW5CbW5TZElEVklIeUJxS0JCc2IxaFI5dVZrbDc3NDZGV2MKOVR6M0k5
 | 
			
		||||
eW5HWDQrT3Rtb0tIM1EyajI1V0dKbHBLb0tVNU9nb21OUjcxYwotPiA5anw6bk56
 | 
			
		||||
dC1ncmVhc2UgPCVeLiZyIH4KTGFRWHBGZFBJUElONUZLb3pJeXNZeXhoakYwT3BM
 | 
			
		||||
TW9kUXBhOGhNbHh1Q1RPRTlCRnhSckg5NEUxWk5MVHJucQp4YlFDcVRzK2V5bWVT
 | 
			
		||||
V0xLQjN1SjVTaWNJajJaTjRrQTd2VHlMRy82TExXbAotLS0gVE5YZVhTWXl4VUN2
 | 
			
		||||
WUpidkJLV1JDU0R2QkdHZE5ZbCt2K2FlbGNjK0ZlNApzDh+kgAy4SBqC51mJi+VX
 | 
			
		||||
ON8wbwLVTQRs1H30eyWNzt/3MO++eS4AoZUKQZUxURwXfhV0t0zd5/MlByBsqaHR
 | 
			
		||||
+W6O/9Dp8e/8GYSX3D892r1LKN0AYHgcKeKwEtJojt5CTNJS2IgU6UxZhTliqAEc
 | 
			
		||||
NkfxvcoAEHhGhPOudEIX2SgjrgVGJA8MYm6/46zAolZws3TWim3NEgJpb9tWXpvi
 | 
			
		||||
1f/MXuxiowplF+PqCsd1EGzpXKsvADq6Rwyxpo6CbJzrq+GhFrTHF+LRkzjWx6JE
 | 
			
		||||
LUsZwDqOZUY=
 | 
			
		||||
-----END AGE ENCRYPTED FILE-----
 | 
			
		||||
							
								
								
									
										14
									
								
								secrets/home/pdns/recursor.conf.age
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								secrets/home/pdns/recursor.conf.age
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,14 @@
 | 
			
		||||
-----BEGIN AGE ENCRYPTED FILE-----
 | 
			
		||||
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IFpOcUlvZyBlODZr
 | 
			
		||||
RHpJcFdFaVNYM0x1d3QxVmhKTFBkMndrakFYS3FxWk00YWxXejNzCkFqWFlCWUt2
 | 
			
		||||
cGluRGtxODQzbElhRWt1TGFVeTE1UU5SSkdZejJzNVdhZ3cKLT4gc3NoLWVkMjU1
 | 
			
		||||
MTkgcytxUmZnIFRpeVNsT2Jqc2I4dzB3cEFWK2ZEZlpJQklWSnhJM3o0Ukhsc1lz
 | 
			
		||||
REZ0VFkKWWJPckVSNlZHREJIVVgwNVNBSkpSbHRPcUxIWVo4ZTlyVkovTGRpZThL
 | 
			
		||||
MAotPiBYMjU1MTkgUGxhR2d3TVh1dnJwQjNoY0pjV09halZKZFhybVk3Vjk3Tmwr
 | 
			
		||||
bDd5ckp6MApBcW8zbUl1SnhmOXZwOFRNUG1EZUNacDlXdXJSbWFUeG5GNjM3eXJo
 | 
			
		||||
RmR3Ci0+IDstZ3JlYXNlICRoICVbfmU2fQpFYzNyZXBxVU5jT3JSY1NFMGEzUnVF
 | 
			
		||||
WFQ2MmR2SGQ0Vnd6V0VxQlp5bE5LZ2NML2hyd09LOEVPL2lGREdLR3FMCmVGN09J
 | 
			
		||||
OUNscVh1d0VSdwotLS0gbTB1NnZ4Q3B6WE1KVzJjbmVwL2dEVjc4WnRXZTlYbFBG
 | 
			
		||||
T3htUHBWang2awr0OgkUO6XPZji5ZBNpqGwOlwpa605t38QCmFSXvPQhvT4Gj/0+
 | 
			
		||||
rUvg7zWf5Yb4c86EDD05CsqGEUQTOKEz08z0lewN5kuFfZmrYQY=
 | 
			
		||||
-----END AGE ENCRYPTED FILE-----
 | 
			
		||||
@@ -1,14 +0,0 @@
 | 
			
		||||
-----BEGIN AGE ENCRYPTED FILE-----
 | 
			
		||||
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IFpOcUlvZyBJSU1V
 | 
			
		||||
M1QyaWcvcFJlUlJEcDVvblJGcXJDWk11RDhCZzBkY2Qyc2lDQW5jCjJVRVBWMTZy
 | 
			
		||||
SHNTZG9ZSnZ3RjRqUE9Ub3JKZERkcTZpeEhSUlppTmVsZm8KLT4gc3NoLWVkMjU1
 | 
			
		||||
MTkgcytxUmZnIFFsbm1oNk1jNndoU0J3SkdFSkNhSGNVRjdQb2JSUFBnczVwdlF0
 | 
			
		||||
bDVhaVUKaFBzSHF3THNiL09Ib2ZhOFlyNVY0Q1ZwOUMwczZiQW9jVlNwanRYek1P
 | 
			
		||||
WQotPiBYMjU1MTkgcEppMVBpbmRGS1h5RUgwNkZPZ0dXWVpkdXlZcFc5S3dQaDA4
 | 
			
		||||
THdhUm9oTQpLbUpTaVVuQ29Zc3FuQ2MyaFcvTkxVK1l1T3V0L3FZSXZBS2dlY2hM
 | 
			
		||||
VUNVCi0+IENcLWdyZWFzZSAnNGJjfiB1IHB3QDpUIHsoQi57Ilw9CnkxdFRqWVZi
 | 
			
		||||
ZFdHQXJwNGZuNDg2Q3cKLS0tIDJSNmthczc1U2xxSlVKZDBLc1BHNnFMV3MwK3Qr
 | 
			
		||||
ckJDL204d210NW1Pb2sKCC+sa8uPupC3Rv+o12XT/wTmLsKhtaE/bbshPCDIHUFn
 | 
			
		||||
cpTwpY96JsCShAjSb6n7Xt6FgTKTFt2iDsGQ6+sLp0AJ2quxRaoxmqaFVsz4p8BL
 | 
			
		||||
gF0On7LgZg==
 | 
			
		||||
-----END AGE ENCRYPTED FILE-----
 | 
			
		||||
@@ -1,11 +0,0 @@
 | 
			
		||||
-----BEGIN AGE ENCRYPTED FILE-----
 | 
			
		||||
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IGhNYTRudyA4Qk8z
 | 
			
		||||
SkhFWWMyaGM1c2luVzZzbWNvT0ZsS09yN0w1N01oY0tldWFXZnhVCkM0YzBVZUM1
 | 
			
		||||
MmRzdFlCL1o5ZTdkTjkxQ1YyQ0kwbnJ0eVRuYUpQNWw2c0EKLT4gWDI1NTE5IGli
 | 
			
		||||
dkp5RjZRSmROMEtQeWJiVkt2UktxdTAwUzZBRW9XajFDblFqZ3ZVR0EKYzFubnp0
 | 
			
		||||
UHo5WlViYTNwbXFBd01qM0R4Wk82MTV1TzJsVVczdGRNSFRBQQotPiAnLWdyZWFz
 | 
			
		||||
ZSAuPzVDCm1SZkdDMHRjT2NBVXI5ektKZ1R3dXhMUEVRblhBdC9mclFZSitSODI0
 | 
			
		||||
OHZzZThEQnlBY25lVnFTQXRaV2FIYTIKeHkrY1NRCi0tLSBhUFgvd1BUbFlJeEFO
 | 
			
		||||
RWRBQzcrT0ZFMG5SZVliNlZnK2N2VDJVV05UTkhBCrZM7RtMrOVIGIpod8aU4GLn
 | 
			
		||||
0KBGTSq6kE01+f1kmTZDAKHx/LhiWgHYKLxTLW4VpYnUCg==
 | 
			
		||||
-----END AGE ENCRYPTED FILE-----
 | 
			
		||||
@@ -1,74 +1,72 @@
 | 
			
		||||
-----BEGIN AGE ENCRYPTED FILE-----
 | 
			
		||||
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IHNqUFR5ZyBlbHl0
 | 
			
		||||
S0lQbXBKVGpNNnJOUS9TSlp0U0EvYWFVanN3N0RMb1JudEdwYVQ4CnJGdklzeEFy
 | 
			
		||||
RmxjamNyUWszYjFGb0ZZbk9EQVdERERtckpqczVscjdmUE0KLT4gc3NoLWVkMjU1
 | 
			
		||||
MTkgRExNZUZnIGR4czhRYjUyU29JbnFnRk5IeXliNzZzMVMya1ZuS2tkUlFVTkxU
 | 
			
		||||
aFd0VWsKenprWWQ0UEdaUGhvRlJUbnU1T2h1czZBK1dpOGwwcjJxc2p6ejV1RnM0
 | 
			
		||||
RQotPiBzc2gtZWQyNTUxOSAzYkIzWmcgMHB6dzVFQ3FtaWErVWNyRXo3WnNhT2NF
 | 
			
		||||
eldUVWtOaVlWOTVwcVVaOUlGMApJUDUzNmhKbUxleTV6SjV0Zmk3dno0STVIRDIv
 | 
			
		||||
SUkyd1M2Z21mdUtMUXIwCi0+IHNzaC1lZDI1NTE5IHErMFhjdyBnRFBPRnNSa0Nn
 | 
			
		||||
UTlpR1Y4OU1UQmNLRnRWaGxzU3RBV0c1bG90K2I5QUQ0CjArUFlGS1B2RkVKSEtP
 | 
			
		||||
ajRpUUNlMkRPN3pxaEkrZ1M3RndxRDZ6U09Wc2cKLT4gc3NoLWVkMjU1MTkgWkIz
 | 
			
		||||
ZTZRIFRPdXRTeEVvUTM1dlQzMll2VDFkUlY2eEFRcnRrc1lNeDZDbFE1a3BjaDgK
 | 
			
		||||
MytBM0Y2Mmo2M1JOWExLQy8xTm9SR05WcmxrV2xBZ0RpeXQxeGVkZ1VZcwotPiBz
 | 
			
		||||
c2gtZWQyNTUxOSBqNjdGWFEgYUw5cnJabnhhdU9lN0NPVXVUazRnVWpzcUVtM3VR
 | 
			
		||||
bWQxNVVSQTN5N3hXRQp0blhXUC94TlRPbS9Ba2N1eVM0QkNNblJBa1hJYjZ1Y1lM
 | 
			
		||||
UDhWbUd5bWNVCi0+IHNzaC1lZDI1NTE5IGMwVE5hUSA0TXowVjA0N2FvcER6OEts
 | 
			
		||||
VTVwa0UzUEtsY005WDhmaU8zZ3VLaXQvaVRJCjB4cjJiMHVGM3hyWlg0OHhaT0lu
 | 
			
		||||
K2NJQWVndzYrSDAyK25NMklSVUI4S28KLT4gc3NoLWVkMjU1MTkgbjhDcFV3IFNE
 | 
			
		||||
Q1NZbnpqUkdiaktnYkxZdzZrYUVqWDEvYnMvOTJqSUpybERTNk9uQ0kKYlMzZkVu
 | 
			
		||||
SXVtaWk2WEtDMEpwZFM3ZVIyWHQwUWNOZjVRS0I0ZjN5MklHYwotPiBzc2gtZWQy
 | 
			
		||||
NTUxOSBqSThSQWcgWTZIMCtNMCtzTFpROHpBMnA3b2s2UFE2dDZGbnlxU2VxMlkz
 | 
			
		||||
aGJFUzV6awpKNDhobHQrTCs4cUVpNE5wblJMako3bU5tVldjVDBjVlJOOHhkUTNk
 | 
			
		||||
NFdrCi0+IHNzaC1lZDI1NTE5IFQrc2JHQSBTbVlBTXIzQ09SOHRJakZXK3NkT1Uy
 | 
			
		||||
RFgrUTZncSsyK3p5WlVDSFNwM2lFClErRHk4Qmp2VlIvZW8rV2lNME53ZFlIUmVC
 | 
			
		||||
bXF5RlVvV2FUM3ZmeWpaQzgKLT4gc3NoLWVkMjU1MTkgaE1hNG53IDBINGhyMDBy
 | 
			
		||||
bkp0RWpTU0F6Uk1kaXllRHBHbXF2QWUwNkN1U0tEWE53VGsKdi9QRlhwRCtyQkRq
 | 
			
		||||
cng1Wk1rZkx2NnJTMUxGajN3b2Z3SG0zd0ptcklCZwotPiBzc2gtZWQyNTUxOSBl
 | 
			
		||||
eXEzZGcgcnQ4WUFMcGRtL1BvYTkxWU12WTdkT1lLRmJlZXZ4cWtHNG54QVo0dDYw
 | 
			
		||||
RQp2NkMwbTROZTBuRUVLNEs3L3BmOTZ2S3dDL0hUbm5OaHZXbjVCRG15bExnCi0+
 | 
			
		||||
IHNzaC1lZDI1NTE5IDdXUTlQQSBPL0t1ZWptTm5YQXIwc3ZNUGhkaVM5QU1DMkNL
 | 
			
		||||
NU1WSFlTT05KOWR3dGhJCmdTTEIrNEZma3E0UzArMndqVEgzWnVLNzl0TjhsbG9P
 | 
			
		||||
OE9aRVk1Ung1cEkKLT4gc3NoLWVkMjU1MTkgZ1N4UDBRIGJNazFtRThSVVVvb3dP
 | 
			
		||||
RHV5WGxCbktDK3c5aEhiYkphNU4zUnVNUVNNV2sKbWZJYkNSZFMvTDI1WVg5SnJV
 | 
			
		||||
bUFSY2JsNDJBc253dlN5Y2Nqdm9TbU9IawotPiBzc2gtZWQyNTUxOSBWRmN3NWcg
 | 
			
		||||
eEo0dmRNWVpuVGdxRHpXc09tUDZldFRKcTBIMVVWcXdmVFRhZnZmenBETQpJWHVp
 | 
			
		||||
NWJNRWhacHlMbHlQcjEzdEZWdUVpbGg0N2pqMjcvTk92UDJpNUlvCi0+IHNzaC1l
 | 
			
		||||
ZDI1NTE5IGhrYnR2ZyB0SFJGRE03T3lnTUJZakVCcnQxVklPNXhzak94eU5KUzNX
 | 
			
		||||
L216SCtUWEVzCmRrS2Rlc1JiNEg1KzExaUsrNHJuSDlTcU5Oa0J4QVZKVmNBRGFP
 | 
			
		||||
ZWlqUjAKLT4gc3NoLWVkMjU1MTkgZXQyenBRIEFhMFVxZ3RRbk4za2t5cWtwVjVi
 | 
			
		||||
Qm9ucVdMekVsSHEwSWlML0JIdmQ2SFkKWW5mWnQvRWlaT3hJLzJyTE5RdTNUMWNM
 | 
			
		||||
SDB4TjVKZCtDN0tCR1NhdnRqbwotPiBzc2gtZWQyNTUxOSBaYkxKV0EgV1loMWZx
 | 
			
		||||
OHhKelNvNzErMDc4cUE5amgycTFTem5lVmlGYTk5bUM2T2dEUQpkMVQ0VS80Y3Jt
 | 
			
		||||
QTZUVnNZV0daczM0Titvc3Q1T2JiTVZYV2tXOW4xV0VRCi0+IHNzaC1lZDI1NTE5
 | 
			
		||||
IFpOcUlvZyAzMnZ2NjR1R2R2UlJNZjNvOU9RckR0MEtnbllyYVJPSUZtUDNWSU5k
 | 
			
		||||
U3c4Ckgza2txalJhOW14c1dGZ0VTc3EzK2NpOUJaVWhqN2lMWU9HL3hMSWlJUVkK
 | 
			
		||||
LT4gc3NoLWVkMjU1MTkgcUxqcXlRIHMxNStVTnY1TUZJaHlXQnNTSFhXditsWnVF
 | 
			
		||||
Y2ZKRWZ5UXVPZUVKY2VjakEKV1N3ODVFYXROTzFReWE5Y1A5MkpXUjJVc00wVVd3
 | 
			
		||||
ZUpzTC9rRGdOWUpxWQotPiBzc2gtZWQyNTUxOSBCYVFsUmcganpkWlpaWlRVQ3Vp
 | 
			
		||||
Y2hvbkpld2kzdzVtdERHajBNUTEyM0NOWlp0WkxtRQp1MEJUKzFUSW9tWjluVU9Y
 | 
			
		||||
clBzNFpzdU83MXdGN2dJSGducnplbEd4M1JNCi0+IHNzaC1lZDI1NTE5IHMrcVJm
 | 
			
		||||
ZyBSRW1pZWFhQkpQRTFYTG9IZnVmWmx6S2pNUll4MGhtRFd1Y0ZhS25JNFZVCjhU
 | 
			
		||||
UDhoOTlTUEtqbytZMjZ2NlozcnZTNXVNcVA3cU1TRmtsL1g4bEhKUzgKLT4gc3No
 | 
			
		||||
LWVkMjU1MTkgNjJKY2NBIElSSXZjc3J5cWNwOHFNV281YzBrVzc2TlVwMnRwb0NJ
 | 
			
		||||
dEdST0s4MEhmQnMKaTNEdkFjRktCZHNCY3FsWE5UbFo1R3lXSlI2NE5MR25neWJ4
 | 
			
		||||
NTlsSllxWQotPiBzc2gtZWQyNTUxOSAvaHgvZEEgOExaRjJiNTJkUGFxZllSK1Uz
 | 
			
		||||
eWxQTmtxOVFPZkVFb2w2Z0tmZVpwTndDWQpuRFlqZWdaQjZaT1BZSmllVzB5NWhY
 | 
			
		||||
MmhHaWtZOXFERzhSRWRXWk5TR1RRCi0+IHNzaC1lZDI1NTE5IFd6TEdIQSBtZW04
 | 
			
		||||
eWlNWU9JOXYvcVlsb1JXM2JKRlREeXJXNHd6MlkvazZrSzdscG5BCnZzWUFwb3lK
 | 
			
		||||
dUhkcDZNakFPN0RMRG5LQzdqU1UzNlJ6eGRGSGlhYUx0YXMKLT4gc3NoLWVkMjU1
 | 
			
		||||
MTkgSEovSjdBIDBaNzZGVkdaVWlWNk4yVW5UdnFCZ2xWUEtIc2QzQmJTMnlINVF1
 | 
			
		||||
V093UmsKcXNhSnlnWHQrRzVSU296NENDN29aMUN5VlRIcittdGNySGhvMHZlT0xl
 | 
			
		||||
NAotPiBzc2gtZWQyNTUxOSBPRXFNc2cgNUFSc045eUVqQWI3MXB4Tkd2RndDS2Na
 | 
			
		||||
VGJrblFLaENPVlZucFdGRGFDTQp6dlRHTnRLSFkxb1RFdmxGS09Jenh2Q25VZ2ha
 | 
			
		||||
QWQ4YUNjdVNJbW8vVGVrCi0+IHNzaC1lZDI1NTE5IC9FSlh2ZyBGM2lrUG1DWUx3
 | 
			
		||||
YndZWWdobVo3TjZHTDNabmdsa3ZHcndwUXVZSVg5T0VZCjNYdlFYSHBsWjBTWXlS
 | 
			
		||||
V0lSZkpwVE05eU1LcFBEbWdXWEZ0U0tSTkthQnMKLT4gWDI1NTE5IDF5SmczUWpo
 | 
			
		||||
bkdmWS9SamxtTTF1eVJnc1QxUGJiUjQwR1VSTmdxMEtqQzAKeTF0NWp6dG1CWGNy
 | 
			
		||||
VVVXVGFLV3dkWWo2YTVkZmtXcHRZai9FSDVBSmJhbwotPiAmJC1ncmVhc2UgaWU3
 | 
			
		||||
YGkpVSBNV0ZfIDM1fltQdzBcCmZYRXB1NEVMNkVqWVF3Ci0tLSB2RVRFYmVGVklB
 | 
			
		||||
bGFiUTBKYlMrRitvN2NnUkhScTMvWml6ZzRKU3ZIeEtvChoKB2c5roTC97pdDOi6
 | 
			
		||||
aPFIaTyOu9NZ4ESwwRjpEgB0D6GP2r7YR3CnxVyXa4sCFUnTF8dLUkABFnSeNeQZ
 | 
			
		||||
M64tM6J+tZAyJa9IKaTgSqvQaGYHHYinygNvf6BShCK4nPUJu0cV6gFtqFle0MWA
 | 
			
		||||
Rez5eRMFH/M2aubhwBeDyHG4WRelkt7oMVXyY6U=
 | 
			
		||||
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IHNqUFR5ZyBaOU1F
 | 
			
		||||
ckpVQWNGejNoQUQzaERobUNmRFMyWVFzc0Eydkh6SEVZNHU2SHhRCmc0NUJMa0lG
 | 
			
		||||
SnRuZHR3dmNKem1oYXA5bHVsNWcwY0xzMTlqQUlsQWJiSFUKLT4gc3NoLWVkMjU1
 | 
			
		||||
MTkgRExNZUZnIG9Ca2M0ZHJwS2I5VWJiY1ptUWJtNTdVakVGQXlteGdCRHg4c3JO
 | 
			
		||||
cXpaSGMKTHlidkxRZ01mWVRLRVRZdWRyNTZWZDhmR0Vicy9hYmF2elg5M1FXNGF6
 | 
			
		||||
UQotPiBzc2gtZWQyNTUxOSAzYkIzWmcgZE03MlRsVDQzdlF3R3F0TWppdU4yV2J3
 | 
			
		||||
N21xS0djYnQzLytKK3JBenFoawp4bk1pWDlmZ2dmOFU3djBHVlN1alJETENGMGhM
 | 
			
		||||
eWhGSFNGUW5OenpNMFRvCi0+IHNzaC1lZDI1NTE5IHErMFhjdyA3am5WUzQ4a0xM
 | 
			
		||||
OEpvdTVGVjNVV2tMNnRHQ2IraGdZbjd2VjcrTnJzSjA0CmoyRjI3U1R5bElhb0NL
 | 
			
		||||
UU4wRG1VZVV2MlpFdFkrUGdNNVNsOTJjN1pmZ0kKLT4gc3NoLWVkMjU1MTkgWkIz
 | 
			
		||||
ZTZRIFByVVhNbzRFQ0grb29hd2x0OU9iUU5sbjU2Zld0RXExM0RHT0M1VTZ6U0kK
 | 
			
		||||
a2lVNzZiNWkwMy9XT2lIVnQrNG52cWx1b3lNQk41WFhHenlsVDdlR1FjZwotPiBz
 | 
			
		||||
c2gtZWQyNTUxOSBqNjdGWFEgVzZURHE4ZHZ0YWNYZ1hkbWQvdDhQbzJ0R1NMNjRv
 | 
			
		||||
QkVWdkNPWFN4blNGawo2ZndJeEhsbkoxYjBXbk96bjZsMXVqeE4yMDFRaDR1K0Rq
 | 
			
		||||
eExHNDFBNlpnCi0+IHNzaC1lZDI1NTE5IGMwVE5hUSBjQXhrenI5cTZhNkR2VnNG
 | 
			
		||||
VitKUzQ5QThOcFJCZytTUXRrQzFZWi9VREZ3CnZFTU5QNm84NjVGYmp4RTZTM0Js
 | 
			
		||||
cTR0WUMwd1RWS0RJNHo0dDBkS1A0NE0KLT4gc3NoLWVkMjU1MTkgbjhDcFV3IHVz
 | 
			
		||||
Q0FiOTBIYUY5SFBLK0Zia3YxaHd4dVN4bDhjbjZYaFVKNHp6VkFOMmMKeXAzcndh
 | 
			
		||||
M2hLWUFSNlJTUXFhNnlZZGZCYnBvM1AzMVg0QWFvK05rS3ZlOAotPiBzc2gtZWQy
 | 
			
		||||
NTUxOSBqSThSQWcgS0NRY0pKaEd2UmVXcTU5bDFYSkx6cS9KNnVXbXc1ZVpxelIy
 | 
			
		||||
U2E0T2VSRQo1cTZzQWk3cDRPSjVOdFQrOWNvWDVhZlE1VTRmRjBHZ0JjTVdheFdX
 | 
			
		||||
bVB3Ci0+IHNzaC1lZDI1NTE5IGhNYTRudyBPUW11MkNuQUsyelNiejl1UEhvMFJT
 | 
			
		||||
bUxmQU5MaW1Qcy9JeUZoVzdUSzBVCmVZWHoxTFVQWmJQbDlzYXZhVkxYRSszOGdm
 | 
			
		||||
MktPS3ZNV1BpZFJkM25wcGsKLT4gc3NoLWVkMjU1MTkgZXlxM2RnIDZLMzQxNFMr
 | 
			
		||||
azlybFZLK05xY21DU3BOZnduOWt4Z2lDNzl4KzVtYitrbUkKcGR1OWtkVTB1czdE
 | 
			
		||||
dWdhd0U3cC82Ry8zTStkQ256N3RMQlZCbjU5bWJVbwotPiBzc2gtZWQyNTUxOSA3
 | 
			
		||||
V1E5UEEgb2IyVVNmM1AwNTVnZExDTEp1NWw4S0xWK0lnWG5DQ1dQTnh3RmNuZ2x5
 | 
			
		||||
NApNaXhzL0wxUWtHNHpWSWplRS8wSzk0cEs4S21VUnp3azlRajJNdlJ6ZEprCi0+
 | 
			
		||||
IHNzaC1lZDI1NTE5IGdTeFAwUSBLWXV1VW1Pb2w0ZkpOUlNEa3dLamFGSDFJMWRq
 | 
			
		||||
NzVMZDRXUWY0UmVuaUhjCkNlWFUvRHByUVBEenFXTXBMZ3k5d2l2L1BaUHprYVN5
 | 
			
		||||
ZHZmdVAvQk1lY3cKLT4gc3NoLWVkMjU1MTkgVkZjdzVnIG1IUngvcVNSM2RrSDF0
 | 
			
		||||
dkZMSlAySmxWL3VqLzJYWWs3SUZTRWpvUkQ0R0EKalMzNW5rSXJES1M5Y2tVeDRW
 | 
			
		||||
bFQ2eG9zeGxSZDBZMDV0TVV2SDVManI4QQotPiBzc2gtZWQyNTUxOSBoa2J0dmcg
 | 
			
		||||
WmkxUSs4MGI4Y1BrZjdSSDRQMEtGbC9LNWlDdDBKbFI4NXdjN21BS2lIRQpUZVhL
 | 
			
		||||
c0orRXNvbGFUbE1UZlBGc3h5N01Fekh2Q3B2WjI0WXpkRWpqM1hnCi0+IHNzaC1l
 | 
			
		||||
ZDI1NTE5IGV0MnpwUSA0TWlIWW1oRzgrYzJUK29XbXVyd2JETHpLUFVLeG4rRUY1
 | 
			
		||||
bmV1bUZPaDBNCnI0cllLZmRFMEZDWTFRV2QxL25uV1RtOHBMZVhrOXFyR0NGbjk4
 | 
			
		||||
QWwvbDgKLT4gc3NoLWVkMjU1MTkgWmJMSldBIGNiK2hGRkhZRlU3SFpURWNLY3lL
 | 
			
		||||
VisrSW01V1lXQU8yUGN5MENNaEZwVU0KbnNGd2Y4TDZKdmFIQ21NWlZZVGQ1ZEFw
 | 
			
		||||
MyszQ0VLOWxiSkdrWFdGWUlkOAotPiBzc2gtZWQyNTUxOSBaTnFJb2cgZ2dnRHkr
 | 
			
		||||
UEs5S3FJRkpBLzZLRyt6RmdBeUcvTjJGTmhoci8xNXord3F5OAplZXRUQTF5MUtT
 | 
			
		||||
RG1uVmZOOENzVVZqWUFsdDFXRm93dy9OYmtVSDZTUDV3Ci0+IHNzaC1lZDI1NTE5
 | 
			
		||||
IHFManF5USA5SUF1MW85T2dZNXY2cFBwOC9Wb1R6MSs5VGVOOTExUnNaM3pwci9l
 | 
			
		||||
N2pRCk1tYWRnSlAwbUNiMWdmRU0wZk5VOHZmVU5uZDlRSlJJM1pHR3VxTTNHN0kK
 | 
			
		||||
LT4gc3NoLWVkMjU1MTkgQmFRbFJnIExWTm0xU0djWW9XL3ova003ZVBMTTFIS1FR
 | 
			
		||||
S0xYckNMRFJhZGVXM1haeDAKeTVoSC92bnhRdG93RnV4akxVRHRuVEc4Y2N3cmta
 | 
			
		||||
UFJrTHZtU3A5RjFGdwotPiBzc2gtZWQyNTUxOSBzK3FSZmcgaGJNcUc4bFZHK3Bl
 | 
			
		||||
cnVZV0dPWkFOTndSMU1zNlAweXZsUkZtSk1XQUoxdwpWak02bTJVWjNNMXZoenJq
 | 
			
		||||
RFN0UzRvdk0xT2VzazFKcysvYk9HejYrLzRvCi0+IHNzaC1lZDI1NTE5IDYySmNj
 | 
			
		||||
QSA4KzVSYkxEUW5jaithdUNvSVpjdDJGZm90Q1IyWnBtbTZnTWNsY01pUkQwCkRa
 | 
			
		||||
NHRHenFIS050dXVWcWdzaElkemU4enEyUmkwU0tSMENJWHFYMlg0L0UKLT4gc3No
 | 
			
		||||
LWVkMjU1MTkgL2h4L2RBIDVhY2hCcitGVjFueUsrTHpNNmEzeDFTUFdYeGZ2d1ox
 | 
			
		||||
czE2TUFIS0NzVFkKU0lFcGJiQmQrMU1iYlhtNWVFZ2VZM09jOTBwUWRDdlNOKzc4
 | 
			
		||||
VHVEeC8wdwotPiBzc2gtZWQyNTUxOSBXekxHSEEgNlhBMHVJTTFuZHgxN3RqYkV0
 | 
			
		||||
SzB2elhYcm9BWmszNjRIUzhCbEpiWktFawpka1ZpK0pCMnAxTUE4UzhHeXhxcjRi
 | 
			
		||||
djNRdUxVeW90SUFENjh0UVJyeDBnCi0+IHNzaC1lZDI1NTE5IEhKL0o3QSBhNno1
 | 
			
		||||
QmZWMFJ1OEdmZVRzd05qWktUM3BXaWtvV3FpckllV29hM0VWalJZClN0NVFMTDlu
 | 
			
		||||
Z01TaVp3ZDRURGRqSk5FazBBVXJuTzlzdFI4bWE3cUowYmsKLT4gc3NoLWVkMjU1
 | 
			
		||||
MTkgT0VxTXNnIHBBaHl2U2hKMVJpc1FDdDRMVnRacHZ6SUh4TGwxYm9Sejh5S3FL
 | 
			
		||||
RVBheUUKQUNRZDZtN1dBcUI1TFVpenI3R0M5TC9zY3B4OEFBMXhLQjMyYmVseWEv
 | 
			
		||||
bwotPiBzc2gtZWQyNTUxOSAvRUpYdmcgZ0M3ZVdBZVlOOFNEbmFwYVcvMGtETTdy
 | 
			
		||||
QXZmSy9qZFVKQkROdFRVak4xSQpRREliRFFjMTl6ak45ckdEdnpReEJPS3RSbXB4
 | 
			
		||||
R0JxdUUxZ2wxSkUwQk5NCi0+IFgyNTUxOSBqYW5sdkVBcUJiUHltVy9mT0hYbzJ4
 | 
			
		||||
bW11dmwvUGFlVkV1WlpFQ2Y1UHpNCm1OQ09yOVRSNnIxeXY0N2ltOEt3OVVYRTM2
 | 
			
		||||
bHV4dkJOaUFrUFhydmdTSFEKLT4gZ296LWdyZWFzZSBbcyA6IUVJKiBSYi04ClB1
 | 
			
		||||
QjgzNTBMM3o1cER5RWhQa1F4YmFEOXNzQUZyOTU2SXRzYmtTODdKd1djZ3NUagot
 | 
			
		||||
LS0gRGN4Y2ZyV1g4YnFaM0JTazNZSFNOQVlzQWViU1R1ZUVpdjB0ZmNUeThvRQrn
 | 
			
		||||
KRRdOMs11eAfh0452NX5E0nDyNXe/Bn3kStg7jBDKRo+JxFw4xTwgT9XeyMwzonH
 | 
			
		||||
bci/yoXC0hSJNiGvMCu9qbnEZakb7nzQfn8KJY9+4ptjRI5zxnGRWUEDrHjNXA22
 | 
			
		||||
UGpm6PGdBRpktySXA4wFTJL1nWxtIIRvZ/j3Njc3O78ggjhW3QtBc0VJ
 | 
			
		||||
-----END AGE ENCRYPTED FILE-----
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user