kernels-bot commited on
Commit
59aa138
·
verified ·
1 Parent(s): 7c0e2f7

Uploaded using `kernel-builder`.

Browse files
build/torch212-metal-aarch64-darwin/__init__.py ADDED
@@ -0,0 +1,98 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Compute directly on the packed blocks of a GGUF checkpoint.
2
+
3
+ A GGUF weight is stored as blocks of 32 or 256 values sharing a scale. These kernels read that
4
+ layout as it is, so a quantized model can be loaded and run without ever materializing a dense
5
+ copy — which is the whole memory saving.
6
+
7
+ Ported from llama.cpp's ggml-cuda; `vendor/UPSTREAM` pins the revision. The ops are named for what
8
+ they do rather than for a backend: each backend registers its own implementation of the same
9
+ schema, so calls dispatch on the tensor's device.
10
+ """
11
+
12
+ import torch
13
+
14
+ from ._ops import add_op_namespace_prefix, ops
15
+
16
+
17
+ __all__ = ["GEMV_TYPES", "MAX_GEMV_ROWS", "dequantize", "get_rows", "mul_mat_id", "mul_mat_vec"]
18
+
19
+ # Upstream's MMVQ_MAX_BATCH_SIZE: `mul_mat_vec` has no implementation beyond this many rows, so a
20
+ # caller with more (prefill) dequantizes and uses an ordinary matmul.
21
+ MAX_GEMV_ROWS = 8
22
+
23
+ # ggml type ids `mul_mat_vec` implements, as this build reports them -- it is backend-specific, and
24
+ # a type routed into a gemv that has no kernel for it is a fault, not a fallback. CUDA covers
25
+ # Q4_0/Q4_1/Q5_0/Q5_1/Q8_0, the K quants, the IQ quants, MXFP4/NVFP4 and Q1_0/Q2_0; Metal is the
26
+ # same minus NVFP4/Q1_0/Q2_0, which its metallib has no kernels for. `dequantize` covers more, so
27
+ # check this before choosing the fused path.
28
+ try:
29
+ GEMV_TYPES = frozenset(ops.gemv_types())
30
+ except AttributeError:
31
+ # A build published before `gemv_types` existed; those are CUDA-only, so its list is theirs.
32
+ GEMV_TYPES = frozenset({2, 3, 6, 7, 8, 10, 11, 12, 13, 14, 16, 17, 18, 19, 20, 21, 22, 23, 29, 39, 40, 41, 42})
33
+
34
+
35
+ def get_rows(
36
+ blocks: torch.Tensor, indices: torch.Tensor, ggml_type: int, cols: int, dtype: torch.dtype
37
+ ) -> torch.Tensor:
38
+ """The rows `indices` names, unpacked: `(rows, bytes_per_row)` uint8 -> `(len(indices), cols)`.
39
+
40
+ ggml's `get_rows`, which dequantizes as it gathers -- so reading a few rows out of a large table
41
+ never touches the rest.
42
+ """
43
+ return ops.get_rows(blocks, indices, ggml_type, cols, dtype)
44
+
45
+
46
+ def dequantize(
47
+ blocks: torch.Tensor, ggml_type: int, rows: int, cols: int, dtype: torch.dtype
48
+ ) -> torch.Tensor:
49
+ """`(rows, bytes_per_row)` uint8 blocks -> `(rows, cols)` values of `dtype`."""
50
+ return ops.dequantize(blocks, ggml_type, rows, cols, dtype)
51
+
52
+
53
+ def mul_mat_vec(
54
+ blocks: torch.Tensor, x: torch.Tensor, ggml_type: int, out_features: int
55
+ ) -> torch.Tensor:
56
+ """Fused dequantize-gemv: `x @ blocks.T` without unpacking `blocks`.
57
+
58
+ `x` is `(rows, in_features)` and `rows` must be at most `MAX_GEMV_ROWS`. The result is f32
59
+ whatever `x`'s dtype was, since the kernel writes an f32 destination; cast it at the call site,
60
+ where the cast can be fused into whatever consumes it.
61
+ """
62
+ return ops.mul_mat_vec(blocks, x, ggml_type, out_features)
63
+
64
+
65
+ def mul_mat_id(
66
+ blocks: torch.Tensor, x: torch.Tensor, ids: torch.Tensor, ggml_type: int, out_features: int
67
+ ) -> torch.Tensor:
68
+ """One dispatch for a bank of routed experts: ggml's `mul_mv_id`.
69
+
70
+ `blocks` is `(n_experts, out_features, bytes_per_row)`, `x` is `(n_tokens, in_features)`, and
71
+ `ids` is `(n_tokens, n_used)` naming the expert each of a token's slots picked. The result is
72
+ `(n_tokens, n_used, out_features)` f32, one row per slot.
73
+
74
+ The alternative is a gemv per expert per layer, whose arithmetic is dwarfed by the dispatch
75
+ around it -- which is most of what a MoE decode step costs.
76
+ """
77
+ return ops.mul_mat_id(blocks, x, ids, ggml_type, out_features)
78
+
79
+
80
+ # Without these, torch.compile cannot trace the ops and breaks the graph at every call.
81
+ @torch.library.register_fake(add_op_namespace_prefix("get_rows"))
82
+ def _get_rows_fake(blocks, indices, ggml_type, cols, dtype):
83
+ return blocks.new_empty((indices.numel(), cols), dtype=dtype)
84
+
85
+
86
+ @torch.library.register_fake(add_op_namespace_prefix("dequantize"))
87
+ def _dequantize_fake(blocks, ggml_type, rows, cols, dtype):
88
+ return blocks.new_empty((rows, cols), dtype=dtype)
89
+
90
+
91
+ @torch.library.register_fake(add_op_namespace_prefix("mul_mat_vec"))
92
+ def _mul_mat_vec_fake(blocks, x, ggml_type, out_features):
93
+ return x.new_empty((x.shape[0], out_features), dtype=torch.float32)
94
+
95
+
96
+ @torch.library.register_fake(add_op_namespace_prefix("mul_mat_id"))
97
+ def _mul_mat_id_fake(blocks, x, ids, ggml_type, out_features):
98
+ return x.new_empty((x.shape[0], ids.shape[1], out_features), dtype=torch.float32)
build/torch212-metal-aarch64-darwin/_ggml_quantization_metal_63f3c1e.abi3.so ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:5c3b7f583105594757bbff3ef481ff808d14373787878b27772b27f22e210a46
3
+ size 3347416
build/torch212-metal-aarch64-darwin/_ops.py ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ import torch
2
+ from . import _ggml_quantization_metal_63f3c1e
3
+ ops = torch.ops._ggml_quantization_metal_63f3c1e
4
+
5
+ def add_op_namespace_prefix(op_name: str):
6
+ """
7
+ Prefix op by namespace.
8
+ """
9
+ return f"_ggml_quantization_metal_63f3c1e::{op_name}"
build/torch212-metal-aarch64-darwin/metadata.json ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "ggml-quantization",
3
+ "id": "_ggml_quantization_metal_63f3c1e",
4
+ "version": 1,
5
+ "license": "MIT",
6
+ "python-depends": [],
7
+ "backend": {
8
+ "type": "metal"
9
+ },
10
+ "digest": {
11
+ "algorithm": "sha256",
12
+ "files": {
13
+ "__init__.py": "iPXgZXBgY3CzpNUSjmCovMVNPLBol1KBaNoTzkXp5mM=",
14
+ "_ggml_quantization_metal_63f3c1e.abi3.so": "XDt/WDEFWUdXu/8+9IH/gI0UNzeHh4sndysn8i4hCkY=",
15
+ "_ops.py": "Ap/ials5aAa2giH9HUnXPFlmDos9zQ4ylpjIBpVUusQ="
16
+ }
17
+ },
18
+ "provenance": {
19
+ "kernel-builder": {
20
+ "version": "0.17.0-dev0",
21
+ "sha": "81f55ea30fd8f819dcf93a3c934dd584c895bd2f",
22
+ "dirty": false
23
+ },
24
+ "kernel": {
25
+ "sha": "63f3c1ea3f9eb1ba61b4a88bd93aaa86a84f55ea",
26
+ "dirty": false
27
+ }
28
+ }
29
+ }
build/torch212-metal-aarch64-darwin/metadata.json.sigstore ADDED
@@ -0,0 +1 @@
 
 
1
+ {"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json","verificationMaterial":{"certificate":{"rawBytes":"MIIHYjCCBuigAwIBAgIUQXr3qWLlkvNgZ5oCjIr9HFD5YzowCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjYwOTAyMTE1NTM4WhcNMjYwOTAyMTIwNTM4WjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAELPJO+fGPjBvjhgPourSaofgGuNq7t4lxHeyH89x2B6McQm5YNV19pH2cj3bUZM5eeTLrw7noDsys+KHQhal36KOCBgcwggYDMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUukEyraXwCmbwZTVcJWGdLTm7C8wwHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wbwYDVR0RAQH/BGUwY4ZhaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5Ly5naXRodWIvd29ya2Zsb3dzL2J1aWxkLW1hYy55YW1sQHJlZnMvaGVhZHMvbWFpbjA5BgorBgEEAYO/MAEBBCtodHRwczovL3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tMB8GCisGAQQBg78wAQIEEXdvcmtmbG93X2Rpc3BhdGNoMDYGCisGAQQBg78wAQMEKDYzZjNjMWVhM2Y5ZWIxYmE2MWI0YTg4YmQ5M2FhYTg2YTg0ZjU1ZWEwGwYKKwYBBAGDvzABBAQNQnVpbGQgKG1hY09TKTArBgorBgEEAYO/MAEFBB1odWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eTAdBgorBgEEAYO/MAEGBA9yZWZzL2hlYWRzL21haW4wOwYKKwYBBAGDvzABCAQtDCtodHRwczovL3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tMHEGCisGAQQBg78wAQkEYwxhaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5Ly5naXRodWIvd29ya2Zsb3dzL2J1aWxkLW1hYy55YW1sQHJlZnMvaGVhZHMvbWFpbjA4BgorBgEEAYO/MAEKBCoMKDYzZjNjMWVhM2Y5ZWIxYmE2MWI0YTg4YmQ5M2FhYTg2YTg0ZjU1ZWEwHQYKKwYBBAGDvzABCwQPDA1naXRodWItaG9zdGVkMEAGCisGAQQBg78wAQwEMgwwaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5MDgGCisGAQQBg78wAQ0EKgwoNjNmM2MxZWEzZjllYjFiYTYxYjRhODhiZDkzYWFhODZhODRmNTVlYTAfBgorBgEEAYO/MAEOBBEMD3JlZnMvaGVhZHMvbWFpbjAaBgorBgEEAYO/MAEPBAwMCjEwNzE0NzU1MjkwLgYKKwYBBAGDvzABEAQgDB5odHRwczovL2dpdGh1Yi5jb20vaHVnZ2luZ2ZhY2UwGAYKKwYBBAGDvzABEQQKDAgyNTcyMDc0MzBxBgorBgEEAYO/MAESBGMMYWh0dHBzOi8vZ2l0aHViLmNvbS9odWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eS8uZ2l0aHViL3dvcmtmbG93cy9idWlsZC1tYWMueWFtbEByZWZzL2hlYWRzL21haW4wOAYKKwYBBAGDvzABEwQqDCg2M2YzYzFlYTNmOWViMWJhNjFiNGE4OGJkOTNhYWE4NmE4NGY1NWVhMCEGCisGAQQBg78wARQEEwwRd29ya2Zsb3dfZGlzcGF0Y2gwZAYKKwYBBAGDvzABFQRWDFRodHRwczovL2dpdGh1Yi5jb20vaHVnZ2luZ2ZhY2Uva2VybmVscy1jb21tdW5pdHkvYWN0aW9ucy9ydW5zLzMzNjI0ODc1MDE2L2F0dGVtcHRzLzEwFgYKKwYBBAGDvzABFgQIDAZwdWJsaWMwRgYKKwYBBAGDvzABGAQ4DDZyZXBvOmh1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5OnJlZjpyZWZzL2hlYWRzL21haW4wgYsGCisGAQQB1nkCBAIEfQR7AHkAdwDdPTBqxscRMmMZHhyZZzcCokpeuN48rf+HinKALynujgAAAaBh+YfPAAAEAwBIMEYCIQDQyK7X2XKAJoEWPEiU82bsPwkuB7mgRj0XIBQqIuHrSQIhALiT0fjvaiH1IJ0p+4plFH4PjnildREnt/VedmE5CRPBMAoGCCqGSM49BAMDA2gAMGUCMQCgR5Z7G0v8fYDEoqSC6NARuD6ErLjUj/rMWpsiv8izBjhMAG4Ys78TH8fqFUZvKA8CMGwE4zuJV6vj4vvsF++2e5rl04rsJKzlEOpp1LB0IPuVLJJi5tre7zQu5g1+vk+bnA=="},"tlogEntries":[{"logIndex":"2685308347","logId":{"keyId":"wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="},"kindVersion":{"kind":"hashedrekord","version":"0.0.1"},"integratedTime":"1788350138","inclusionPromise":{"signedEntryTimestamp":"MEUCIQCeukhGjzuXb+V9F6Lr4J4re/aF7x8sLiOzrp5Mq67a1QIgNGOVLfWTv+gtE1MrzoM7tYmK3lSPofrseDPjgJ1sGSY="},"inclusionProof":{"logIndex":"2563404085","rootHash":"Yw9Kn0q+nQVf2cuMQmOqmEaY8EW8n06DQij5asxKjB0=","treeSize":"2563404094","hashes":["i+GhLf5HyqgbPxJFV0GfSNnbesbf22PC5MVtIUFbUHY=","ViyKVuv/dOtSgW6MZJj7gtx3EeRpFMSzX2FgHrCyXZg=","IsbWJXsVgWvJiIA8rjkp+r2Dp7faiuOFkImJ6NL64ag=","AGnN1ZO3629gQ1gpcU+Y/63sxn/UaZ09YrnqnzWsVVw=","pKmPCnDXe0+wm5aqFxAI4sPud0ihKy7W+3X6E5RvUKs=","RVSwGqFrgqLA+QVr9gTnk9li2haKE3xpLvjzoUvYOSk=","PLcJyFMz+PX4iElWppigcChwVTSvWQKm0jAsw90GQ2U=","yx1C8qORgQZyEAY/S3IweAzoPmtYm93g7ouqo0XujJQ=","7qHI9xRdbuuSQzIEYjspvGUklwG3oQUfXM2gwWzda2o=","F+YuHc8O3xlVfXj9owStrUJMnQTwY/NpQ4opoGW8gKc=","H2EWTqHaPzZyLGzFNdm1vZITRk/1WU8HnEukaJgoG2E=","oHcOV2H5nfxCFsD3J616h87Eiz+X30EjHngkLoDqRJQ=","HiSowX/eHl/VU2Q+A0EfICMiguqx41ThMqJf2HY+o9M=","itRV5Rvo1MAx7h7FsTOgBX8gRAnu5MLfPmZWuLwhlhA=","eXSLrLqKSxRTixSP/k4YimriB2lufao6trqTrsxxlyg=","SndbMKVtcTenAkwi2JBfGzD+mhexp1qJbRIY+A1JRIU=","xH/DCseLHr9eKoYT8qsORZK7zVdEGYWHuVtsVrD95wY="],"checkpoint":{"envelope":"rekor.sigstore.dev - 1193050959916656506\n2563404094\nYw9Kn0q+nQVf2cuMQmOqmEaY8EW8n06DQij5asxKjB0=\n\n— rekor.sigstore.dev wNI9ajBFAiBFIs7b3+Kzd7xNy6Vj52XFpaa+V7+q4woJfE1gHlPmEAIhAIv1Hscfp7Zt5TPXfNoIZuXkj0p1LNDWeERR9zjYwYvt\n"}},"canonicalizedBody":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiIwNzQwMTdiZmQ4MDkxMDZhMjZhM2M3NThjODZlODBiMDA5NTI2ODQ5NmJmNzBiMGEwZTdhNDQwNDA2YTYzNjUxIn19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FUUNJSFRlUkN5WGdXVDhPSHY2bjNoT1ZzVmU4N0V6Z3kzLzdOUk5JT2xKZGdaMkFpQm1uM0pWMHhPd2YvYStBTXNBa2RpSVUyclZGWSs5UEVkMFhSOHdIdTlZeEE9PSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVaFpha05EUW5WcFowRjNTVUpCWjBsVlVWaHlNM0ZYVEd4cmRrNW5XalZ2UTJwSmNqbElSa1ExV1hwdmQwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFpkMDlVUVhsTlZFVXhUbFJOTkZkb1kwNU5hbGwzVDFSQmVVMVVTWGRPVkUwMFYycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVZNVUVwUEsyWkhVR3BDZG1wb1oxQnZkWEpUWVc5bVowZDFUbkUzZERSc2VFaGxlVWdLT0RsNE1rSTJUV05SYlRWWlRsWXhPWEJJTW1OcU0ySlZXazAxWldWVVRISjNOMjV2UkhONWN5dExTRkZvWVd3ek5rdFBRMEpuWTNkbloxbEVUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXUkNaMDVXU0ZFMFJVWm5VVlYxYTBWNUNuSmhXSGREYldKM1dsUldZMHBYUjJSTVZHMDNRemgzZDBoM1dVUldVakJxUWtKbmQwWnZRVlV6T1ZCd2VqRlphMFZhWWpWeFRtcHdTMFpYYVhocE5Ga0tXa1E0ZDJKM1dVUldVakJTUVZGSUwwSkhWWGRaTkZwb1lVaFNNR05JVFRaTWVUbHVZVmhTYjJSWFNYVlpNamwwVERKb01Wb3laSEJpYldSdFdWZE9iQXBNTW5Sc1kyMDFiR0pJVFhSWk1qbDBZbGhXZFdGWVVqVk1lVFZ1WVZoU2IyUlhTWFprTWpsNVlUSmFjMkl6WkhwTU1rb3hZVmQ0YTB4WE1XaFplVFUxQ2xsWE1YTlJTRXBzV201TmRtRkhWbWhhU0UxMllsZEdjR0pxUVRWQ1oyOXlRbWRGUlVGWlR5OU5RVVZDUWtOMGIyUklVbmRqZW05MlRETlNkbUV5Vm5VS1RHMUdhbVJIYkhaaWJrMTFXakpzTUdGSVZtbGtXRTVzWTIxT2RtSnVVbXhpYmxGMVdUSTVkRTFDT0VkRGFYTkhRVkZSUW1jM09IZEJVVWxGUlZoa2RncGpiWFJ0WWtjNU0xZ3lVbkJqTTBKb1pFZE9iMDFFV1VkRGFYTkhRVkZSUW1jM09IZEJVVTFGUzBSWmVscHFUbXBOVjFab1RUSlpOVnBYU1hoWmJVVXlDazFYU1RCWlZHYzBXVzFSTlUweVJtaFpWR2N5V1ZSbk1GcHFWVEZhVjBWM1IzZFpTMHQzV1VKQ1FVZEVkbnBCUWtKQlVVNVJibFp3WWtkUlowdEhNV2dLV1RBNVZFdFVRWEpDWjI5eVFtZEZSVUZaVHk5TlFVVkdRa0l4YjJSWFpHNWhWelZ1V20xR2FscFRPWEphV0VwMVdsZDRla3hYVG5aaVZ6RXhZbTFzTUFwbFZFRmtRbWR2Y2tKblJVVkJXVTh2VFVGRlIwSkJPWGxhVjFwNlRESm9iRmxYVW5wTU1qRm9ZVmMwZDA5M1dVdExkMWxDUWtGSFJIWjZRVUpEUVZGMENrUkRkRzlrU0ZKM1kzcHZka3d6VW5aaE1sWjFURzFHYW1SSGJIWmliazExV2pKc01HRklWbWxrV0U1c1kyMU9kbUp1VW14aWJsRjFXVEk1ZEUxSVJVY0tRMmx6UjBGUlVVSm5OemgzUVZGclJWbDNlR2hoU0ZJd1kwaE5Oa3g1T1c1aFdGSnZaRmRKZFZreU9YUk1NbWd4V2pKa2NHSnRaRzFaVjA1c1RESjBiQXBqYlRWc1lraE5kRmt5T1hSaVdGWjFZVmhTTlV4NU5XNWhXRkp2WkZkSmRtUXlPWGxoTWxwellqTmtla3d5U2pGaFYzaHJURmN4YUZsNU5UVlpWekZ6Q2xGSVNteGFiazEyWVVkV2FGcElUWFppVjBad1ltcEJORUpuYjNKQ1owVkZRVmxQTDAxQlJVdENRMjlOUzBSWmVscHFUbXBOVjFab1RUSlpOVnBYU1hnS1dXMUZNazFYU1RCWlZHYzBXVzFSTlUweVJtaFpWR2N5V1ZSbk1GcHFWVEZhVjBWM1NGRlpTMHQzV1VKQ1FVZEVkbnBCUWtOM1VWQkVRVEZ1WVZoU2J3cGtWMGwwWVVjNWVtUkhWbXROUlVGSFEybHpSMEZSVVVKbk56aDNRVkYzUlUxbmQzZGhTRkl3WTBoTk5reDVPVzVoV0ZKdlpGZEpkVmt5T1hSTU1tZ3hDbG95WkhCaWJXUnRXVmRPYkV3eWRHeGpiVFZzWWtoTmRGa3lPWFJpV0ZaMVlWaFNOVTFFWjBkRGFYTkhRVkZSUW1jM09IZEJVVEJGUzJkM2IwNXFUbTBLVFRKTmVGcFhSWHBhYW14c1dXcEdhVmxVV1hoWmFsSm9UMFJvYVZwRWEzcFpWMFpvVDBSYWFFOUVVbTFPVkZac1dWUkJaa0puYjNKQ1owVkZRVmxQTHdwTlFVVlBRa0pGVFVRelNteGFiazEyWVVkV2FGcElUWFppVjBad1ltcEJZVUpuYjNKQ1owVkZRVmxQTDAxQlJWQkNRWGROUTJwRmQwNTZSVEJPZWxVeENrMXFhM2RNWjFsTFMzZFpRa0pCUjBSMmVrRkNSVUZSWjBSQ05XOWtTRkozWTNwdmRrd3laSEJrUjJneFdXazFhbUl5TUhaaFNGWnVXakpzZFZveVdtZ0tXVEpWZDBkQldVdExkMWxDUWtGSFJIWjZRVUpGVVZGTFJFRm5lVTVVWTNsTlJHTXdUWHBDZUVKbmIzSkNaMFZGUVZsUEwwMUJSVk5DUjAxTldWZG9NQXBrU0VKNlQyazRkbG95YkRCaFNGWnBURzFPZG1KVE9XOWtWMlJ1WVZjMWJscHRSbXBhVXpseVdsaEtkVnBYZUhwTVYwNTJZbGN4TVdKdGJEQmxVemgxQ2xveWJEQmhTRlpwVEROa2RtTnRkRzFpUnprelkzazVhV1JYYkhOYVF6RjBXVmROZFdWWFJuUmlSVUo1V2xkYWVrd3lhR3haVjFKNlRESXhhR0ZYTkhjS1QwRlpTMHQzV1VKQ1FVZEVkbnBCUWtWM1VYRkVRMmN5VFRKWmVsbDZSbXhaVkU1dFQxZFdhVTFYU21oT2FrWnBUa2RGTkU5SFNtdFBWRTVvV1ZkRk5BcE9iVVUwVGtkWk1VNVhWbWhOUTBWSFEybHpSMEZSVVVKbk56aDNRVkpSUlVWM2QxSmtNamw1WVRKYWMySXpaR1phUjJ4NlkwZEdNRmt5WjNkYVFWbExDa3QzV1VKQ1FVZEVkbnBCUWtaUlVsZEVSbEp2WkVoU2QyTjZiM1pNTW1Sd1pFZG9NVmxwTldwaU1qQjJZVWhXYmxveWJIVmFNbHBvV1RKVmRtRXlWbmtLWW0xV2MyTjVNV3BpTWpGMFpGYzFjR1JJYTNaWlYwNHdZVmM1ZFdONU9YbGtWelY2VEhwTmVrNXFTVEJQUkdNeFRVUkZNa3d5UmpCa1IxWjBZMGhTZWdwTWVrVjNSbWRaUzB0M1dVSkNRVWRFZG5wQlFrWm5VVWxFUVZwM1pGZEtjMkZYVFhkU1oxbExTM2RaUWtKQlIwUjJla0ZDUjBGUk5FUkVXbmxhV0VKMkNrOXRhREZhTW1Sd1ltMWtiVmxYVG14TU1uUnNZMjAxYkdKSVRYUlpNamwwWWxoV2RXRllValZQYmtwc1dtcHdlVnBYV25wTU1taHNXVmRTZWt3eU1XZ0tZVmMwZDJkWmMwZERhWE5IUVZGUlFqRnVhME5DUVVsRlpsRlNOMEZJYTBGa2QwUmtVRlJDY1hoelkxSk5iVTFhU0doNVdscDZZME52YTNCbGRVNDBPQXB5Wml0SWFXNUxRVXg1Ym5WcVowRkJRV0ZDYUN0WlpsQkJRVUZGUVhkQ1NVMUZXVU5KVVVSUmVVczNXREpZUzBGS2IwVlhVRVZwVlRneVluTlFkMnQxQ2tJM2JXZFNhakJZU1VKUmNVbDFTSEpUVVVsb1FVeHBWREJtYW5aaGFVZ3hTVW93Y0NzMGNHeEdTRFJRYW01cGJHUlNSVzUwTDFabFpHMUZOVU5TVUVJS1RVRnZSME5EY1VkVFRUUTVRa0ZOUkVFeVowRk5SMVZEVFZGRFoxSTFXamRITUhZNFpsbEVSVzl4VTBNMlRrRlNkVVEyUlhKTWFsVnFMM0pOVjNCemFRcDJPR2w2UW1wb1RVRkhORmx6TnpoVVNEaG1jVVpWV25aTFFUaERUVWQzUlRSNmRVcFdOblpxTkhaMmMwWXJLekpsTlhKc01EUnljMHBMZW14RlQzQndDakZNUWpCSlVIVldURXBLYVRWMGNtVTNlbEYxTldjeEszWnJLMkp1UVQwOUNpMHRMUzB0UlU1RUlFTkZVbFJKUmtsRFFWUkZMUzB0TFMwSyJ9fX19"}],"timestampVerificationData":{"rfc3161Timestamps":[{"signedTimestamp":"MIICyTADAgEAMIICwAYJKoZIhvcNAQcCoIICsTCCAq0CAQMxDTALBglghkgBZQMEAgEwgbgGCyqGSIb3DQEJEAEEoIGoBIGlMIGiAgEBBgkrBgEEAYO/MAIwMTANBglghkgBZQMEAgEFAAQgR0To2Ev67fMbng7zhxNPRE0px1JskZPyKl248kSsC48CFQDDGgK5S7O24hDhORh5dHiDxWcIYBgPMjAyNjA5MDIxMTU1MzhaMAMCAQGgMqQwMC4xFTATBgNVBAoTDHNpZ3N0b3JlLmRldjEVMBMGA1UEAxMMc2lnc3RvcmUtdHNhoAAxggHaMIIB1gIBATBRMDkxFTATBgNVBAoTDHNpZ3N0b3JlLmRldjEgMB4GA1UEAxMXc2lnc3RvcmUtdHNhLXNlbGZzaWduZWQCFDoTVC8MkGHuvMFDL8uKjosqI4sMMAsGCWCGSAFlAwQCAaCB/DAaBgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQwHAYJKoZIhvcNAQkFMQ8XDTI2MDkwMjExNTUzOFowLwYJKoZIhvcNAQkEMSIEIEvMCLwKUNcI5bhcltde8tQJbHAYFisHWV0VcmjxKwhQMIGOBgsqhkiG9w0BCRACLzF/MH0wezB5BCCF+Se8B6tiysO0Q1bBDvyBssaIP9p6uebYcNnROs0FtzBVMD2kOzA5MRUwEwYDVQQKEwxzaWdzdG9yZS5kZXYxIDAeBgNVBAMTF3NpZ3N0b3JlLXRzYS1zZWxmc2lnbmVkAhQ6E1QvDJBh7rzBQy/Lio6LKiOLDDAKBggqhkjOPQQDAgRmMGQCMF6jlzoBJBK0Vq/XeIpb6l0kZkR75wZIakVyJZuBiSugZ4tR5fJ1OWuxZZfbHNufWwIwEUjDVbIY+jzanNMrZju0gAHUgOv61sgR8HDRo9y9bRwt9406dTsa5IaX567LhS81"}]}},"messageSignature":{"messageDigest":{"algorithm":"SHA2_256","digest":"B0AXv9gJEGomo8dYyG6AsAlSaElr9wsKDnpEBAamNlE="},"signature":"MEQCIHTeRCyXgWT8OHv6n3hOVsVe87Ezgy3/7NRNIOlJdgZ2AiBmn3JV0xOwf/a+AMsAkdiIU2rVFY+9PEd0XR8wHu9YxA=="}}
build/torch213-metal-aarch64-darwin/__init__.py ADDED
@@ -0,0 +1,98 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Compute directly on the packed blocks of a GGUF checkpoint.
2
+
3
+ A GGUF weight is stored as blocks of 32 or 256 values sharing a scale. These kernels read that
4
+ layout as it is, so a quantized model can be loaded and run without ever materializing a dense
5
+ copy — which is the whole memory saving.
6
+
7
+ Ported from llama.cpp's ggml-cuda; `vendor/UPSTREAM` pins the revision. The ops are named for what
8
+ they do rather than for a backend: each backend registers its own implementation of the same
9
+ schema, so calls dispatch on the tensor's device.
10
+ """
11
+
12
+ import torch
13
+
14
+ from ._ops import add_op_namespace_prefix, ops
15
+
16
+
17
+ __all__ = ["GEMV_TYPES", "MAX_GEMV_ROWS", "dequantize", "get_rows", "mul_mat_id", "mul_mat_vec"]
18
+
19
+ # Upstream's MMVQ_MAX_BATCH_SIZE: `mul_mat_vec` has no implementation beyond this many rows, so a
20
+ # caller with more (prefill) dequantizes and uses an ordinary matmul.
21
+ MAX_GEMV_ROWS = 8
22
+
23
+ # ggml type ids `mul_mat_vec` implements, as this build reports them -- it is backend-specific, and
24
+ # a type routed into a gemv that has no kernel for it is a fault, not a fallback. CUDA covers
25
+ # Q4_0/Q4_1/Q5_0/Q5_1/Q8_0, the K quants, the IQ quants, MXFP4/NVFP4 and Q1_0/Q2_0; Metal is the
26
+ # same minus NVFP4/Q1_0/Q2_0, which its metallib has no kernels for. `dequantize` covers more, so
27
+ # check this before choosing the fused path.
28
+ try:
29
+ GEMV_TYPES = frozenset(ops.gemv_types())
30
+ except AttributeError:
31
+ # A build published before `gemv_types` existed; those are CUDA-only, so its list is theirs.
32
+ GEMV_TYPES = frozenset({2, 3, 6, 7, 8, 10, 11, 12, 13, 14, 16, 17, 18, 19, 20, 21, 22, 23, 29, 39, 40, 41, 42})
33
+
34
+
35
+ def get_rows(
36
+ blocks: torch.Tensor, indices: torch.Tensor, ggml_type: int, cols: int, dtype: torch.dtype
37
+ ) -> torch.Tensor:
38
+ """The rows `indices` names, unpacked: `(rows, bytes_per_row)` uint8 -> `(len(indices), cols)`.
39
+
40
+ ggml's `get_rows`, which dequantizes as it gathers -- so reading a few rows out of a large table
41
+ never touches the rest.
42
+ """
43
+ return ops.get_rows(blocks, indices, ggml_type, cols, dtype)
44
+
45
+
46
+ def dequantize(
47
+ blocks: torch.Tensor, ggml_type: int, rows: int, cols: int, dtype: torch.dtype
48
+ ) -> torch.Tensor:
49
+ """`(rows, bytes_per_row)` uint8 blocks -> `(rows, cols)` values of `dtype`."""
50
+ return ops.dequantize(blocks, ggml_type, rows, cols, dtype)
51
+
52
+
53
+ def mul_mat_vec(
54
+ blocks: torch.Tensor, x: torch.Tensor, ggml_type: int, out_features: int
55
+ ) -> torch.Tensor:
56
+ """Fused dequantize-gemv: `x @ blocks.T` without unpacking `blocks`.
57
+
58
+ `x` is `(rows, in_features)` and `rows` must be at most `MAX_GEMV_ROWS`. The result is f32
59
+ whatever `x`'s dtype was, since the kernel writes an f32 destination; cast it at the call site,
60
+ where the cast can be fused into whatever consumes it.
61
+ """
62
+ return ops.mul_mat_vec(blocks, x, ggml_type, out_features)
63
+
64
+
65
+ def mul_mat_id(
66
+ blocks: torch.Tensor, x: torch.Tensor, ids: torch.Tensor, ggml_type: int, out_features: int
67
+ ) -> torch.Tensor:
68
+ """One dispatch for a bank of routed experts: ggml's `mul_mv_id`.
69
+
70
+ `blocks` is `(n_experts, out_features, bytes_per_row)`, `x` is `(n_tokens, in_features)`, and
71
+ `ids` is `(n_tokens, n_used)` naming the expert each of a token's slots picked. The result is
72
+ `(n_tokens, n_used, out_features)` f32, one row per slot.
73
+
74
+ The alternative is a gemv per expert per layer, whose arithmetic is dwarfed by the dispatch
75
+ around it -- which is most of what a MoE decode step costs.
76
+ """
77
+ return ops.mul_mat_id(blocks, x, ids, ggml_type, out_features)
78
+
79
+
80
+ # Without these, torch.compile cannot trace the ops and breaks the graph at every call.
81
+ @torch.library.register_fake(add_op_namespace_prefix("get_rows"))
82
+ def _get_rows_fake(blocks, indices, ggml_type, cols, dtype):
83
+ return blocks.new_empty((indices.numel(), cols), dtype=dtype)
84
+
85
+
86
+ @torch.library.register_fake(add_op_namespace_prefix("dequantize"))
87
+ def _dequantize_fake(blocks, ggml_type, rows, cols, dtype):
88
+ return blocks.new_empty((rows, cols), dtype=dtype)
89
+
90
+
91
+ @torch.library.register_fake(add_op_namespace_prefix("mul_mat_vec"))
92
+ def _mul_mat_vec_fake(blocks, x, ggml_type, out_features):
93
+ return x.new_empty((x.shape[0], out_features), dtype=torch.float32)
94
+
95
+
96
+ @torch.library.register_fake(add_op_namespace_prefix("mul_mat_id"))
97
+ def _mul_mat_id_fake(blocks, x, ids, ggml_type, out_features):
98
+ return x.new_empty((x.shape[0], ids.shape[1], out_features), dtype=torch.float32)
build/torch213-metal-aarch64-darwin/_ggml_quantization_metal_63f3c1e.abi3.so ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:2bb7cc62bb7f24bcb3bba127f53386f4b85b4ec8e8f7b472146dbbe32be2ba8a
3
+ size 3347416
build/torch213-metal-aarch64-darwin/_ops.py ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ import torch
2
+ from . import _ggml_quantization_metal_63f3c1e
3
+ ops = torch.ops._ggml_quantization_metal_63f3c1e
4
+
5
+ def add_op_namespace_prefix(op_name: str):
6
+ """
7
+ Prefix op by namespace.
8
+ """
9
+ return f"_ggml_quantization_metal_63f3c1e::{op_name}"
build/torch213-metal-aarch64-darwin/metadata.json ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "ggml-quantization",
3
+ "id": "_ggml_quantization_metal_63f3c1e",
4
+ "version": 1,
5
+ "license": "MIT",
6
+ "python-depends": [],
7
+ "backend": {
8
+ "type": "metal"
9
+ },
10
+ "digest": {
11
+ "algorithm": "sha256",
12
+ "files": {
13
+ "__init__.py": "iPXgZXBgY3CzpNUSjmCovMVNPLBol1KBaNoTzkXp5mM=",
14
+ "_ggml_quantization_metal_63f3c1e.abi3.so": "K7fMYrt/JLyzu6En9TOG9LhbTsjo97RyFG274yviuoo=",
15
+ "_ops.py": "Ap/ials5aAa2giH9HUnXPFlmDos9zQ4ylpjIBpVUusQ="
16
+ }
17
+ },
18
+ "provenance": {
19
+ "kernel-builder": {
20
+ "version": "0.17.0-dev0",
21
+ "sha": "81f55ea30fd8f819dcf93a3c934dd584c895bd2f",
22
+ "dirty": false
23
+ },
24
+ "kernel": {
25
+ "sha": "63f3c1ea3f9eb1ba61b4a88bd93aaa86a84f55ea",
26
+ "dirty": false
27
+ }
28
+ }
29
+ }
build/torch213-metal-aarch64-darwin/metadata.json.sigstore ADDED
@@ -0,0 +1 @@
 
 
1
+ {"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json","verificationMaterial":{"certificate":{"rawBytes":"MIIHYDCCBuegAwIBAgIUA8sAqyEQ+d1zWIR1sDcdeHk8ITgwCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjYwOTAyMTE1NTM5WhcNMjYwOTAyMTIwNTM5WjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEyD+evNcCKEAjAItElDyckX5uZyfAhr/prMLHO0bBVavexnJbiiidskYP6Q1IwvtCRp7UZ4WL3UAxeh/6FDPZZ6OCBgYwggYCMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUfIou181hDwZihGOM5mCKg7CeUGwwHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wbwYDVR0RAQH/BGUwY4ZhaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5Ly5naXRodWIvd29ya2Zsb3dzL2J1aWxkLW1hYy55YW1sQHJlZnMvaGVhZHMvbWFpbjA5BgorBgEEAYO/MAEBBCtodHRwczovL3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tMB8GCisGAQQBg78wAQIEEXdvcmtmbG93X2Rpc3BhdGNoMDYGCisGAQQBg78wAQMEKDYzZjNjMWVhM2Y5ZWIxYmE2MWI0YTg4YmQ5M2FhYTg2YTg0ZjU1ZWEwGwYKKwYBBAGDvzABBAQNQnVpbGQgKG1hY09TKTArBgorBgEEAYO/MAEFBB1odWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eTAdBgorBgEEAYO/MAEGBA9yZWZzL2hlYWRzL21haW4wOwYKKwYBBAGDvzABCAQtDCtodHRwczovL3Rva2VuLmFjdGlvbnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tMHEGCisGAQQBg78wAQkEYwxhaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5Ly5naXRodWIvd29ya2Zsb3dzL2J1aWxkLW1hYy55YW1sQHJlZnMvaGVhZHMvbWFpbjA4BgorBgEEAYO/MAEKBCoMKDYzZjNjMWVhM2Y5ZWIxYmE2MWI0YTg4YmQ5M2FhYTg2YTg0ZjU1ZWEwHQYKKwYBBAGDvzABCwQPDA1naXRodWItaG9zdGVkMEAGCisGAQQBg78wAQwEMgwwaHR0cHM6Ly9naXRodWIuY29tL2h1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5MDgGCisGAQQBg78wAQ0EKgwoNjNmM2MxZWEzZjllYjFiYTYxYjRhODhiZDkzYWFhODZhODRmNTVlYTAfBgorBgEEAYO/MAEOBBEMD3JlZnMvaGVhZHMvbWFpbjAaBgorBgEEAYO/MAEPBAwMCjEwNzE0NzU1MjkwLgYKKwYBBAGDvzABEAQgDB5odHRwczovL2dpdGh1Yi5jb20vaHVnZ2luZ2ZhY2UwGAYKKwYBBAGDvzABEQQKDAgyNTcyMDc0MzBxBgorBgEEAYO/MAESBGMMYWh0dHBzOi8vZ2l0aHViLmNvbS9odWdnaW5nZmFjZS9rZXJuZWxzLWNvbW11bml0eS8uZ2l0aHViL3dvcmtmbG93cy9idWlsZC1tYWMueWFtbEByZWZzL2hlYWRzL21haW4wOAYKKwYBBAGDvzABEwQqDCg2M2YzYzFlYTNmOWViMWJhNjFiNGE4OGJkOTNhYWE4NmE4NGY1NWVhMCEGCisGAQQBg78wARQEEwwRd29ya2Zsb3dfZGlzcGF0Y2gwZAYKKwYBBAGDvzABFQRWDFRodHRwczovL2dpdGh1Yi5jb20vaHVnZ2luZ2ZhY2Uva2VybmVscy1jb21tdW5pdHkvYWN0aW9ucy9ydW5zLzMzNjI0ODc1MDE2L2F0dGVtcHRzLzEwFgYKKwYBBAGDvzABFgQIDAZwdWJsaWMwRgYKKwYBBAGDvzABGAQ4DDZyZXBvOmh1Z2dpbmdmYWNlL2tlcm5lbHMtY29tbXVuaXR5OnJlZjpyZWZzL2hlYWRzL21haW4wgYoGCisGAQQB1nkCBAIEfAR6AHgAdgDdPTBqxscRMmMZHhyZZzcCokpeuN48rf+HinKALynujgAAAaBh+Y1gAAAEAwBHMEUCIBfg15c5eccaeocxgMXI6GBHXqS9mdIvF7ox1I4UmUrTAiEAsdJhOCn1wQOCExqmEdnl7yTWhGzDR7vD6lFFAUyL2LMwCgYIKoZIzj0EAwMDZwAwZAIwKBJZNxW90QcAwDBVVvgynfx+lqXNNIELpssEh/jgpQoZm5pl+7haMgJI8dRNkSOkAjAk3XiK9HvNX9o7hAj4ZXtbAKmFUB3DAEZYtPWtF9fgCzOklAyr5D7IeCTwCDlNkzQ="},"tlogEntries":[{"logIndex":"2685308397","logId":{"keyId":"wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="},"kindVersion":{"kind":"hashedrekord","version":"0.0.1"},"integratedTime":"1788350140","inclusionPromise":{"signedEntryTimestamp":"MEQCIAsetNKbPLA6RI31K7ZgnhEkS2KNKn1AhnSsNwWmffKUAiAu9BkH7zvHIUtrokJOZgxX9atGu0ygUNECmZEC+gRAGA=="},"inclusionProof":{"logIndex":"2563404135","rootHash":"DYBdiHsnsjYqTAQmBs55k/z7N9v0gpw4QXjVK2fYzvk=","treeSize":"2563404141","hashes":["ZK/RFlw3+PGyKRbHSiRgZrwTOd4GMbROs5nYy9B3QDE=","LsJ5V9ZzRpKAXqsius6kWXqBqzW5QGT7X6rSgGD236s=","GGf/tdV93RclZZT6MP/g5DnB80nTv78VEHfVYc9X+Us=","vxBXON0lWFaxdw8wPWmcp61nVYl5M3Yy5M/BoJnvJVE=","DZytdJO5CQEp6d+H6mGVanwoLfha/VuIaUinDUy063o=","2CXIOfDeMiOU4dMcijEg2ej5frR5iF7WdHbtwLsADXc=","PLcJyFMz+PX4iElWppigcChwVTSvWQKm0jAsw90GQ2U=","yx1C8qORgQZyEAY/S3IweAzoPmtYm93g7ouqo0XujJQ=","7qHI9xRdbuuSQzIEYjspvGUklwG3oQUfXM2gwWzda2o=","F+YuHc8O3xlVfXj9owStrUJMnQTwY/NpQ4opoGW8gKc=","H2EWTqHaPzZyLGzFNdm1vZITRk/1WU8HnEukaJgoG2E=","oHcOV2H5nfxCFsD3J616h87Eiz+X30EjHngkLoDqRJQ=","HiSowX/eHl/VU2Q+A0EfICMiguqx41ThMqJf2HY+o9M=","itRV5Rvo1MAx7h7FsTOgBX8gRAnu5MLfPmZWuLwhlhA=","eXSLrLqKSxRTixSP/k4YimriB2lufao6trqTrsxxlyg=","SndbMKVtcTenAkwi2JBfGzD+mhexp1qJbRIY+A1JRIU=","xH/DCseLHr9eKoYT8qsORZK7zVdEGYWHuVtsVrD95wY="],"checkpoint":{"envelope":"rekor.sigstore.dev - 1193050959916656506\n2563404141\nDYBdiHsnsjYqTAQmBs55k/z7N9v0gpw4QXjVK2fYzvk=\n\n— rekor.sigstore.dev wNI9ajBFAiBJhuN1JNT2QLfHsimPG8Ec3oL0AIkx8ckS07sWSZp22gIhAIhmwCsub+MT+8QXFmGMZJI/yZLokQMSRFsMTDo2qQhr\n"}},"canonicalizedBody":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiIxN2I3ODNmY2QyMmU4YzZlMDIwNWNlMTdmYWNjMzUyZTg1NTI3NmRiNDNkNTUyNDZmMjRiZTU0ZTJmY2JkMDUyIn19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FWUNJUUM1dnUwNkNCMVJCRTZXN2xOQkFyblk2Q2dkUXk2cTYvRTIvc2M1UFZEUFBBSWhBTGZwdEVRR0ljbGRmT0xjTERCZ3Z6R1ROdVF2SmhuamlRUGEzY0RBcS9DTCIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVaFpSRU5EUW5WbFowRjNTVUpCWjBsVlFUaHpRWEY1UlZFclpERjZWMGxTTVhORVkyUmxTR3M0U1ZSbmQwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFpkMDlVUVhsTlZFVXhUbFJOTlZkb1kwNU5hbGwzVDFSQmVVMVVTWGRPVkUwMVYycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVY1UkN0bGRrNWpRMHRGUVdwQlNYUkZiRVI1WTJ0WU5YVmFlV1pCYUhJdmNISk5URWdLVHpCaVFsWmhkbVY0YmtwaWFXbHBaSE5yV1ZBMlVURkpkM1owUTFKd04xVmFORmRNTTFWQmVHVm9MelpHUkZCYVdqWlBRMEpuV1hkbloxbERUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXUkNaMDVXU0ZFMFJVWm5VVlZtU1c5MUNqRTRNV2hFZDFwcGFFZFBUVFZ0UTB0bk4wTmxWVWQzZDBoM1dVUldVakJxUWtKbmQwWnZRVlV6T1ZCd2VqRlphMFZhWWpWeFRtcHdTMFpYYVhocE5Ga0tXa1E0ZDJKM1dVUldVakJTUVZGSUwwSkhWWGRaTkZwb1lVaFNNR05JVFRaTWVUbHVZVmhTYjJSWFNYVlpNamwwVERKb01Wb3laSEJpYldSdFdWZE9iQXBNTW5Sc1kyMDFiR0pJVFhSWk1qbDBZbGhXZFdGWVVqVk1lVFZ1WVZoU2IyUlhTWFprTWpsNVlUSmFjMkl6WkhwTU1rb3hZVmQ0YTB4WE1XaFplVFUxQ2xsWE1YTlJTRXBzV201TmRtRkhWbWhhU0UxMllsZEdjR0pxUVRWQ1oyOXlRbWRGUlVGWlR5OU5RVVZDUWtOMGIyUklVbmRqZW05MlRETlNkbUV5Vm5VS1RHMUdhbVJIYkhaaWJrMTFXakpzTUdGSVZtbGtXRTVzWTIxT2RtSnVVbXhpYmxGMVdUSTVkRTFDT0VkRGFYTkhRVkZSUW1jM09IZEJVVWxGUlZoa2RncGpiWFJ0WWtjNU0xZ3lVbkJqTTBKb1pFZE9iMDFFV1VkRGFYTkhRVkZSUW1jM09IZEJVVTFGUzBSWmVscHFUbXBOVjFab1RUSlpOVnBYU1hoWmJVVXlDazFYU1RCWlZHYzBXVzFSTlUweVJtaFpWR2N5V1ZSbk1GcHFWVEZhVjBWM1IzZFpTMHQzV1VKQ1FVZEVkbnBCUWtKQlVVNVJibFp3WWtkUlowdEhNV2dLV1RBNVZFdFVRWEpDWjI5eVFtZEZSVUZaVHk5TlFVVkdRa0l4YjJSWFpHNWhWelZ1V20xR2FscFRPWEphV0VwMVdsZDRla3hYVG5aaVZ6RXhZbTFzTUFwbFZFRmtRbWR2Y2tKblJVVkJXVTh2VFVGRlIwSkJPWGxhVjFwNlRESm9iRmxYVW5wTU1qRm9ZVmMwZDA5M1dVdExkMWxDUWtGSFJIWjZRVUpEUVZGMENrUkRkRzlrU0ZKM1kzcHZka3d6VW5aaE1sWjFURzFHYW1SSGJIWmliazExV2pKc01HRklWbWxrV0U1c1kyMU9kbUp1VW14aWJsRjFXVEk1ZEUxSVJVY0tRMmx6UjBGUlVVSm5OemgzUVZGclJWbDNlR2hoU0ZJd1kwaE5Oa3g1T1c1aFdGSnZaRmRKZFZreU9YUk1NbWd4V2pKa2NHSnRaRzFaVjA1c1RESjBiQXBqYlRWc1lraE5kRmt5T1hSaVdGWjFZVmhTTlV4NU5XNWhXRkp2WkZkSmRtUXlPWGxoTWxwellqTmtla3d5U2pGaFYzaHJURmN4YUZsNU5UVlpWekZ6Q2xGSVNteGFiazEyWVVkV2FGcElUWFppVjBad1ltcEJORUpuYjNKQ1owVkZRVmxQTDAxQlJVdENRMjlOUzBSWmVscHFUbXBOVjFab1RUSlpOVnBYU1hnS1dXMUZNazFYU1RCWlZHYzBXVzFSTlUweVJtaFpWR2N5V1ZSbk1GcHFWVEZhVjBWM1NGRlpTMHQzV1VKQ1FVZEVkbnBCUWtOM1VWQkVRVEZ1WVZoU2J3cGtWMGwwWVVjNWVtUkhWbXROUlVGSFEybHpSMEZSVVVKbk56aDNRVkYzUlUxbmQzZGhTRkl3WTBoTk5reDVPVzVoV0ZKdlpGZEpkVmt5T1hSTU1tZ3hDbG95WkhCaWJXUnRXVmRPYkV3eWRHeGpiVFZzWWtoTmRGa3lPWFJpV0ZaMVlWaFNOVTFFWjBkRGFYTkhRVkZSUW1jM09IZEJVVEJGUzJkM2IwNXFUbTBLVFRKTmVGcFhSWHBhYW14c1dXcEdhVmxVV1hoWmFsSm9UMFJvYVZwRWEzcFpWMFpvVDBSYWFFOUVVbTFPVkZac1dWUkJaa0puYjNKQ1owVkZRVmxQTHdwTlFVVlBRa0pGVFVRelNteGFiazEyWVVkV2FGcElUWFppVjBad1ltcEJZVUpuYjNKQ1owVkZRVmxQTDAxQlJWQkNRWGROUTJwRmQwNTZSVEJPZWxVeENrMXFhM2RNWjFsTFMzZFpRa0pCUjBSMmVrRkNSVUZSWjBSQ05XOWtTRkozWTNwdmRrd3laSEJrUjJneFdXazFhbUl5TUhaaFNGWnVXakpzZFZveVdtZ0tXVEpWZDBkQldVdExkMWxDUWtGSFJIWjZRVUpGVVZGTFJFRm5lVTVVWTNsTlJHTXdUWHBDZUVKbmIzSkNaMFZGUVZsUEwwMUJSVk5DUjAxTldWZG9NQXBrU0VKNlQyazRkbG95YkRCaFNGWnBURzFPZG1KVE9XOWtWMlJ1WVZjMWJscHRSbXBhVXpseVdsaEtkVnBYZUhwTVYwNTJZbGN4TVdKdGJEQmxVemgxQ2xveWJEQmhTRlpwVEROa2RtTnRkRzFpUnprelkzazVhV1JYYkhOYVF6RjBXVmROZFdWWFJuUmlSVUo1V2xkYWVrd3lhR3haVjFKNlRESXhhR0ZYTkhjS1QwRlpTMHQzV1VKQ1FVZEVkbnBCUWtWM1VYRkVRMmN5VFRKWmVsbDZSbXhaVkU1dFQxZFdhVTFYU21oT2FrWnBUa2RGTkU5SFNtdFBWRTVvV1ZkRk5BcE9iVVUwVGtkWk1VNVhWbWhOUTBWSFEybHpSMEZSVVVKbk56aDNRVkpSUlVWM2QxSmtNamw1WVRKYWMySXpaR1phUjJ4NlkwZEdNRmt5WjNkYVFWbExDa3QzV1VKQ1FVZEVkbnBCUWtaUlVsZEVSbEp2WkVoU2QyTjZiM1pNTW1Sd1pFZG9NVmxwTldwaU1qQjJZVWhXYmxveWJIVmFNbHBvV1RKVmRtRXlWbmtLWW0xV2MyTjVNV3BpTWpGMFpGYzFjR1JJYTNaWlYwNHdZVmM1ZFdONU9YbGtWelY2VEhwTmVrNXFTVEJQUkdNeFRVUkZNa3d5UmpCa1IxWjBZMGhTZWdwTWVrVjNSbWRaUzB0M1dVSkNRVWRFZG5wQlFrWm5VVWxFUVZwM1pGZEtjMkZYVFhkU1oxbExTM2RaUWtKQlIwUjJla0ZDUjBGUk5FUkVXbmxhV0VKMkNrOXRhREZhTW1Sd1ltMWtiVmxYVG14TU1uUnNZMjAxYkdKSVRYUlpNamwwWWxoV2RXRllValZQYmtwc1dtcHdlVnBYV25wTU1taHNXVmRTZWt3eU1XZ0tZVmMwZDJkWmIwZERhWE5IUVZGUlFqRnVhME5DUVVsRlprRlNOa0ZJWjBGa1owUmtVRlJDY1hoelkxSk5iVTFhU0doNVdscDZZME52YTNCbGRVNDBPQXB5Wml0SWFXNUxRVXg1Ym5WcVowRkJRV0ZDYUN0Wk1XZEJRVUZGUVhkQ1NFMUZWVU5KUW1abk1UVmpOV1ZqWTJGbGIyTjRaMDFZU1RaSFFraFljVk01Q20xa1NYWkdOMjk0TVVrMFZXMVZjbFJCYVVWQmMyUkthRTlEYmpGM1VVOURSWGh4YlVWa2JtdzNlVlJYYUVkNlJGSTNka1EyYkVaR1FWVjVUREpNVFhjS1EyZFpTVXR2V2tsNmFqQkZRWGROUkZwM1FYZGFRVWwzUzBKS1drNTRWemt3VVdOQmQwUkNWbFoyWjNsdVpuZ3JiSEZZVGs1SlJVeHdjM05GYUM5cVp3cHdVVzlhYlRWd2JDczNhR0ZOWjBwSk9HUlNUbXRUVDJ0QmFrRnJNMWhwU3psSWRrNVlPVzgzYUVGcU5GcFlkR0pCUzIxR1ZVSXpSRUZGV2xsMFVGZDBDa1k1Wm1kRGVrOXJiRUY1Y2pWRU4wbGxRMVIzUTBSc1RtdDZVVDBLTFMwdExTMUZUa1FnUTBWU1ZFbEdTVU5CVkVVdExTMHRMUW89In19fX0="}],"timestampVerificationData":{"rfc3161Timestamps":[{"signedTimestamp":"MIICyjADAgEAMIICwQYJKoZIhvcNAQcCoIICsjCCAq4CAQMxDTALBglghkgBZQMEAgEwgbgGCyqGSIb3DQEJEAEEoIGoBIGlMIGiAgEBBgkrBgEEAYO/MAIwMTANBglghkgBZQMEAgEFAAQgIYXbfiWINeZSXjjiskHbXgmvL88876HC603DMx4Q9q0CFQCrtNJPdmF9O2vG8cV474rkByR/thgPMjAyNjA5MDIxMTU1MzlaMAMCAQGgMqQwMC4xFTATBgNVBAoTDHNpZ3N0b3JlLmRldjEVMBMGA1UEAxMMc2lnc3RvcmUtdHNhoAAxggHbMIIB1wIBATBRMDkxFTATBgNVBAoTDHNpZ3N0b3JlLmRldjEgMB4GA1UEAxMXc2lnc3RvcmUtdHNhLXNlbGZzaWduZWQCFDoTVC8MkGHuvMFDL8uKjosqI4sMMAsGCWCGSAFlAwQCAaCB/DAaBgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQwHAYJKoZIhvcNAQkFMQ8XDTI2MDkwMjExNTUzOVowLwYJKoZIhvcNAQkEMSIEIKIRhpD/R4r4CGOldoIofDxKJpTRaxT8612K5ADGs7VAMIGOBgsqhkiG9w0BCRACLzF/MH0wezB5BCCF+Se8B6tiysO0Q1bBDvyBssaIP9p6uebYcNnROs0FtzBVMD2kOzA5MRUwEwYDVQQKEwxzaWdzdG9yZS5kZXYxIDAeBgNVBAMTF3NpZ3N0b3JlLXRzYS1zZWxmc2lnbmVkAhQ6E1QvDJBh7rzBQy/Lio6LKiOLDDAKBggqhkjOPQQDAgRnMGUCMQDdBuHEvqRV11MBdhkaCZ52ENv7FeZEfAK2GROLlga1OqeDFgnviuVdyoT9TdJSrA8CMHEbORtv/pqRR9m7tGc5qluxDoPs1r3YHCTbzqY8YfKVQRpNd9J3OOMnvaVfBlWQbA=="}]}},"messageSignature":{"messageDigest":{"algorithm":"SHA2_256","digest":"F7eD/NIujG4CBc4X+sw1LoVSdttD1VJG8kvlTi/L0FI="},"signature":"MEYCIQC5vu06CB1RBE6W7lNBArnY6CgdQy6q6/E2/sc5PVDPPAIhALfptEQGIcldfOLcLDBgvzGTNuQvJhnjiQPa3cDAq/CL"}}