upleb.uk

Public git repos — served from a NIP-34 GRASP relay at git.upleb.uk

summaryrefslogtreecommitdiff
path: root/reveal
diff options
context:
space:
mode:
authorlog <log@invalid>2026-10-09 21:21:39 +0000
committerlog <log@invalid>2026-10-09 21:21:39 +0000
commit853cf5e8de5c65eeeec40f40c0bbe8ad8c9d99a8 (patch)
tree2b93a6d8f55d77bacbc8d4d5fa2d6dcffa617295 /reveal
parent0e620816558493c087aee42b85ca0a13fd0d8359 (diff)
size 103282
Diffstat (limited to 'reveal')
-rw-r--r--reveal/v5-000015/check.py319
-rw-r--r--reveal/v5-000015/manifest.txt22
-rw-r--r--reveal/v5-000015/manifest.txt.otsbin0 -> 759 bytes
-rw-r--r--reveal/v5-000015/r33533812.ctbin0 -> 19372 bytes
-rw-r--r--reveal/v5-000015/r33533812.nostr.json1
-rw-r--r--reveal/v5-000015/r33533812.tlock11
-rw-r--r--reveal/v5-000015/r33562612.ctbin0 -> 1517 bytes
-rw-r--r--reveal/v5-000015/r33562612.nostr.json1
-rw-r--r--reveal/v5-000015/r33562612.tlock11
-rw-r--r--reveal/v5-000015/r33649012.ctbin0 -> 6601 bytes
-rw-r--r--reveal/v5-000015/r33649012.nostr.json1
-rw-r--r--reveal/v5-000015/r33649012.tlock11
-rw-r--r--reveal/v5-000015/r33677812.ctbin0 -> 1006 bytes
-rw-r--r--reveal/v5-000015/r33677812.nostr.json1
-rw-r--r--reveal/v5-000015/r33677812.tlock11
-rw-r--r--reveal/v5-000015/r33793012.ctbin0 -> 2403 bytes
-rw-r--r--reveal/v5-000015/r33793012.nostr.json1
-rw-r--r--reveal/v5-000015/r33793012.tlock11
-rw-r--r--reveal/v5-000015/r34685812.ctbin0 -> 19100 bytes
-rw-r--r--reveal/v5-000015/r34685812.nostr.json1
-rw-r--r--reveal/v5-000015/r34685812.tlock11
-rw-r--r--reveal/v5-000015/r34714612.ctbin0 -> 1371 bytes
-rw-r--r--reveal/v5-000015/r34714612.nostr.json1
-rw-r--r--reveal/v5-000015/r34714612.tlock11
-rw-r--r--reveal/v5-000015/r34801012.ctbin0 -> 6472 bytes
-rw-r--r--reveal/v5-000015/r34801012.nostr.json1
-rw-r--r--reveal/v5-000015/r34801012.tlock11
-rw-r--r--reveal/v5-000015/r34829812.ctbin0 -> 1016 bytes
-rw-r--r--reveal/v5-000015/r34829812.nostr.json1
-rw-r--r--reveal/v5-000015/r34829812.tlock11
-rw-r--r--reveal/v5-000015/r34945012.ctbin0 -> 2422 bytes
-rw-r--r--reveal/v5-000015/r34945012.nostr.json1
-rw-r--r--reveal/v5-000015/r34945012.tlock11
-rw-r--r--reveal/v5-000015/r35578612.ctbin0 -> 846 bytes
-rw-r--r--reveal/v5-000015/r35578612.nostr.json1
-rw-r--r--reveal/v5-000015/r35578612.tlock11
-rw-r--r--reveal/v5-000015/r35693812.ctbin0 -> 4839 bytes
-rw-r--r--reveal/v5-000015/r35693812.nostr.json1
-rw-r--r--reveal/v5-000015/r35693812.tlock11
-rw-r--r--reveal/v5-000015/r36730612.ctbin0 -> 854 bytes
-rw-r--r--reveal/v5-000015/r36730612.nostr.json1
-rw-r--r--reveal/v5-000015/r36730612.tlock11
-rw-r--r--reveal/v5-000015/r36788212.ctbin0 -> 1029 bytes
-rw-r--r--reveal/v5-000015/r36788212.nostr.json1
-rw-r--r--reveal/v5-000015/r36788212.tlock11
-rw-r--r--reveal/v5-000015/r36845812.ctbin0 -> 5214 bytes
-rw-r--r--reveal/v5-000015/r36845812.nostr.json1
-rw-r--r--reveal/v5-000015/r36845812.tlock11
-rw-r--r--reveal/v5-000015/r37940212.ctbin0 -> 1019 bytes
-rw-r--r--reveal/v5-000015/r37940212.nostr.json1
-rw-r--r--reveal/v5-000015/r37940212.tlock11
-rw-r--r--reveal/v5-000015/seal.json43
52 files changed, 576 insertions, 0 deletions
diff --git a/reveal/v5-000015/check.py b/reveal/v5-000015/check.py
new file mode 100644
index 0000000..7f86b8d
--- /dev/null
+++ b/reveal/v5-000015/check.py
@@ -0,0 +1,319 @@
1#!/usr/bin/env python3
2"""
3Check Echo's self-revealing ledger seals (`sha256-live-v5`) without trusting Echo.
4
5 python3 check.py SEAL_DIR [SEAL_DIR ...] [--tle PATH] [--offline]
6
7Needs Python 3.11+, the `cryptography` package (ChaCha20-Poly1305) and drand's `tle` binary
8(`go install github.com/drand/tlock/cmd/tle@v1.2.0`). It imports nothing of Echo's: a checker that needs the thing it
9checks is not a checker, which is why it is copied, whole, into every seal directory.
10
11Each SEAL_DIR is one seal: `manifest.txt` (the exact text the seal's digest is the sha256 of), `seal.json`, and per
12reveal group `r<ROUND>.tlock` (the group's key, time-locked to that drand round) and `r<ROUND>.ct` (the group,
13encrypted under that key), and, once the group has been revealed, `r<ROUND>.held.json` (how many of its withheld
14lines Echo publishes no salt for, and why) and any number of `r<ROUND>.salts.<N>.json`: each the salts of withheld
15lines Echo decided to open and had not erased, each with its line. `manifest.txt.ots`, when present, is an
16OpenTimestamps proof over the manifest: `ots verify manifest.txt.ots` checks it against Bitcoin.
17
18What it checks, from the files alone and the beacon:
19 1. the manifest hashes to the seal's digest, and each seal names the one before it (when several are given);
20 2. each group's ciphertext and locked key hash to what the manifest commits, and the key is locked to the
21 manifest's round of the manifest's chain;
22 3. for every group whose round the beacon has signed: the round's signature as each relay serves it, the key
23 unlocked with it, the group decrypted, its bytes hashed to the committed digest, its lines and withheld lines
24 counted against the committed counts, its lines in id order, and every line's reveal day recomputed from its
25 own settling instant under the seal's named rule (`utc-day-after-close`: the first 00:00 UTC after
26 `settles_at`, else after the deadline);
27 4. for every opened group with releases: each names this seal, round and group and its own number; each released
28 salt and line hash to the withheld line's committed hash; no line is settled twice; and a hold, where there is
29 one, names the group and counts no more lines than are withheld;
30 5. once every group of every seal from the first is open and every withheld line released: the union of their v4
31 lines, sorted by id, rehashes to the v4 digest the last seal follows, so no sealed forecast was left out of a
32 reveal. Where a withheld line has no released salt (held, erased, or not yet released) that digest cannot be
33 rebuilt, and this says so and why: what is checked then is only that every forecast the v4 seal covers is in a
34 group, counted. A withheld line is never called verified.
35
36A group whose round is not yet signed, or whose withheld lines have no release yet, is reported as pending or held,
37not as a failure. Exit 0 when everything checkable passed, 1 when anything did not match.
38"""
39from __future__ import annotations
40
41import argparse
42import base64
43import hashlib
44import json
45import re
46import subprocess
47import sys
48import urllib.request
49import zlib
50from datetime import datetime, timedelta, timezone
51from pathlib import Path
52
53
54def sha(b: bytes) -> str:
55 return hashlib.sha256(b).hexdigest()
56
57
58def parse_manifest(text: str) -> dict:
59 lines = text.split("\n")
60 if lines[0] != "sha256-live-v5":
61 raise ValueError(f"not a v5 manifest: {lines[0]!r}")
62 m = {"groups": []}
63 for ln in lines[1:]:
64 word, _, rest = ln.partition(" ")
65 if word == "prev":
66 m["prev"] = None if rest == "-" else rest
67 elif word == "follows":
68 seq, digest, n = rest.split(" ")
69 m["follows"] = {"seq": int(seq), "digest": digest, "n": int(n)}
70 elif word == "covers":
71 m["covers"] = rest.split(" ")
72 elif word == "variant":
73 m["variant"] = json.loads(rest)
74 elif word == "counts":
75 m["n"], m["n_withheld"], m["n_groups"] = map(int, rest.split(" "))
76 elif word == "group":
77 r, at, n, w, digest, ct, key, late = rest.split(" ")
78 m["groups"].append({"round": int(r), "reveal_at": at, "n": int(n), "n_withheld": int(w),
79 "digest": digest, "ct": ct, "key": key, "late": late == "1"})
80 else:
81 raise ValueError(f"unknown manifest line {ln!r}")
82 return m
83
84
85def stanza(locked: str) -> tuple[int, str] | None:
86 body = "".join(ln for ln in locked.strip().splitlines() if not ln.startswith("-----"))
87 m = re.search(rb"-> tlock (\d+) ([0-9a-f]{64})", base64.b64decode(body))
88 return (int(m.group(1)), m.group(2).decode()) if m else None
89
90
91def round_at(beacon: dict, at: datetime) -> int:
92 t = at.timestamp()
93 whole = int(t) + (t != int(t))
94 if whole <= beacon["genesis_time"]:
95 return 1
96 return -(-(whole - beacon["genesis_time"]) // beacon["period"]) + 1
97
98
99def reveal_day(closes: datetime) -> datetime:
100 d = closes.astimezone(timezone.utc).date() + timedelta(days=1)
101 return datetime(d.year, d.month, d.day, tzinfo=timezone.utc)
102
103
104def parse_line(ln: str) -> dict:
105 """One line: `id|issued_at|deadline|forecaster|p|settlement|anchor<TAB>open:<v4>` or `...<TAB>withheld:<hex>`."""
106 numeric, tab, text = ln.partition("\t")
107 if not tab:
108 raise ValueError("a line without its text layer")
109 fid, issued, deadline, forecaster, p, rest = numeric.split("|", 5)
110 dec = json.JSONDecoder()
111 settle, end = dec.raw_decode(rest)
112 if rest[end] != "|":
113 raise ValueError("settlement not followed by the anchor")
114 anchor, end2 = dec.raw_decode(rest, end + 1)
115 if end2 != len(rest):
116 raise ValueError("trailing bytes after the anchor")
117 out = {"id": int(fid), "issued_at": issued, "deadline": deadline, "forecaster": forecaster, "p": float(p),
118 "settlement": settle, "anchor": anchor}
119 if text.startswith("open:"):
120 out["v4"] = text[5:]
121 if not out["v4"].startswith(f"{fid}|"):
122 raise ValueError("the text layer is another forecast's line")
123 elif re.fullmatch(r"withheld:[0-9a-f]{64}", text):
124 out["withheld"] = text[9:]
125 else:
126 raise ValueError(f"unknown text layer {text[:20]!r}")
127 return out
128
129
130def beacon_round(beacon: dict, rnd: int) -> dict:
131 """What each relay serves for the round: its signature, or why there is none."""
132 out = {}
133 for relay in beacon["relays"]:
134 url = f"{relay.rstrip('/')}/{beacon['chain_hash']}/public/{rnd}"
135 try:
136 with urllib.request.urlopen(url, timeout=20) as r: # noqa: S310 — the seal's own relays
137 out[relay] = json.loads(r.read()).get("signature")
138 except Exception as exc: # noqa: BLE001 — report, go on
139 out[relay] = f"unavailable ({type(exc).__name__})"
140 return out
141
142
143def unlock(tle: str, beacon: dict, locked: str) -> bytes | None:
144 """The key, or None while the round is unsigned. Each relay is tried in turn."""
145 errors = []
146 for relay in beacon["relays"]:
147 r = subprocess.run([tle, "-d", "-n", relay.rstrip("/") + "/", "-c", beacon["chain_hash"]],
148 input=locked.encode(), capture_output=True, timeout=120, check=False)
149 if r.returncode == 0:
150 return r.stdout
151 if b"too early" in r.stderr:
152 return None
153 errors.append(f"{relay}: {r.stderr.decode(errors='replace').strip()[-160:]}")
154 raise RuntimeError("; ".join(errors))
155
156
157def release(d: Path, seal_digest: str, g: dict, lines: list[dict], say) -> tuple[dict[int, str], int, str | None]:
158 """An opened group's releases and hold, checked against the group: (id -> the v4 line each released salt opens,
159 how many withheld lines were opened and found erased, and the hold's reason where Echo published one)."""
160 r = g["round"]
161 shut = {x["id"]: x["withheld"] for x in lines if "withheld" in x}
162 out, erased, seen, bad = {}, set(), set(), []
163 files = sorted(d.glob(f"r{r}.salts.*.json"), key=lambda p: int(p.name.split(".")[-2]))
164 for k, path in enumerate(files):
165 rel = json.loads(path.read_text())
166 say(rel.get("format") == "echo-reveal-salts/1" and rel.get("seal") == seal_digest
167 and rel.get("round") == r and rel.get("group") == g["digest"] and rel.get("n") == k
168 and path.name == f"r{r}.salts.{k}.json",
169 f"round {r}: release {k} names this seal, round and group, and follows the one before")
170 for x in rel.get("released", []):
171 i, line = x["id"], x["line"]
172 opens = (i in shut and i not in seen and line.startswith(f"{i}|")
173 and sha(bytes.fromhex(x["salt"]) + line.encode()) == shut[i])
174 if opens:
175 out[i] = line
176 else:
177 bad.append(i)
178 seen.add(i)
179 for i in rel.get("erased", []):
180 if i not in shut or i in seen:
181 bad.append(i)
182 erased.add(i)
183 seen.add(i)
184 if files:
185 say(not bad, f"round {r}: {len(out)} released lines open their committed hashes, {len(erased)} opened lines "
186 f"found erased, none settled twice" + (f" ({len(bad)} do not, e.g. {bad[:3]})" if bad else ""))
187 why = None
188 hold = d / f"r{r}.held.json"
189 if hold.exists():
190 h = json.loads(hold.read_text())
191 say(h.get("format") == "echo-reveal-held/1" and h.get("seal") == seal_digest and h.get("round") == r
192 and h.get("group") == g["digest"] and 0 <= h.get("held", -1) <= len(shut),
193 f"round {r}: the hold names this seal, round and group, and counts at most its withheld lines")
194 why = str(h.get("why") or "no reason given")
195 left = len(shut) - len(out) - len(erased)
196 if left:
197 print(f" .... round {r}: {left} withheld lines have no released salt: counted, not rehashed"
198 + (f" (Echo publishes none: {why})" if why else " (no release or hold published yet)"))
199 return out, len(erased), why
200
201
202def check(dirs: list[Path], tle: str = "tle", offline: bool = False) -> int:
203 from cryptography.hazmat.primitives.ciphers.aead import ChaCha20Poly1305
204
205 failed, pending, withheld, held, erased, union = 0, 0, 0, 0, 0, {}
206 reasons: set[str] = set()
207 first_prev = "unset"
208
209 def say(ok: bool, what: str) -> None:
210 nonlocal failed
211 failed += not ok
212 print(f" {'PASS' if ok else 'FAIL'} {what}")
213
214 prev_digest = None
215 seals = []
216 for d in dirs:
217 text = (d / "manifest.txt").read_bytes()
218 row = json.loads((d / "seal.json").read_text())
219 seals.append((d, text, row, parse_manifest(text.decode())))
220 seals.sort(key=lambda s: s[2]["seq"])
221 last = None
222 for i, (d, text, row, m) in enumerate(seals):
223 print(f"v5 seal {row['seq']}: {m['n']} forecasts in {m['n_groups']} reveal groups, {m['n_withheld']} withheld, "
224 f"follows v4 seal {m['follows']['seq']}")
225 say(sha(text) == row["digest"], f"sha256(manifest.txt) is the seal's digest {row['digest'][:16]}…")
226 say(len(m["groups"]) == m["n_groups"] and sum(g["n"] for g in m["groups"]) == m["n"]
227 and sum(g["n_withheld"] for g in m["groups"]) == m["n_withheld"], "the manifest's counts add up")
228 if i == 0:
229 first_prev = m["prev"]
230 else:
231 say(m["prev"] == prev_digest, "it names the seal before it")
232 prev_digest, last = row["digest"], m
233 b = m["variant"]["beacon"]
234 for g in m["groups"]:
235 r = g["round"]
236 ct, locked = (d / f"r{r}.ct").read_bytes(), (d / f"r{r}.tlock").read_text()
237 say(sha(ct) == g["ct"] and sha(locked.encode()) == g["key"],
238 f"round {r}: the ciphertext and the locked key are the committed ones")
239 say(stanza(locked) == (r, b["chain_hash"]), f"round {r}: the key is locked to that round of that chain")
240 say(round_at(b, datetime.fromisoformat(g["reveal_at"])) == r, f"round {r} is signed at {g['reveal_at']}")
241 if not offline:
242 sigs = beacon_round(b, r)
243 good = {s for s in sigs.values() if s and not s.startswith("unavailable")}
244 print(f" .... round {r} signature from {len(sigs)} relays: "
245 + ("not yet signed" if not good else f"{len(good)} distinct: {min(good)[:24]}…"))
246 if len(good) > 1:
247 say(False, f"round {r}: relays disagree on its signature")
248 key = unlock(tle, b, locked)
249 if key is None:
250 pending += 1
251 print(f" .... round {r} ({g['reveal_at']}) not yet signed: {g['n']} forecasts stay locked")
252 continue
253 try:
254 plain = zlib.decompress(ChaCha20Poly1305(key).decrypt(b"\x00" * 12, ct, None))
255 except Exception as exc: # noqa: BLE001 — a finding, not a crash
256 say(False, f"round {r}: the ciphertext does not open under its key ({type(exc).__name__})")
257 continue
258 say(sha(plain) == g["digest"], f"round {r}: the opened group hashes to its committed digest")
259 lines = [parse_line(ln) for ln in plain.decode().split("\n")]
260 ids = [x["id"] for x in lines]
261 say(len(lines) == g["n"] and sum("withheld" in x for x in lines) == g["n_withheld"],
262 f"round {r}: {len(lines)} lines, {g['n_withheld']} withheld, as committed")
263 say(ids == sorted(set(ids)), f"round {r}: lines in id order, none twice")
264 due = datetime.fromisoformat(g["reveal_at"])
265 if m["variant"].get("reveal") == "utc-day-after-close":
266 wrong = [x["id"] for x in lines if reveal_day(datetime.fromisoformat(
267 (x["settlement"] or {}).get("settles_at") or x["deadline"])) != due]
268 say(not wrong, f"round {r}: every line belongs to this reveal day"
269 + (f" ({len(wrong)} do not, e.g. {wrong[:3]})" if wrong else ""))
270 else:
271 print(f" .... round {r}: reveal rule {m['variant'].get('reveal')!r} is not one this checker "
272 "recomputes; which lines belong to the day is unchecked")
273 opened, gone, why = release(d, row["digest"], g, lines, say)
274 for x in lines:
275 if x["id"] in union:
276 say(False, f"forecast {x['id']} is in two groups")
277 union[x["id"]] = x.get("v4") or opened.get(x["id"])
278 shut = sum(1 for x in lines if "withheld" in x and x["id"] not in opened) - gone
279 erased += gone
280 if why is None:
281 withheld += shut
282 else:
283 held += shut
284 reasons.add(why)
285 if last is not None:
286 if first_prev is not None:
287 print(" .... completeness: the first seal given is not the chain's first; give every seal from it")
288 elif pending:
289 print(f" .... completeness: {pending} groups still locked; it is checkable once all have opened")
290 elif withheld or held or erased:
291 told = [f"{withheld} withheld lines not yet released"] if withheld else []
292 told += ([f"{held} withheld lines held, for which Echo publishes no salt ({'; '.join(sorted(reasons))})"]
293 if held else [])
294 told += [f"{erased} erased stay hashes"] if erased else []
295 print(f" .... completeness: {', '.join(told)}: those lines can be counted but not rehashed, so the v4 "
296 f"lines cannot all be rebuilt and the v4 digest is NOT checked; {len(union)} forecasts against "
297 f"the v4 seal's {last['follows']['n']}")
298 say(len(union) == last["follows"]["n"], "every forecast the v4 seal covers is in a group, counted")
299 else:
300 got = sha("\n".join(union[k] for k in sorted(union)).encode())
301 say(got == last["follows"]["digest"] and len(union) == last["follows"]["n"],
302 f"the union of {len(union)} lines rehashes to v4 seal {last['follows']['seq']}'s digest")
303 print("\nNOT VERIFIED" if failed else f"\nVERIFIED{f' ({pending} groups not yet revealed)' if pending else ''}")
304 return 1 if failed else 0
305
306
307def main(argv: list[str]) -> int:
308 ap = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter)
309 ap.add_argument("dirs", nargs="*", default=[str(Path(__file__).resolve().parent)],
310 help="seal directories, any order (default: the one this script sits in)")
311 ap.add_argument("--tle", default="tle", help="the tle binary that unlocks a key once its round is signed")
312 ap.add_argument("--offline", action="store_true",
313 help="do not fetch each round's signature from the relays for display; tle still asks them")
314 args = ap.parse_args(argv)
315 return check([Path(d) for d in args.dirs], tle=args.tle, offline=args.offline)
316
317
318if __name__ == "__main__":
319 raise SystemExit(main(sys.argv[1:]))
diff --git a/reveal/v5-000015/manifest.txt b/reveal/v5-000015/manifest.txt
new file mode 100644
index 0000000..0bdf8a8
--- /dev/null
+++ b/reveal/v5-000015/manifest.txt
@@ -0,0 +1,22 @@
1sha256-live-v5
2prev 11293db524a9ce788df948c5347c7f627a7649e0718bce967ae5d32261fe19ba
3follows 45 23679ed5882b641cb8781bedf229dd9bc81fc72cb2b4c63e713ea25c9e36c0c4 52597
4covers 2026-10-09T16:31:25.305817Z 2026-10-09T21:20:37.989880Z
5variant {"beacon":{"chain_hash":"52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971","genesis_time":1692803367,"period":3,"relays":["https://api.drand.sh","https://api2.drand.sh","https://api3.drand.sh","https://drand.cloudflare.com"],"scheme":"bls-unchained-g1-rfc9380"},"cipher":"chacha20poly1305-zlib6-nonce0","gate":{"default":"withheld: a kept salt can be released later; an opened text can never be withdrawn","opened":"none","why":"no decision by Echo yet"},"line":"numeric<TAB>open:<v4 line> | numeric<TAB>withheld:sha256(salt||v4 line)","reveal":"utc-day-after-close","salts":"key ring: one content a seal, one part a line","tool":{"name":"tle","sha256":"69157d8c14a1d390d1b7744946288f83d4b10748471d5447f9abb77a5902c541","version":"tlock v1.2.0 -- github.com/drand/tlock"}}
6counts 1227 1227 16
7group 33533812 2026-10-31T00:00:00.000000Z 339 339 092b9afff3d1ba86e82bab391354093ae618d5db7369d26d8d914545a01d7fe2 daca555cceae6f743042b3413eb06d435da3d936ce347aa0765970b394140bde 251678e2f09086843b0c29500affc26667e3e06437a4daa16c7f9469c47e6249 0
8group 33562612 2026-11-01T00:00:00.000000Z 21 21 eabd826dcee34249bbd53ef9f29e02a31134b0f367326be080c77fc5bef76e8a ca31c2ab4460fa756e615ac9814c93d77745724b66b968f7682d2444229e3e57 63c92b992d787aca96c554a08e48ddb453c6069248a9d78171b647dd4d9d3f06 0
9group 33649012 2026-11-04T00:00:00.000000Z 108 108 3dcfc84a3ab6a008816f7a91cb318727b583aad28957a466cf9a1370b1a2fb07 eb841103e021af867aad47e2272baafdfe13941dc8aa4de2724a545569afc824 2c391f67d8e8e8064a5a7177ed9710c6b573b9532476a10f566d2cb129b0e86c 0
10group 33677812 2026-11-05T00:00:00.000000Z 12 12 3f7534a5d0dd1221864706a1821f60745a9090cbedb7bde46ac96b75e42b59d9 6a8ec1381609ed979376e695492d32181b8a389ba911e15cdedac927bfc13501 3a81937b64f1863a3ce8ac031a464f774681bfad2e8a88e33bad0606dbb18191 0
11group 33793012 2026-11-09T00:00:00.000000Z 36 36 8e4c9cb608dd70d188b92fb2ae392804de6fbf50a8c7b36c20fba3900c997b8e e12a6c9f58c32c2eed6b65260d7dd8093a961ff59c90443990459f49257a9e7b 326b711c75793187cf03382eedb30958ee175c32121e72c2cd328368632ca188 0
12group 34685812 2026-12-10T00:00:00.000000Z 336 336 ea1eeed54b6a64c12c8ad140cb49859ef97eba4211d5408a188b2ac0a357bedd 6c744c35a82c3055a61a518b2844a2a2d8233e305cff6f50a86c9f9c10d51d82 0174108376f8f82ad8618be4c324ac0e12725ae1f371f801b706f2dbc0189cb0 0
13group 34714612 2026-12-11T00:00:00.000000Z 18 18 1f04ca5359925941f92251efe15de59fe87fc8e56cab8b1155ad2072422a9c93 db69f5689e8f5014eb99f557210108c7e2ac347172f0efe59ceda13c0f984bf9 0f412965f68f3b1a47434dc505d6f6e874d6cffd16f27f3a108d619e9bc6efcf 0
14group 34801012 2026-12-14T00:00:00.000000Z 105 105 e40f7ceb57652cf64b2547e3b328a4b35cd6aab94467cb0573545bc0968b5b55 b79a48d2552d5028daac85242ebac48449468e42167bbbd166e41212b7dfc033 b721225062333aec901d7382247eb38dcbf61870fab3689ba15f9a51c505d23d 0
15group 34829812 2026-12-15T00:00:00.000000Z 12 12 ac9dfa6db527551f00079b1c80d21271bd186e58350fb09b147ad5c24ec3265a 08d45335183d1ff228be045a1f1f70490869a8e9ae6f4bd73e1bcda6f7a76e42 5ae18479a66a5f09419a1069eb67f88b3f5293f1d6ae97b0ea4536e9dae8398b 0
16group 34945012 2026-12-19T00:00:00.000000Z 36 36 64b263716ccff5b2dc029602c3da67c956898604f155bf3ea83449384d64bdef c81586ca65094a1d14e7f0e112d6e54297051e630d6270313ff693040a3d5c42 d86a46eba860d06de2501a267367bfc23e03e2ceddfee04f2255539d3ceca817 0
17group 35578612 2027-01-10T00:00:00.000000Z 9 9 94b6250528065f08b85d7bbc158ebbf54f45aeb55cf9cdfee6908be50eb4638c b59293fbddc0f440032b280497d889d731127e8ff0d9d91180d48560c3dcabcc 7b0f1439aa5424800ce0e1380f3da5163d8f58174191320b6765ba08530b53a9 0
18group 35693812 2027-01-14T00:00:00.000000Z 78 78 4a021ae959af427b51d6e700fa8cc6f0fbc7f419b498fe6deff8da011b07dc18 40dcfd86892743e3d9eb5517b32342795c7669e9da42fe7a1c73309a28123e3a a65e9bbac48c889dffa8a3009ba3f54f73bbf6b9ee81f4f66c05c011a3df0e1f 0
19group 36730612 2027-02-19T00:00:00.000000Z 9 9 4f3399b9d34d0bed43af4eb49e57b165aa622c4fec5ba1d18ef7849995f457c2 0559ae1b751959f403772e7b11e221fb9f285616bcae5ce780a4d23ca74c6104 8566644621eb2dff672164db8f43b4e17bf4de3c77c8cb46fbda899a027eb426 0
20group 36788212 2027-02-21T00:00:00.000000Z 12 12 5d325e737f9c7eaf89a1e91961f6b05182489d8c8f8adb352287e44db80d0ceb 09e2645bdaea0695b0d46fcce19cdb530dee5153476add7377edc542ac44c826 e60d594f8cc1e956b17690e73e2f6c5b70c88ac1f7fe5cd8738ad29a43bcb366 0
21group 36845812 2027-02-23T00:00:00.000000Z 84 84 bb98419ca3bdaf94a26feac3d847176f2e8624f0c4c7722871ba1abb51893a0f 53ec7b623272057a70d54cc807613369b8952eb38a21e0c1f1198a075b738e39 6e94cf62615764351441df78bbcaa1275faaef8e515c7345726948923418f5ac 0
22group 37940212 2027-04-02T00:00:00.000000Z 12 12 170514d02dccd65fe1cc5ef497f4a1633f3bc7321e6d10f1174cbecefce3e1a9 f486c8f779359b30b552d1d57abf9929f4db38793105e4040bdb280885f520d8 295c470be828d8f818108cb8947ef262c562f177b2ab69312f5a6fd9bcd9d425 0 \ No newline at end of file
diff --git a/reveal/v5-000015/manifest.txt.ots b/reveal/v5-000015/manifest.txt.ots
new file mode 100644
index 0000000..b40c225
--- /dev/null
+++ b/reveal/v5-000015/manifest.txt.ots
Binary files differ
diff --git a/reveal/v5-000015/r33533812.ct b/reveal/v5-000015/r33533812.ct
new file mode 100644
index 0000000..5828552
--- /dev/null
+++ b/reveal/v5-000015/r33533812.ct
Binary files differ
diff --git a/reveal/v5-000015/r33533812.nostr.json b/reveal/v5-000015/r33533812.nostr.json
new file mode 100644
index 0000000..508cb3a
--- /dev/null
+++ b/reveal/v5-000015/r33533812.nostr.json
@@ -0,0 +1 @@
{"content":"-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDMzNTMzODEyIDUyZGI5YmE3\nMGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw\nMGM4NGU5NzEKaTA3WXZ5aEhwWUZpQ3lRMXZOaE11TiswV1laOFluMGZjM0FHWVN2\nOTJpOWRLU3RiN3ZKK2NhL1F4ZStWUlpGKwpFLzhsMGdaalZQbXFGVWsxLy91QzBo\nbkh5K05kb3BOV0VwUXdnTzNsOVdiaVFYMUpoRkpXcC9jb0VMM3FIaVRqCm52Qi9X\nMk9zOFVsMjluNjRkWEp0QzViaFIzcFYwOTRPUnA2WGk1M01tVGcKLS0tIGQ3dFVu\nOFhoM3NhdlpzeHpHS3B1ODE3Wi8xSHVUa1hHcEQyT3VUVWVCMU0K+0l2gj9T8y8B\nDgc5KqdRD1hVipcbENMLcCZGJkLBy9iHUOLCnC/Cs0Uhe35rGs+48ceCw9D4LJNG\nXsYG97lnHg==\n-----END AGE ENCRYPTED FILE-----\n","tags":[["t","echo-ledger-reveal"],["round","33533812"],["reveal_at","2026-10-31T00:00:00.000000Z"],["chain","52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971"],["digest","092b9afff3d1ba86e82bab391354093ae618d5db7369d26d8d914545a01d7fe2"],["ct","daca555cceae6f743042b3413eb06d435da3d936ce347aa0765970b394140bde"],["seal","2aeea1fb056caadc5d3aeabb30c6d393fa4fa1b54edcfcb35c6e74bb9bf3fa28"]]}
diff --git a/reveal/v5-000015/r33533812.tlock b/reveal/v5-000015/r33533812.tlock
new file mode 100644
index 0000000..3256942
--- /dev/null
+++ b/reveal/v5-000015/r33533812.tlock
@@ -0,0 +1,11 @@
1-----BEGIN AGE ENCRYPTED FILE-----
2YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDMzNTMzODEyIDUyZGI5YmE3
3MGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw
4MGM4NGU5NzEKaTA3WXZ5aEhwWUZpQ3lRMXZOaE11TiswV1laOFluMGZjM0FHWVN2
5OTJpOWRLU3RiN3ZKK2NhL1F4ZStWUlpGKwpFLzhsMGdaalZQbXFGVWsxLy91QzBo
6bkh5K05kb3BOV0VwUXdnTzNsOVdiaVFYMUpoRkpXcC9jb0VMM3FIaVRqCm52Qi9X
7Mk9zOFVsMjluNjRkWEp0QzViaFIzcFYwOTRPUnA2WGk1M01tVGcKLS0tIGQ3dFVu
8OFhoM3NhdlpzeHpHS3B1ODE3Wi8xSHVUa1hHcEQyT3VUVWVCMU0K+0l2gj9T8y8B
9Dgc5KqdRD1hVipcbENMLcCZGJkLBy9iHUOLCnC/Cs0Uhe35rGs+48ceCw9D4LJNG
10XsYG97lnHg==
11-----END AGE ENCRYPTED FILE-----
diff --git a/reveal/v5-000015/r33562612.ct b/reveal/v5-000015/r33562612.ct
new file mode 100644
index 0000000..c4c3486
--- /dev/null
+++ b/reveal/v5-000015/r33562612.ct
Binary files differ
diff --git a/reveal/v5-000015/r33562612.nostr.json b/reveal/v5-000015/r33562612.nostr.json
new file mode 100644
index 0000000..103dc6d
--- /dev/null
+++ b/reveal/v5-000015/r33562612.nostr.json
@@ -0,0 +1 @@
{"content":"-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDMzNTYyNjEyIDUyZGI5YmE3\nMGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw\nMGM4NGU5NzEKbFZUL3hkTUl5aktsR2xFVFBid3d2YXdKeFJaUUp0dWJIQlBweWNy\nN0ZMa0Q5RVJrM3IwUWwrQ0xYNWxxK2RVcApHY1ZZK1ZBcHpSTERpZjhQNzhCRTU5\nZUp3OEZvK3RqTy9NdWtzQ09BbnloSEgzYndRZlN1OXRpckhoMzB6dkYwCk5nWUdo\ndy8xZmM2SWQyQXI5VDA2QUp2MVozVTJXVXhUYVFlZUtUZ2lwdjgKLS0tIHJXRDBJ\ncWNtZGFzb0FOMjRrcmdtaGs4NDhleVNwelBpaGdFMytTM2E3UVEKIVcAUE+9wzXM\nv25zqLvHJzjEJin6FVvR4twYa+/HzGK34V9kFNXgmykNbt+tozDFvLzm1ElzRLg8\nCNdru4rHTQ==\n-----END AGE ENCRYPTED FILE-----\n","tags":[["t","echo-ledger-reveal"],["round","33562612"],["reveal_at","2026-11-01T00:00:00.000000Z"],["chain","52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971"],["digest","eabd826dcee34249bbd53ef9f29e02a31134b0f367326be080c77fc5bef76e8a"],["ct","ca31c2ab4460fa756e615ac9814c93d77745724b66b968f7682d2444229e3e57"],["seal","2aeea1fb056caadc5d3aeabb30c6d393fa4fa1b54edcfcb35c6e74bb9bf3fa28"]]}
diff --git a/reveal/v5-000015/r33562612.tlock b/reveal/v5-000015/r33562612.tlock
new file mode 100644
index 0000000..6dd8275
--- /dev/null
+++ b/reveal/v5-000015/r33562612.tlock
@@ -0,0 +1,11 @@
1-----BEGIN AGE ENCRYPTED FILE-----
2YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDMzNTYyNjEyIDUyZGI5YmE3
3MGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw
4MGM4NGU5NzEKbFZUL3hkTUl5aktsR2xFVFBid3d2YXdKeFJaUUp0dWJIQlBweWNy
5N0ZMa0Q5RVJrM3IwUWwrQ0xYNWxxK2RVcApHY1ZZK1ZBcHpSTERpZjhQNzhCRTU5
6ZUp3OEZvK3RqTy9NdWtzQ09BbnloSEgzYndRZlN1OXRpckhoMzB6dkYwCk5nWUdo
7dy8xZmM2SWQyQXI5VDA2QUp2MVozVTJXVXhUYVFlZUtUZ2lwdjgKLS0tIHJXRDBJ
8cWNtZGFzb0FOMjRrcmdtaGs4NDhleVNwelBpaGdFMytTM2E3UVEKIVcAUE+9wzXM
9v25zqLvHJzjEJin6FVvR4twYa+/HzGK34V9kFNXgmykNbt+tozDFvLzm1ElzRLg8
10CNdru4rHTQ==
11-----END AGE ENCRYPTED FILE-----
diff --git a/reveal/v5-000015/r33649012.ct b/reveal/v5-000015/r33649012.ct
new file mode 100644
index 0000000..e76975c
--- /dev/null
+++ b/reveal/v5-000015/r33649012.ct
Binary files differ
diff --git a/reveal/v5-000015/r33649012.nostr.json b/reveal/v5-000015/r33649012.nostr.json
new file mode 100644
index 0000000..56a3b34
--- /dev/null
+++ b/reveal/v5-000015/r33649012.nostr.json
@@ -0,0 +1 @@
{"content":"-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDMzNjQ5MDEyIDUyZGI5YmE3\nMGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw\nMGM4NGU5NzEKcWNOUEhtZ1hiR0RmeGx5SWtMMEg0Q3N6dUdVTTJuMUJWUjNmdFlD\nblYxcFJjbzRBSERXYlI3UUo5cm1ITnlNbApGZzAzbGtJOEhialJUZVJCQ1FZYVB2\nYXpNMmpnL0F1UTVESlA1RU1KS2lWRnFSNFI5TVFhdDA0akpqM1dWVjVHClVNSlQx\nbGNkdXo4TzVsR2czVUh2dHNoZjg5Nmp1YkRad1BkR0UzZkxURTQKLS0tIDJzTG13\nTXpTSWlmUGpxeVVlRm56Y0NjQ1JCQW5oMFlueVlVK1EySmhkaDgKzwugtgC7aPJk\nID84+BNR9PWq9hWste9CnOH7MFvTYrA4PMgVAPx20n5W5jMXjMpruiHlzpvxCMq5\n9ldnbZSW0w==\n-----END AGE ENCRYPTED FILE-----\n","tags":[["t","echo-ledger-reveal"],["round","33649012"],["reveal_at","2026-11-04T00:00:00.000000Z"],["chain","52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971"],["digest","3dcfc84a3ab6a008816f7a91cb318727b583aad28957a466cf9a1370b1a2fb07"],["ct","eb841103e021af867aad47e2272baafdfe13941dc8aa4de2724a545569afc824"],["seal","2aeea1fb056caadc5d3aeabb30c6d393fa4fa1b54edcfcb35c6e74bb9bf3fa28"]]}
diff --git a/reveal/v5-000015/r33649012.tlock b/reveal/v5-000015/r33649012.tlock
new file mode 100644
index 0000000..4bcb76e
--- /dev/null
+++ b/reveal/v5-000015/r33649012.tlock
@@ -0,0 +1,11 @@
1-----BEGIN AGE ENCRYPTED FILE-----
2YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDMzNjQ5MDEyIDUyZGI5YmE3
3MGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw
4MGM4NGU5NzEKcWNOUEhtZ1hiR0RmeGx5SWtMMEg0Q3N6dUdVTTJuMUJWUjNmdFlD
5blYxcFJjbzRBSERXYlI3UUo5cm1ITnlNbApGZzAzbGtJOEhialJUZVJCQ1FZYVB2
6YXpNMmpnL0F1UTVESlA1RU1KS2lWRnFSNFI5TVFhdDA0akpqM1dWVjVHClVNSlQx
7bGNkdXo4TzVsR2czVUh2dHNoZjg5Nmp1YkRad1BkR0UzZkxURTQKLS0tIDJzTG13
8TXpTSWlmUGpxeVVlRm56Y0NjQ1JCQW5oMFlueVlVK1EySmhkaDgKzwugtgC7aPJk
9ID84+BNR9PWq9hWste9CnOH7MFvTYrA4PMgVAPx20n5W5jMXjMpruiHlzpvxCMq5
109ldnbZSW0w==
11-----END AGE ENCRYPTED FILE-----
diff --git a/reveal/v5-000015/r33677812.ct b/reveal/v5-000015/r33677812.ct
new file mode 100644
index 0000000..00ee3eb
--- /dev/null
+++ b/reveal/v5-000015/r33677812.ct
Binary files differ
diff --git a/reveal/v5-000015/r33677812.nostr.json b/reveal/v5-000015/r33677812.nostr.json
new file mode 100644
index 0000000..5a81b80
--- /dev/null
+++ b/reveal/v5-000015/r33677812.nostr.json
@@ -0,0 +1 @@
{"content":"-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDMzNjc3ODEyIDUyZGI5YmE3\nMGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw\nMGM4NGU5NzEKbUFDU2kyOHlYSWJGQ2FBUU1uN0tUQkZhbVJjMVVTVW0wanlQMjZt\nNjVVenlEd091dWFlM3lCZ3NqaUxad2o4WApFaSt2RHhQZTNScVNEeUdySWRWRFpR\nUlZlQS9DOWlyWS9hWGxPOFJta0RHWVFGQ2llcC9KZGVxTHd4bUl5SFRWCktlMS9Q\nYnVpVCtENVIzUm81Z1FtekFlcHpvUlo3RmZmN3gzZE5FdzZnN2cKLS0tIGxyNXBx\nRHloSy9leGxWaUtvZEUzUnFxcDU1YU5TbS9HZS8xMWNPbGxRWDgK8ggX+zhlwq+3\nz2QlYlzYbEKitOZmBHSy2e3vwF/xIKXCA6O+Jdxbe2yQycrQu544PlfABKCca+B2\nmljvfCvHBQ==\n-----END AGE ENCRYPTED FILE-----\n","tags":[["t","echo-ledger-reveal"],["round","33677812"],["reveal_at","2026-11-05T00:00:00.000000Z"],["chain","52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971"],["digest","3f7534a5d0dd1221864706a1821f60745a9090cbedb7bde46ac96b75e42b59d9"],["ct","6a8ec1381609ed979376e695492d32181b8a389ba911e15cdedac927bfc13501"],["seal","2aeea1fb056caadc5d3aeabb30c6d393fa4fa1b54edcfcb35c6e74bb9bf3fa28"]]}
diff --git a/reveal/v5-000015/r33677812.tlock b/reveal/v5-000015/r33677812.tlock
new file mode 100644
index 0000000..724e11a
--- /dev/null
+++ b/reveal/v5-000015/r33677812.tlock
@@ -0,0 +1,11 @@
1-----BEGIN AGE ENCRYPTED FILE-----
2YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDMzNjc3ODEyIDUyZGI5YmE3
3MGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw
4MGM4NGU5NzEKbUFDU2kyOHlYSWJGQ2FBUU1uN0tUQkZhbVJjMVVTVW0wanlQMjZt
5NjVVenlEd091dWFlM3lCZ3NqaUxad2o4WApFaSt2RHhQZTNScVNEeUdySWRWRFpR
6UlZlQS9DOWlyWS9hWGxPOFJta0RHWVFGQ2llcC9KZGVxTHd4bUl5SFRWCktlMS9Q
7YnVpVCtENVIzUm81Z1FtekFlcHpvUlo3RmZmN3gzZE5FdzZnN2cKLS0tIGxyNXBx
8RHloSy9leGxWaUtvZEUzUnFxcDU1YU5TbS9HZS8xMWNPbGxRWDgK8ggX+zhlwq+3
9z2QlYlzYbEKitOZmBHSy2e3vwF/xIKXCA6O+Jdxbe2yQycrQu544PlfABKCca+B2
10mljvfCvHBQ==
11-----END AGE ENCRYPTED FILE-----
diff --git a/reveal/v5-000015/r33793012.ct b/reveal/v5-000015/r33793012.ct
new file mode 100644
index 0000000..0fa8e7b
--- /dev/null
+++ b/reveal/v5-000015/r33793012.ct
Binary files differ
diff --git a/reveal/v5-000015/r33793012.nostr.json b/reveal/v5-000015/r33793012.nostr.json
new file mode 100644
index 0000000..d5b6ff0
--- /dev/null
+++ b/reveal/v5-000015/r33793012.nostr.json
@@ -0,0 +1 @@
{"content":"-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDMzNzkzMDEyIDUyZGI5YmE3\nMGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw\nMGM4NGU5NzEKcnl3ditWMVVZeWtXQjU1UE83amdqR3hQK3d2bjU5R2FVY3lOaFZR\nTGd6Qms4TXgraFB2ZmJYWXI2ejZwSktGYwpHVHVkb2IvNklSTll3akN5V014VDZp\nTVVnTnBZMEpQaTFzSWFNc2M3RFFRRVRPV1VHMktXd2lvRHpIa0hJS1Y0CjFRcGpt\nN3pPL3FLVmFUWndqeEpXSzZ6M2FIZHN1ZDBFdGNwOUtTVXNETGcKLS0tIHVHWG9l\nYy9wakdhR3ZmY2YrUVhLdmVUbG5RVHRnS1RVZC9oa2trdlYvWFEKX0hQ34PlFLLw\nQ565SJiARdipZmWtB1RKQ1aNYQKRoYSR9XqpoctP6Eq738TnmaLJoz9FRovfuDtO\nVTMBIRAfZQ==\n-----END AGE ENCRYPTED FILE-----\n","tags":[["t","echo-ledger-reveal"],["round","33793012"],["reveal_at","2026-11-09T00:00:00.000000Z"],["chain","52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971"],["digest","8e4c9cb608dd70d188b92fb2ae392804de6fbf50a8c7b36c20fba3900c997b8e"],["ct","e12a6c9f58c32c2eed6b65260d7dd8093a961ff59c90443990459f49257a9e7b"],["seal","2aeea1fb056caadc5d3aeabb30c6d393fa4fa1b54edcfcb35c6e74bb9bf3fa28"]]}
diff --git a/reveal/v5-000015/r33793012.tlock b/reveal/v5-000015/r33793012.tlock
new file mode 100644
index 0000000..56be7f3
--- /dev/null
+++ b/reveal/v5-000015/r33793012.tlock
@@ -0,0 +1,11 @@
1-----BEGIN AGE ENCRYPTED FILE-----
2YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDMzNzkzMDEyIDUyZGI5YmE3
3MGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw
4MGM4NGU5NzEKcnl3ditWMVVZeWtXQjU1UE83amdqR3hQK3d2bjU5R2FVY3lOaFZR
5TGd6Qms4TXgraFB2ZmJYWXI2ejZwSktGYwpHVHVkb2IvNklSTll3akN5V014VDZp
6TVVnTnBZMEpQaTFzSWFNc2M3RFFRRVRPV1VHMktXd2lvRHpIa0hJS1Y0CjFRcGpt
7N3pPL3FLVmFUWndqeEpXSzZ6M2FIZHN1ZDBFdGNwOUtTVXNETGcKLS0tIHVHWG9l
8Yy9wakdhR3ZmY2YrUVhLdmVUbG5RVHRnS1RVZC9oa2trdlYvWFEKX0hQ34PlFLLw
9Q565SJiARdipZmWtB1RKQ1aNYQKRoYSR9XqpoctP6Eq738TnmaLJoz9FRovfuDtO
10VTMBIRAfZQ==
11-----END AGE ENCRYPTED FILE-----
diff --git a/reveal/v5-000015/r34685812.ct b/reveal/v5-000015/r34685812.ct
new file mode 100644
index 0000000..94b3899
--- /dev/null
+++ b/reveal/v5-000015/r34685812.ct
Binary files differ
diff --git a/reveal/v5-000015/r34685812.nostr.json b/reveal/v5-000015/r34685812.nostr.json
new file mode 100644
index 0000000..d7c6494
--- /dev/null
+++ b/reveal/v5-000015/r34685812.nostr.json
@@ -0,0 +1 @@
{"content":"-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDM0Njg1ODEyIDUyZGI5YmE3\nMGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw\nMGM4NGU5NzEKbUdTdlpzOFdpMzhGL1VGYjFOdlpkeXhFb3hKT0kwL08yWjJMVm45\nUGxnMWVsbXllR0lwNitrYnpxVUQ4VVRzYwpDVUpMOTFaWFNGQkhnb3d5U0Vtd3Bw\nb2lPN3RFVjNVdzJESkJJb0JxY0RzRXM4M3k1akU3NjE3VnBQN0E1S3V1CmZKSVlW\nRmpGTVk5MTB4MG0yUkF6Vzd3ekg3UXkrbnM3WEozSmVHdXFDYkEKLS0tIDlTTzM0\ndUk3TklwSjVVUUgxOXZDRm1HM1lMZHdUNVZGT1hqa3JlelBCRjAKjrw0WHXXFUu/\nfwldCn+qJJtmbFA1IM/nLbxH777dqzmihyEcnwbXm2TEqN9J31qywr2ofdygW/2X\n5q9U739ffg==\n-----END AGE ENCRYPTED FILE-----\n","tags":[["t","echo-ledger-reveal"],["round","34685812"],["reveal_at","2026-12-10T00:00:00.000000Z"],["chain","52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971"],["digest","ea1eeed54b6a64c12c8ad140cb49859ef97eba4211d5408a188b2ac0a357bedd"],["ct","6c744c35a82c3055a61a518b2844a2a2d8233e305cff6f50a86c9f9c10d51d82"],["seal","2aeea1fb056caadc5d3aeabb30c6d393fa4fa1b54edcfcb35c6e74bb9bf3fa28"]]}
diff --git a/reveal/v5-000015/r34685812.tlock b/reveal/v5-000015/r34685812.tlock
new file mode 100644
index 0000000..14171fe
--- /dev/null
+++ b/reveal/v5-000015/r34685812.tlock
@@ -0,0 +1,11 @@
1-----BEGIN AGE ENCRYPTED FILE-----
2YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDM0Njg1ODEyIDUyZGI5YmE3
3MGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw
4MGM4NGU5NzEKbUdTdlpzOFdpMzhGL1VGYjFOdlpkeXhFb3hKT0kwL08yWjJMVm45
5UGxnMWVsbXllR0lwNitrYnpxVUQ4VVRzYwpDVUpMOTFaWFNGQkhnb3d5U0Vtd3Bw
6b2lPN3RFVjNVdzJESkJJb0JxY0RzRXM4M3k1akU3NjE3VnBQN0E1S3V1CmZKSVlW
7RmpGTVk5MTB4MG0yUkF6Vzd3ekg3UXkrbnM3WEozSmVHdXFDYkEKLS0tIDlTTzM0
8dUk3TklwSjVVUUgxOXZDRm1HM1lMZHdUNVZGT1hqa3JlelBCRjAKjrw0WHXXFUu/
9fwldCn+qJJtmbFA1IM/nLbxH777dqzmihyEcnwbXm2TEqN9J31qywr2ofdygW/2X
105q9U739ffg==
11-----END AGE ENCRYPTED FILE-----
diff --git a/reveal/v5-000015/r34714612.ct b/reveal/v5-000015/r34714612.ct
new file mode 100644
index 0000000..86cdaa9
--- /dev/null
+++ b/reveal/v5-000015/r34714612.ct
Binary files differ
diff --git a/reveal/v5-000015/r34714612.nostr.json b/reveal/v5-000015/r34714612.nostr.json
new file mode 100644
index 0000000..9afab7d
--- /dev/null
+++ b/reveal/v5-000015/r34714612.nostr.json
@@ -0,0 +1 @@
{"content":"-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDM0NzE0NjEyIDUyZGI5YmE3\nMGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw\nMGM4NGU5NzEKaFJvaFN0NWdmL2VwL0xnbEx0WkJsYmpxWkRqc0ZOTDgvSVdyQjZR\nbUYvcCszQnE1TEdlQlBZR0EzNXRBQ2NyQgpDU1IvMEdFZmRQNDY1MUZTM1hmTXBS\nNXluZjhVTzgwaGJUT3RJbmg4T1BTL1FYZkxMMzRmUU9tQlVMM1Ruc2N6CmgxK1ls\naldzdit4TmhjTVhRcFJjbGRxVVFDWi9yRitkY0N6aDc3VUVQeEEKLS0tIElpNzdJ\ndmZjVG56K2xoeUhkTEsxL2VDOE5yQzJoWUdIUm9xSUozWUtwd28KZJ/fr+jTJ6Od\nXh0BtDDaWn4OhWGZoz5wEfZm5hGZ+ZXZfWLmQWt2IS6NDlAFWFTa4JLuJJiP9jIG\nt/kOPuoKyg==\n-----END AGE ENCRYPTED FILE-----\n","tags":[["t","echo-ledger-reveal"],["round","34714612"],["reveal_at","2026-12-11T00:00:00.000000Z"],["chain","52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971"],["digest","1f04ca5359925941f92251efe15de59fe87fc8e56cab8b1155ad2072422a9c93"],["ct","db69f5689e8f5014eb99f557210108c7e2ac347172f0efe59ceda13c0f984bf9"],["seal","2aeea1fb056caadc5d3aeabb30c6d393fa4fa1b54edcfcb35c6e74bb9bf3fa28"]]}
diff --git a/reveal/v5-000015/r34714612.tlock b/reveal/v5-000015/r34714612.tlock
new file mode 100644
index 0000000..c8f0e16
--- /dev/null
+++ b/reveal/v5-000015/r34714612.tlock
@@ -0,0 +1,11 @@
1-----BEGIN AGE ENCRYPTED FILE-----
2YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDM0NzE0NjEyIDUyZGI5YmE3
3MGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw
4MGM4NGU5NzEKaFJvaFN0NWdmL2VwL0xnbEx0WkJsYmpxWkRqc0ZOTDgvSVdyQjZR
5bUYvcCszQnE1TEdlQlBZR0EzNXRBQ2NyQgpDU1IvMEdFZmRQNDY1MUZTM1hmTXBS
6NXluZjhVTzgwaGJUT3RJbmg4T1BTL1FYZkxMMzRmUU9tQlVMM1Ruc2N6CmgxK1ls
7aldzdit4TmhjTVhRcFJjbGRxVVFDWi9yRitkY0N6aDc3VUVQeEEKLS0tIElpNzdJ
8dmZjVG56K2xoeUhkTEsxL2VDOE5yQzJoWUdIUm9xSUozWUtwd28KZJ/fr+jTJ6Od
9Xh0BtDDaWn4OhWGZoz5wEfZm5hGZ+ZXZfWLmQWt2IS6NDlAFWFTa4JLuJJiP9jIG
10t/kOPuoKyg==
11-----END AGE ENCRYPTED FILE-----
diff --git a/reveal/v5-000015/r34801012.ct b/reveal/v5-000015/r34801012.ct
new file mode 100644
index 0000000..12a3217
--- /dev/null
+++ b/reveal/v5-000015/r34801012.ct
Binary files differ
diff --git a/reveal/v5-000015/r34801012.nostr.json b/reveal/v5-000015/r34801012.nostr.json
new file mode 100644
index 0000000..5305846
--- /dev/null
+++ b/reveal/v5-000015/r34801012.nostr.json
@@ -0,0 +1 @@
{"content":"-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDM0ODAxMDEyIDUyZGI5YmE3\nMGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw\nMGM4NGU5NzEKcmIwbDAwbUZnVDlkamdIcW83TkVyZlJiRWE3akdiTzc2OW96bzk4\nejdPWFZOVEVaM0ttelNvbDRnUUhkTkd3dwpBRVBZamtrRG9WNWZtcXNpSjEyTDVL\nQ1ZLSjRWVFloblErT0hCWDdGUmhHSHVTYWIyZEJNbk13NFlzUWlubEdQCkV3ai9s\nWVVSSE8xMzRJVmN1eW1WVnBmeUFab2hzdjFJS3Y2cHFWRXd6QmsKLS0tIFVEVHI1\nZG1ZOE9NL1BIeE0rejd6dWt2d3dWWVJVekdoTDk1UEVJVytiSkEK8sAqZ2bpynaO\n6OJBNVZ28nHhE2kqrtknDo2FyZCxR5iIlDfFKTV1zfhBDCF89UYZEZy4sMb/Wk7b\nUFzxiwgLXQ==\n-----END AGE ENCRYPTED FILE-----\n","tags":[["t","echo-ledger-reveal"],["round","34801012"],["reveal_at","2026-12-14T00:00:00.000000Z"],["chain","52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971"],["digest","e40f7ceb57652cf64b2547e3b328a4b35cd6aab94467cb0573545bc0968b5b55"],["ct","b79a48d2552d5028daac85242ebac48449468e42167bbbd166e41212b7dfc033"],["seal","2aeea1fb056caadc5d3aeabb30c6d393fa4fa1b54edcfcb35c6e74bb9bf3fa28"]]}
diff --git a/reveal/v5-000015/r34801012.tlock b/reveal/v5-000015/r34801012.tlock
new file mode 100644
index 0000000..6fe4629
--- /dev/null
+++ b/reveal/v5-000015/r34801012.tlock
@@ -0,0 +1,11 @@
1-----BEGIN AGE ENCRYPTED FILE-----
2YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDM0ODAxMDEyIDUyZGI5YmE3
3MGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw
4MGM4NGU5NzEKcmIwbDAwbUZnVDlkamdIcW83TkVyZlJiRWE3akdiTzc2OW96bzk4
5ejdPWFZOVEVaM0ttelNvbDRnUUhkTkd3dwpBRVBZamtrRG9WNWZtcXNpSjEyTDVL
6Q1ZLSjRWVFloblErT0hCWDdGUmhHSHVTYWIyZEJNbk13NFlzUWlubEdQCkV3ai9s
7WVVSSE8xMzRJVmN1eW1WVnBmeUFab2hzdjFJS3Y2cHFWRXd6QmsKLS0tIFVEVHI1
8ZG1ZOE9NL1BIeE0rejd6dWt2d3dWWVJVekdoTDk1UEVJVytiSkEK8sAqZ2bpynaO
96OJBNVZ28nHhE2kqrtknDo2FyZCxR5iIlDfFKTV1zfhBDCF89UYZEZy4sMb/Wk7b
10UFzxiwgLXQ==
11-----END AGE ENCRYPTED FILE-----
diff --git a/reveal/v5-000015/r34829812.ct b/reveal/v5-000015/r34829812.ct
new file mode 100644
index 0000000..f4e537c
--- /dev/null
+++ b/reveal/v5-000015/r34829812.ct
Binary files differ
diff --git a/reveal/v5-000015/r34829812.nostr.json b/reveal/v5-000015/r34829812.nostr.json
new file mode 100644
index 0000000..9e6d85d
--- /dev/null
+++ b/reveal/v5-000015/r34829812.nostr.json
@@ -0,0 +1 @@
{"content":"-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDM0ODI5ODEyIDUyZGI5YmE3\nMGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw\nMGM4NGU5NzEKa1dTUGxWRFlZbEtFakxyMEdybkxRejhDV1Z0TVFrYlBMVTNkMDlq\nTkpYc2hKS1l1Vlo5VENidlJOMFVmQ3JHagpESzZVZXpVTWlnazRiM0pTZVlWRTV1\nMUlod21kU2VpRmN2RkFTMVdZVEhMRk0wRUcxVjEwSHh1YzVSNzU3M0RPCnJySEtY\nY3dBRXFBOTcycVJaL1R6c2Z4RGlmNTEyUVZkbldrMkpCS2docEkKLS0tIHZTMmN2\nK0pCQVM1VWlSOVhIQlJSOUNtT3R0VDdvejE0S3lubXV2VDlDZXMKgHW0PZmYwhKb\nzA5/CMhlyk/7MgSnayJaFMBHEzMJT9JHJhKg+UFF0iuTBQ2szs5E0JlVaIBZNHpi\ndcDAuXyCMg==\n-----END AGE ENCRYPTED FILE-----\n","tags":[["t","echo-ledger-reveal"],["round","34829812"],["reveal_at","2026-12-15T00:00:00.000000Z"],["chain","52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971"],["digest","ac9dfa6db527551f00079b1c80d21271bd186e58350fb09b147ad5c24ec3265a"],["ct","08d45335183d1ff228be045a1f1f70490869a8e9ae6f4bd73e1bcda6f7a76e42"],["seal","2aeea1fb056caadc5d3aeabb30c6d393fa4fa1b54edcfcb35c6e74bb9bf3fa28"]]}
diff --git a/reveal/v5-000015/r34829812.tlock b/reveal/v5-000015/r34829812.tlock
new file mode 100644
index 0000000..4fa1b37
--- /dev/null
+++ b/reveal/v5-000015/r34829812.tlock
@@ -0,0 +1,11 @@
1-----BEGIN AGE ENCRYPTED FILE-----
2YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDM0ODI5ODEyIDUyZGI5YmE3
3MGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw
4MGM4NGU5NzEKa1dTUGxWRFlZbEtFakxyMEdybkxRejhDV1Z0TVFrYlBMVTNkMDlq
5TkpYc2hKS1l1Vlo5VENidlJOMFVmQ3JHagpESzZVZXpVTWlnazRiM0pTZVlWRTV1
6MUlod21kU2VpRmN2RkFTMVdZVEhMRk0wRUcxVjEwSHh1YzVSNzU3M0RPCnJySEtY
7Y3dBRXFBOTcycVJaL1R6c2Z4RGlmNTEyUVZkbldrMkpCS2docEkKLS0tIHZTMmN2
8K0pCQVM1VWlSOVhIQlJSOUNtT3R0VDdvejE0S3lubXV2VDlDZXMKgHW0PZmYwhKb
9zA5/CMhlyk/7MgSnayJaFMBHEzMJT9JHJhKg+UFF0iuTBQ2szs5E0JlVaIBZNHpi
10dcDAuXyCMg==
11-----END AGE ENCRYPTED FILE-----
diff --git a/reveal/v5-000015/r34945012.ct b/reveal/v5-000015/r34945012.ct
new file mode 100644
index 0000000..9409cde
--- /dev/null
+++ b/reveal/v5-000015/r34945012.ct
Binary files differ
diff --git a/reveal/v5-000015/r34945012.nostr.json b/reveal/v5-000015/r34945012.nostr.json
new file mode 100644
index 0000000..a96899f
--- /dev/null
+++ b/reveal/v5-000015/r34945012.nostr.json
@@ -0,0 +1 @@
{"content":"-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDM0OTQ1MDEyIDUyZGI5YmE3\nMGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw\nMGM4NGU5NzEKcy9GbXJmMThySDd3cllUbFJtZG5tSDB0ejQyOG1NM0l4d3pEeHRI\nWmw2NDBsVXJMckRRMFNHQXFkbEduLzIrWQpCNnhiQlI5Zlh2azVEelQydkNsVWtR\nbTZtME9JU2Y0b0VEUlRXM3psYmUyOEl5UWY1ZmhHSjVmRmFUL25ud0p3CjhYVWNP\nQ3Z5aTBxTTJXdDl0VGlveVRSSXZMaUVETHNSZGp4RmhLWnVzUlkKLS0tIGxEVFJw\nUHhTamlsUVA2Ukp3aTgrRDV1dEc2NEVVVXZnSXlkMGVRMVgzYzAKJaLTOVx3+1/9\nb3h3hZcsEu2+af74eoVHHUm1RcAeSuQVDy62lcWj0wDW1ZzVe8XjaPZ4PrZDuMOv\n3Me67CFSQQ==\n-----END AGE ENCRYPTED FILE-----\n","tags":[["t","echo-ledger-reveal"],["round","34945012"],["reveal_at","2026-12-19T00:00:00.000000Z"],["chain","52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971"],["digest","64b263716ccff5b2dc029602c3da67c956898604f155bf3ea83449384d64bdef"],["ct","c81586ca65094a1d14e7f0e112d6e54297051e630d6270313ff693040a3d5c42"],["seal","2aeea1fb056caadc5d3aeabb30c6d393fa4fa1b54edcfcb35c6e74bb9bf3fa28"]]}
diff --git a/reveal/v5-000015/r34945012.tlock b/reveal/v5-000015/r34945012.tlock
new file mode 100644
index 0000000..b50b53b
--- /dev/null
+++ b/reveal/v5-000015/r34945012.tlock
@@ -0,0 +1,11 @@
1-----BEGIN AGE ENCRYPTED FILE-----
2YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDM0OTQ1MDEyIDUyZGI5YmE3
3MGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw
4MGM4NGU5NzEKcy9GbXJmMThySDd3cllUbFJtZG5tSDB0ejQyOG1NM0l4d3pEeHRI
5Wmw2NDBsVXJMckRRMFNHQXFkbEduLzIrWQpCNnhiQlI5Zlh2azVEelQydkNsVWtR
6bTZtME9JU2Y0b0VEUlRXM3psYmUyOEl5UWY1ZmhHSjVmRmFUL25ud0p3CjhYVWNP
7Q3Z5aTBxTTJXdDl0VGlveVRSSXZMaUVETHNSZGp4RmhLWnVzUlkKLS0tIGxEVFJw
8UHhTamlsUVA2Ukp3aTgrRDV1dEc2NEVVVXZnSXlkMGVRMVgzYzAKJaLTOVx3+1/9
9b3h3hZcsEu2+af74eoVHHUm1RcAeSuQVDy62lcWj0wDW1ZzVe8XjaPZ4PrZDuMOv
103Me67CFSQQ==
11-----END AGE ENCRYPTED FILE-----
diff --git a/reveal/v5-000015/r35578612.ct b/reveal/v5-000015/r35578612.ct
new file mode 100644
index 0000000..38ca0bc
--- /dev/null
+++ b/reveal/v5-000015/r35578612.ct
Binary files differ
diff --git a/reveal/v5-000015/r35578612.nostr.json b/reveal/v5-000015/r35578612.nostr.json
new file mode 100644
index 0000000..62becc0
--- /dev/null
+++ b/reveal/v5-000015/r35578612.nostr.json
@@ -0,0 +1 @@
{"content":"-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDM1NTc4NjEyIDUyZGI5YmE3\nMGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw\nMGM4NGU5NzEKaytyOXVUYWs5aFdMdkFlc2c2OVFPNDZCWHhZQWZIMjNkZzBJR0ZU\nTFh1TEJnamI4bXhsVXR2azRuQTgxREIvUApFRnB1VXZhc3VaNmcvaXVzTFlrVU9t\nZThJblZUTVhKK1JmVmlNTGlwbFFiM1ZOOW5JUUlmc0crbFEzWkxKOVRiClZ2NWFQ\nSHlRT1VJa0d0WmhyeXB5dm4xRFByS21Ga3FrYXVhOXFnVUdRTUkKLS0tIG1oKzNK\ncHRvU3JtSkNjUVdqRjd6eU9mTzR6clJ2R3VWWHNZQm1WSExXc0kKibm6m6xAgtAc\nVlndR4cJmTBOELcNlABmm6Oy3DkVTvrKyOipuliz2tLx+D1RejzTpw/dC1MVSCoW\noIidFZk+3g==\n-----END AGE ENCRYPTED FILE-----\n","tags":[["t","echo-ledger-reveal"],["round","35578612"],["reveal_at","2027-01-10T00:00:00.000000Z"],["chain","52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971"],["digest","94b6250528065f08b85d7bbc158ebbf54f45aeb55cf9cdfee6908be50eb4638c"],["ct","b59293fbddc0f440032b280497d889d731127e8ff0d9d91180d48560c3dcabcc"],["seal","2aeea1fb056caadc5d3aeabb30c6d393fa4fa1b54edcfcb35c6e74bb9bf3fa28"]]}
diff --git a/reveal/v5-000015/r35578612.tlock b/reveal/v5-000015/r35578612.tlock
new file mode 100644
index 0000000..e5f04d0
--- /dev/null
+++ b/reveal/v5-000015/r35578612.tlock
@@ -0,0 +1,11 @@
1-----BEGIN AGE ENCRYPTED FILE-----
2YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDM1NTc4NjEyIDUyZGI5YmE3
3MGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw
4MGM4NGU5NzEKaytyOXVUYWs5aFdMdkFlc2c2OVFPNDZCWHhZQWZIMjNkZzBJR0ZU
5TFh1TEJnamI4bXhsVXR2azRuQTgxREIvUApFRnB1VXZhc3VaNmcvaXVzTFlrVU9t
6ZThJblZUTVhKK1JmVmlNTGlwbFFiM1ZOOW5JUUlmc0crbFEzWkxKOVRiClZ2NWFQ
7SHlRT1VJa0d0WmhyeXB5dm4xRFByS21Ga3FrYXVhOXFnVUdRTUkKLS0tIG1oKzNK
8cHRvU3JtSkNjUVdqRjd6eU9mTzR6clJ2R3VWWHNZQm1WSExXc0kKibm6m6xAgtAc
9VlndR4cJmTBOELcNlABmm6Oy3DkVTvrKyOipuliz2tLx+D1RejzTpw/dC1MVSCoW
10oIidFZk+3g==
11-----END AGE ENCRYPTED FILE-----
diff --git a/reveal/v5-000015/r35693812.ct b/reveal/v5-000015/r35693812.ct
new file mode 100644
index 0000000..b5d00da
--- /dev/null
+++ b/reveal/v5-000015/r35693812.ct
Binary files differ
diff --git a/reveal/v5-000015/r35693812.nostr.json b/reveal/v5-000015/r35693812.nostr.json
new file mode 100644
index 0000000..e7e9f1a
--- /dev/null
+++ b/reveal/v5-000015/r35693812.nostr.json
@@ -0,0 +1 @@
{"content":"-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDM1NjkzODEyIDUyZGI5YmE3\nMGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw\nMGM4NGU5NzEKa25rdFZFOVdqL2VIdXRVUjA2SVhoUFd0MnNGUnoxWVNRcjdYSGhZ\nUWl4Y1J6UlkxT0ZYWTlNZmN1L0FUbzVvNQpDcHNqTjVIQ0tjL3EwNnEvNlFtcmxp\nS3gyOTM4andIcW9iYU45YWFTZER2Nko5NXI4TUJrTmF6SktXZWNQUk1PCklQamRO\nRTFXbm1EV0hxMlRBS0hqeEdkMnVrWUl4N0doTmw1N2NIWFFsNUEKLS0tIG1OMG5G\nR1d1ZFo3TmRtREtaRXJuTUoxeXI5TDJ2V0M2cHhvV1p6eENTSjgKR2U+cbEEEn+I\ndHxZ3ehCDh1qe7CysHKNeSnbKOxL+76TqzRESOvCtXAvUjB7v6nMd1pzSYaKSepP\n7U7ZYAfuMA==\n-----END AGE ENCRYPTED FILE-----\n","tags":[["t","echo-ledger-reveal"],["round","35693812"],["reveal_at","2027-01-14T00:00:00.000000Z"],["chain","52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971"],["digest","4a021ae959af427b51d6e700fa8cc6f0fbc7f419b498fe6deff8da011b07dc18"],["ct","40dcfd86892743e3d9eb5517b32342795c7669e9da42fe7a1c73309a28123e3a"],["seal","2aeea1fb056caadc5d3aeabb30c6d393fa4fa1b54edcfcb35c6e74bb9bf3fa28"]]}
diff --git a/reveal/v5-000015/r35693812.tlock b/reveal/v5-000015/r35693812.tlock
new file mode 100644
index 0000000..03e2b4d
--- /dev/null
+++ b/reveal/v5-000015/r35693812.tlock
@@ -0,0 +1,11 @@
1-----BEGIN AGE ENCRYPTED FILE-----
2YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDM1NjkzODEyIDUyZGI5YmE3
3MGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw
4MGM4NGU5NzEKa25rdFZFOVdqL2VIdXRVUjA2SVhoUFd0MnNGUnoxWVNRcjdYSGhZ
5UWl4Y1J6UlkxT0ZYWTlNZmN1L0FUbzVvNQpDcHNqTjVIQ0tjL3EwNnEvNlFtcmxp
6S3gyOTM4andIcW9iYU45YWFTZER2Nko5NXI4TUJrTmF6SktXZWNQUk1PCklQamRO
7RTFXbm1EV0hxMlRBS0hqeEdkMnVrWUl4N0doTmw1N2NIWFFsNUEKLS0tIG1OMG5G
8R1d1ZFo3TmRtREtaRXJuTUoxeXI5TDJ2V0M2cHhvV1p6eENTSjgKR2U+cbEEEn+I
9dHxZ3ehCDh1qe7CysHKNeSnbKOxL+76TqzRESOvCtXAvUjB7v6nMd1pzSYaKSepP
107U7ZYAfuMA==
11-----END AGE ENCRYPTED FILE-----
diff --git a/reveal/v5-000015/r36730612.ct b/reveal/v5-000015/r36730612.ct
new file mode 100644
index 0000000..db7eafe
--- /dev/null
+++ b/reveal/v5-000015/r36730612.ct
Binary files differ
diff --git a/reveal/v5-000015/r36730612.nostr.json b/reveal/v5-000015/r36730612.nostr.json
new file mode 100644
index 0000000..cde73cb
--- /dev/null
+++ b/reveal/v5-000015/r36730612.nostr.json
@@ -0,0 +1 @@
{"content":"-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDM2NzMwNjEyIDUyZGI5YmE3\nMGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw\nMGM4NGU5NzEKdG9ueWlSbG45NmVUcE9XcXJXRWd0a2NpeUQra2VRT1RwLzNrVjJt\nR1E0NFhpbkF5UVhxREhvRkREN3dnbGlibQpCVkE2SzNLbEVWNUp5cWtmSzU3U0h1\neE5Pa2lCcjE4M1ZnNDgwczNVOC9LdmRnLzNZMWVGVE5Oa094RVBldk5mCjRmeEhk\nSG9Ma1h3VENGaHZkUEI3YnhoWGlBdEV6OEFwZytGZmFCdXlTRDAKLS0tIGxVZG82\nNDJ4VlBMSWYrckd0WFFUM0FYcHp3Zlg5Qzl5M2tFam9SM0tTTTgK5yd3hskuhqpc\nRCvqUEGc7bJUJz1vJAENWVeNeCieSm+3fYr4SbNLaoAlZUSDBRkf0rRmjVGms+CP\npAwv6T2ZnQ==\n-----END AGE ENCRYPTED FILE-----\n","tags":[["t","echo-ledger-reveal"],["round","36730612"],["reveal_at","2027-02-19T00:00:00.000000Z"],["chain","52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971"],["digest","4f3399b9d34d0bed43af4eb49e57b165aa622c4fec5ba1d18ef7849995f457c2"],["ct","0559ae1b751959f403772e7b11e221fb9f285616bcae5ce780a4d23ca74c6104"],["seal","2aeea1fb056caadc5d3aeabb30c6d393fa4fa1b54edcfcb35c6e74bb9bf3fa28"]]}
diff --git a/reveal/v5-000015/r36730612.tlock b/reveal/v5-000015/r36730612.tlock
new file mode 100644
index 0000000..1ed58d6
--- /dev/null
+++ b/reveal/v5-000015/r36730612.tlock
@@ -0,0 +1,11 @@
1-----BEGIN AGE ENCRYPTED FILE-----
2YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDM2NzMwNjEyIDUyZGI5YmE3
3MGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw
4MGM4NGU5NzEKdG9ueWlSbG45NmVUcE9XcXJXRWd0a2NpeUQra2VRT1RwLzNrVjJt
5R1E0NFhpbkF5UVhxREhvRkREN3dnbGlibQpCVkE2SzNLbEVWNUp5cWtmSzU3U0h1
6eE5Pa2lCcjE4M1ZnNDgwczNVOC9LdmRnLzNZMWVGVE5Oa094RVBldk5mCjRmeEhk
7SG9Ma1h3VENGaHZkUEI3YnhoWGlBdEV6OEFwZytGZmFCdXlTRDAKLS0tIGxVZG82
8NDJ4VlBMSWYrckd0WFFUM0FYcHp3Zlg5Qzl5M2tFam9SM0tTTTgK5yd3hskuhqpc
9RCvqUEGc7bJUJz1vJAENWVeNeCieSm+3fYr4SbNLaoAlZUSDBRkf0rRmjVGms+CP
10pAwv6T2ZnQ==
11-----END AGE ENCRYPTED FILE-----
diff --git a/reveal/v5-000015/r36788212.ct b/reveal/v5-000015/r36788212.ct
new file mode 100644
index 0000000..0612802
--- /dev/null
+++ b/reveal/v5-000015/r36788212.ct
Binary files differ
diff --git a/reveal/v5-000015/r36788212.nostr.json b/reveal/v5-000015/r36788212.nostr.json
new file mode 100644
index 0000000..d657ca5
--- /dev/null
+++ b/reveal/v5-000015/r36788212.nostr.json
@@ -0,0 +1 @@
{"content":"-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDM2Nzg4MjEyIDUyZGI5YmE3\nMGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw\nMGM4NGU5NzEKZ3BIbXZ1YXhGL3JUNVZZWmtmK1ZNQUtENGpSU09MbndRZlU5cU1x\nNVQ1eVdIcUh1QlA3U2RvdnpNNmNBaG4ybApDelk1QlRleXRyRmd6VXZ6U3JFUjlH\ndnFZZ2o3dmREVkdHaDUxUHB1ZHIzUmpGd0NxU3c3NkVKS3drcGt3Y2h1Clo3TWVt\nM1RHMjJhRUFCWFlWUkl1SWtrNDdHQVhCQStCM2dsbWdINWltMmcKLS0tIEV5Z3Rx\nL09JVnZSRUdXQmFad2NOQ2R5L3lpalRzajg4alc3aFNSTnJXMjAKOSv89M/Ib20i\n3FLuKon6sYNz1XIw416JZ7GkZ9/Qs3nSGbluEKnMRN5CMOybbh8vqawV8ZesJV8L\nKnc8tETixQ==\n-----END AGE ENCRYPTED FILE-----\n","tags":[["t","echo-ledger-reveal"],["round","36788212"],["reveal_at","2027-02-21T00:00:00.000000Z"],["chain","52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971"],["digest","5d325e737f9c7eaf89a1e91961f6b05182489d8c8f8adb352287e44db80d0ceb"],["ct","09e2645bdaea0695b0d46fcce19cdb530dee5153476add7377edc542ac44c826"],["seal","2aeea1fb056caadc5d3aeabb30c6d393fa4fa1b54edcfcb35c6e74bb9bf3fa28"]]}
diff --git a/reveal/v5-000015/r36788212.tlock b/reveal/v5-000015/r36788212.tlock
new file mode 100644
index 0000000..7806c0e
--- /dev/null
+++ b/reveal/v5-000015/r36788212.tlock
@@ -0,0 +1,11 @@
1-----BEGIN AGE ENCRYPTED FILE-----
2YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDM2Nzg4MjEyIDUyZGI5YmE3
3MGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw
4MGM4NGU5NzEKZ3BIbXZ1YXhGL3JUNVZZWmtmK1ZNQUtENGpSU09MbndRZlU5cU1x
5NVQ1eVdIcUh1QlA3U2RvdnpNNmNBaG4ybApDelk1QlRleXRyRmd6VXZ6U3JFUjlH
6dnFZZ2o3dmREVkdHaDUxUHB1ZHIzUmpGd0NxU3c3NkVKS3drcGt3Y2h1Clo3TWVt
7M1RHMjJhRUFCWFlWUkl1SWtrNDdHQVhCQStCM2dsbWdINWltMmcKLS0tIEV5Z3Rx
8L09JVnZSRUdXQmFad2NOQ2R5L3lpalRzajg4alc3aFNSTnJXMjAKOSv89M/Ib20i
93FLuKon6sYNz1XIw416JZ7GkZ9/Qs3nSGbluEKnMRN5CMOybbh8vqawV8ZesJV8L
10Knc8tETixQ==
11-----END AGE ENCRYPTED FILE-----
diff --git a/reveal/v5-000015/r36845812.ct b/reveal/v5-000015/r36845812.ct
new file mode 100644
index 0000000..f92ef94
--- /dev/null
+++ b/reveal/v5-000015/r36845812.ct
Binary files differ
diff --git a/reveal/v5-000015/r36845812.nostr.json b/reveal/v5-000015/r36845812.nostr.json
new file mode 100644
index 0000000..babd1a6
--- /dev/null
+++ b/reveal/v5-000015/r36845812.nostr.json
@@ -0,0 +1 @@
{"content":"-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDM2ODQ1ODEyIDUyZGI5YmE3\nMGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw\nMGM4NGU5NzEKcmdwTWRnOFcwV3RaVXdxTGdjRWNaQTk1YlBCTFQydTY4Vm1LcW1V\nYUVuamlRSkZnRmxxQWZEanRXTXVES3RuZQpGNnEvVVAxbTcwU0U4SEJtQ1NCYWh0\nOFhMTFFxS2l2RkNoTys4VUtPZzRxTUg4OU1jcy9nRm5kczA5UEJzak1EClkyMFFj\na2JqcmIrYTV5MXI0OHExdC9oWDJxUW0vTC9vMXVNeEFtOXZ6M1kKLS0tIGxVQXRZ\nV0t0aW5RNFByd0RQUU11eUhCLzVScXBCaFRqcUhWd2xoazJhWm8KFpmlOcQ5dQxN\nFoXcIzL1qYrQMgldWinBE5GPYZvsa/xzPnpk926XjaerddUFpPvhYUTba4vuoxjO\nBfcH55pWQA==\n-----END AGE ENCRYPTED FILE-----\n","tags":[["t","echo-ledger-reveal"],["round","36845812"],["reveal_at","2027-02-23T00:00:00.000000Z"],["chain","52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971"],["digest","bb98419ca3bdaf94a26feac3d847176f2e8624f0c4c7722871ba1abb51893a0f"],["ct","53ec7b623272057a70d54cc807613369b8952eb38a21e0c1f1198a075b738e39"],["seal","2aeea1fb056caadc5d3aeabb30c6d393fa4fa1b54edcfcb35c6e74bb9bf3fa28"]]}
diff --git a/reveal/v5-000015/r36845812.tlock b/reveal/v5-000015/r36845812.tlock
new file mode 100644
index 0000000..29fad50
--- /dev/null
+++ b/reveal/v5-000015/r36845812.tlock
@@ -0,0 +1,11 @@
1-----BEGIN AGE ENCRYPTED FILE-----
2YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDM2ODQ1ODEyIDUyZGI5YmE3
3MGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw
4MGM4NGU5NzEKcmdwTWRnOFcwV3RaVXdxTGdjRWNaQTk1YlBCTFQydTY4Vm1LcW1V
5YUVuamlRSkZnRmxxQWZEanRXTXVES3RuZQpGNnEvVVAxbTcwU0U4SEJtQ1NCYWh0
6OFhMTFFxS2l2RkNoTys4VUtPZzRxTUg4OU1jcy9nRm5kczA5UEJzak1EClkyMFFj
7a2JqcmIrYTV5MXI0OHExdC9oWDJxUW0vTC9vMXVNeEFtOXZ6M1kKLS0tIGxVQXRZ
8V0t0aW5RNFByd0RQUU11eUhCLzVScXBCaFRqcUhWd2xoazJhWm8KFpmlOcQ5dQxN
9FoXcIzL1qYrQMgldWinBE5GPYZvsa/xzPnpk926XjaerddUFpPvhYUTba4vuoxjO
10BfcH55pWQA==
11-----END AGE ENCRYPTED FILE-----
diff --git a/reveal/v5-000015/r37940212.ct b/reveal/v5-000015/r37940212.ct
new file mode 100644
index 0000000..1385688
--- /dev/null
+++ b/reveal/v5-000015/r37940212.ct
Binary files differ
diff --git a/reveal/v5-000015/r37940212.nostr.json b/reveal/v5-000015/r37940212.nostr.json
new file mode 100644
index 0000000..3add4e3
--- /dev/null
+++ b/reveal/v5-000015/r37940212.nostr.json
@@ -0,0 +1 @@
{"content":"-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDM3OTQwMjEyIDUyZGI5YmE3\nMGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw\nMGM4NGU5NzEKckM4TytSTUV2MGNkNUxLclRUMEdTVnNnNFl4MEN0bXp5TVlvTmg5\nczVxVzd3cmNSTU1STFdBVDBJemgydi9WWQpBZEV3VldaUGJ3T2V4U2FPcnhES2o2\nZXhoc2VTVEEwSkp6NVpqb2N5aGI2SUwwUllNNlluRzllVFhnU2w5eEFVCjJYa053\nNFM1Mk1xN3NiRUJUWGN2R2xXL3ZUMlhUaS84VkRoWG0zQVV3RlkKLS0tIGhVcXZQ\nOEtDZ2Z4czJ0eXF2OFhZdktLVVhMaWc1WjhXeFJKK21IRjlyYVkKu27BLhG/kxBT\nALYKV8f+bufMZ56Nh5x4VPUDmGdCaZk0bHlxj2WlHhUIBweAVhBElFVLido65hlS\nKRLs5v/uBg==\n-----END AGE ENCRYPTED FILE-----\n","tags":[["t","echo-ledger-reveal"],["round","37940212"],["reveal_at","2027-04-02T00:00:00.000000Z"],["chain","52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971"],["digest","170514d02dccd65fe1cc5ef497f4a1633f3bc7321e6d10f1174cbecefce3e1a9"],["ct","f486c8f779359b30b552d1d57abf9929f4db38793105e4040bdb280885f520d8"],["seal","2aeea1fb056caadc5d3aeabb30c6d393fa4fa1b54edcfcb35c6e74bb9bf3fa28"]]}
diff --git a/reveal/v5-000015/r37940212.tlock b/reveal/v5-000015/r37940212.tlock
new file mode 100644
index 0000000..c770dc9
--- /dev/null
+++ b/reveal/v5-000015/r37940212.tlock
@@ -0,0 +1,11 @@
1-----BEGIN AGE ENCRYPTED FILE-----
2YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHRsb2NrIDM3OTQwMjEyIDUyZGI5YmE3
3MGUwY2MwZjZlYWY3ODAzZGQwNzQ0N2ExZjU0Nzc3MzVmZDNmNjYxNzkyYmE5NDYw
4MGM4NGU5NzEKckM4TytSTUV2MGNkNUxLclRUMEdTVnNnNFl4MEN0bXp5TVlvTmg5
5czVxVzd3cmNSTU1STFdBVDBJemgydi9WWQpBZEV3VldaUGJ3T2V4U2FPcnhES2o2
6ZXhoc2VTVEEwSkp6NVpqb2N5aGI2SUwwUllNNlluRzllVFhnU2w5eEFVCjJYa053
7NFM1Mk1xN3NiRUJUWGN2R2xXL3ZUMlhUaS84VkRoWG0zQVV3RlkKLS0tIGhVcXZQ
8OEtDZ2Z4czJ0eXF2OFhZdktLVVhMaWc1WjhXeFJKK21IRjlyYVkKu27BLhG/kxBT
9ALYKV8f+bufMZ56Nh5x4VPUDmGdCaZk0bHlxj2WlHhUIBweAVhBElFVLido65hlS
10KRLs5v/uBg==
11-----END AGE ENCRYPTED FILE-----
diff --git a/reveal/v5-000015/seal.json b/reveal/v5-000015/seal.json
new file mode 100644
index 0000000..fc56c17
--- /dev/null
+++ b/reveal/v5-000015/seal.json
@@ -0,0 +1,43 @@
1{
2 "algorithm": "sha256-live-v5",
3 "anchor_ref": "sha256:2aeea1fb056caadc5d3aeabb30c6d393fa4fa1b54edcfcb35c6e74bb9bf3fa28",
4 "covers_after": "2026-10-09T16:31:25.305817Z",
5 "covers_through": "2026-10-09T21:20:37.989880Z",
6 "digest": "2aeea1fb056caadc5d3aeabb30c6d393fa4fa1b54edcfcb35c6e74bb9bf3fa28",
7 "follows_seq": 45,
8 "n_forecasts": 1227,
9 "n_groups": 16,
10 "n_withheld": 1227,
11 "prev_digest": "11293db524a9ce788df948c5347c7f627a7649e0718bce967ae5d32261fe19ba",
12 "prev_seq": 14,
13 "sealed_at": "2026-10-09T21:21:07.305632Z",
14 "seq": 15,
15 "variant": {
16 "beacon": {
17 "chain_hash": "52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971",
18 "genesis_time": 1692803367,
19 "period": 3,
20 "relays": [
21 "https://api.drand.sh",
22 "https://api2.drand.sh",
23 "https://api3.drand.sh",
24 "https://drand.cloudflare.com"
25 ],
26 "scheme": "bls-unchained-g1-rfc9380"
27 },
28 "cipher": "chacha20poly1305-zlib6-nonce0",
29 "gate": {
30 "default": "withheld: a kept salt can be released later; an opened text can never be withdrawn",
31 "opened": "none",
32 "why": "no decision by Echo yet"
33 },
34 "line": "numeric<TAB>open:<v4 line> | numeric<TAB>withheld:sha256(salt||v4 line)",
35 "reveal": "utc-day-after-close",
36 "salts": "key ring: one content a seal, one part a line",
37 "tool": {
38 "name": "tle",
39 "sha256": "69157d8c14a1d390d1b7744946288f83d4b10748471d5447f9abb77a5902c541",
40 "version": "tlock v1.2.0 -- github.com/drand/tlock"
41 }
42 }
43}