diff --git a/.github/workflows/bit-reuse-147.yml b/.github/workflows/bit-reuse-147.yml new file mode 100644 index 0000000000..6a8d3a27ec --- /dev/null +++ b/.github/workflows/bit-reuse-147.yml @@ -0,0 +1,29 @@ +name: Verify recycled bit registers on the paired-cube bit word + +on: + push: + pull_request: + workflow_dispatch: + +permissions: + contents: read + +jobs: + certificate: + runs-on: ubuntu-24.04 + timeout-minutes: 30 + strategy: + fail-fast: false + matrix: + python-version: ['3.11', '3.14'] + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 + with: + persist-credentials: false + - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7 + with: + python-version: ${{ matrix.python-version }} + - name: Reproduce PR144, run the ledger, check exact nesting, replay and reprice + run: python3 research/bit-reuse-147/verify.py + - name: Require committed files to remain unchanged + run: git diff --exit-code diff --git a/research/bit-reuse-147/NOTICE b/research/bit-reuse-147/NOTICE new file mode 100644 index 0000000000..aaeb125cab --- /dev/null +++ b/research/bit-reuse-147/NOTICE @@ -0,0 +1,21 @@ +Recycled bit registers on the paired-cube shared cores, 9 October 2026 +Copyright 2026 DaysSky. Apache-2.0. + +Prepared by DaysSky with Anthropic Claude assistance. The contribution is the late read timetable, the hand-off +of dead bit registers to later deferred births on this word, and their verification. No priority over concurrent +work is claimed. + +Credits for what this package uses: + +- icekylinx: #144 and #130 (paired-cube and three-stage cover framework, selected gauges, completed-core ledger, + pricing and assembly), and #104. +- hpst3r (William Porter): #147, terminal elimination on this bit word. Its plan of 1,549 eliminated slots is used + unchanged, and price147.py follows its pricing approach. +- jamesyc (James Chang): #124, the birth-read reuse operation. +- SovereignSteak: #122, terminal accumulator elimination. +- Swapnil Jain: the round-seven deferred bit word and its exact frame tools. +- Zhihao Chen (jacklightChen): the PR97 ledger. +- an664: #128, completed-core sharing. +- gupt1156: #148, the atom exponent 1/2000 reported as a secondary value. + +All inherited licenses, notices and assistance disclosures remain in force and unchanged. diff --git a/research/bit-reuse-147/PROOF.md b/research/bit-reuse-147/PROOF.md new file mode 100644 index 0000000000..03bb202330 --- /dev/null +++ b/research/bit-reuse-147/PROOF.md @@ -0,0 +1,96 @@ +# Recycling dead bit registers at deferred births: argument and scope + +**Setting.** This is the bit branch of the merged #144 (icekylinx), after the terminal elimination of #147 (hpst3r). +Its word is Swapnil Jain's round-seven PR97 word at h = 23: + +- non-deferred and omitted reads at frame 0; +- early V gates, phase 1 and the copied centres; +- deferred reads of the selected slots at their sigma frames, in the inherited readout order; +- late V gates, the rest of L, the output reads, then L^-1 and V^-1 at the full frame. + +#144 charges the resulting chains per vertex in dimension m = 69: auxiliary chain steps, source and target chains and +copied centres, each three times; one gauge child 3 dim(sigma) per selected slot; and 2v endpoint children. +W = 2v + R and the deficit is 2,024 per vertex. #147 deletes 1,549 terminal output slots; that plan is used here +unchanged, as is #144's choice of 9,543 selected gauges. + +**Two changes.** Nothing else in the word moves. + +1. *Reads run late.* The selected reads keep their inherited relative order, but each one is executed as late as + these constraints allow, instead of in one block after phase 1: + - a read precedes the first operation that touches its slot, and that slot's V gate follows the read; + - the V gates of one leaf keep their inherited chain order; + - every read on a target precedes the first redirected write into that target. +2. *Dead registers are reused.* A slot D that is neither an output slot nor a retained centre is never touched + again after its last operation, where it sits at the frame U_D of that operation. For 3,338 pairs (B, D) with D's last operation + before B's read and U_D inside sigma_B, the register of D is moved from U_D to sigma_B and becomes B. B is then a + deferred slot without an entrance gauge. This is jamesyc's #124 birth-read operation, applied to the bit word. + +**Scalar identity.** The inherited identity holds for arbitrary start values of all slots: a slot s with start value +z_s contributes C_{T,s} z_s to target T through L and the root reads, and its read subtracts exactly that, where C is +the exact integer adjoint. + +- Delaying a read does not change what it reads. Until its first operation or V gate, the register holds its start + value, and a read only writes into targets, which nothing reads back. +- For a recycled pair, B's start value is whatever D left behind, a linear form in the data and the other start + values. D's last operation is before the read and B's first operation is after it, so B's read sees that value + and B's own contribution carries the same value with the same coefficients. The two cancel as before. +- D's remaining contributions are unchanged, because no operation reads D after its last operation. +- The inverse pass undoes the register updates (operations and V gates) in exact reverse order, at the full frame. + On a recycled register this removes B's V gate before D's operations are undone. The inherited order, with every + V^-1 after L^-1, would not restore the registers; `verify.py` checks that it fails. + +`word147.complete` runs the literal word on the 23,979 physical registers with every data port, target and +register as its own formal variable, over F2 (bitmasks) and over Z (integer linear forms with the exact integer +coefficients). Every register must end as its own variable and every target as its start variable plus exactly +its defining sum. This check is complete and uses no random vectors. `word147.replay` then runs the word on random +scratch and data, where three tampered words must break the Z identity: a recycled read of the register's entrance +value, a recycled read taken before its donor's last write, and the inherited inverse order. + +**Frames.** Every frame is an original frame key of the PR97 word, so nondegeneracy is inherited. A hand-off is the +difference of two inherited projectors; it adds finitely many rank-witness primes for the fixed prime q of #130's +weighted compiler to avoid, and nothing else. `word147.ledger` +executes the forward word on frame keys. Each scalar gate must find all its registers at one common key, and no +register may retreat in dimension. The check of actual nesting is separate: + +- A move between two keys of one inherited certified chain, in that chain's order, is nested by the pinned audits + (`check_lifted.py` D, `check_frames.py` X and Q) that #144 relies on. Those chains are the original slot chains, + the X chains in their original V order, and the target chains in readout order with positive Z support, ending + at t_T^perp. A subsequence of a nested chain is nested. +- Every other move is checked exactly over Q with integer bases rebuilt by `check_lifted.py`, and both frames are + checked nondegenerate. There are 4,878 such moves: + - 3,338 hand-offs U_D -> sigma_B (993 of them have equal dimension, so the two frames are equal); + - 935 target moves from the last remaining level to a redirected V frame; + - 605 target moves from one eliminated slot's redirected frame to another's V frame. These arise because a + redirected V write now runs just before its slot's first operation rather than in the late-V block. + +Delaying the reads does not reorder any chain. With no elimination and no recycling, the delayed word reproduces +every histogram of #144's row; `verify.py` checks this as a control. + +**Accounting.** #144's ledger (`notes/paired-cube-sharing.tex`) charges a physical role by its entrance gauge and +its frame chain. A recycled register enters with its first occupant's gauge, follows one nested chain to the full +frame, and has its raw value restored, so it satisfies the same completed-core contract. Relative to #147, one pair +(B, D) with d = dim U_D and f = dim sigma_B + +- removes D's final step of rank 23 - d (three copies) and B's gauge child of width 3f; +- adds the hand-off step of rank f - d (three copies); +- lowers W by one. + +The removed rank is 3(23 - d) + 3f and the added rank is 3(f - d), so the mass drops by 69 = m and the deficit stays +2,024. The row is rebuilt from the actual ledger moves (`word147.row`) and priced with #144's own functions +(`price147.py`): `exact_moment`, the full rare-class fallback, the complex certificate, the finite bridge and the +47-constraint assembly. The largest child falls from 66 to 60, which only shortens the recursion depth bound. + +**Scope.** This is a finite conditional construction. Every interface that #144 retains stays an assumption: + +- the unchanged complete scalar word and the inherited rational frame audit of PR97; +- the paired source scheduling and completed-core sharing; +- the uniform recursion, analytic and tape contracts. + +Not established here: + +- The replay runs one core on its own bank, as in #147. That is the premise the shared-core argument uses. +- The pinned PR97 frame audits are relied on, not rerun. +- The plan is one legal choice found by a matching heuristic (`make_plan.py`). No optimality is claimed, and the + certified value does not depend on how the plan was found. +- The headline uses the merged atom exponent 1/1000. The value at 1/2000 (gupt1156's #148) is reported separately + and rests on the retained requirement a_bit < beta < 1 - a_bit. diff --git a/research/bit-reuse-147/README.md b/research/bit-reuse-147/README.md new file mode 100644 index 0000000000..44fe6de1da --- /dev/null +++ b/research/bit-reuse-147/README.md @@ -0,0 +1,71 @@ +# Recycled bit registers on #144's shared cores + +Under the interfaces retained by the merged #144, this package certifies + + T(n) = O(n (log n)^(1 - κ)), κ = 471809569/10^12 = 4.71809569e-4 + +That is +1.54% over #147 (4646633/10^10) and +2.36% over the merged #144 (4609169/10^10). It adds this directory +and one workflow; no existing file changes. + +## What changes + +Only the bit word changes, and #144 is bit-limited. Starting from #147's reduced word: + +- The selected deferred reads keep their order but run as late as the word allows, instead of in one block. +- 3,338 auxiliary registers that are dead (never touched again) are handed to a later deferred slot whose entrance + frame contains the dead register's frame. The recipient's inherited read cancels what the donor left. This is + jamesyc's #124 birth-read operation, applied to the bit word. + +Each hand-off removes one physical role, the donor's final step and the recipient's gauge child, and adds one +shorter step. [PROOF.md](PROOF.md) gives the argument and its scope. + +| | roles R | W per vertex | coarse bit saving | κ | +|---|---|---|---|---| +| #144 (merged) | 28,866 | 32,408 | 4617656/10^10 | 4609169/10^10 | +| #147 | 27,317 | 30,859 | 4655227/10^10 | 4646633/10^10 | +| this package | 23,979 | 27,521 | 472689442/10^12 | **471809569/10^12** | + +The deficit per vertex (2,024) is unchanged. The complex side (4856569/10^10) still has about 2.9% headroom. + +The headline keeps the merged atom exponent 1/1000. At gupt1156's 1/2000 (#148) the same row gives +472026274/10^12 = 4.72026274e-4; `verify.py` checks both. + +Not composed here: Th0rgal's exact min-cut gauge subset (#146). #144's own 9,543 selected gauges are used. + +## Verify + + python3 research/bit-reuse-147/verify.py # stdlib only, about 2 minutes; do not use -O + python3 research/bit-reuse-147/verify.py --all # also re-checks every inherited frame move, about 9 minutes + +`verify.py` runs these checks: + +1. It reproduces #144's coarse saving, stopped saving and κ exactly on #144's own grid. +2. With no elimination and no recycling, the delayed-read word reproduces every histogram of #144's row. +3. It runs the frame ledger of the frozen plan: every scalar gate at one common frame, no register retreating. The + row rebuilt from the actual moves must equal `row.json`. +4. It checks all 4,878 new adjacent frame pairs for exact nesting over Q, with bases rebuilt by `check_lifted.py`. + A control must reject mismatched hand-offs. +5. It runs the literal word on the 23,979 physical registers with all 27,521 inputs as formal variables, over F2 + and over Z, and requires the exact identity. This is complete, with no random vectors. A random replay then + confirms that three tampered words break the identity. +6. It prices the row with #144's assembly (47 constraints, 7 margins); the next grid points are rejected. + +## Files + +- `word147.py`: timetable, literal events, scalar replay, frame ledger and row. +- `frames147.py`: exact integer frame bases and nesting over Q. +- `price147.py`: pricing with #144's `paired_cube_network.py` functions. As in #147, the one relaxed check is the + bit dimension test, which accepts R <= 28866. +- `plan.json`: the eliminated slots (#147's plan, unchanged), the remaining gauge slots and the 3,338 pairs. +- `row.json`, `expected.json`: the resulting row and the certified values. +- `make_plan.py`: how the plan was found (needs numpy and scipy). Verification does not use it. + +## Limits + +- This is a finite conditional construction. Everything #144 retains stays an assumption, and the pinned PR97 + frame audits are relied on, not rerun. +- The replay runs one core on its own bank, as in #147. +- The plan is one legal choice from a matching heuristic. No optimality is claimed. +- The complete `make verify` and the formal targets were not run locally; the fork's CI runs them. + +Credits are in [NOTICE](NOTICE). diff --git a/research/bit-reuse-147/expected.json b/research/bit-reuse-147/expected.json new file mode 100644 index 0000000000..138271dc03 --- /dev/null +++ b/research/bit-reuse-147/expected.json @@ -0,0 +1,5 @@ +{ + "coarse": "236344721/500000000000", + "kappa": "471809569/1000000000000", + "kappa_atom_2000": "236013137/500000000000" +} diff --git a/research/bit-reuse-147/frames147.py b/research/bit-reuse-147/frames147.py new file mode 100644 index 0000000000..a336706b48 --- /dev/null +++ b/research/bit-reuse-147/frames147.py @@ -0,0 +1,72 @@ +"""Exact integer bases of the frames that the recycled word joins in a new order, and exact nesting over Q. + +Stdlib only. Node frames, late-copy intersections and root frames are rebuilt from the pinned PR97 witness with +Swapnil Jain's check_lifted.py machinery, exactly as check_frames.py derives them; sigma and V-leaf frames are the +primitive integer bases of the pinned data file.""" +import sys +from fractions import Fraction +from math import gcd + + +def prim(r): + r = [Fraction(x) for x in r]; den = 1 + for x in r: den = den * x.denominator // gcd(den, x.denominator) + z = [int(x * den) for x in r]; g = 0 + for x in z: g = gcd(g, x) + return [x // g for x in z] if g else z + + +class Exact: + def __init__(self, S, W, folder): + sys.path.insert(0, str(folder)) + import check_lifted as cl + from linalg import null_exact, rank_mod, Q31 + self.S = S; self.h = h = S.h; self.cl = cl; self.null_exact = null_exact; self.rank_mod = rank_mod; self.Q31 = Q31 + pr = cl.Prog(W); bas, dn = cl.spans(pr); self.users = cl.users_of(pr, dn) + fr = self.fr = cl.Frames(pr, dn, bas, self.users); fr.cobases(); d, _ = fr.dims(); self.ld, _ = cl.late_frames(fr, pr, self.users) + assert all(S.node_dims[n] == d[n] for n in pr.act) and len(S.node_dims) == len(pr.act), 'recorded node dimensions' + self.full = [[int(i == j) for j in range(h)] for i in range(h)] + self._basis = {}; self._null = {} + + def ukey(self, n, k): + u = self.users[n][k] + return ('n', u[1]) if u[0] == 'gate' else self.cl.root_key(u) + + def basis(self, key): + if key not in self._basis: + S, fr = self.S, self.fr; kind = key[0] + if kind == 'sigma': B = S.sigma[key[1]] + elif kind == 'v': B = S.vstart[key[1]] + elif kind == '0': B = [] + elif kind == 'F': B = self.full + elif kind == 'out': B = [prim(r) for r in fr.exact_basis(('out', key[2][0], tuple(key[2])))] + elif kind == 'c': + n, lt = key[1], key[2] + B = self.basis(self.ukey(n, lt[-1])) + for kk in reversed(lt[:-1]): B = fr.intersect_exact(self.basis(self.ukey(n, kk)), B) + B = [prim(r) for r in B] + else: B = [prim(r) for r in fr.exact_basis(key)] + assert len(B) == S.dim(key), ('exact dimension', key) + self._basis[key] = B + return self._basis[key] + + def null(self, key): + if key not in self._null: + B = self.basis(key) + self._null[key] = [prim(z) for z in self.null_exact(B, self.h)] if B else self.full + return self._null[key] + + def inside(self, a, b): + """span(a) <= span(b), exactly over Q (integer dot products with an exact integer basis of b's annihilator).""" + A = self.basis(a) + if not A or len(self.basis(b)) == self.h: return True + if len(A) > len(self.basis(b)): return False + return all(sum(x * z for x, z in zip(ra, rz)) == 0 for ra in A for rz in self.null(b)) + + def nondegenerate(self, key): + """G = I - J/9 nondegenerate on the frame: det(9 B G B^T) nonzero mod 2^31-1, hence over Z.""" + B = self.basis(key) + if not B or len(B) == self.h: return True + sm = [sum(b) for b in B] + gram = [[9 * sum(x * y for x, y in zip(a, b)) - sa * sb for b, sb in zip(B, sm)] for a, sa in zip(B, sm)] + return self.rank_mod(gram, self.Q31) == len(B) diff --git a/research/bit-reuse-147/make_plan.py b/research/bit-reuse-147/make_plan.py new file mode 100644 index 0000000000..2c927ee469 --- /dev/null +++ b/research/bit-reuse-147/make_plan.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python3 +"""Regenerate plan.json: a heavy matching of dead registers to later deferred births. + +Needs numpy and scipy. verify.py does not use this file: it checks the frozen plan directly, so the certified value +does not depend on how the plan was found, and no optimality is claimed. + + elim taken unchanged from the existing plan.json (hpst3r's #147 plan at 29383a28d96b9880edbe59ed930f1da1dd6fdfa6); + level #144's selected gauges that survive the elimination; + donors every remaining slot that is neither an output slot nor a retained centre, at its last frame; + edge donor D -> level slot B when D's last operation precedes B's read in the latest timetable and U_D is + inside sigma_B (screened modulo a prime here, verified exactly over Q by verify.py); + weight the first-order moment saved, 3 phi(23 - d) + phi(3f) - 3 phi(f - d); + matching maximum total weight (scipy.optimize.linear_sum_assignment). +""" +import json +import sys +from pathlib import Path + +import numpy as np +from scipy.optimize import linear_sum_assignment + +HERE = Path(__file__).resolve().parent +sys.path.insert(0, str(HERE)) +import word147 # noqa: E402 +from frames147 import Exact # noqa: E402 + +PRIME = 1048573 +SAVING = 4.73e-4 + + +def main(): + dr, W, D, S, record, folder = word147.load_schedule() + h, m = S.h, 3 * S.h + sel = json.loads((word147.ROOT / record['selection_file']).read_text()) + elim = json.loads((HERE / 'plan.json').read_text())['elim']; gone = set(elim) + level = [s for s in sel['retained_readout_order'] if s not in gone] + word = word147.Word(S, elim, level, []) + exact = Exact(S, W, folder) + donors = [s for s in range(S.R) if s not in S.out and s not in S.ret and s not in gone] + last = {d: [k for k in S.chain_keys(d) if k[0] != 'F'][-1] for d in donors} + rows, owner = [], [] + for i, d in enumerate(donors): + for r in exact.basis(last[d]): rows.append([x % PRIME for x in r]); owner.append(i) + V = np.array(rows, dtype=np.int64); owner = np.array(owner); size = np.bincount(owner, minlength=len(donors)) + inside = {} + for b in level: + key = tuple(map(tuple, S.sigma[b])) + if key not in inside: + if len(key) == h: inside[key] = np.arange(len(donors)) + else: + N = np.array([[x % PRIME for x in z] for z in exact.null(('sigma', b))], dtype=np.int64) + ok = (((V @ N.T) % PRIME) == 0).all(axis=1) + inside[key] = np.nonzero(np.bincount(owner[ok], minlength=len(donors)) == size)[0] + phi = lambda r: r * ((m / r) ** SAVING - 1) / SAVING if r else 0.0 + edges = [] + for j, b in enumerate(level): + f = S.f[b] + for i in inside[tuple(map(tuple, S.sigma[b]))]: + d = donors[int(i)] + if d == b or word.death[d] >= word.p[b]: continue + dd = S.dim(last[d]) + edges.append((int(i), j, 3 * phi(h - dd) + phi(3 * f) - 3 * phi(f - dd))) + used_r = sorted({e[0] for e in edges}); used_c = sorted({e[1] for e in edges}) + rr = {r: i for i, r in enumerate(used_r)}; cc = {c: i for i, c in enumerate(used_c)} + A = np.zeros((len(used_r), len(used_c))) + for r, c, x in edges: A[rr[r], cc[c]] = x + ri, ci = linear_sum_assignment(A, maximize=True) + pairs = sorted((level[used_c[c]], donors[used_r[r]]) for r, c in zip(ri, ci) if A[r, c] > 0) + taken = {b for b, _ in pairs} + plan = dict(elim=sorted(elim), retained=[s for s in level if s not in taken], pairs=[list(p) for p in pairs]) + out = Path(sys.argv[1]) if len(sys.argv) > 1 else HERE / 'plan.json' + out.write_text(json.dumps(plan, separators=(',', ':')) + '\n') + print('edges %d, pairs %d, first-order gain %.0f -> %s' % (len(edges), len(pairs), sum(A[r, c] for r, c in zip(ri, ci)), out)) + + +if __name__ == '__main__': + main() diff --git a/research/bit-reuse-147/plan.json b/research/bit-reuse-147/plan.json new file mode 100644 index 0000000000..6384777f51 --- /dev/null +++ b/research/bit-reuse-147/plan.json @@ -0,0 +1 @@ +{"elim":[12,13,26,27,40,41,54,55,68,69,82,83,96,97,110,111,124,125,138,139,282,294,306,318,330,342,354,366,378,383,507,519,531,543,555,567,579,591,596,708,720,732,744,756,768,780,785,885,897,909,921,933,945,950,1038,1050,1062,1074,1086,1091,1167,1179,1191,1203,1208,1272,1284,1296,1301,1353,1365,1370,1410,1415,1436,1445,1450,1451,1456,1462,1463,1468,1474,1475,1480,1486,1487,1492,1498,1499,1504,1510,1511,1516,1522,1523,1528,1534,1535,1540,1546,1547,1552,1559,1560,1566,1572,1573,1579,1585,1586,1592,1598,1599,1605,1611,1612,1618,1624,1625,1631,1637,1638,1644,1650,1651,1657,1663,1664,1670,1676,1677,1686,1693,1698,1699,1704,1710,1711,1716,1722,1723,1728,1734,1735,1740,1746,1747,1752,1758,1759,1764,1770,1771,1776,1782,1783,1788,1795,1796,1802,1808,1809,1815,1821,1822,1828,1834,1835,1841,1847,1848,1854,1860,1861,1867,1873,1874,1880,1886,1887,1893,1899,1900,1909,1916,1921,1922,1927,1933,1934,1939,1945,1946,1951,1957,1958,1963,1969,1970,1975,1981,1982,1987,1993,1994,1999,2006,2007,2013,2019,2020,2026,2032,2033,2039,2045,2046,2052,2058,2059,2065,2071,2072,2078,2084,2085,2091,2097,2098,2107,2114,2119,2120,2125,2131,2132,2137,2143,2144,2149,2155,2156,2161,2167,2168,2173,2179,2180,2185,2192,2193,2199,2205,2206,2212,2218,2219,2225,2231,2232,2238,2244,2245,2251,2257,2258,2264,2270,2271,2280,2287,2292,2293,2298,2304,2305,2310,2316,2317,2322,2328,2329,2334,2340,2341,2346,2353,2354,2360,2366,2367,2373,2379,2380,2386,2392,2393,2399,2405,2406,2412,2418,2419,2428,2435,2440,2441,2446,2452,2453,2458,2464,2465,2470,2476,2477,2482,2489,2490,2496,2502,2503,2509,2515,2516,2522,2528,2529,2535,2541,2542,2551,2558,2563,2564,2569,2575,2576,2581,2587,2588,2593,2600,2601,2607,2613,2614,2620,2626,2627,2633,2639,2640,2649,2656,2661,2662,2667,2673,2674,2679,2686,2687,2693,2699,2700,2706,2712,2713,2722,2729,2734,2735,2740,2747,2748,2754,2760,2761,2770,2777,2783,2784,2793,2806,2807,2820,2821,2834,2835,2848,2849,2862,2863,2876,2877,2890,2891,2904,2905,2918,2919,3050,3062,3074,3086,3098,3110,3122,3134,3139,3251,3263,3275,3287,3299,3311,3323,3328,3428,3440,3452,3464,3476,3488,3493,3581,3593,3605,3617,3629,3634,3710,3722,3734,3746,3751,3815,3827,3839,3844,3896,3908,3913,3953,3958,3979,3988,3993,3994,3999,4005,4006,4011,4017,4018,4023,4029,4030,4035,4041,4042,4047,4053,4054,4059,4065,4066,4071,4077,4078,4083,4090,4091,4097,4103,4104,4110,4116,4117,4123,4129,4130,4136,4142,4143,4149,4155,4156,4162,4168,4169,4175,4181,4182,4188,4194,4195,4204,4211,4216,4217,4222,4228,4229,4234,4240,4241,4246,4252,4253,4258,4264,4265,4270,4276,4277,4282,4288,4289,4294,4301,4302,4308,4314,4315,4321,4327,4328,4334,4340,4341,4347,4353,4354,4360,4366,4367,4373,4379,4380,4386,4392,4393,4402,4409,4414,4415,4420,4426,4427,4432,4438,4439,4444,4450,4451,4456,4462,4463,4468,4474,4475,4480,4487,4488,4494,4500,4501,4507,4513,4514,4520,4526,4527,4533,4539,4540,4546,4552,4553,4559,4565,4566,4575,4582,4587,4588,4593,4599,4600,4605,4611,4612,4617,4623,4624,4629,4635,4636,4641,4648,4649,4655,4661,4662,4668,4674,4675,4681,4687,4688,4694,4700,4701,4707,4713,4714,4723,4730,4735,4736,4741,4747,4748,4753,4759,4760,4765,4771,4772,4777,4784,4785,4791,4797,4798,4804,4810,4811,4817,4823,4824,4830,4836,4837,4846,4853,4858,4859,4864,4870,4871,4876,4882,4883,4888,4895,4896,4902,4908,4909,4915,4921,4922,4928,4934,4935,4944,4951,4956,4957,4962,4968,4969,4974,4981,4982,4988,4994,4995,5001,5007,5008,5017,5024,5029,5030,5035,5042,5043,5049,5055,5056,5065,5072,5078,5079,5088,5101,5102,5115,5116,5129,5130,5143,5144,5157,5158,5171,5172,5185,5186,5199,5200,5319,5331,5343,5355,5367,5379,5391,5396,5496,5508,5520,5532,5544,5556,5561,5649,5661,5673,5685,5697,5702,5778,5790,5802,5814,5819,5883,5895,5907,5912,5964,5976,5981,6021,6026,6047,6056,6061,6062,6067,6073,6074,6079,6085,6086,6091,6097,6098,6103,6109,6110,6115,6121,6122,6127,6133,6134,6139,6146,6147,6153,6159,6160,6166,6172,6173,6179,6185,6186,6192,6198,6199,6205,6211,6212,6218,6224,6225,6231,6237,6238,6247,6254,6259,6260,6265,6271,6272,6277,6283,6284,6289,6295,6296,6301,6307,6308,6313,6319,6320,6325,6332,6333,6339,6345,6346,6352,6358,6359,6365,6371,6372,6378,6384,6385,6391,6397,6398,6404,6410,6411,6420,6427,6432,6433,6438,6444,6445,6450,6456,6457,6462,6468,6469,6474,6480,6481,6486,6493,6494,6500,6506,6507,6513,6519,6520,6526,6532,6533,6539,6545,6546,6552,6558,6559,6568,6575,6580,6581,6586,6592,6593,6598,6604,6605,6610,6616,6617,6622,6629,6630,6636,6642,6643,6649,6655,6656,6662,6668,6669,6675,6681,6682,6691,6698,6703,6704,6709,6715,6716,6721,6727,6728,6733,6740,6741,6747,6753,6754,6760,6766,6767,6773,6779,6780,6789,6796,6801,6802,6807,6813,6814,6819,6826,6827,6833,6839,6840,6846,6852,6853,6862,6869,6874,6875,6880,6887,6888,6894,6900,6901,6910,6917,6923,6924,6933,6946,6947,6960,6961,6974,6975,6988,6989,7002,7003,7016,7017,7030,7031,7138,7150,7162,7174,7186,7198,7203,7291,7303,7315,7327,7339,7344,7420,7432,7444,7456,7461,7525,7537,7549,7554,7606,7618,7623,7663,7668,7689,7698,7703,7704,7709,7715,7716,7721,7727,7728,7733,7739,7740,7745,7751,7752,7757,7763,7764,7769,7776,7777,7783,7789,7790,7796,7802,7803,7809,7815,7816,7822,7828,7829,7835,7841,7842,7848,7854,7855,7864,7871,7876,7877,7882,7888,7889,7894,7900,7901,7906,7912,7913,7918,7924,7925,7930,7937,7938,7944,7950,7951,7957,7963,7964,7970,7976,7977,7983,7989,7990,7996,8002,8003,8012,8019,8024,8025,8030,8036,8037,8042,8048,8049,8054,8060,8061,8066,8073,8074,8080,8086,8087,8093,8099,8100,8106,8112,8113,8119,8125,8126,8135,8142,8147,8148,8153,8159,8160,8165,8171,8172,8177,8184,8185,8191,8197,8198,8204,8210,8211,8217,8223,8224,8233,8240,8245,8246,8251,8257,8258,8263,8270,8271,8277,8283,8284,8290,8296,8297,8306,8313,8318,8319,8324,8331,8332,8338,8344,8345,8354,8361,8367,8368,8377,8390,8391,8404,8405,8418,8419,8432,8433,8446,8447,8460,8461,8556,8568,8580,8592,8604,8609,8685,8697,8709,8721,8726,8790,8802,8814,8819,8871,8883,8888,8928,8933,8954,8963,8968,8969,8974,8980,8981,8986,8992,8993,8998,9004,9005,9010,9016,9017,9022,9029,9030,9036,9042,9043,9049,9055,9056,9062,9068,9069,9075,9081,9082,9088,9094,9095,9104,9111,9116,9117,9122,9128,9129,9134,9140,9141,9146,9152,9153,9158,9165,9166,9172,9178,9179,9185,9191,9192,9198,9204,9205,9211,9217,9218,9227,9234,9239,9240,9245,9251,9252,9257,9263,9264,9269,9276,9277,9283,9289,9290,9296,9302,9303,9309,9315,9316,9325,9332,9337,9338,9343,9349,9350,9355,9362,9363,9369,9375,9376,9382,9388,9389,9398,9405,9410,9411,9416,9423,9424,9430,9436,9437,9446,9453,9459,9460,9469,9482,9483,9496,9497,9510,9511,9524,9525,9538,9539,9622,9634,9646,9658,9663,9727,9739,9751,9756,9808,9820,9825,9865,9870,9891,9900,9905,9906,9911,9917,9918,9923,9929,9930,9935,9941,9942,9947,9954,9955,9961,9967,9968,9974,9980,9981,9987,9993,9994,10000,10006,10007,10016,10023,10028,10029,10034,10040,10041,10046,10052,10053,10058,10065,10066,10072,10078,10079,10085,10091,10092,10098,10104,10105,10114,10121,10126,10127,10132,10138,10139,10144,10151,10152,10158,10164,10165,10171,10177,10178,10187,10194,10199,10200,10205,10212,10213,10219,10225,10226,10235,10242,10248,10249,10258,10271,10272,10285,10286,10299,10300,10313,10314,10385,10397,10409,10414,10466,10478,10483,10523,10528,10549,10558,10563,10564,10569,10575,10576,10581,10587,10588,10593,10600,10601,10607,10613,10614,10620,10626,10627,10633,10639,10640,10649,10656,10661,10662,10667,10673,10674,10679,10686,10687,10693,10699,10700,10706,10712,10713,10722,10729,10734,10735,10740,10747,10748,10754,10760,10761,10770,10777,10783,10784,10793,10806,10807,10820,10821,10834,10835,10894,10906,10911,10951,10956,10977,10986,10991,10992,10997,11003,11004,11009,11016,11017,11023,11029,11030,11036,11042,11043,11052,11059,11064,11065,11070,11077,11078,11084,11090,11091,11100,11107,11113,11114,11123,11136,11137,11150,11151,11198,11203,11224,11233,11238,11239,11244,11251,11252,11258,11264,11265,11274,11281,11287,11288,11297,11310,11311,11339,11348,11354,11355,11364,28670,28671,28675,28676,28680,28681,28685,28686,28691],"retained":[22967,23065,23159,23249,23335,23417,23495,23569,23836,23838,23840,23842,23844,23846,23848,23850,23852,23854,23857,23894,23896,23898,23900,23902,23904,23906,23908,23910,23913,24010,24094,24162,24173,24175,24187,24201,24213,24214,24247,24463,24466,24469,24472,24475,24667,24669,24895,25085,25087,25311,25487,25499,25501,25909,25911,26315,26317,26717,26719,27115,27117,27509,27511,27711,27899,27901,28097,28099,28285,28287,28297,28481,22918,22922,22924,22926,22928,22930,22932,22934,22969,22971,22973,22975,22977,22979,23016,23020,23022,23024,23026,23028,23030,23032,23067,23069,23071,23073,23075,23077,23161,23163,23165,23167,23206,23208,23210,23212,23216,23251,23253,23255,23257,23296,23298,23302,23337,23339,23378,23380,23384,23419,23421,23462,23536,24189,24245,24250,24253,24256,24259,24668,24672,24675,24678,24681,24833,24835,25072,25086,25093,25096,25099,25251,25252,25488,25503,25507,25510,25513,25667,25669,25894,25913,25920,25923,26077,26078,26127,26302,26322,26326,26329,26485,26487,26700,26724,26731,26887,26888,26928,27100,27125,27129,27287,27289,27490,27519,27681,27682,27709,27713,27882,28073,28075,28264,28459,28460,28482,28648,23835,23837,23893,23895,23947,23949,23997,23999,24043,24045,24085,24087,24123,24125,24157,24159,24246,24249,24252,24255,24310,24311,24313,24314,24352,24353,24355,24356,24382,24383,24385,24386,24400,24401,24403,24404,24406,24407,24409,24410,24411,24412,24413,24414,24415,24416,24418,24420,24421,24422,24424,24426,24427,24428,24430,24432,24433,24434,24436,24438,24439,24440,24462,24465,24468,24471,24526,24527,24529,24530,24568,24569,24571,24572,24598,24599,24601,24602,24616,24617,24619,24620,24622,24623,24625,24626,24628,24631,24634,24637,24640,24643,24646,24649,24652,24654,24655,24656,24671,24674,24677,24731,24735,24736,24774,24775,24777,24778,24804,24805,24807,24808,24822,24823,24825,24826,24828,24829,24831,24832,24834,24836,24838,24840,24841,24842,24844,24846,24847,24848,24850,24852,24853,24854,24856,24858,24859,24860,24862,24882,24885,24888,24891,24946,24947,24949,24950,24988,24989,24991,24992,25018,25019,25021,25022,25036,25037,25039,25040,25042,25043,25044,25048,25051,25054,25057,25060,25063,25066,25069,25071,25073,25074,25075,25089,25092,25095,25149,25152,25192,25193,25195,25196,25222,25223,25225,25226,25240,25241,25243,25244,25246,25247,25249,25250,25254,25256,25257,25258,25260,25262,25263,25264,25266,25268,25269,25270,25272,25274,25275,25276,25278,25279,25298,25301,25304,25307,25362,25363,25365,25366,25404,25405,25407,25408,25434,25435,25437,25438,25452,25453,25455,25456,25457,25460,25464,25467,25470,25473,25476,25479,25482,25484,25485,25486,25489,25498,25500,25506,25509,25563,25566,25605,25609,25610,25636,25637,25639,25640,25654,25655,25657,25658,25660,25661,25663,25664,25665,25666,25668,25670,25672,25674,25675,25676,25678,25680,25681,25682,25684,25686,25687,25688,25690,25691,25692,25710,25713,25716,25719,25774,25775,25777,25778,25816,25817,25819,25820,25846,25847,25849,25850,25864,25865,25866,25869,25872,25876,25879,25882,25885,25888,25891,25893,25895,25896,25897,25898,25899,25907,25908,25910,25916,25919,25973,25976,26015,26018,26046,26047,26049,26050,26064,26065,26067,26068,26070,26071,26073,26074,26075,26076,26080,26082,26083,26084,26086,26088,26089,26090,26092,26094,26095,26096,26098,26099,26100,26101,26118,26121,26124,26182,26183,26185,26186,26224,26225,26227,26228,26254,26255,26257,26258,26271,26274,26277,26280,26284,26287,26290,26293,26296,26298,26299,26300,26303,26304,26305,26312,26313,26314,26316,26319,26325,26379,26382,26421,26424,26451,26455,26456,26470,26471,26473,26474,26476,26477,26479,26480,26481,26482,26483,26484,26486,26488,26490,26492,26493,26494,26496,26498,26499,26500,26502,26503,26504,26505,26506,26522,26525,26528,26531,26586,26587,26589,26590,26628,26629,26631,26632,26658,26659,26660,26675,26678,26681,26684,26688,26691,26694,26697,26699,26701,26702,26703,26704,26705,26706,26707,26713,26714,26715,26716,26718,26721,26727,26781,26784,26823,26826,26853,26856,26872,26873,26875,26876,26878,26879,26881,26882,26883,26884,26885,26886,26890,26892,26893,26894,26896,26898,26899,26900,26902,26903,26904,26905,26906,26907,26922,26925,26931,26986,26987,26989,26990,27028,27029,27031,27032,27057,27060,27075,27078,27081,27084,27088,27091,27094,27096,27097,27098,27101,27102,27103,27104,27105,27110,27111,27112,27113,27114,27116,27119,27122,27179,27182,27221,27224,27251,27254,27269,27273,27274,27276,27277,27279,27280,27281,27282,27283,27284,27285,27286,27288,27290,27292,27294,27295,27296,27298,27299,27300,27301,27302,27303,27304,27318,27321,27324,27327,27382,27383,27385,27386,27424,27425,27426,27453,27456,27471,27474,27477,27480,27484,27487,27489,27491,27492,27493,27494,27495,27496,27497,27498,27499,27503,27504,27505,27506,27507,27508,27510,27513,27516,27573,27576,27615,27618,27645,27648,27663,27666,27670,27671,27673,27674,27675,27676,27677,27678,27679,27680,27684,27686,27687,27688,27690,27691,27692,27693,27694,27695,27696,27697,27710,27716,27719,27774,27775,27777,27778,27815,27818,27845,27848,27863,27866,27869,27872,27875,27876,27877,27878,27879,27880,27883,27884,27885,27886,27887,27888,27889,27892,27893,27894,27895,27896,27897,27898,27900,27903,27906,27909,27963,27966,28005,28008,28035,28038,28053,28056,28059,28063,28064,28065,28066,28067,28068,28069,28070,28071,28072,28074,28076,28078,28079,28080,28081,28082,28083,28084,28085,28086,28098,28101,28104,28107,28162,28163,28164,28203,28206,28233,28236,28251,28254,28257,28260,28263,28265,28266,28267,28268,28269,28270,28271,28272,28273,28274,28275,28277,28278,28279,28280,28281,28282,28283,28284,28286,28289,28292,28295,28349,28352,28391,28394,28421,28424,28439,28442,28445,28448,28451,28452,28453,28454,28455,28456,28457,28458,28461,28462,28463,28464,28465,28466,28467,28468,28469,28470,28485,28488,28491,28545,28548,28587,28590,28617,28620,28635,28638,28641,28644,28647,28649,28650,28651,28652,28653,28654,28655,28656,28657,28658,28659,28660,28661,28662,28663,28664,28665,28666,28687,28688,28689,28690,280,286,292,298,304,310,316,322,328,334,340,346,352,358,364,370,376,420,426,432,438,444,450,456,462,468,474,480,486,511,517,523,529,535,541,547,553,559,565,571,577,583,589,621,627,633,639,645,651,657,663,669,675,681,687,712,718,724,730,736,742,748,754,760,766,772,778,810,816,822,828,834,840,846,852,858,864,889,895,901,907,913,919,925,931,937,943,975,981,987,993,999,1005,1011,1017,1042,1048,1054,1060,1066,1072,1078,1084,1116,1122,1128,1134,1140,1146,1171,1177,1183,1189,1195,1201,1233,1239,1245,1251,1276,1282,1288,1294,1332,1351,1357,1363,1449,1455,1461,1467,1473,1479,1485,1491,1497,1503,1509,1515,1521,1527,1533,1539,1545,1551,1564,1571,1577,1584,1590,1597,1603,1610,1616,1623,1629,1636,1642,1649,1655,1662,1668,1675,1709,1715,1721,1727,1733,1739,1745,1751,1757,1763,1769,1775,1781,1787,1813,1820,1826,1833,1839,1846,1852,1859,1865,1872,1878,1885,1891,1898,1920,1926,1932,1938,1944,1950,1956,1962,1968,1974,1980,1986,1992,1998,2011,2018,2024,2031,2037,2044,2050,2057,2063,2070,2076,2083,2089,2096,2130,2136,2142,2148,2154,2160,2166,2172,2178,2184,2210,2217,2223,2230,2236,2243,2249,2256,2262,2269,2303,2309,2315,2321,2327,2333,2339,2345,2371,2378,2384,2391,2397,2404,2410,2417,2451,2457,2463,2469,2475,2481,2494,2501,2507,2514,2520,2527,2533,2540,2574,2580,2586,2592,2618,2625,2631,2638,2660,2666,2672,2678,2691,2698,2704,2711,2957,2963,2969,2975,2981,2987,2993,2999,3005,3011,3017,3023,3029,3054,3060,3066,3072,3078,3084,3090,3096,3102,3108,3114,3120,3126,3132,3158,3164,3170,3176,3182,3188,3194,3200,3206,3212,3218,3224,3230,3243,3249,3255,3261,3267,3273,3279,3285,3291,3297,3303,3309,3315,3321,3353,3359,3365,3371,3377,3383,3389,3395,3401,3407,3420,3426,3432,3438,3444,3450,3456,3462,3468,3474,3480,3486,3512,3518,3524,3530,3536,3542,3548,3554,3560,3573,3579,3585,3591,3597,3603,3609,3615,3621,3627,3647,3653,3659,3665,3671,3677,3683,3689,3702,3708,3714,3720,3726,3732,3738,3744,3776,3782,3788,3794,3819,3825,3831,3837,3857,3863,3869,3875,3888,3894,3900,3906,4004,4010,4016,4022,4028,4034,4040,4046,4052,4058,4064,4070,4076,4082,4102,4108,4115,4121,4128,4134,4141,4147,4154,4160,4167,4173,4180,4186,4193,4215,4221,4227,4233,4239,4245,4251,4257,4263,4269,4275,4281,4287,4293,4306,4313,4319,4326,4332,4339,4345,4352,4358,4365,4371,4378,4384,4391,4413,4419,4425,4431,4437,4443,4449,4455,4461,4467,4473,4479,4492,4499,4505,4512,4518,4525,4531,4538,4544,4551,4557,4564,4586,4592,4598,4604,4610,4616,4622,4628,4634,4640,4653,4660,4666,4673,4679,4686,4692,4699,4705,4712,4734,4740,4746,4752,4758,4764,4770,4776,4789,4796,4802,4809,4815,4822,4828,4835,4863,4869,4875,4881,4887,4900,4907,4913,4920,4926,4933,4955,4961,4967,4973,4986,4993,4999,5006,5220,5226,5232,5238,5244,5250,5256,5262,5268,5274,5280,5286,5292,5298,5311,5317,5323,5329,5335,5341,5347,5353,5359,5365,5371,5377,5383,5389,5409,5415,5421,5427,5433,5439,5445,5451,5457,5463,5469,5475,5488,5494,5500,5506,5512,5518,5524,5530,5536,5542,5548,5554,5574,5580,5586,5592,5598,5604,5610,5616,5622,5628,5641,5647,5653,5659,5665,5671,5677,5683,5689,5695,5715,5721,5727,5733,5739,5745,5751,5757,5770,5776,5782,5788,5794,5800,5806,5812,5832,5838,5844,5850,5856,5862,5875,5881,5887,5893,5899,5905,5925,5931,5937,5943,5956,5962,5968,5974,6013,6019,6060,6066,6072,6078,6084,6090,6096,6102,6108,6114,6120,6126,6132,6138,6151,6158,6164,6171,6177,6184,6190,6197,6203,6210,6216,6223,6229,6236,6258,6264,6270,6276,6282,6288,6294,6300,6306,6312,6318,6324,6337,6344,6350,6357,6363,6370,6376,6383,6389,6396,6402,6409,6431,6437,6443,6449,6455,6461,6467,6473,6479,6485,6498,6505,6511,6518,6524,6531,6537,6544,6550,6557,6579,6585,6591,6597,6603,6609,6615,6621,6634,6641,6647,6654,6660,6667,6673,6680,6702,6708,6714,6720,6726,6732,6745,6752,6758,6765,6771,6778,6800,6806,6812,6818,6831,6838,6844,6851,6873,6879,6892,6899,7051,7057,7063,7069,7075,7081,7087,7093,7099,7105,7111,7117,7130,7136,7142,7148,7154,7160,7166,7172,7178,7184,7190,7196,7216,7222,7228,7234,7240,7246,7252,7258,7264,7270,7283,7289,7295,7301,7307,7313,7319,7325,7331,7337,7357,7363,7369,7375,7381,7387,7393,7399,7412,7418,7424,7430,7436,7442,7448,7454,7474,7480,7486,7492,7498,7504,7517,7523,7529,7535,7541,7547,7567,7573,7579,7585,7598,7604,7610,7616,7636,7642,7655,7661,7702,7708,7714,7720,7726,7732,7738,7744,7750,7756,7762,7768,7781,7788,7794,7801,7807,7814,7820,7827,7833,7840,7846,7853,7875,7881,7887,7893,7899,7905,7911,7917,7923,7929,7942,7949,7955,7962,7968,7975,7981,7988,7994,8001,8023,8029,8035,8041,8047,8053,8059,8065,8078,8085,8091,8098,8104,8111,8117,8124,8146,8152,8158,8164,8170,8176,8189,8196,8202,8209,8215,8222,8244,8250,8256,8262,8275,8282,8288,8295,8317,8323,8336,8343,8481,8487,8493,8499,8505,8511,8517,8523,8529,8535,8548,8554,8560,8566,8572,8578,8584,8590,8596,8602,8622,8628,8634,8640,8646,8652,8658,8664,8677,8683,8689,8695,8701,8707,8713,8719,8739,8745,8751,8757,8763,8769,8782,8788,8794,8800,8806,8812,8832,8838,8844,8850,8863,8869,8875,8881,8901,8907,8920,8926,8967,8973,8979,8985,8991,8997,9003,9009,9015,9021,9034,9041,9047,9054,9060,9067,9073,9080,9086,9093,9115,9121,9127,9133,9139,9145,9151,9157,9170,9177,9183,9190,9196,9203,9209,9216,9238,9244,9250,9256,9262,9268,9281,9288,9294,9301,9307,9314,9336,9342,9348,9354,9367,9374,9380,9387,9409,9415,9428,9435,9559,9565,9571,9577,9583,9589,9595,9601,9614,9620,9626,9632,9638,9644,9650,9656,9676,9682,9688,9694,9700,9706,9719,9725,9731,9737,9743,9749,9769,9775,9781,9787,9800,9806,9812,9818,9838,9844,9857,9863,9904,9910,9916,9922,9928,9934,9940,9946,9959,9966,9972,9979,9985,9992,9998,10005,10027,10033,10039,10045,10051,10057,10070,10077,10083,10090,10096,10103,10125,10131,10137,10143,10156,10163,10169,10176,10198,10204,10217,10224,10334,10340,10346,10352,10358,10364,10377,10383,10389,10395,10401,10407,10427,10433,10439,10445,10458,10464,10470,10476,10496,10502,10515,10521,10562,10568,10574,10580,10586,10592,10605,10612,10618,10625,10631,10638,10660,10666,10672,10678,10691,10698,10704,10711,10733,10739,10752,10759,10855,10861,10867,10873,10886,10892,10898,10904,10924,10930,10943,10949,10990,10996,11002,11008,11021,11028,11034,11041,11063,11069,11082,11089,11171,11177,11190,11196,11237,11243,11256,11263,23806,23808,23810,23812,23814,23816,23818,23820,23822,23824,23839,23841,23843,23845,23847,23849,23851,23853,23897,23899,23901,23903,23905,23907,23909,23951,23953,23955,23957,23959,23961,24001,24003,24005,24007,24009,24047,24049,24051,24053,24089,24091,24093,24127,24129,24161,24309,24312,24351,24354,24381,24384,24399,24402,24405,24408,24451,24452,24453,24454,24455,24456,24457,24458,24459,24460,24474,24477,24480,24483,24486,24489,24492,24495,24498,24501,24504,24507,24510,24513,24516,24519,24522,24531,24534,24537,24540,24543,24546,24549,24552,24555,24558,24561,24564,24573,24576,24579,24582,24585,24588,24591,24594,24603,24606,24609,24612,24657,24658,24659,24660,24661,24662,24663,24664,24665,24666,24683,24684,24685,24686,24687,24688,24695,24696,24697,24698,24699,24700,24707,24708,24709,24710,24711,24712,24719,24720,24721,24722,24723,24724,24732,24733,24734,24773,24776,24803,24806,24821,24824,24827,24830,24871,24872,24873,24874,24875,24876,24877,24878,24879,24880,24894,24936,24937,24938,24942,24943,24944,24978,24979,24980,24984,24985,24986,25008,25009,25010,25014,25015,25016,25026,25027,25028,25032,25033,25034,25045,25046,25076,25077,25078,25079,25080,25081,25082,25083,25084,25101,25102,25103,25104,25105,25106,25107,25108,25109,25110,25111,25112,25113,25114,25115,25116,25117,25118,25119,25120,25121,25122,25123,25124,25125,25126,25127,25128,25129,25130,25131,25132,25133,25134,25135,25136,25137,25138,25139,25140,25141,25142,25143,25144,25145,25146,25147,25148,25150,25151,25153,25154,25191,25194,25221,25224,25239,25242,25245,25248,25287,25288,25289,25290,25291,25292,25293,25294,25295,25296,25310,25349,25350,25351,25352,25353,25354,25355,25356,25357,25358,25359,25360,25391,25392,25393,25394,25395,25396,25397,25398,25399,25400,25401,25402,25421,25422,25423,25424,25425,25426,25427,25428,25429,25430,25431,25432,25439,25440,25441,25442,25443,25444,25445,25446,25447,25448,25449,25450,25458,25459,25461,25462,25490,25491,25492,25493,25494,25495,25496,25497,25515,25516,25517,25518,25519,25520,25521,25522,25523,25524,25525,25526,25527,25528,25529,25530,25531,25532,25533,25534,25535,25536,25537,25538,25539,25540,25541,25542,25543,25544,25545,25546,25547,25548,25549,25550,25551,25552,25553,25554,25555,25556,25557,25558,25559,25560,25561,25562,25564,25565,25567,25568,25569,25570,25571,25572,25573,25574,25581,25582,25583,25584,25585,25586,25593,25594,25595,25596,25597,25598,25606,25607,25608,25635,25638,25653,25656,25659,25662,25699,25700,25701,25702,25703,25704,25705,25706,25707,25708,25722,25752,25753,25754,25758,25759,25760,25761,25762,25763,25764,25765,25766,25767,25768,25769,25770,25771,25772,25794,25795,25796,25800,25801,25802,25803,25804,25805,25806,25807,25808,25809,25810,25811,25812,25813,25814,25824,25825,25826,25830,25831,25832,25833,25834,25835,25836,25837,25838,25839,25840,25841,25842,25843,25844,25851,25852,25853,25854,25855,25856,25857,25858,25859,25860,25861,25862,25867,25868,25870,25871,25873,25874,25900,25901,25902,25903,25904,25905,25906,25925,25926,25927,25928,25929,25930,25931,25932,25933,25934,25935,25936,25937,25938,25939,25940,25941,25942,25943,25944,25945,25946,25947,25948,25949,25950,25951,25952,25953,25954,25955,25956,25957,25958,25959,25960,25961,25962,25963,25964,25965,25966,25967,25968,25969,25970,25971,25972,25974,25975,25977,25978,25979,25980,25981,25982,25983,25984,25985,25986,25987,25988,25989,25990,25991,25992,25993,25994,25995,25996,25997,25998,25999,26000,26001,26002,26003,26004,26005,26006,26007,26008,26009,26010,26011,26012,26013,26014,26016,26017,26019,26020,26045,26048,26063,26066,26069,26072,26107,26108,26109,26110,26111,26112,26113,26114,26115,26116,26130,26157,26158,26159,26160,26161,26162,26163,26164,26165,26166,26167,26168,26169,26170,26171,26172,26173,26174,26175,26176,26177,26178,26179,26180,26199,26200,26201,26202,26203,26204,26205,26206,26207,26208,26209,26210,26211,26212,26213,26214,26215,26216,26217,26218,26219,26220,26221,26222,26229,26230,26231,26232,26233,26234,26235,26236,26237,26238,26239,26240,26241,26242,26243,26244,26245,26246,26247,26248,26249,26250,26251,26252,26259,26260,26261,26262,26263,26264,26265,26266,26267,26268,26269,26270,26272,26273,26275,26276,26278,26279,26281,26282,26306,26307,26308,26309,26310,26311,26331,26332,26333,26334,26335,26336,26337,26338,26339,26340,26341,26342,26343,26344,26345,26346,26347,26348,26349,26350,26351,26352,26353,26354,26355,26356,26357,26358,26359,26360,26361,26362,26363,26364,26365,26366,26367,26368,26369,26370,26371,26372,26373,26374,26375,26376,26377,26378,26380,26381,26383,26384,26385,26386,26387,26388,26389,26390,26391,26392,26393,26394,26395,26396,26397,26398,26399,26400,26401,26402,26403,26404,26405,26406,26407,26408,26409,26410,26411,26412,26413,26414,26415,26416,26417,26418,26419,26420,26422,26423,26425,26426,26427,26428,26429,26430,26431,26432,26439,26440,26441,26442,26443,26444,26452,26453,26454,26469,26472,26475,26478,26511,26512,26513,26514,26515,26516,26517,26518,26519,26520,26534,26552,26553,26554,26558,26559,26560,26561,26562,26563,26564,26565,26566,26567,26568,26569,26570,26571,26572,26573,26574,26575,26576,26577,26578,26579,26580,26581,26582,26583,26584,26594,26595,26596,26600,26601,26602,26603,26604,26605,26606,26607,26608,26609,26610,26611,26612,26613,26614,26615,26616,26617,26618,26619,26620,26621,26622,26623,26624,26625,26626,26633,26634,26635,26636,26637,26638,26639,26640,26641,26642,26643,26644,26645,26646,26647,26648,26649,26650,26651,26652,26653,26654,26655,26656,26661,26662,26663,26664,26665,26666,26667,26668,26669,26670,26671,26672,26673,26674,26676,26677,26679,26680,26682,26683,26685,26686,26708,26709,26710,26711,26712,26733,26734,26735,26736,26737,26738,26739,26740,26741,26742,26743,26744,26745,26746,26747,26748,26749,26750,26751,26752,26753,26754,26755,26756,26757,26758,26759,26760,26761,26762,26763,26764,26765,26766,26767,26768,26769,26770,26771,26772,26773,26774,26775,26776,26777,26778,26779,26780,26782,26783,26785,26786,26787,26788,26789,26790,26791,26792,26793,26794,26795,26796,26797,26798,26799,26800,26801,26802,26803,26804,26805,26806,26807,26808,26809,26810,26811,26812,26813,26814,26815,26816,26817,26818,26819,26820,26821,26822,26824,26825,26827,26828,26829,26830,26831,26832,26833,26834,26835,26836,26837,26838,26839,26840,26841,26842,26843,26844,26845,26846,26847,26848,26849,26850,26851,26852,26854,26855,26857,26858,26871,26874,26877,26880,26911,26912,26913,26914,26915,26916,26917,26918,26919,26920,26934,26949,26950,26951,26952,26953,26954,26955,26956,26957,26958,26959,26960,26961,26962,26963,26964,26965,26966,26967,26968,26969,26970,26971,26972,26973,26974,26975,26976,26977,26978,26979,26980,26981,26982,26983,26984,26991,26992,26993,26994,26995,26996,26997,26998,26999,27000,27001,27002,27003,27004,27005,27006,27007,27008,27009,27010,27011,27012,27013,27014,27015,27016,27017,27018,27019,27020,27021,27022,27023,27024,27025,27026,27033,27034,27035,27036,27037,27038,27039,27040,27041,27042,27043,27044,27045,27046,27047,27048,27049,27050,27051,27052,27053,27054,27055,27056,27058,27059,27061,27062,27063,27064,27065,27066,27067,27068,27069,27070,27071,27072,27073,27074,27076,27077,27079,27080,27082,27083,27085,27086,27106,27107,27108,27109,27131,27132,27133,27134,27135,27136,27137,27138,27139,27140,27141,27142,27143,27144,27145,27146,27147,27148,27149,27150,27151,27152,27153,27154,27155,27156,27157,27158,27159,27160,27161,27162,27163,27164,27165,27166,27167,27168,27169,27170,27171,27172,27173,27174,27175,27176,27177,27178,27180,27181,27183,27184,27185,27186,27187,27188,27189,27190,27191,27192,27193,27194,27195,27196,27197,27198,27199,27200,27201,27202,27203,27204,27205,27206,27207,27208,27209,27210,27211,27212,27213,27214,27215,27216,27217,27218,27219,27220,27222,27223,27225,27226,27227,27228,27229,27230,27231,27232,27233,27234,27235,27236,27237,27238,27239,27240,27241,27242,27243,27244,27245,27246,27247,27248,27249,27250,27252,27253,27255,27256,27257,27258,27259,27260,27261,27262,27270,27271,27272,27275,27278,27307,27308,27309,27310,27311,27312,27313,27314,27315,27316,27330,27336,27337,27338,27342,27343,27344,27345,27346,27347,27348,27349,27350,27351,27352,27353,27354,27355,27356,27357,27358,27359,27360,27361,27362,27363,27364,27365,27366,27367,27368,27369,27370,27371,27372,27373,27374,27375,27376,27377,27378,27379,27380,27387,27388,27389,27390,27391,27392,27393,27394,27395,27396,27397,27398,27399,27400,27401,27402,27403,27404,27405,27406,27407,27408,27409,27410,27411,27412,27413,27414,27415,27416,27417,27418,27419,27420,27421,27422,27427,27428,27429,27430,27431,27432,27433,27434,27435,27436,27437,27438,27439,27440,27441,27442,27443,27444,27445,27446,27447,27448,27449,27450,27451,27452,27454,27455,27457,27458,27459,27460,27461,27462,27463,27464,27465,27466,27467,27468,27469,27470,27472,27473,27475,27476,27478,27479,27481,27482,27500,27501,27502,27525,27526,27527,27528,27529,27530,27531,27532,27533,27534,27535,27536,27537,27538,27539,27540,27541,27542,27543,27544,27545,27546,27547,27548,27549,27550,27551,27552,27553,27554,27555,27556,27557,27558,27559,27560,27561,27562,27563,27564,27565,27566,27567,27568,27569,27570,27571,27572,27574,27575,27577,27578,27579,27580,27581,27582,27583,27584,27585,27586,27587,27588,27589,27590,27591,27592,27593,27594,27595,27596,27597,27598,27599,27600,27601,27602,27603,27604,27605,27606,27607,27608,27609,27610,27611,27612,27613,27614,27616,27617,27619,27620,27621,27622,27623,27624,27625,27626,27627,27628,27629,27630,27631,27632,27633,27634,27635,27636,27637,27638,27639,27640,27641,27642,27643,27644,27646,27647,27649,27650,27651,27652,27653,27654,27655,27656,27657,27658,27659,27660,27661,27662,27664,27665,27667,27668,27669,27672,27699,27700,27701,27702,27703,27704,27705,27706,27707,27708,27722,27725,27726,27727,27728,27729,27730,27731,27732,27733,27734,27735,27736,27737,27738,27739,27740,27741,27742,27743,27744,27745,27746,27747,27748,27749,27750,27751,27752,27753,27754,27755,27756,27757,27758,27759,27760,27761,27762,27763,27764,27765,27766,27767,27768,27769,27770,27771,27772,27779,27780,27781,27782,27783,27784,27785,27786,27787,27788,27789,27790,27791,27792,27793,27794,27795,27796,27797,27798,27799,27800,27801,27802,27803,27804,27805,27806,27807,27808,27809,27810,27811,27812,27813,27814,27816,27817,27819,27820,27821,27822,27823,27824,27825,27826,27827,27828,27829,27830,27831,27832,27833,27834,27835,27836,27837,27838,27839,27840,27841,27842,27843,27844,27846,27847,27849,27850,27851,27852,27853,27854,27855,27856,27857,27858,27859,27860,27861,27862,27864,27865,27867,27868,27870,27871,27873,27874,27890,27891,27912,27915,27916,27917,27918,27919,27920,27921,27922,27923,27924,27925,27926,27927,27928,27929,27930,27931,27932,27933,27934,27935,27936,27937,27938,27939,27940,27941,27942,27943,27944,27945,27946,27947,27948,27949,27950,27951,27952,27953,27954,27955,27956,27957,27958,27959,27960,27961,27962,27964,27965,27967,27968,27969,27970,27971,27972,27973,27974,27975,27976,27977,27978,27979,27980,27981,27982,27983,27984,27985,27986,27987,27988,27989,27990,27991,27992,27993,27994,27995,27996,27997,27998,27999,28000,28001,28002,28003,28004,28006,28007,28009,28010,28011,28012,28013,28014,28015,28016,28017,28018,28019,28020,28021,28022,28023,28024,28025,28026,28027,28028,28029,28030,28031,28032,28033,28034,28036,28037,28039,28040,28041,28042,28043,28044,28045,28046,28047,28048,28049,28050,28051,28052,28054,28055,28057,28058,28060,28061,28062,28087,28088,28089,28090,28091,28092,28093,28094,28095,28096,28110,28113,28114,28115,28116,28117,28118,28119,28120,28121,28122,28123,28124,28125,28126,28127,28128,28129,28130,28131,28132,28133,28134,28135,28136,28137,28138,28139,28140,28141,28142,28143,28144,28145,28146,28147,28148,28149,28150,28151,28152,28153,28154,28155,28156,28157,28158,28159,28160,28165,28166,28167,28168,28169,28170,28171,28172,28173,28174,28175,28176,28177,28178,28179,28180,28181,28182,28183,28184,28185,28186,28187,28188,28189,28190,28191,28192,28193,28194,28195,28196,28197,28198,28199,28200,28201,28202,28204,28205,28207,28208,28209,28210,28211,28212,28213,28214,28215,28216,28217,28218,28219,28220,28221,28222,28223,28224,28225,28226,28227,28228,28229,28230,28231,28232,28234,28235,28237,28238,28239,28240,28241,28242,28243,28244,28245,28246,28247,28248,28249,28250,28252,28253,28255,28256,28258,28259,28261,28262,28276,28298,28301,28302,28303,28304,28305,28306,28307,28308,28309,28310,28311,28312,28313,28314,28315,28316,28317,28318,28319,28320,28321,28322,28323,28324,28325,28326,28327,28328,28329,28330,28331,28332,28333,28334,28335,28336,28337,28338,28339,28340,28341,28342,28343,28344,28345,28346,28347,28348,28350,28351,28353,28354,28355,28356,28357,28358,28359,28360,28361,28362,28363,28364,28365,28366,28367,28368,28369,28370,28371,28372,28373,28374,28375,28376,28377,28378,28379,28380,28381,28382,28383,28384,28385,28386,28387,28388,28389,28390,28392,28393,28395,28396,28397,28398,28399,28400,28401,28402,28403,28404,28405,28406,28407,28408,28409,28410,28411,28412,28413,28414,28415,28416,28417,28418,28419,28420,28422,28423,28425,28426,28427,28428,28429,28430,28431,28432,28433,28434,28435,28436,28437,28438,28440,28441,28443,28444,28446,28447,28449,28450,28471,28472,28473,28474,28475,28476,28477,28478,28479,28480,28494,28497,28498,28499,28500,28501,28502,28503,28504,28505,28506,28507,28508,28509,28510,28511,28512,28513,28514,28515,28516,28517,28518,28519,28520,28521,28522,28523,28524,28525,28526,28527,28528,28529,28530,28531,28532,28533,28534,28535,28536,28537,28538,28539,28540,28541,28542,28543,28544,28546,28547,28549,28550,28551,28552,28553,28554,28555,28556,28557,28558,28559,28560,28561,28562,28563,28564,28565,28566,28567,28568,28569,28570,28571,28572,28573,28574,28575,28576,28577,28578,28579,28580,28581,28582,28583,28584,28585,28586,28588,28589,28591,28592,28593,28594,28595,28596,28597,28598,28599,28600,28601,28602,28603,28604,28605,28606,28607,28608,28609,28610,28611,28612,28613,28614,28615,28616,28618,28619,28621,28622,28623,28624,28625,28626,28627,28628,28629,28630,28631,28632,28633,28634,28636,28637,28639,28640,28642,28643,28645,28646,28668,28673,28678,28683,28693,28695,28696,28698,28699,28701,28702,28704,28705,28707,28708,28710,28711,28713,28714,28716,28717,28719,28720,28722,28723,28725,28726,28728,28729,28731,28732,28734,28735,28737,28738,28740,28742,28745,28747,28749,28750,28752,28753,28755,28756,28758,28759,28761,28762,28764,28765,28767,28768,28770,28771,28773,28774,28776,28777,28779,28780,28782,28784,28787,28789,28791,28792,28794,28795,28797,28798,28800,28801,28803,28804,28806,28807,28809,28810,28812,28814,28817,28819,28821,28822,28824,28825,28827,28828,28830,28832,28835,28838,28841,23882,23936,23986,24032,24074,24112,24146,24176,24202],"pairs":[[5,12862],[6,12363],[19,11919],[20,5188],[33,24242],[34,7019],[47,23772],[48,8449],[61,21873],[62,9527],[75,3936],[76,10302],[89,21871],[90,10823],[103,3969],[104,11139],[117,21191],[118,11299],[131,11331],[132,11955],[154,5947],[155,22883],[159,38],[160,20188],[161,11577],[165,52],[166,21536],[167,11596],[171,24],[172,17533],[173,11579],[177,66],[178,17537],[179,11618],[183,80],[184,17535],[185,11580],[189,94],[190,17547],[191,11643],[195,108],[196,17527],[197,11581],[201,122],[202,20212],[203,11671],[207,136],[208,2021],[209,11583],[213,2797],[214,147],[215,11702],[219,2811],[220,17481],[221,11585],[225,2825],[226,20178],[227,11736],[231,2839],[232,2047],[233,11587],[237,2853],[238,20175],[239,11773],[243,2867],[244,20170],[245,11590],[249,2881],[250,1690],[251,11813],[255,2895],[256,2073],[257,12348],[261,2920],[262,148],[263,11957],[268,4799],[269,11591],[270,5202],[274,2909],[275,2504],[276,12374],[281,2108],[287,17493],[288,11377],[293,17499],[299,17521],[300,11381],[305,17489],[311,2220],[312,11385],[317,2650],[323,17525],[324,11389],[329,2246],[335,2381],[336,11393],[341,2259],[347,2517],[348,11397],[353,2194],[359,2233],[360,11401],[365,2207],[371,17559],[372,12102],[377,2491],[384,20214],[385,4197],[391,22283],[392,11610],[396,5127],[397,17539],[398,11598],[402,5113],[403,2756],[404,11620],[408,7041],[409,20189],[410,11599],[414,2929],[415,20167],[416,11645],[421,20209],[422,11600],[427,17497],[428,11673],[433,2688],[434,11602],[439,21530],[440,11704],[445,17483],[446,11604],[451,17487],[452,11738],[457,17491],[458,11606],[463,2766],[464,11775],[469,1442],[470,11609],[475,17519],[476,11815],[481,17523],[482,12313],[487,17545],[488,11953],[493,21600],[494,13717],[495,12077],[499,5141],[500,17503],[501,5392],[505,5155],[506,17543],[512,17551],[513,5557],[518,21528],[524,2628],[525,5698],[530,20184],[536,2008],[537,5815],[542,17531],[548,2749],[549,5908],[554,2407],[560,22311],[561,5977],[566,2086],[572,2060],[573,6022],[578,2034],[584,2498],[585,12100],[590,2602],[597,21906],[598,3138],[604,23765],[605,11632],[609,3331],[610,19704],[611,11621],[615,4205],[616,1836],[617,11646],[622,20203],[623,11622],[628,20207],[629,11674],[634,20200],[635,11624],[640,20182],[641,11705],[646,17477],[647,11626],[652,20177],[653,11739],[658,50],[659,11628],[664,2443],[665,11776],[670,20169],[671,11631],[676,2111],[677,11816],[682,20194],[683,12280],[688,120],[689,11952],[694,21632],[695,14482],[696,12074],[700,5399],[701,17529],[702,7199],[706,6050],[707,2771],[713,1687],[714,7340],[719,17485],[725,17517],[726,7457],[731,17495],[737,1587],[738,7550],[743,17541],[749,1875],[750,7619],[755,17501],[761,134],[762,7664],[767,17549],[773,1849],[774,12098],[779,1823],[786,21541],[787,3327],[793,21203],[794,11657],[798,8416],[799,20204],[800,11647],[804,8430],[805,20174],[806,11675],[811,1665],[812,11649],[817,1639],[818,11706],[823,17479],[824,11651],[829,1613],[830,11740],[835,20197],[836,11653],[841,143],[842,11777],[847,1913],[848,11656],[853,2355],[854,11817],[859,2511],[860,12249],[865,1561],[866,11949],[871,21664],[872,15157],[873,12066],[877,8444],[878,2537],[879,8605],[883,8458],[884,92],[890,2566],[891,8722],[896,21538],[902,19699],[903,8815],[908,21529],[914,64],[915,8884],[920,78],[926,2789],[927,8929],[932,106],[938,19703],[939,12096],[944,19701],[951,21534],[952,3492],[958,19605],[959,11685],[963,3637],[964,22642],[965,11677],[969,4576],[970,1810],[971,11708],[976,17469],[977,11679],[982,17473],[983,11742],[988,17471],[989,11681],[994,2547],[995,11779],[1000,2701],[1001,11684],[1006,2432],[1007,11819],[1012,2615],[1013,12220],[1018,2524],[1019,11946],[1024,21696],[1025,15742],[1026,12055],[1030,5705],[1031,17557],[1032,9659],[1036,6421],[1037,1797],[1043,2718],[1044,9752],[1049,2479],[1055,2737],[1056,9821],[1061,2578],[1067,2676],[1068,9866],[1073,2708],[1079,2695],[1080,12094],[1085,2622],[1092,19706],[1093,3633],[1099,23775],[1100,11716],[1104,10297],[1105,17475],[1106,11710],[1110,10311],[1111,2664],[1112,11744],[1117,2645],[1118,11712],[1123,2635],[1124,11781],[1129,2284],[1130,11715],[1135,2590],[1136,11821],[1141,2609],[1142,12193],[1147,22308],[1148,11943],[1153,21728],[1154,16237],[1155,12041],[1159,10797],[1160,22309],[1161,10410],[1165,10811],[1166,8],[1172,21531],[1173,10479],[1178,22],[1184,19705],[1185,10524],[1190,17567],[1196,17563],[1197,22312],[1202,17561],[1209,21532],[1210,3750],[1216,19609],[1217,11750],[1221,3847],[1222,19700],[1223,11746],[1227,4847],[1228,1888],[1229,11783],[1234,2774],[1235,11749],[1240,2653],[1241,11823],[1246,2726],[1247,12168],[1252,2388],[1253,11940],[1258,21760],[1259,16642],[1260,12024],[1264,5915],[1265,2343],[1266,10907],[1270,6692],[1271,2467],[1277,2429],[1278,10952],[1283,2414],[1289,2455],[1290,22643],[1295,36],[1302,21533],[1303,3843],[1309,23784],[1310,11787],[1314,11148],[1315,2555],[1316,11786],[1320,11301],[1321,2424],[1322,11826],[1326,11321],[1327,2331],[1328,12145],[1333,2401],[1334,11936],[1339,21792],[1340,16957],[1341,12004],[1345,11312],[1346,20192],[1347,11199],[1352,2375],[1358,2362],[1359,22965],[1364,21247],[1371,2530],[1372,3912],[1378,19613],[1379,11827],[1383,3961],[1384,22641],[1385,11959],[1389,5018],[1390,1862],[1391,11933],[1396,21824],[1397,17182],[1398,11981],[1402,6029],[1403,21542],[1404,23837],[1408,6863],[1409,2319],[1416,19708],[1417,3957],[1423,21204],[1424,20112],[1429,21856],[1430,11870],[1431,20118],[1437,19702],[1438,24451],[1444,7403],[1457,23806],[1469,22916],[1481,22622],[1493,22289],[1505,11396],[1517,11400],[1529,11404],[1541,11408],[1553,11411],[1558,20310],[1565,22619],[1578,20144],[1591,21224],[1604,19675],[1617,22284],[1630,19671],[1643,19673],[1656,146],[1669,642],[1684,3185],[1685,19672],[1692,21200],[1697,5169],[1703,5183],[1705,22918],[1717,22624],[1729,22291],[1741,11430],[1753,11434],[1765,11438],[1777,11442],[1789,11445],[1794,20406],[1800,5197],[1801,21526],[1807,6937],[1814,953],[1827,17417],[1840,17457],[1853,17441],[1866,17429],[1879,17425],[1892,17421],[1907,5253],[1908,19678],[1915,21510],[1928,22626],[1940,22293],[1952,11460],[1964,11464],[1976,11468],[1988,11472],[2000,11475],[2005,20502],[2012,19670],[2025,21515],[2038,22285],[2051,19669],[2064,21513],[2077,20127],[2090,22287],[2105,13299],[2106,21517],[2113,20115],[2118,9473],[2124,9487],[2126,22295],[2138,11486],[2150,11490],[2162,11494],[2174,11498],[2186,11501],[2191,20598],[2197,9501],[2198,17385],[2204,9515],[2211,17461],[2224,17393],[2237,17401],[2250,216],[2263,17445],[2278,13325],[2279,192],[2286,22592],[2291,7347],[2297,7865],[2299,11508],[2311,11512],[2323,11516],[2335,11520],[2347,11523],[2352,20694],[2358,8612],[2359,22620],[2365,8957],[2372,20134],[2385,21522],[2398,145],[2411,17397],[2426,13347],[2427,19676],[2434,20111],[2439,10825],[2445,10836],[2447,11530],[2459,11534],[2471,11538],[2483,11541],[2488,20790],[2495,1373],[2508,149],[2521,20126],[2534,17389],[2549,13365],[2550,21514],[2557,20113],[2562,7557],[2568,8136],[2570,11548],[2582,11552],[2594,11555],[2599,20886],[2605,8822],[2606,19674],[2612,9228],[2619,20141],[2632,21518],[2647,5713],[2648,21525],[2655,11373],[2668,11562],[2680,11565],[2685,20982],[2692,20119],[2705,21512],[2720,5725],[2721,21516],[2728,5761],[2733,7671],[2739,8307],[2741,11571],[2746,21078],[2752,8936],[2753,21880],[2759,9399],[2768,5737],[2769,21520],[2776,7121],[2782,21174],[2791,5749],[2792,20166],[2799,12864],[2800,19572],[2813,24241],[2814,14484],[2827,19607],[2828,15159],[2841,21179],[2842,15744],[2855,19611],[2856,16239],[2869,21180],[2870,16644],[2883,19615],[2884,16959],[2897,2879],[2898,17184],[2911,17309],[2912,12900],[2934,13719],[2935,12557],[2939,6965],[2940,17739],[2941,6149],[2945,6951],[2946,20285],[2947,12545],[2951,1439],[2952,17687],[2953,6063],[2958,4786],[2959,12546],[2964,4329],[2965,6075],[2970,2927],[2971,12547],[2976,4945],[2977,6087],[2982,4303],[2983,12549],[2988,17683],[2989,6099],[2994,4355],[2995,12551],[3000,22357],[3001,6111],[3006,4812],[3007,12553],[3012,9],[3013,6123],[3018,2928],[3019,12556],[3024,17725],[3025,13258],[3030,4502],[3031,12898],[3036,21568],[3037,13701],[3038,13022],[3042,6979],[3043,17689],[3044,12560],[3048,6993],[3049,17693],[3055,4702],[3056,12379],[3061,17691],[3067,4738],[3068,12383],[3073,4541],[3079,4515],[3080,12387],[3085,20305],[3091,4489],[3092,12391],[3097,4403],[3103,20271],[3104,12395],[3109,17697],[3115,4381],[3116,12399],[3121,4923],[3127,4904],[3128,13045],[3133,17745],[3140,21956],[3141,6240],[3147,19570],[3148,12579],[3152,1910],[3153,19762],[3154,6156],[3159,4131],[3160,12568],[3165,5066],[3166,6169],[3171,20278],[3172,12569],[3177,21570],[3178,6182],[3183,3982],[3184,12571],[3189,19757],[3190,6195],[3195,17695],[3196,12573],[3201,17685],[3202,6208],[3207,17741],[3208,12575],[3213,19759],[3214,6221],[3219,297],[3220,12578],[3225,17717],[3226,13225],[3231,4118],[3232,12897],[3237,22044],[3238,14467],[3239,13019],[3244,21573],[3245,12585],[3250,17721],[3256,17729],[3257,12413],[3262,17701],[3268,4170],[3269,12417],[3274,4144],[3280,17699],[3281,12421],[3286,17743],[3292,17747],[3293,12425],[3298,17751],[3304,17719],[3305,12429],[3310,17723],[3316,4650],[3317,13043],[3322,4676],[3329,21560],[3330,5395],[3336,19576],[3337,12604],[3341,9529],[3342,4750],[3343,6342],[3347,9540],[3348,20270],[3349,12594],[3354,20263],[3355,6355],[3360,17731],[3361,12596],[3366,17749],[3367,6368],[3372,17703],[3373,12598],[3378,4793],[3379,6381],[3384,2923],[3385,12600],[3390,369],[3391,6394],[3396,345],[3397,12603],[3402,321],[3403,13194],[3408,19761],[3409,12894],[3414,22082],[3415,15143],[3416,13011],[3421,4897],[3422,12613],[3427,5044],[3433,17727],[3434,12443],[3439,4983],[3445,273],[3446,12447],[3451,21561],[3457,4819],[3458,12451],[3463,4832],[3469,4806],[3470,12455],[3475,4842],[3481,4861],[3482,13041],[3487,4873],[3494,21566],[3495,5560],[3501,19574],[3502,12632],[3506,2281],[3507,22684],[3508,6503],[3513,4105],[3514,12624],[3519,21563],[3520,6516],[3525,325],[3526,12626],[3531,17757],[3532,6529],[3537,17761],[3538,12628],[3543,4774],[3544,6542],[3549,4885],[3550,12631],[3555,17759],[3556,13165],[3561,4762],[3562,12891],[3567,22116],[3568,15729],[3569,13000],[3574,19764],[3575,12644],[3580,4917],[3586,4959],[3587,12469],[3592,4971],[3598,4930],[3599,12473],[3604,4940],[3610,5003],[3611,12477],[3616,5013],[3622,4990],[3623,13039],[3628,5061],[3635,21562],[3636,5701],[3642,19580],[3643,12663],[3648,5032],[3649,6639],[3654,5051],[3655,12657],[3660,5084],[3661,6652],[3666,277],[3667,12659],[3672,289],[3673,6665],[3678,19763],[3679,12662],[3684,22354],[3685,13138],[3690,337],[3691,12888],[3696,22146],[3697,16225],[3698,12986],[3703,301],[3704,12678],[3709,22355],[3715,313],[3716,12491],[3721,4719],[3727,4709],[3728,12495],[3733,4670],[3739,4696],[3740,22358],[3745,4683],[3752,21564],[3753,5818],[3759,19578],[3760,12697],[3764,2552],[3765,19758],[3766,6750],[3770,9759],[3771,4183],[3772,12693],[3777,20288],[3778,6763],[3783,4561],[3784,12696],[3789,361],[3790,13113],[3795,4724],[3796,12885],[3801,22172],[3802,16631],[3803,12969],[3807,10017],[3808,21565],[3809,12715],[3813,10417],[3814,17767],[3820,349],[3821,12509],[3826,373],[3832,4614],[3833,22685],[3838,17763],[3845,4825],[3846,5911],[3852,19584],[3853,12734],[3858,4657],[3859,6836],[3864,4638],[3865,12733],[3870,4626],[3871,13090],[3876,21574],[3877,12881],[3882,22194],[3883,16947],[3884,12949],[3889,4602],[3890,12755],[3895,4590],[3901,4571],[3902,23063],[3907,21291],[3914,4554],[3915,5980],[3921,19582],[3922,12774],[3926,1418],[3927,22683],[3928,12904],[3932,2723],[3933,4157],[3934,12878],[3939,22212],[3940,17173],[3941,12926],[3945,9873],[3946,19760],[3947,23895],[3951,10188],[3952,19766],[3959,4528],[3960,6025],[3966,21181],[3967,21171],[3972,22226],[3973,12817],[3974,22229],[3980,4092],[3981,24871],[3987,21878],[3992,7007],[3998,7021],[4000,23016],[4012,22666],[4024,22337],[4036,12394],[4048,12398],[4060,12402],[4072,12406],[4084,12409],[4089,6644],[4095,7032],[4096,0],[4109,20240],[4122,11378],[4135,19735],[4148,20217],[4161,19731],[4174,20218],[4187,2926],[4202,5406],[4203,19732],[4210,8462],[4223,22668],[4235,22339],[4247,12424],[4259,12428],[4271,12432],[4283,12436],[4295,12439],[4300,8088],[4307,11402],[4320,21547],[4333,22333],[4346,19729],[4359,21545],[4372,20223],[4385,22335],[4400,7048],[4401,21549],[4408,19657],[4421,22341],[4433,12450],[4445,12454],[4457,12458],[4469,12462],[4481,12465],[4486,9180],[4493,17585],[4506,17657],[4519,17641],[4532,17593],[4545,11394],[4558,17597],[4573,8490],[4574,11386],[4581,19617],[4594,12472],[4606,12476],[4618,12480],[4630,12484],[4642,12487],[4647,9969],[4654,22664],[4667,20230],[4680,21554],[4693,2925],[4706,21546],[4721,7049],[4722,19736],[4729,19641],[4742,12494],[4754,12498],[4766,12502],[4778,12505],[4783,9625],[4790,3],[4803,3916],[4816,20222],[4829,17589],[4844,7061],[4845,21548],[4852,7589],[4857,10552],[4865,12512],[4877,12516],[4889,12519],[4894,9718],[4901,19734],[4914,20237],[4927,21550],[4942,7073],[4943,21557],[4950,8668],[4963,12526],[4975,12529],[4980,9681],[4987,17621],[5000,20215],[5015,7085],[5016,21544],[5023,9605],[5028,10531],[5034,10723],[5036,12535],[5041,9693],[5047,10959],[5048,21932],[5054,11053],[5063,7097],[5064,21552],[5071,9791],[5077,9705],[5086,7109],[5087,20262],[5094,3236],[5095,13874],[5108,21206],[5109,5090],[5122,21193],[5123,5104],[5136,7646],[5137,5118],[5150,21216],[5151,5132],[5164,7679],[5165,5146],[5178,21221],[5179,5160],[5192,3971],[5193,13755],[5215,20110],[5216,20479],[5221,19816],[5222,13425],[5227,3077],[5228,13450],[5233,6911],[5234,6261],[5239,17923],[5240,13426],[5245,17895],[5246,6094],[5251,2804],[5252,13428],[5257,19811],[5258,6106],[5263,17943],[5264,13430],[5269,17885],[5270,6118],[5275,17893],[5276,13432],[5281,19813],[5282,6309],[5287,510],[5288,13435],[5293,17917],[5294,14077],[5299,3065],[5300,6132],[5305,21628],[5306,13436],[5307,1336],[5312,21605],[5313,13441],[5318,20381],[5324,20366],[5325,6175],[5330,6790],[5336,6828],[5337,6188],[5342,17889],[5348,17901],[5349,6201],[5354,3113],[5360,17941],[5361,6214],[5366,6657],[5372,17921],[5373,13306],[5378,6631],[5384,17949],[5385,13895],[5390,3089],[5397,21592],[5398,7857],[5404,23778],[5405,13461],[5410,20359],[5411,6496],[5416,17929],[5417,13451],[5422,6742],[5423,6280],[5428,5204],[5429,13453],[5434,6521],[5435,6292],[5440,6547],[5441,13455],[5446,17891],[5447,6304],[5452,17899],[5453,13457],[5458,6768],[5459,6470],[5464,17919],[5465,13460],[5470,17927],[5471,14046],[5476,17931],[5477,6318],[5482,9193],[5483,3413],[5484,13866],[5489,17887],[5490,6348],[5495,17903],[5501,20374],[5502,6361],[5507,21602],[5513,17947],[5514,6374],[5519,17951],[5525,21593],[5526,6387],[5531,6495],[5537,582],[5538,13332],[5543,558],[5549,534],[5550,13893],[5555,19815],[5562,21598],[5563,7202],[5569,21509],[5570,13489],[5575,22722],[5576,6441],[5581,3053],[5582,6577],[5587,21595],[5588,6453],[5593,22397],[5594,13483],[5599,17957],[5600,6465],[5605,17897],[5606,13485],[5611,19817],[5612,6606],[5617,22396],[5618,13488],[5623,6360],[5624,14017],[5629,17925],[5630,6479],[5635,9982],[5636,3566],[5637,13855],[5642,19818],[5643,13500],[5648,6386],[5654,3041],[5655,6522],[5660,17961],[5666,6174],[5667,6535],[5672,6226],[5678,6200],[5679,13354],[5684,17959],[5690,17963],[5691,13891],[5696,6148],[5703,21594],[5704,7343],[5710,23781],[5711,13520],[5716,6889],[5717,6589],[5722,17967],[5723,6700],[5728,164],[5729,6601],[5734,5097],[5735,13516],[5740,5111],[5741,6717],[5746,5125],[5747,13519],[5752,5153],[5753,13990],[5758,5167],[5759,6615],[5764,9613],[5765,3695],[5766,13841],[5771,5181],[5772,6645],[5777,5195],[5783,6064],[5784,6658],[5789,6076],[5795,6100],[5796,13372],[5801,6112],[5807,6124],[5808,22400],[5813,6155],[5820,21596],[5821,7460],[5827,21511],[5828,13554],[5833,19812],[5834,6712],[5839,3125],[5840,6798],[5845,6569],[5846,6803],[5851,20384],[5852,13553],[5857,21331],[5858,13965],[5863,21606],[5864,6726],[5869,9564],[5870,3800],[5871,13824],[5876,21597],[5877,13571],[5882,17945],[5888,6334],[5889,13386],[5894,6248],[5900,5139],[5901,22723],[5906,6088],[5913,6399],[5914,7553],[5920,23787],[5921,13591],[5926,6136],[5927,8280],[5932,6168],[5933,13590],[5938,6181],[5939,13942],[5944,6194],[5945,6812],[5950,9576],[5951,3881],[5952,13804],[5957,6233],[5958,13611],[5963,6243],[5969,6220],[5970,23157],[5975,6262],[5982,6670],[5983,7622],[5989,22236],[5990,13631],[5994,11206],[5995,22721],[5996,13759],[6000,11227],[6001,3101],[6002,6873],[6007,9588],[6008,3938],[6009,13781],[6014,19814],[6015,23949],[6020,19820],[6027,6347],[6028,7667],[6034,21207],[6035,21151],[6040,9600],[6041,13674],[6042,21861],[6048,6373],[6049,25287],[6055,868],[6068,5220],[6080,5232],[6092,5244],[6104,5256],[6116,5268],[6128,5280],[6140,5292],[6145,21624],[6152,11436],[6165,21579],[6178,22377],[6191,19785],[6204,21577],[6217,20319],[6230,22379],[6245,11450],[6246,11420],[6253,21867],[6266,5409],[6278,5421],[6290,5433],[6302,5445],[6314,5457],[6326,5469],[6331,21656],[6338,17785],[6351,17857],[6364,17841],[6377,5736],[6390,5583],[6403,5712],[6418,11476],[6419,11428],[6426,22593],[6439,5574],[6451,5586],[6463,5598],[6475,5610],[6487,5622],[6492,21688],[6499,5841],[6512,5984],[6525,20326],[6538,5206],[6551,20318],[6566,796],[6567,21578],[6574,20109],[6587,5715],[6599,5727],[6611,5739],[6623,5751],[6628,21720],[6635,21586],[6648,17],[6661,5210],[6674,5430],[6689,808],[6690,21580],[6697,21865],[6710,5832],[6722,5844],[6734,5856],[6739,21752],[6746,5607],[6759,20333],[6772,12376],[6787,820],[6788,21576],[6795,21183],[6808,5925],[6820,5937],[6825,21784],[6832,12384],[6845,17789],[6860,832],[6861,21582],[6868,22595],[6881,5994],[6886,21816],[6893,21584],[6908,844],[6909,5229],[6916,1150],[6922,21848],[6931,856],[6932,20358],[6939,5401],[6940,21209],[6953,19606],[6954,21187],[6967,19612],[6968,21213],[6981,19610],[6982,21188],[6995,19616],[6996,21218],[7009,6991],[7010,19614],[7023,6039],[7024,14520],[7046,19608],[7047,14228],[7052,20491],[7053,7940],[7058,8355],[7059,14218],[7064,20470],[7065,7724],[7070,21634],[7071,14220],[7076,18079],[7077,7736],[7082,19861],[7083,14222],[7088,21625],[7089,7748],[7094,8101],[7095,14224],[7100,5098],[7101,7914],[7106,19863],[7107,14227],[7112,19865],[7113,14805],[7118,3254],[7119,7762],[7124,21662],[7125,5481],[7126,14631],[7131,2818],[7132,7792],[7137,8234],[7143,20462],[7144,7805],[7149,8272],[7155,18093],[7156,7818],[7161,18149],[7167,18085],[7168,7831],[7173,18141],[7179,18121],[7180,14122],[7185,7965],[7191,3278],[7192,14652],[7197,8075],[7204,21630],[7205,9097],[7211,6935],[7212,14256],[7217,22756],[7218,7885],[7223,3242],[7224,8021],[7229,21627],[7230,7897],[7235,18091],[7236,14250],[7241,18157],[7242,7909],[7247,18097],[7248,14252],[7253,19867],[7254,8050],[7259,18119],[7260,14255],[7265,7804],[7266,14776],[7271,18125],[7272,7923],[7277,21694],[7278,5634],[7279,14620],[7284,19868],[7285,14266],[7290,20495],[7296,7830],[7297,7966],[7302,18161],[7308,3302],[7309,7979],[7314,18101],[7320,18129],[7321,14144],[7326,2944],[7332,5334],[7333,14650],[7338,5358],[7345,21626],[7346,8608],[7352,6949],[7353,14287],[7358,5382],[7359,8033],[7364,7035],[7365,8144],[7370,18095],[7371,8045],[7376,18099],[7377,14283],[7382,8212],[7383,8161],[7388,18123],[7389,14286],[7394,18127],[7395,14749],[7400,18131],[7401,8059],[7406,9637],[7407,5763],[7408,14606],[7413,18087],[7414,8089],[7419,18103],[7425,18159],[7426,8102],[7431,22435],[7437,771],[7438,14162],[7443,22434],[7449,18163],[7450,22438],[7455,18117],[7462,18089],[7463,8725],[7469,6963],[7470,14321],[7475,19862],[7476,8156],[7481,3314],[7482,8242],[7487,8013],[7488,8247],[7493,7991],[7494,14320],[7499,21367],[7500,14724],[7505,747],[7506,8170],[7511,9730],[7512,5868],[7513,14589],[7518,21629],[7519,14337],[7524,18145],[7530,7778],[7531,14176],[7536,7692],[7542,20480],[7543,22757],[7548,18143],[7555,7843],[7556,8818],[7562,6977],[7563,14358],[7568,18147],[7569,9372],[7574,18151],[7575,14357],[7580,18167],[7581,14701],[7586,21638],[7587,8256],[7592,9799],[7593,5949],[7594,14569],[7599,723],[7600,14377],[7605,699],[7611,5310],[7612,23247],[7617,7939],[7624,8114],[7625,8887],[7631,6037],[7632,14398],[7637,22755],[7638,14524],[7643,3290],[7644,8317],[7649,9774],[7650,6006],[7651,14546],[7656,19864],[7657,23999],[7662,19870],[7669,7791],[7670,8932],[7676,21189],[7677,21166],[7682,9786],[7683,14441],[7684,21869],[7690,7817],[7691,25699],[7697,19585],[7710,7051],[7722,7063],[7734,7075],[7746,7087],[7758,7099],[7770,7111],[7775,21660],[7782,17975],[7795,21611],[7808,20417],[7821,19837],[7834,20418],[7847,20415],[7862,11484],[7863,11458],[7870,10877],[7883,7216],[7895,7228],[7907,7240],[7919,7252],[7931,7264],[7936,21692],[7943,7483],[7956,7626],[7969,20422],[7982,7037],[7995,20414],[8010,11506],[8011,21610],[8018,19593],[8031,7357],[8043,7369],[8055,7381],[8067,7393],[8072,21726],[8079,21618],[8092,31],[8105,5092],[8118,7072],[8133,11524],[8134,21612],[8141,19601],[8154,7474],[8166,7486],[8178,7498],[8183,21758],[8190,7249],[8203,20429],[8216,12414],[8231,1102],[8232,21608],[8239,10315],[8252,7567],[8264,7579],[8269,21790],[8276,17989],[8289,17993],[8304,1114],[8305,21614],[8312,19597],[8325,7636],[8330,21822],[8337,21616],[8352,1126],[8353,13291],[8360,19645],[8366,21854],[8375,1138],[8376,20454],[8383,7276],[8384,15295],[8397,9848],[8398,22282],[8411,23768],[8412,24244],[8425,9881],[8426,23790],[8439,19653],[8440,21201],[8453,7681],[8454,15195],[8476,10449],[8477,20667],[8482,22786],[8483,8977],[8488,3157],[8489,9113],[8494,21659],[8495,8989],[8500,5499],[8501,14927],[8506,18285],[8507,9001],[8512,18297],[8513,14929],[8518,19913],[8519,9142],[8524,22468],[8525,14932],[8530,18317],[8531,15442],[8536,18325],[8537,9015],[8542,21658],[8543,14933],[8544,22884],[8549,19914],[8550,14942],[8555,20591],[8561,18301],[8562,9058],[8567,3467],[8573,18357],[8574,9071],[8579,7177],[8585,18329],[8586,14847],[8591,7153],[8597,18361],[8598,15316],[8603,3443],[8610,9364],[8611,10009],[8617,8379],[8618,14964],[8623,2956],[8624,9125],[8629,22469],[8630,9236],[8635,5547],[8636,9137],[8641,8465],[8642,14960],[8647,5523],[8648,9253],[8653,9304],[8654,14963],[8659,18323],[8660,15415],[8665,18327],[8666,9151],[8671,7411],[8672,7405],[8673,15281],[8678,18287],[8679,9181],[8684,18295],[8690,18299],[8691,9194],[8696,18303],[8702,18331],[8703,14865],[8708,18359],[8714,18363],[8715,22472],[8720,18367],[8727,9326],[8728,9662],[8734,8393],[8735,14998],[8740,19908],[8741,9248],[8746,3479],[8747,9334],[8752,9105],[8753,9339],[8758,20576],[8759,14997],[8764,21399],[8765,15390],[8770,9057],[8771,9262],[8776,7362],[8777,7510],[8778,15264],[8783,21661],[8784,15013],[8789,18293],[8795,18341],[8796,14879],[8801,18345],[8807,18349],[8808,22787],[8813,7141],[8820,7189],[8821,9755],[8827,8407],[8828,15035],[8833,7129],[8834,10161],[8839,6944],[8840,15034],[8845,3419],[8846,15367],[8851,21670],[8852,9348],[8857,7374],[8858,7591],[8859,15244],[8864,9083],[8865,15053],[8870,18343],[8876,18347],[8877,23333],[8882,18351],[8889,9206],[8890,9824],[8896,8421],[8897,15075],[8902,22785],[8903,15199],[8908,3455],[8909,9409],[8914,7165],[8915,7648],[8916,15221],[8921,19910],[8922,24045],[8927,19916],[8934,18321],[8935,9869],[8941,21210],[8942,21147],[8947,7398],[8948,15118],[8949,20106],[8955,9167],[8956,26107],[8962,11152],[8975,8481],[8987,8493],[8999,8505],[9011,8517],[9023,8529],[9028,21690],[9035,8748],[9048,8891],[9061,20518],[9074,8467],[9087,20510],[9102,21674],[9103,21642],[9110,21190],[9123,8622],[9135,8634],[9147,8646],[9159,8658],[9164,21722],[9171,21650],[9184,45],[9197,5106],[9210,12448],[9225,21706],[9226,21644],[9233,21874],[9246,8739],[9258,8751],[9270,8763],[9275,21754],[9282,8514],[9295,20525],[9308,12440],[9323,21738],[9324,21640],[9331,11372],[9344,8832],[9356,8844],[9361,21786],[9368,14107],[9381,18189],[9396,21770],[9397,21646],[9404,21866],[9417,8901],[9422,21818],[9429,21648],[9444,21802],[9445,13317],[9452,21868],[9458,21850],[9467,21834],[9468,20550],[9475,8614],[9476,19636],[9489,19634],[9490,24243],[9503,19640],[9504,19655],[9517,9499],[9518,19638],[9531,8946],[9532,15780],[9554,10934],[9555,15551],[9560,18475],[9561,9914],[9566,21691],[9567,10025],[9572,22499],[9573,9926],[9578,18485],[9579,15547],[9584,8387],[9585,10042],[9590,19955],[9591,15550],[9596,22498],[9597,15988],[9602,18517],[9603,9940],[9608,7435],[9609,8670],[9610,15866],[9615,3608],[9616,9970],[9621,18497],[9627,18501],[9628,9983],[9633,7318],[9639,18525],[9640,15481],[9645,18529],[9651,3584],[9652,22502],[9657,7294],[9664,10115],[9665,10642],[9671,9471],[9672,15585],[9677,19950],[9678,10037],[9683,3620],[9684,10123],[9689,9894],[9690,10128],[9695,20672],[9696,15584],[9701,21427],[9702,15963],[9707,21702],[9708,10051],[9713,7528],[9714,8775],[9715,15849],[9720,21693],[9721,15599],[9726,18493],[9732,18541],[9733,15495],[9738,18545],[9744,18549],[9745,22813],[9750,7282],[9757,7330],[9758,10413],[9764,9485],[9765,15622],[9770,7056],[9771,10696],[9776,6958],[9777,15621],[9782,18557],[9783,15940],[9788,18561],[9789,10137],[9794,7597],[9795,8856],[9796,15829],[9801,3346],[9802,15639],[9807,2968],[9813,5640],[9814,23415],[9819,9543],[9826,9995],[9827,10482],[9833,8944],[9834,15662],[9839,22811],[9840,15784],[9845,3596],[9846,10198],[9851,7306],[9852,8913],[9853,15806],[9858,19952],[9859,24087],[9864,19958],[9871,18521],[9872,10527],[9878,21195],[9879,21162],[9884,7584],[9885,15705],[9886,20116],[9892,9956],[9893,26511],[9899,140],[9912,9559],[9924,9571],[9936,9583],[9948,9595],[9953,21724],[9960,20635],[9973,9828],[9986,20641],[9999,9545],[10014,21708],[10015,21676],[10022,21182],[10035,9676],[10047,9688],[10059,9700],[10064,21756],[10071,14848],[10084,20621],[10097,20606],[10112,21740],[10113,21672],[10120,5201],[10133,9769],[10145,9781],[10150,21788],[10157,5120],[10170,18389],[10185,21772],[10186,21678],[10193,19589],[10206,9838],[10211,21820],[10218,21680],[10233,21804],[10234,5407],[10241,19625],[10247,21852],[10256,21836],[10257,20646],[10264,9712],[10265,16344],[10278,10967],[10279,23794],[10292,11214],[10293,23792],[10306,9883],[10307,16275],[10329,8854],[10330,20114],[10335,19988],[10336,10572],[10341,3737],[10342,10658],[10347,9480],[10348,10663],[10353,20768],[10354,16081],[10359,21451],[10360,16443],[10365,21734],[10366,10586],[10371,7540],[10372,16082],[10373,20853],[10378,21725],[10379,16095],[10384,18685],[10390,18741],[10391,16024],[10396,18757],[10402,7221],[10403,16365],[10408,18745],[10415,7447],[10416,11045],[10422,10260],[10423,16119],[10428,18749],[10429,11026],[10434,18761],[10435,16118],[10440,7068],[10441,16420],[10446,6972],[10447,10672],[10452,9649],[10453,9793],[10454,16324],[10459,3358],[10460,16135],[10465,2980],[10471,5579],[10472,23493],[10477,10318],[10484,18693],[10485,10910],[10491,10274],[10492,16159],[10497,22833],[10498,16279],[10503,3713],[10504,10733],[10509,7014],[10510,9850],[10511,16301],[10516,19990],[10517,24125],[10522,19996],[10529,7423],[10530,10955],[10536,21214],[10537,21141],[10542,7028],[10543,16202],[10544,21853],[10550,18721],[10551,26911],[10557,19629],[10570,10334],[10582,10346],[10594,10358],[10599,9742],[10606,14866],[10619,20717],[10632,20702],[10647,21736],[10648,21704],[10655,21864],[10668,10427],[10680,10439],[10685,9811],[10692,5134],[10705,18589],[10720,21768],[10721,21710],[10728,21870],[10741,10496],[10746,9856],[10753,21712],[10768,21800],[10769,5419],[10776,19621],[10782,9843],[10791,21832],[10792,20742],[10799,10419],[10800,19656],[10813,10795],[10814,19654],[10827,10541],[10828,16680],[10850,11329],[10851,16526],[10856,11104],[10857,16525],[10862,9494],[10863,16565],[10868,20864],[10869,16807],[10874,21471],[10875,11002],[10880,6986],[10881,10451],[10882,16729],[10887,21766],[10888,16541],[10893,18941],[10899,18957],[10900,23567],[10905,18945],[10912,7080],[10913,11267],[10919,10539],[10920,16566],[10925,22851],[10926,16684],[10931,3806],[10932,11063],[10937,7104],[10938,10508],[10939,16706],[10944,10983],[10945,24159],[10950,20024],[10957,7516],[10958,11202],[10964,21199],[10965,21159],[10970,7116],[10971,16609],[10972,20030],[10978,7233],[10979,27307],[10985,21175],[10998,10855],[11010,10867],[11015,7609],[11022,18839],[11035,20813],[11050,21774],[11051,21742],[11058,21197],[11071,10924],[11076,7654],[11083,21744],[11098,21806],[11099,5431],[11106,19649],[11112,7641],[11121,21838],[11122,20838],[11129,10847],[11130,16883],[11143,10969],[11144,16995],[11166,10916],[11167,17021],[11172,22865],[11173,16999],[11178,3769],[11179,11237],[11184,7479],[11185,10936],[11186,21037],[11191,10803],[11192,24189],[11197,20054],[11204,7000],[11205,17269],[11211,21219],[11212,21133],[11217,7092],[11218,16926],[11219,20060],[11225,7245],[11226,27699],[11232,21196],[11245,11171],[11250,7491],[11257,21776],[11272,5455],[11273,5443],[11280,5479],[11286,7503],[11295,5467],[11296,20934],[11303,11216],[11304,17220],[11326,20080],[11327,21156],[11332,7257],[11333,17153],[11334,20086],[11340,7386],[11341,28087],[11347,21222],[11353,3028],[11362,21126],[11363,21030],[22981,10],[23079,386],[23169,5099],[23259,788],[23292,8402],[23294,8388],[23341,9549],[23423,1094],[23456,10283],[23458,10269],[23497,10845],[23571,1304],[23606,11134],[23866,3026],[23868,3227],[23870,3404],[23872,3557],[23874,3686],[23876,3791],[23878,3872],[23880,3929],[23922,5223],[23924,5412],[23926,5577],[23928,5718],[23930,5835],[23932,5928],[23934,5997],[23974,7054],[23976,7219],[23978,7360],[23980,7477],[23982,7570],[23984,7639],[24022,8484],[24024,8625],[24026,8742],[24028,8835],[24030,8904],[24066,9562],[24068,9679],[24070,9772],[24072,9841],[24106,10337],[24108,10430],[24110,10499],[24142,10858],[24144,10927],[24174,11174],[24258,20140],[24261,22239],[24262,429],[24263,387],[24264,22885],[24265,23802],[24266,600],[24267,17372],[24268,807],[24269,789],[24270,17370],[24271,23801],[24272,150],[24273,20147],[24274,22892],[24275,405],[24276,17405],[24277,21521],[24278,954],[24279,17376],[24280,17407],[24281,1095],[24282,17374],[24283,20123],[24284,168],[24285,22895],[24286,477],[24287,1305],[24288,17409],[24289,21519],[24290,20146],[24291,17380],[24292,17411],[24293,20121],[24294,17378],[24295,20124],[24296,1212],[24297,22904],[24298,489],[24299,453],[24300,17413],[24301,20135],[24302,1374],[24303,17384],[24304,17415],[24305,1419],[24306,17382],[24307,264],[24308,20122],[24315,20150],[24316,22898],[24317,17375],[24318,20137],[24319,21223],[24320,17371],[24321,17408],[24322,20153],[24323,17369],[24324,17406],[24325,20131],[24326,17373],[24327,22901],[24328,855],[24329,20149],[24330,20160],[24331,21225],[24332,17377],[24333,17412],[24334,20157],[24335,17379],[24336,17410],[24337,20132],[24338,20129],[24339,22907],[24340,867],[24341,831],[24342,20165],[24343,21884],[24344,17381],[24345,17416],[24346,20162],[24347,17383],[24348,17414],[24349,690],[24350,20130],[24357,22238],[24358,1137],[24359,20156],[24360,22888],[24361,23804],[24362,20152],[24363,17436],[24364,1323],[24365,20155],[24366,17434],[24367,23803],[24368,20159],[24369,22910],[24370,1149],[24371,20161],[24372,17453],[24373,20145],[24374,1113],[24375,17440],[24376,17455],[24377,20136],[24378,17438],[24379,1020],[24380,20164],[24387,22914],[24388,1335],[24389,17439],[24390,22912],[24391,1392],[24392,17435],[24393,17456],[24394,1425],[24395,17433],[24396,17454],[24397,1254],[24398,17437],[24441,11915],[24442,11917],[24443,11900],[24444,11901],[24445,11903],[24446,11905],[24447,11907],[24448,11909],[24449,11911],[24450,11913],[24478,22241],[24479,2394],[24481,22935],[24482,23832],[24484,17472],[24485,2368],[24487,17470],[24488,23831],[24490,20195],[24491,22942],[24493,17505],[24494,21537],[24496,17476],[24497,17507],[24499,17474],[24500,20171],[24502,22945],[24503,1652],[24505,17509],[24506,21535],[24508,17480],[24509,17511],[24511,17478],[24512,20172],[24514,22954],[24515,114],[24517,17513],[24518,20183],[24520,17484],[24521,17515],[24523,17482],[24524,128],[24525,20196],[24528,20173],[24532,20198],[24533,22948],[24535,20185],[24536,21246],[24538,17508],[24539,20201],[24541,17506],[24542,20179],[24544,22951],[24545,1626],[24547,20208],[24548,21248],[24550,17512],[24551,20205],[24553,17510],[24554,20180],[24556,22957],[24557,86],[24559,20213],[24560,21910],[24562,17516],[24563,20210],[24565,17514],[24566,100],[24567,20199],[24570,20181],[24574,22240],[24575,1600],[24577,22938],[24578,23834],[24580,17536],[24581,1574],[24583,17534],[24584,23833],[24586,22960],[24587,58],[24589,17553],[24590,20193],[24592,17540],[24593,17555],[24595,17538],[24596,72],[24597,20202],[24600,20187],[24604,22964],[24605,30],[24607,22962],[24608,16],[24610,17556],[24611,2],[24613,17554],[24614,44],[24615,20206],[24618,20191],[24621,20211],[24624,21909],[24680,20236],[24689,17572],[24690,3350],[24691,3332],[24692,17570],[24693,23861],[24694,3143],[24701,17576],[24702,17607],[24703,3638],[24704,17574],[24705,20219],[24706,3497],[24713,17580],[24714,17611],[24715,3848],[24716,17578],[24717,20220],[24718,3755],[24725,17584],[24726,17615],[24727,3962],[24728,17582],[24729,266],[24730,3917],[24737,20246],[24738,22998],[24739,17575],[24740,20233],[24741,21269],[24742,17571],[24743,17608],[24744,20249],[24745,17569],[24746,17606],[24747,20227],[24748,17573],[24749,23001],[24750,3398],[24751,20245],[24752,20256],[24753,21271],[24754,17577],[24755,17612],[24756,20253],[24757,17579],[24758,17610],[24759,20228],[24760,20225],[24761,23007],[24762,3410],[24763,3374],[24764,20261],[24765,21936],[24766,17581],[24767,17616],[24768,20258],[24769,17583],[24770,17614],[24771,3233],[24772,20226],[24779,22242],[24780,3680],[24781,20252],[24782,22988],[24783,23864],[24784,20248],[24785,17636],[24786,3866],[24787,20251],[24788,17634],[24789,23863],[24790,20255],[24791,23010],[24792,3692],[24793,20257],[24794,17653],[24795,20241],[24796,3656],[24797,17640],[24798,17655],[24799,20232],[24800,17638],[24801,3563],[24802,20260],[24809,23014],[24810,3878],[24811,17639],[24812,23012],[24813,3935],[24814,17635],[24815,17656],[24816,3968],[24817,17633],[24818,17654],[24819,3797],[24820,17637],[24861,12860],[24863,12845],[24864,12846],[24865,12848],[24866,12850],[24867,12852],[24868,12854],[24869,12856],[24870,12858],[24897,4689],[24898,22245],[24899,5021],[24900,23033],[24901,23890],[24902,4948],[24903,4663],[24904,17672],[24905,4850],[24906,17670],[24907,23889],[24908,5069],[24909,20291],[24910,23040],[24911,4579],[24912,17705],[24913,21569],[24914,4910],[24915,17676],[24916,17707],[24917,4996],[24918,17674],[24919,20267],[24920,4727],[24921,23043],[24922,357],[24923,20290],[24924,17709],[24925,21567],[24926,4406],[24927,17680],[24928,17711],[24929,4208],[24930,17678],[24931,20268],[24932,20265],[24933,23052],[24934,2894],[24935,4368],[24939,17684],[24940,17715],[24941,20266],[24945,20292],[24948,20269],[24951,20294],[24952,23046],[24953,17675],[24954,20281],[24955,21290],[24956,17671],[24957,17708],[24958,20297],[24959,17669],[24960,17706],[24961,20275],[24962,17673],[24963,23049],[24964,333],[24965,20293],[24966,20304],[24967,21292],[24968,17677],[24969,17712],[24970,20301],[24971,17679],[24972,17710],[24973,20276],[24974,20273],[24975,23055],[24976,2866],[24977,4342],[24981,17716],[24982,20306],[24983,20274],[24987,20295],[24990,20277],[24993,22244],[24994,309],[24995,20300],[24996,23036],[24997,23892],[24998,20296],[24999,17736],[25000,285],[25001,20299],[25002,17734],[25003,23891],[25004,20303],[25005,23058],[25006,2838],[25007,4316],[25011,17740],[25012,17755],[25013,20280],[25017,20298],[25020,20283],[25023,23062],[25024,2810],[25025,17735],[25029,17756],[25030,152],[25031,17733],[25035,20302],[25038,20287],[25041,20307],[25098,20332],[25155,20342],[25156,23094],[25157,17775],[25158,20329],[25159,21311],[25160,17771],[25161,17808],[25162,20345],[25163,17769],[25164,17806],[25165,20323],[25166,17773],[25167,5466],[25168,23097],[25169,20341],[25170,20352],[25171,21313],[25172,17777],[25173,17812],[25174,20349],[25175,17779],[25176,17810],[25177,20324],[25178,20321],[25179,5478],[25180,23103],[25181,5442],[25182,20357],[25183,21984],[25184,17781],[25185,17816],[25186,20354],[25187,17783],[25188,5301],[25189,17814],[25190,20322],[25197,5748],[25198,22246],[25199,20348],[25200,23084],[25201,23920],[25202,20344],[25203,5934],[25204,17836],[25205,20347],[25206,17834],[25207,23919],[25208,20351],[25209,5760],[25210,23106],[25211,5724],[25212,17853],[25213,20337],[25214,20356],[25215,17840],[25216,17855],[25217,20353],[25218,5631],[25219,17838],[25220,20328],[25227,5946],[25228,23110],[25229,17839],[25230,6003],[25231,23108],[25232,17835],[25233,6036],[25234,17856],[25235,17833],[25236,5865],[25237,17854],[25238,17837],[25277,13715],[25280,3035],[25281,13703],[25282,13705],[25283,13707],[25284,13709],[25285,13711],[25286,13713],[25313,6534],[25314,22249],[25315,6866],[25316,23127],[25317,23944],[25318,6793],[25319,6508],[25320,17872],[25321,6695],[25322,17870],[25323,23943],[25324,6914],[25325,20387],[25326,23134],[25327,6424],[25328,17905],[25329,21601],[25330,6755],[25331,17876],[25332,17907],[25333,6841],[25334,17874],[25335,20363],[25336,6572],[25337,23137],[25338,570],[25339,6053],[25340,17909],[25341,21599],[25342,20386],[25343,17880],[25344,17911],[25345,20361],[25346,17878],[25347,20364],[25348,6251],[25361,20388],[25364,20365],[25367,20390],[25368,23140],[25369,17875],[25370,20377],[25371,21330],[25372,17871],[25373,17908],[25374,20393],[25375,17869],[25376,17906],[25377,20371],[25378,17873],[25379,23143],[25380,546],[25381,20389],[25382,20400],[25383,21332],[25384,17877],[25385,17912],[25386,20397],[25387,17879],[25388,17910],[25389,20372],[25390,20369],[25403,20391],[25406,20373],[25409,22248],[25410,522],[25411,20396],[25412,23130],[25413,23946],[25414,20392],[25415,17936],[25416,498],[25417,20395],[25418,17934],[25419,23945],[25420,20399],[25433,20394],[25436,20379],[25451,20398],[25454,20383],[25512,20428],[25575,18008],[25576,20441],[25577,17969],[25578,18006],[25579,20419],[25580,17973],[25587,18012],[25588,20445],[25589,17979],[25590,18010],[25591,20420],[25592,17977],[25599,18016],[25600,20450],[25601,17983],[25602,5303],[25603,18014],[25604,17981],[25611,7390],[25612,22250],[25613,20444],[25614,23176],[25615,23972],[25616,20440],[25617,7576],[25618,18036],[25619,20443],[25620,18034],[25621,23971],[25622,20447],[25623,7402],[25624,23198],[25625,7366],[25626,18053],[25627,20433],[25628,20452],[25629,18040],[25630,18055],[25631,20449],[25632,7273],[25633,18038],[25634,20424],[25641,7588],[25642,23202],[25643,18039],[25644,7645],[25645,23200],[25646,18035],[25647,7678],[25648,18056],[25649,18033],[25650,7507],[25651,18054],[25652,18037],[25689,14480],[25693,5304],[25694,14470],[25695,14472],[25696,14474],[25697,14476],[25698,14478],[25725,7978],[25726,22253],[25727,8310],[25728,23217],[25729,23994],[25730,8237],[25731,7952],[25732,18072],[25733,8139],[25734,18070],[25735,23993],[25736,8358],[25737,20483],[25738,23224],[25739,7868],[25740,18105],[25741,21633],[25742,8199],[25743,18076],[25744,18107],[25745,8285],[25746,18074],[25747,20459],[25748,8016],[25749,23227],[25750,759],[25751,20482],[25755,18080],[25756,18111],[25757,20457],[25773,20484],[25776,20461],[25779,20486],[25780,23230],[25781,18075],[25782,20473],[25783,21366],[25784,18071],[25785,18108],[25786,20489],[25787,18069],[25788,18106],[25789,20467],[25790,18073],[25791,23233],[25792,735],[25793,20485],[25797,18112],[25798,20493],[25799,20465],[25815,20487],[25818,20469],[25821,22252],[25822,711],[25823,20488],[25827,18136],[25828,401],[25829,20492],[25845,20490],[25848,20475],[25863,20494],[25922,20524],[26021,8655],[26022,22254],[26023,20540],[26024,23264],[26025,24020],[26026,20536],[26027,8841],[26028,18236],[26029,20539],[26030,18234],[26031,24019],[26032,20543],[26033,8667],[26034,23286],[26035,8631],[26036,18253],[26037,20529],[26038,20548],[26039,18240],[26040,18255],[26041,20545],[26042,8538],[26043,18238],[26044,20520],[26051,8853],[26052,23290],[26053,18239],[26054,8910],[26055,23288],[26056,18235],[26057,8943],[26058,18256],[26059,18233],[26060,8772],[26061,18254],[26062,18237],[26097,15155],[26102,7123],[26103,15147],[26104,15149],[26105,15151],[26106,15153],[26133,9070],[26134,22257],[26135,9402],[26136,23303],[26137,24040],[26138,9329],[26139,9044],[26140,18272],[26141,9231],[26142,18270],[26143,24039],[26144,9450],[26145,20579],[26146,23310],[26147,8960],[26148,18305],[26149,21665],[26150,9291],[26151,18276],[26152,18307],[26153,9377],[26154,18274],[26155,20555],[26156,9108],[26181,20580],[26184,20557],[26187,20582],[26188,23316],[26189,18275],[26190,20569],[26191,21398],[26192,18271],[26193,18308],[26194,20585],[26195,18269],[26196,18306],[26197,20563],[26198,18273],[26223,20583],[26226,20565],[26253,20586],[26256,20571],[26328,20620],[26433,9778],[26434,18436],[26435,20636],[26436,18434],[26437,24063],[26438,20639],[26445,18440],[26446,18455],[26447,20616],[26448,8540],[26449,18438],[26450,20644],[26457,9790],[26458,23374],[26459,18439],[26460,9847],[26461,23372],[26462,18435],[26463,9880],[26464,18456],[26465,18433],[26466,9709],[26467,18454],[26468,18437],[26501,15740],[26507,8541],[26508,15734],[26509,15736],[26510,15738],[26537,8583],[26538,22261],[26539,10191],[26540,23385],[26541,24082],[26542,10118],[26543,8559],[26544,18472],[26545,10020],[26546,18470],[26547,24081],[26548,10239],[26549,20675],[26550,23392],[26551,10080],[26555,18476],[26556,18507],[26557,10166],[26585,20676],[26588,20653],[26591,20678],[26592,23398],[26593,18471],[26597,18508],[26598,20681],[26599,18469],[26627,20679],[26630,20661],[26657,20682],[26730,20716],[26859,10448],[26860,23454],[26861,18639],[26862,10505],[26863,23452],[26864,18635],[26865,10538],[26866,18656],[26867,18633],[26868,10367],[26869,18654],[26870,18637],[26901,16235],[26908,9607],[26909,16231],[26910,16233],[26937,8700],[26938,22265],[26939,10726],[26940,23463],[26941,24120],[26942,10653],[26943,8676],[26944,18672],[26945,10555],[26946,18670],[26947,24119],[26948,10774],[26985,20772],[26988,20749],[27027,20775],[27030,20757],[27128,20812],[27263,10966],[27264,18856],[27265,18833],[27266,10369],[27267,18854],[27268,18837],[27297,16640],[27305,10370],[27306,16638],[27333,8793],[27334,22269],[27335,11056],[27339,8627],[27340,18872],[27341,10268],[27381,20868],[27384,20845],[27423,20871],[27522,20908],[27689,16955],[27698,10879],[27773,20964],[27776,20941],[28077,11183],[28161,21060],[28667,2907],[28669,127],[28672,3144],[28674,2931],[28677,7043],[28679,7208],[28682,9551],[28684,9668],[28694,3564],[28697,15],[28700,7274],[28703,2795],[28706,29],[28709,43],[28712,2809],[28715,2823],[28718,57],[28721,71],[28724,2837],[28727,2851],[28730,85],[28733,99],[28736,2865],[28739,1426],[28741,11323],[28743,113],[28744,17319],[28746,2893],[28748,3333],[28751,3498],[28754,5212],[28757,5566],[28760,3639],[28763,3756],[28766,5707],[28769,5824],[28772,3849],[28775,3918],[28778,5917],[28781,5986],[28783,5174],[28785,3963],[28786,6031],[28788,7005],[28790,7349],[28793,7466],[28796,8473],[28799,8731],[28802,7559],[28805,7628],[28808,8824],[28811,8893],[28813,7673],[28815,8435],[28816,8938],[28818,9513],[28820,9761],[28823,9830],[28826,10326],[28829,10488],[28831,9875],[28833,10288],[28834,10533],[28836,10809],[28837,10961],[28839,11125],[28840,11163],[28842,11208]]} diff --git a/research/bit-reuse-147/price147.py b/research/bit-reuse-147/price147.py new file mode 100644 index 0000000000..adbe8342ea --- /dev/null +++ b/research/bit-reuse-147/price147.py @@ -0,0 +1,104 @@ +"""Price a shared-core bit row with the merged #144 arithmetic (scripts/paired_cube_network.py, icekylinx). + +Stdlib only. The functions used are #144's own: exact_moment(), the rare-class contamination of bit_certificate(), +complex_certificate(), finite_bridge() and the 47-constraint assembly. As in hpst3r's #147, the one relaxed check is +the bit dimension test, which here accepts R <= 28866; every other check of shared_profile() is kept verbatim. The +coarse saving and kappa are the largest points of a 10^-12 grid that pass, and the next points are rejected. On +#144's own 10^-10 grid and row this reproduces 4617656/10^10, 4613422943/10^13 and 4609169/10^10 exactly. +""" +import json +import sys +from collections import Counter +from fractions import Fraction as Q +from pathlib import Path + +HERE = Path(__file__).resolve().parent +ROOT = HERE.parents[1] +sys.path.insert(0, str(ROOT / 'scripts')) +import paired_cube_network as pcn # noqa: E402 + +GRID = 10**12 + + +def bit_profile(row): + require = pcn.require + h, v, R, ell = (row[k] for k in ('h', 'v', 'R', 'loss')) + m, W, H = 3 * h, 2 * v + R, Counter() + selected = {int(r): n for r, n in row['selected_rank_histogram'].items()} + require(sum(selected.values()) == row['selected_roles'], 'Selected gauge count') + for r, n in selected.items(): + require(0 < r < h and n > 0, 'Proper local gauges') + H[3 * r] += n + require((h, v, ell) == (23, 1771, 506) and 0 < R <= 28866, 'Retained bit local dimensions (R reduced)') + for name in ('auxiliary_histogram', 'source_data_histogram', 'target_data_histogram', 'copied_center_histogram'): + for r, n in row[name].items(): + H[int(r)] += 3 * n + H[2] += 2 * v + H = pcn.clean(H) + require(all(0 < r < m and n > 0 for r, n in H.items()), 'Proper shared-core children') + mass = sum(r * n for r, n in H.items()) + require(H == pcn.clean(row['child_histogram']), 'Saved complete child histogram') + require((m, W, mass, W * m - mass) == (row['m'], row['W_per_vertex'], row['rank_per_vertex'], row['deficit_per_vertex']), + 'Saved sharing dimensions and rank') + require(W * m - mass == 2 * v - 3 * ell, 'Shared-core telescoping deficit') + return dict(m=m, local_dimension=h, W_per_vertex=W, rank_per_vertex=mass, deficit_per_vertex=W * m - mass, + child_multiplicities=H, maxchild=max(H), edge_count=sum(H.values())) + + +def bit_gap(p, coarse): + """bit_certificate()'s strict moment gap at a coarse saving, or None if either strict inequality fails.""" + try: + exact = pcn.exact_moment(p, coarse) + except (AssertionError, ValueError): + return None + m, W = p['m'], p['W_per_vertex']; fallback = 32 * m * m + added = pcn.BAD * Q(fallback * p['edge_count'], W * m) * pcn.exp_upper(coarse * pcn.log_upper(Q(m))) + rank_upper = Q(p['rank_per_vertex']) + pcn.BAD * fallback * p['edge_count'] + gap = 1 - exact['moment_upper'] - added + return gap if gap > 0 and rank_upper < W * m else None + + +def largest(ok, lo, hi): + assert ok(lo) and not ok(hi) + while hi - lo > 1: + mid = (lo + hi) // 2 + lo, hi = (mid, hi) if ok(mid) else (lo, mid) + return lo + + +def price(row, atom=None, grid=GRID): + """atom None: the merged #144 atom exponent 1/1000. grid 10^10 is #144's own grid.""" + atom = pcn.ATOM if atom is None else atom + p = bit_profile(row) + assert Q(2 * p['m']**3, 2**80) < pcn.BAD + k = largest(lambda k: bit_gap(p, Q(k, grid)) is not None, 4 * grid // 10**4, 6 * grid // 10**4) + coarse = Q(k, grid) + ab = (1 - atom) * coarse + atom * pcn.OLD + assert ab < atom < 1 - ab, 'Subordinate adapter and row tolls' + assembly_bit = min(ab, (1 - pcn.PHASE_STOP) * pcn.AC - Q(1, 10**10)) + assert assembly_bit == ab, 'the bit side still binds' + crow = json.loads((ROOT / 'certificates' / 'paired-cube-complex-input.json').read_text()) + phase = pcn.complex_certificate(crow) + bridge = pcn.finite_bridge(phase, None, crow) + assert Q(json.loads((ROOT / 'certificates' / 'copied-centers-network.json').read_text())['bit']['saving']) == pcn.OLD + def accepts(kk): + try: pcn.assembly(assembly_bit, pcn.AC, bridge, Q(kk, grid), beta=pcn.PHASE_STOP) + except (AssertionError, ValueError): return False + return True + kap = largest(accepts, 0, int(pcn.AC * grid) + 1) + res = pcn.assembly(assembly_bit, pcn.AC, bridge, Q(kap, grid), beta=pcn.PHASE_STOP) + assert len(res['strict_constraints']) == 47 and len(res['margins']) == 7 + assert all(value > 0 for value in res['strict_constraints'].values()) + return dict(R=row['R'], W_per_vertex=p['W_per_vertex'], maxchild=p['maxchild'], atom=atom, + coarse=coarse, coarse_gap=bit_gap(p, coarse), coarse_next_rejected=Q(k + 1, grid), + stopped=ab, complex=pcn.AC, kappa=Q(kap, grid), kappa_next_rejected=Q(kap + 1, grid), + absorption_gap=res['absorption_gap']) + + +if __name__ == '__main__': + assert not sys.flags.optimize + row = json.loads(Path(sys.argv[1]).read_text()) + for atom in (None, Q(1, 2000)): + r = price(row, atom) + print('atom %s: R %d W %d coarse %s stopped %.12e kappa %s = %.10e' % ( + r['atom'], r['R'], r['W_per_vertex'], r['coarse'], float(r['stopped']), r['kappa'], float(r['kappa']))) diff --git a/research/bit-reuse-147/row.json b/research/bit-reuse-147/row.json new file mode 100644 index 0000000000..39ec6220bc --- /dev/null +++ b/research/bit-reuse-147/row.json @@ -0,0 +1,99 @@ +{ + "R": 23979, + "W_per_vertex": 27521, + "auxiliary_histogram": { + "1": 53031, + "10": 175, + "11": 338, + "12": 216, + "13": 501, + "14": 110, + "15": 628, + "16": 896, + "17": 1566, + "18": 635, + "19": 743, + "2": 64836, + "20": 2273, + "21": 262, + "3": 12632, + "4": 10831, + "5": 5848, + "6": 1619, + "7": 688, + "8": 1142, + "9": 497 + }, + "child_histogram": { + "1": 188241, + "10": 525, + "11": 1014, + "12": 648, + "13": 1536, + "14": 330, + "15": 1884, + "16": 3564, + "17": 5292, + "18": 3312, + "19": 9936, + "2": 200567, + "20": 6819, + "21": 789, + "22": 75, + "3": 38040, + "4": 33117, + "48": 72, + "5": 17577, + "51": 118, + "54": 806, + "57": 3651, + "6": 4857, + "60": 9, + "7": 2064, + "8": 3426, + "9": 1491 + }, + "copied_center_histogram": { + "22": 23 + }, + "deficit_per_vertex": 2024, + "eliminated_roles": 1549, + "h": 23, + "loss": 506, + "m": 69, + "omitted_roles": 2022, + "rank_per_vertex": 1896925, + "recycled_roles": 3338, + "selected_rank_histogram": { + "16": 72, + "17": 118, + "18": 806, + "19": 3651, + "20": 9 + }, + "selected_roles": 4656, + "source_data_histogram": { + "1": 5061, + "13": 11, + "16": 198, + "17": 22, + "19": 1540, + "3": 23, + "4": 208, + "5": 11 + }, + "source_manifest": "references/partial-gauge/pr97/SOURCE.json", + "source_manifest_sha256": "68fb539abcd6df21d142e4e204b6e9482eb7f9cd3907650f54bd058070266596", + "target_data_histogram": { + "1": 4655, + "16": 94, + "17": 176, + "18": 469, + "19": 1029, + "2": 839, + "21": 1, + "22": 2, + "3": 25 + }, + "v": 1771 +} diff --git a/research/bit-reuse-147/verify.py b/research/bit-reuse-147/verify.py new file mode 100644 index 0000000000..1408992788 --- /dev/null +++ b/research/bit-reuse-147/verify.py @@ -0,0 +1,123 @@ +#!/usr/bin/env python3 +"""Verify the recycled bit word from the pinned sources (Python stdlib only; a few minutes; do not use -O). + + 1. #144 control. On #144's own 10^-10 grid, the merged #144 row prices to its coarse saving 4617656/10^10, + stopped saving 4613422943/10^13 and kappa 4609169/10^10 exactly, with the next grid points rejected. + 2. Timetable control. With no elimination and no recycling, the delayed-read word of this package reproduces every + histogram of #144's reconstruct() row: delaying reads in the inherited order changes no charge. + 3. The frozen plan is legal, its timetable satisfies every ordering constraint, and the frame ledger runs: every + scalar gate finds its registers at one common frame key and no register ever retreats. The row rebuilt from the + actual ledger moves equals row.json. + 4. Every adjacent frame pair that is not an ordered pair of one inherited certified chain is nested exactly over Q + and both frames are nondegenerate. Control: a recipient given a donor whose frame is not inside sigma is + rejected by the same test. + 5. The literal scalar word on the physical registers. First on formal variables, over F2 and over Z with the + exact integer read coefficients: every register must end as its own variable and every target as its start + variable plus exactly its defining sum. This is complete and uses no random vectors. Then with random + scratch and data, where three tampered words must break the Z identity: a recycled read of the register's + entrance value, a recycled read taken before its donor's last write, and the inherited inverse order. + 6. #144's assembly on the new row: kappa and its next grid point, at the merged atom exponent 1/1000 and at 1/2000. +Usage: python3 research/bit-reuse-147/verify.py [--all] + --all also checks exact nesting of every distinct ledger move, including those the pinned audits already certify + (about seven more minutes). +""" +import json +import random +import sys +import time +from collections import Counter +from fractions import Fraction as Q +from pathlib import Path + +HERE = Path(__file__).resolve().parent +sys.path.insert(0, str(HERE)) +T0 = time.time() +def log(*a): print('[%5.0fs]' % (time.time() - T0), *a, flush=True) + +EXPECT = json.loads((HERE / 'expected.json').read_text()) + + +def clean(H): return {str(k): n for k, n in H.items() if n} + + +def main(): + assert not sys.flags.optimize, 'run without -O' + import word147 + import price147 + from frames147 import Exact + from paired_cube_bit import reconstruct + ROOT = word147.ROOT + + base = reconstruct() + r0 = price147.price(base, grid=10**10) + assert (r0['coarse'], r0['stopped'], r0['kappa']) == (Q(4617656, 10**10), Q(4613422943, 10**13), Q(4609169, 10**10)), r0 + log('PASS #144 control: coarse 4617656/10^10, stopped 4613422943/10^13, kappa 4609169/10^10 (next rejected)') + + dr, W, D, S, record, folder = word147.load_schedule() + outputs = {(c, tuple(T)): n for c, T, n in W['outputs']} + sel = json.loads((ROOT / record['selection_file']).read_text()) + plain = word147.Word(S, [], sel['retained_readout_order'], []) + led0 = plain.ledger(); row0 = plain.row(led0, record) + for key in ('auxiliary_histogram', 'source_data_histogram', 'target_data_histogram', 'selected_rank_histogram', + 'child_histogram'): + assert clean(row0[key]) == clean(base[key]), key + assert (row0['R'], row0['W_per_vertex'], row0['rank_per_vertex']) == (base['R'], base['W_per_vertex'], base['rank_per_vertex']) + assert plain.replay(2, random.Random(1), outputs) and plain.replay(0, random.Random(2), outputs) + log('PASS timetable control: #144 row reproduced with reads delayed to positions %d..%d of %d; replay holds' % ( + min(plain.p.values()), max(plain.p.values()), plain.N)) + + plan = json.loads((HERE / 'plan.json').read_text()) + assert set(plan['retained']) <= set(sel['retained_readout_order']), "level slots are among #144's selected gauges" + assert {b for b, _ in plan['pairs']} <= set(sel['retained_readout_order']) + word = word147.Word(S, plan['elim'], plan['retained'], plan['pairs']) + led = word.ledger(); row = word.row(led, record) + assert row == json.loads((HERE / 'row.json').read_text()), 'row differs' + occupants = Counter(led['phys'].values()) + log('PASS ledger: %d eliminated, %d recycled, %d physical roles (longest occupant chain %d); row equals row.json' % ( + len(plan['elim']), len(plan['pairs']), row['R'], max(occupants.values()))) + + exact = Exact(S, W, folder) + fresh = word.new_moves(led) + kinds = Counter((reg, a[0], b[0]) for reg, a, b in fresh) + for reg, a, b in fresh: + assert exact.inside(a, b), ('not nested', reg, a, b) + assert exact.nondegenerate(a) and exact.nondegenerate(b), ('degenerate', a, b) + handoffs = {(('n', 0), ('sigma', b)) for b in word.donor_of} + assert kinds['a', 'n', 'sigma'] + kinds['a', 'ret', 'sigma'] + kinds['a', 'c', 'sigma'] + kinds['a', 'v', 'sigma'] + \ + kinds['a', 'sigma', 'sigma'] + kinds['a', 'out', 'sigma'] <= len(handoffs) + assert all(reg == 'y' or b[0] == 'sigma' for reg, a, b in fresh), 'only hand-offs and target chains are new' + rng = random.Random(20261009); rejected = 0; tried = 0 + donors = sorted(word.recipient_of) + while tried < 200: + b = rng.choice(sorted(word.donor_of)); d = rng.choice(donors) + key = [k for k in S.chain_keys(d) if k[0] != 'F'][-1] + if S.dim(key) > S.f[b]: continue + tried += 1; rejected += not exact.inside(key, ('sigma', b)) + assert rejected > 0, 'the nesting test never rejects' + log('PASS exact nesting over Q of all %d new adjacent pairs %s; control rejected %d of %d mismatched hand-offs' % ( + len(fresh), dict(kinds), rejected, tried)) + if '--all' in sys.argv: # optional: every distinct move, inherited ones included + every = sorted(led['moves'], key=str) + for reg, a, b in every: assert exact.inside(a, b), ('not nested', reg, a, b) + log('PASS exact nesting over Q of all %d distinct ledger moves, inherited ones included' % len(every)) + + assert word.complete(2, outputs) and word.complete(0, outputs), 'scalar identity on formal variables' + log('PASS complete scalar identity on all %d formal variables, over F2 and over Z (no random vectors)' % (2 * S.v + row['R'])) + rng = random.Random(20261009) + okF = all(word.replay(2, rng, outputs) for _ in range(3)); okZ = all(word.replay(0, rng, outputs) for _ in range(2)) + assert okF and okZ, 'scalar identity' + for tamper in ('stale', 'early', 'vlast'): + assert not word.replay(0, rng, outputs, tamper), 'tamper accepted: ' + tamper + log('PASS literal replay on %d physical registers over Z and F2; stale read, premature read and inherited inverse ' + 'order all rejected' % row['R']) + + for atom, name in ((None, 'kappa'), (Q(1, 2000), 'kappa_atom_2000')): + r = price147.price(row, atom) + assert str(r['kappa']) == EXPECT[name] and str(r['coarse']) == EXPECT['coarse'], (name, str(r['kappa']), str(r['coarse'])) + log('PASS atom %s: kappa %s = %.10e (next %s rejected); coarse %s, stopped %.12e, R %d, W %d, largest child %d' % ( + r['atom'], r['kappa'], float(r['kappa']), r['kappa_next_rejected'], r['coarse'], float(r['stopped']), + r['R'], r['W_per_vertex'], r['maxchild'])) + + +if __name__ == '__main__': + main() diff --git a/research/bit-reuse-147/word147.py b/research/bit-reuse-147/word147.py new file mode 100644 index 0000000000..bbad02df6e --- /dev/null +++ b/research/bit-reuse-147/word147.py @@ -0,0 +1,438 @@ +"""The recycled bit word: #147's reduced PR97 word with dead auxiliary slots handed to later deferred births. + +Stdlib only. A plan is three lists over the slots of Swapnil Jain's round-seven PR97 word (h = 23): + + elim terminal output slots deleted exactly as in #147 (hpst3r; SovereignSteak's #122 operation); + retained first occupants that keep their entrance gauge sigma (as in #144); + pairs [recipient B, donor D]: the physical register of D, dead after its last touch at frame U_D, is moved to + sigma_B and becomes B. B's inherited deferred read then cancels the value D left behind (jamesyc's #124 + birth-read operation, here on the bit word). + +Level slots (retained or recipients) are read at their sigma frames, in the inherited readout order, but each read is +executed as late as the constraints below allow instead of in one block after phase one. Everything else keeps its +inherited place. This module derives the timetable, the literal event list, the scalar replay, the frame ledger and +the resulting row; verify.py drives it. +""" +import gzip +import importlib.util +import json +import sys +from collections import Counter, defaultdict +from pathlib import Path + +HERE = Path(__file__).resolve().parent +ROOT = HERE.parents[1] +sys.path.insert(0, str(ROOT / 'scripts')) +from partial_gauge_bit import frozen_sources # noqa: E402 + + +def load_schedule(): + record = json.loads((ROOT / 'certificates/paired-cube-bit-input.json').read_text()) + folder, _ = frozen_sources(record) + spec = importlib.util.spec_from_file_location('pr97_deferred_reuse', folder / 'deferred.py') + dr = importlib.util.module_from_spec(spec); spec.loader.exec_module(dr) + W = json.load(gzip.open(folder / 'witness_23.json.gz', 'rt')); D = json.load(gzip.open(folder / 'deferred_23.json.gz', 'rt')) + return dr, W, D, dr.Schedule(W, D), record, folder + + +class Word: + def __init__(self, S, elim, retained, pairs): + self.S = S; self.h = S.h; self.v = S.v; self.R = S.R + self.orig_sel = set(S.sel); self.readout = list(S.readout) + self.elim = set(elim); self.retained = set(retained) + self.donor_of = {b: d for b, d in pairs}; self.recipient_of = {d: b for b, d in pairs} + self.level = self.retained | set(self.donor_of) + ops = self.ops = S.ops + prev = {}; pred = defaultdict(list); last = {}; first = {} + for i, op in enumerate(ops): + for s in S.touch(op): + if s in prev: pred[i].append(prev[s]) + prev[s] = i; last[s] = i; first.setdefault(s, i) + anc = set(); stack = [last[s] for s in S.ret] + while stack: + i = stack.pop() + if i in anc: continue + anc.add(i); stack.extend(pred[i]) + assert not any(set(S.touch(ops[i])) & self.orig_sel for i in anc) + self.ph1 = [i for i in range(len(ops)) if i in anc and ops[i][0] != 'src'] + self.rest = [i for i in range(len(ops)) if i not in anc and ops[i][0] != 'src'] + self.pos = {i: k for k, i in enumerate(self.rest)}; self.N = len(self.rest) + self.first_pos = {s: (self.pos[first[s]] if first[s] in self.pos else -1) for s in first} + self.death = {s: (self.pos[last[s]] if last[s] in self.pos else -1) for s in last} + self.early_v = sorted(set(S.srcop) - self.orig_sel, key=lambda s: (S.srcop[s], len(S.vstart[s]), s)) + src = Counter() + for op in ops: + if op[0] == 'add': src[op[2]] += 1 + elif op[0] == 'fan': src[op[1]] += 1 + self.never_source = {s for s in range(S.R) if src[s] == 0} + self.adj = S.adjoint() + self.target_of = {u: S.tid[S.out[u][1]] for u in self.elim} + self.check_plan() + self.timetable() + + # ---------------------------------------------------------------------------------------- plan legality + def check_plan(self): + S = self.S + assert all(u in S.out and u in self.orig_sel and u in self.never_source for u in self.elim), 'eliminated slots' + assert self.retained <= self.orig_sel and set(self.donor_of) <= self.orig_sel, 'level slots are deferred slots' + assert not (self.retained & set(self.donor_of)), 'a recipient has no entrance gauge' + assert not (self.level & self.elim) and not (set(self.recipient_of) & self.elim) + assert len(self.recipient_of) == len(self.donor_of), 'one recipient per donor' + assert not (set(self.recipient_of) & set(S.out)), 'an output slot is read at the end and never dies' + assert not (set(self.recipient_of) & set(S.ret)), 'a retained centre is not used as a donor' + for b, d in self.donor_of.items(): assert b != d + + # ---------------------------------------------------------------------------------------- timetable + def timetable(self): + """Latest read position p[B] (the read runs just before rest operation p[B]) and V time tau[s] of every + deferred V slot, as the greatest solution of + p[B] <= first operation touching B; reads keep the inherited readout order; + a level V slot takes its V gate right after its read (tau = p); + tau[s] <= first operation touching s; V gates of one leaf keep the inherited chain order; + every read on a target precedes the first redirected write into that target. + """ + S, N = self.S, self.N + order = [b for b in self.readout if b in self.level] + p = {b: self.first_pos[b] for b in order} + late = [s for s in S.late_v] + tau = {s: self.first_pos[s] for s in late if s not in self.level} + def get(s): return p[s] if s in p else tau[s] + def cap(s, value): + if s in p: + if value < p[s]: p[s] = value; return True + elif value < tau[s]: tau[s] = value; return True + return False + chains = [] + late_set = set(late) + for n, us in S.xs: + ch = [s for s in us if s in late_set] + if len(ch) > 1: chains.append(ch) + first_write = {} # target -> eliminated slots writing into it + for u in self.elim: first_write.setdefault(self.target_of[u], []).append(u) + readers = defaultdict(list) + for b in order: + for t in self.adj[b]: + if t in first_write: readers[t].append(b) + changed = True + while changed: + changed = False + for a, b in zip(reversed(order[:-1]), reversed(order[1:])): + changed |= cap(a, p[b]) + for ch in chains: + for a, b in zip(reversed(ch[:-1]), reversed(ch[1:])): + changed |= cap(a, get(b)) + for t, us in first_write.items(): + w = min((tau[u] if u in tau else self.first_pos[u]) for u in us) + for b in readers[t]: changed |= cap(b, w) + assert all(0 <= x <= N for x in p.values()) and all(0 <= x <= N for x in tau.values()) + self.order = order; self.p = p; self.tau = tau + for b, d in self.donor_of.items(): + assert self.death[d] < p[b], ('donor still live at the recipient read', b, d) + + # ---------------------------------------------------------------------------------------- literal events + def events(self): + """Forward events of the middle section, in execution order: + ('read', B) | ('v', s) | ('vred', u) | ('op', i). Reads and V events with time k run before rest op k.""" + S = self.S + at = defaultdict(list) + rank = {b: i for i, b in enumerate(self.readout)} + lpos = {s: i for i, s in enumerate(S.late_v)} + for b in self.order: + at[self.p[b]].append((0, rank[b], 'read', b)) + if b in S.srcop: at[self.p[b]].append((1, lpos[b], 'v', b)) + for s, k in self.tau.items(): at[k].append((1, lpos[s], 'vred' if s in self.elim else 'v', s)) + out = [] + for k in range(self.N + 1): + out.extend((kind, s) for _, _, kind, s in sorted(at.get(k, ()))) + if k < self.N: out.append(('op', self.rest[k])) + return out + + def physical(self): + phys = {} + for s in range(self.R): + if s in self.elim: continue + r = s + while r in self.donor_of: r = self.donor_of[r] + phys[s] = r + return phys + + # ---------------------------------------------------------------------------------------- scalar replay + def replay(self, ring, rng, outputs, tamper=None): + """Literal scalar word on physical registers with arbitrary scratch and data. ring 0: exact integers with the + exact integer read coefficients; ring 2: the F2 word. Returns True iff every physical register is restored + and every target receives exactly its defining sum (over F2 also exactly x_T).""" + S = self.S; trip, v = S.trip, S.v; ops = self.ops; srcop = S.srcop; elim = self.elim + mod = (lambda z: z & 1) if ring == 2 else (lambda z: z) + phys = self.physical() + x = [rng.randrange(-10**6, 10**6) for _ in range(v)] + a0 = {r: rng.randrange(-10**6, 10**6) for r in set(phys.values())} + y0 = [rng.randrange(-10**6, 10**6) for _ in range(v)] + a = dict(a0); y = list(y0); done = []; count = [0] + def coefficient(c): return c & 1 if ring == 2 else c + def read(s): + value = a[phys[s]] + if tamper == 'stale' and s in self.donor_of and count[0] == 0: + count[0] = 1; value = a0[phys[s]] # reads the register's entrance value, not what D left + for t, c in self.adj[s].items(): y[t] -= coefficient(c) * value + def redirected(t, value): + y[t] += value + def vgate(s, sign=1): a[phys[s]] += sign * x[srcop[s] - 1] + def runop(i, sign=1): + op = ops[i] + if op[0] == 'add': + if op[1] in elim: + if sign == 1: redirected(self.target_of[op[1]], a[phys[op[2]]]) + return + a[phys[op[1]]] += sign * a[phys[op[2]]] + else: + for g in op[2]: + if g in elim: + if sign == 1: redirected(self.target_of[g], a[phys[op[1]]]) + continue + a[phys[g]] += sign * a[phys[op[1]]] + for s in range(self.R): + if s not in self.level and s not in elim: read(s) + for s in self.early_v: vgate(s); done.append(('v', s)) + for i in self.ph1: runop(i); done.append(('op', i)) + for s, c in S.ret.items(): + for t, T in enumerate(trip): + if c in T: y[t] += a[phys[s]] + events = self.events() + if tamper == 'early': # one recycled read executed before its donor's last write + written = {} + for j, (kind, s) in enumerate(events): + if kind == 'v': written[s] = j + elif kind == 'op': + op = ops[s] + for g in ([op[1]] if op[0] == 'add' else op[2]): written[g] = j + b = next(e[1] for e in events if e[0] == 'read' and self.donor_of.get(e[1]) in written) + j = written[self.donor_of[b]] + assert events.index(('read', b)) > j + events = [e for e in events if e != ('read', b)]; events.insert(j, ('read', b)) + for kind, s in events: + if kind == 'read': read(s) + elif kind == 'v': vgate(s); done.append(('v', s)) + elif kind == 'vred': redirected(self.target_of[s], x[srcop[s] - 1]) + else: runop(s); done.append(('op', s)) + for s, (c, T) in S.out.items(): + if s not in elim: y[S.tid[T]] += a[phys[s]] + if tamper == 'vlast': # the inherited inverse order: every V^-1 after L^-1 + done = [e for e in done if e[0] == 'v'] + [e for e in done if e[0] == 'op'] + for kind, s in reversed(done): + if kind == 'v': vgate(s, -1) + else: runop(s, -1) + if any(mod(a[r] - a0[r]) for r in a0): return False + want = [0] * v + for (c, T), n in outputs.items(): + A_, B_ = [q for q in T if q != c] + want[S.tid[T]] += sum(x[i] for i, Sx in enumerate(trip) if c in Sx and A_ not in Sx and B_ not in Sx) + for c in range(S.h): + tot = sum(x[i] for i, Sx in enumerate(trip) if c in Sx) + for t, T in enumerate(trip): + if c in T: want[t] += tot + if any(mod(y[t] - y0[t] - want[t]) for t in range(v)): return False + if ring == 2 and any(mod(y[t] - y0[t] - x[t]) for t in range(v)): return False + return True + + def complete(self, ring, outputs): + """The same literal word on formal variables: every data port, target and physical register starts as its + own variable. ring 2: bitmasks over the variables; ring 0: sparse integer linear forms. Deterministic and + complete: returns True iff every register ends as its own variable and every target ends as its start + variable plus exactly its defining sum (over F2: plus x_T). No random vectors are involved.""" + S = self.S; trip, v = S.trip, S.v; ops = self.ops; srcop = S.srcop; elim = self.elim + phys = self.physical(); regs = sorted(set(phys.values())) + index = {r: 2 * v + k for k, r in enumerate(regs)} + want = [dict() for _ in range(v)] + for (c, T), n in outputs.items(): + A_, B_ = [q for q in T if q != c] + row = want[S.tid[T]] + for i, Sx in enumerate(trip): + if c in Sx and A_ not in Sx and B_ not in Sx: row[i] = row.get(i, 0) + 1 + for c in range(S.h): + star = [i for i, Sx in enumerate(trip) if c in Sx] + for t, T in enumerate(trip): + if c in T: + for i in star: want[t][i] = want[t].get(i, 0) + 1 + if ring == 2: + a = {r: 1 << index[r] for r in regs}; y = [1 << (v + t) for t in range(v)]; x = [1 << i for i in range(v)] + def into_y(t, value, c): + if c & 1: y[t] ^= value + def into_a(r, value, sign): a[r] ^= value + else: + a = {r: {index[r]: 1} for r in regs}; y = [{v + t: 1} for t in range(v)]; x = [{i: 1} for i in range(v)] + def accumulate(dst, value, c): + for k, z in value.items(): + z = dst.get(k, 0) + c * z + if z: dst[k] = z + else: del dst[k] + def into_y(t, value, c): accumulate(y[t], value, c) + def into_a(r, value, sign): accumulate(a[r], value, sign) + done = [] + def read(s): + value = a[phys[s]] + for t, c in self.adj[s].items(): into_y(t, value, -c) + def vgate(s, sign=1): into_a(phys[s], x[srcop[s] - 1], sign) + def runop(i, sign=1): + op = ops[i] + if op[0] == 'add': + if op[1] in elim: + if sign == 1: into_y(self.target_of[op[1]], a[phys[op[2]]], 1) + return + into_a(phys[op[1]], a[phys[op[2]]], sign) + else: + for g in op[2]: + if g in elim: + if sign == 1: into_y(self.target_of[g], a[phys[op[1]]], 1) + continue + into_a(phys[g], a[phys[op[1]]], sign) + for s in range(self.R): + if s not in self.level and s not in elim: read(s) + for s in self.early_v: vgate(s); done.append(('v', s)) + for i in self.ph1: runop(i); done.append(('op', i)) + for s, c in S.ret.items(): + for t, T in enumerate(trip): + if c in T: into_y(t, a[phys[s]], 1) + for kind, s in self.events(): + if kind == 'read': read(s) + elif kind == 'v': vgate(s); done.append(('v', s)) + elif kind == 'vred': into_y(self.target_of[s], x[srcop[s] - 1], 1) + else: runop(s); done.append(('op', s)) + for s, (c, T) in S.out.items(): + if s not in elim: into_y(S.tid[T], a[phys[s]], 1) + for kind, s in reversed(done): + if kind == 'v': vgate(s, -1) + else: runop(s, -1) + if ring == 2: + if any(a[r] != 1 << index[r] for r in regs): return False + if any({i for i, c in want[t].items() if c & 1} != {t} for t in range(v)): return False + return all(y[t] == (1 << (v + t)) ^ (1 << t) for t in range(v)) + if any(a[r] != {index[r]: 1} for r in regs): return False + for t in range(v): + expected = dict(want[t]); expected[v + t] = 1 + if y[t] != expected: return False + return True + + # ---------------------------------------------------------------------------------------- frame ledger + def ledger(self): + """Run the forward word on frame keys. Every scalar gate must find its registers at one common frame key; + every register only moves forward. Returns the moves (register kind, old key, new key) in time order, the + key sequence of every register, and the rank histograms of the actual moves.""" + S = self.S; h, v = S.h, S.v; ops = self.ops; elim = self.elim; phys = self.physical() + def norm(k): return ('out', 0, tuple(k[2])) if k[0] == 'out' else k + dim = S.dim + cur = {}; seq = {} + for r in set(phys.values()): + cur['a', r] = ('sigma', r) if r in self.retained else ('0',) + for n, _ in S.xs: cur['x', n] = ('n', n) + for t in range(v): cur['y', t] = ('0',) + for reg, k in cur.items(): seq[reg] = [k] + hist = {'a': Counter(), 'x': Counter(), 'y': Counter()} + moves = Counter() + def move(reg, dst): + dst = norm(dst); old = cur[reg] + if old == dst: return + r = dim(dst) - dim(old) + assert r >= 0, ('retreat', reg, old, dst) + moves[reg[0], old, dst] += 1 + if r: hist[reg[0]][r] += 1 + cur[reg] = dst; seq[reg].append(dst) + def gate(regs, frame): + for reg in regs: move(reg, frame) + assert all(cur[reg] == norm(frame) for reg in regs) + A = lambda s: ('a', phys[s]) + leaf = S.srcop + def operation(i): + op = ops[i] + if op[0] == 'add': + _, p, o, n = op; frame = ('n', n) + gate([('y', self.target_of[p]) if p in elim else A(p), A(o)], frame) + else: + for g in sorted(op[2], key=lambda s: dim(S.start_key(s))): + frame = S.start_key(g) + gate([A(op[1]), ('y', self.target_of[g]) if g in elim else A(g)], frame) + for s in range(self.R): + if s not in self.level and s not in elim: + assert cur[A(s)] == ('0',) and s == phys[s], 'zero-prelude read of a first occupant at frame zero' + for s in self.early_v: gate([A(s), ('x', leaf[s])], ('v', s)) + for i in self.ph1: operation(i) + centres = 0 + for s, c in S.ret.items(): + move(A(s), ('ret', c)) + assert all(cur['y', t] == ('0',) for t, T in enumerate(S.trip) if c in T) + centres += 1 + for kind, s in self.events(): + if kind == 'read': + f = ('sigma', s) + if s in self.donor_of: move(A(s), f) + assert cur[A(s)] == f, ('read frame', s) + for t, c in self.adj[s].items(): + assert c > 0 + gate([('y', t)], f) + elif kind == 'v': gate([A(s), ('x', leaf[s])], ('v', s)) + elif kind == 'vred': gate([('x', leaf[s]), ('y', self.target_of[s])], ('v', s)) + else: operation(s) + for s, (c, T) in S.out.items(): + if s not in elim: gate([A(s), ('y', S.tid[T])], ('out', 0, T)) + for t, T in enumerate(S.trip): move(('y', t), ('out', 0, T)) + for r in set(phys.values()): move(('a', r), ('F',)) + for n, _ in S.xs: move(('x', n), ('F',)) + return dict(moves=moves, seq=seq, hist=hist, centres=centres, phys=phys) + + # ---------------------------------------------------------------------------------------- inherited nestings + def inherited(self): + """Adjacent frame pairs whose nesting the pinned PR97 audits already certify (check_lifted.py D and + check_frames.py X/Q, relied on by #144): consecutive keys of every original slot chain, of every X chain in + its original V order, and of every y chain in readout order with positive Z support; plus sigma <= start and + sigma <= t_T^perp. Chains are nested sequences, so any ordered pair taken from one chain is nested too.""" + S = self.S + def norm(k): return ('out', 0, tuple(k[2])) if k[0] == 'out' else k + keep = S.sel; S.sel = set(self.orig_sel) + chains = [] + for s in range(S.R): chains.append([norm(k) for k in S.chain_keys(s)]) + S.sel = keep + for n, us in S.xs: chains.append([('n', n)] + [('v', s) for s in us] + [('F',)]) + byt = defaultdict(list) + for s in self.readout: + for t, c in self.adj[s].items(): + if c > 0: byt[t].append(('sigma', s)) + for t, T in enumerate(S.trip): chains.append([('0',)] + byt[t] + [('out', 0, T), ('F',)]) + return chains + + def row(self, led, record): + """#144's shared-core bit row from the actual ledger moves.""" + S = self.S; h, v = S.h, S.v + aux, source, target = led['hist']['a'], led['hist']['x'], led['hist']['y'] + assert +source == Counter(r for path in S.xdata() for r in path if r), 'source chains unchanged' + assert sum(r * n for r, n in target.items()) == v * (h - 1) and led['centres'] == h + gauges = Counter(S.f[s] for s in self.retained) + children = Counter() + for local in (aux, source, target, Counter({h - 1: h})): + for r, n in local.items(): + if r and n: children[r] += 3 * n + for r, n in gauges.items(): children[3 * r] += n + children[2] += 2 * v + Rn = len(set(led['phys'].values())) + assert Rn == S.R - len(self.elim) - len(self.donor_of) + enc = lambda H: {str(r): n for r, n in sorted(H.items()) if n} + row = dict(record) + row.update(R=Rn, W_per_vertex=2 * v + Rn, selected_roles=sum(gauges.values()), selected_rank_histogram=enc(gauges), + auxiliary_histogram=enc(aux), source_data_histogram=enc(source), target_data_histogram=enc(target), + child_histogram=enc(children), rank_per_vertex=sum(r * n for r, n in children.items()), + eliminated_roles=len(self.elim), recycled_roles=len(self.donor_of), + omitted_roles=len(self.orig_sel) - len(self.elim) - len(self.level)) + row.pop('selection_file', None); row.pop('selection_sha256', None) + assert row['W_per_vertex'] * row['m'] - row['rank_per_vertex'] == row['deficit_per_vertex'] == 2024 + return row + + def new_moves(self, led): + """Distinct moves of the ledger that are not an ordered pair of one inherited certified chain.""" + where = defaultdict(dict) + for ci, chain in enumerate(self.inherited()): + for i, k in enumerate(chain): where[k].setdefault(ci, i) + def certified(a, b): + if a == ('0',) or b == ('F',): return True + wa, wb = where.get(a), where.get(b) + if not wa or not wb: return False + small, big = (wa, wb) if len(wa) <= len(wb) else (wb, wa) + return any(ci in big and wa[ci] <= wb[ci] for ci in small) + return sorted((m for m in led['moves'] if not certified(m[1], m[2])), key=str) diff --git a/research/gauge-recycling/README.md b/research/gauge-recycling/README.md new file mode 100644 index 0000000000..b1d50569bb --- /dev/null +++ b/research/gauge-recycling/README.md @@ -0,0 +1,105 @@ +# Gauge refinement through recycled bit registers + +Under the interfaces retained by #144 and #150, this composition gives +`T(n) = O(n (log n)^(1-kappa))`, with +**kappa = 472154791/10^12 = 0.000472154791**. +This is a conditional construction, not an unconditional multiplication theorem. + +The branch is stacked on #150 at +`40d4038760ebb6d6d3d702ce88fa3645de29f0c1`. The only additional files are +in this directory. No existing producer, certificate, or checker is modified. + +## Mechanism and proof + +Restore 187 omitted entrance gauges (165 of rank 16 and 22 of rank 17), +retaining #150's 1,549 terminal eliminations and all 3,338 handoffs. +The old read times remain unchanged and every donor still dies before its +recipient's read. Thus better entrance/target charges need not cost recycling +opportunities. This is not true for arbitrary added gauges: the timetable +and the new frame transitions must be checked. + +Each restored read belongs to an original first occupant and precedes its +first update. Subtracting that initial value at the delayed read instead of +in the zero prelude preserves dirty-state cancellation. A recycled recipient +still subtracts its donor's final value. Inverse updates run in exact reverse +order, including source injections. All initial auxiliary values are arbitrary. +The verifier checks this identity on all 27,521 formal inputs over Z and F2. + +The physical-register ledger checks common frames for gates and ordered +movement, and reconstructs the complete row. Its set of 4,878 non-inherited +frame transitions is exactly #150's, so #150's exact Q nesting and +nondegeneracy checks transport without an additional geometric assumption. +Inherited chains and the shared-core/interface arguments retain the same +dependencies as #150. Optional `--frames` checks every fresh pair directly. + +The histogram delta relative to #150 is: + +| Width | 1 | 2 | 3 | 4 | 16 | 17 | 18 | 19 | 20 | 48 | 51 | +|---|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:| +| Delta |339|597|405|45|693|-183|-489|-495|-87|165|22| + +Total rank is unchanged; there are 1,012 additional positive children. +Their rare-class costs are charged, not discarded. R=23,979, W=27,521, +deficit=2,024 and largest child=60. The coarse bit saving is +`c=472806533/10^12`. + +## Recurrence and assembly + +With the same volume-normalized stopped supplier as #144, atom exponent +theta, and ordinary leaf saving `d=384599/10^10`, the cost is + +``` +O(e^(1-theta) + e^((1-theta)(1-c)+theta*(1-d)) + + e^(theta*(1-d)) + e^theta log e). +``` + +At `theta=473/10^6`, `a=(1-theta)c+theta*d` equals +`472601087042591/10^18`; the required strict inequalities +`a < theta < 1-a` hold. All inherited coefficient preparation, precision, +addressing, copies, restoration, cleanup, phase-stop and uniformity contracts +are retained, not re-proved here. Pricing uses #150's unchanged exact #144 +assembly functions, checking 47 constraints and seven margins. + +| Row | theta | conditional kappa | +|---|---:|---:| +| #150 | .0005 | .000472026274 | +| Composition | .0005 | .000472143085 | +| #150 repriced | .000473 | .000472037976 | +| Composition | .000473 | **.000472154791** | + +The structural contribution at identical theta is .000000116815; the further +wrapper change contributes .000000011706 on the composed row. Bit supply +still limits the assembly. Failed next-grid upper-enclosure tests mean only +failure of that certificate, not a mathematical optimality result. + +## Reproduce + +Python stdlib only; do not use `-O`. From the repository root: + +```sh +python3 research/bit-reuse-147/verify.py +python3 research/gauge-recycling/verify.py +# Alternatively rebuild the composition's fresh geometry directly: +python3 research/gauge-recycling/verify.py --frames +``` + +The first command verifies the baseline geometry used by the default second +command. Saved plan and row are exact witnesses, not solver logs. No search +or external workspace is needed. The script validates the plan, rebuilds +the ledger/row, checks complete formal identities and three negative controls, +and independently reprices the two reported atom choices. No new Lean theorem +or whole-repository formal check is claimed. + +## Provenance and scope + +The refined gauge set was found in our Round19 search; concurrent #146 +(Th0rgal) supplies the public min-cut gauge refinement. No priority is claimed +for gauge optimization. Credits: DaysSky #150 for the late-read recycling +implementation and complete scalar checker; jamesyc #124 for birth-read reuse; +hpst3r #147 and SovereignSteak #122 for terminal elimination; icekylinx #144 +for the paired-cube/shared-core construction and assembly; gupt1156 #148 for +atom tightening; Swapnil Jain and Zhihao Chen for inherited word/frame tools; +an664 #128 for completed-core sharing. This contribution is compatible +composition, its exact accounting, and the timetable-neutral mechanism. +Prepared by SovereignSteak with AI assistance. No broad novelty or optimality +claim is made. diff --git a/research/gauge-recycling/plan.json b/research/gauge-recycling/plan.json new file mode 100644 index 0000000000..c786cb1f58 --- /dev/null +++ b/research/gauge-recycling/plan.json @@ -0,0 +1 @@ +{"elim": [12, 13, 26, 27, 40, 41, 54, 55, 68, 69, 82, 83, 96, 97, 110, 111, 124, 125, 138, 139, 282, 294, 306, 318, 330, 342, 354, 366, 378, 383, 507, 519, 531, 543, 555, 567, 579, 591, 596, 708, 720, 732, 744, 756, 768, 780, 785, 885, 897, 909, 921, 933, 945, 950, 1038, 1050, 1062, 1074, 1086, 1091, 1167, 1179, 1191, 1203, 1208, 1272, 1284, 1296, 1301, 1353, 1365, 1370, 1410, 1415, 1436, 1445, 1450, 1451, 1456, 1462, 1463, 1468, 1474, 1475, 1480, 1486, 1487, 1492, 1498, 1499, 1504, 1510, 1511, 1516, 1522, 1523, 1528, 1534, 1535, 1540, 1546, 1547, 1552, 1559, 1560, 1566, 1572, 1573, 1579, 1585, 1586, 1592, 1598, 1599, 1605, 1611, 1612, 1618, 1624, 1625, 1631, 1637, 1638, 1644, 1650, 1651, 1657, 1663, 1664, 1670, 1676, 1677, 1686, 1693, 1698, 1699, 1704, 1710, 1711, 1716, 1722, 1723, 1728, 1734, 1735, 1740, 1746, 1747, 1752, 1758, 1759, 1764, 1770, 1771, 1776, 1782, 1783, 1788, 1795, 1796, 1802, 1808, 1809, 1815, 1821, 1822, 1828, 1834, 1835, 1841, 1847, 1848, 1854, 1860, 1861, 1867, 1873, 1874, 1880, 1886, 1887, 1893, 1899, 1900, 1909, 1916, 1921, 1922, 1927, 1933, 1934, 1939, 1945, 1946, 1951, 1957, 1958, 1963, 1969, 1970, 1975, 1981, 1982, 1987, 1993, 1994, 1999, 2006, 2007, 2013, 2019, 2020, 2026, 2032, 2033, 2039, 2045, 2046, 2052, 2058, 2059, 2065, 2071, 2072, 2078, 2084, 2085, 2091, 2097, 2098, 2107, 2114, 2119, 2120, 2125, 2131, 2132, 2137, 2143, 2144, 2149, 2155, 2156, 2161, 2167, 2168, 2173, 2179, 2180, 2185, 2192, 2193, 2199, 2205, 2206, 2212, 2218, 2219, 2225, 2231, 2232, 2238, 2244, 2245, 2251, 2257, 2258, 2264, 2270, 2271, 2280, 2287, 2292, 2293, 2298, 2304, 2305, 2310, 2316, 2317, 2322, 2328, 2329, 2334, 2340, 2341, 2346, 2353, 2354, 2360, 2366, 2367, 2373, 2379, 2380, 2386, 2392, 2393, 2399, 2405, 2406, 2412, 2418, 2419, 2428, 2435, 2440, 2441, 2446, 2452, 2453, 2458, 2464, 2465, 2470, 2476, 2477, 2482, 2489, 2490, 2496, 2502, 2503, 2509, 2515, 2516, 2522, 2528, 2529, 2535, 2541, 2542, 2551, 2558, 2563, 2564, 2569, 2575, 2576, 2581, 2587, 2588, 2593, 2600, 2601, 2607, 2613, 2614, 2620, 2626, 2627, 2633, 2639, 2640, 2649, 2656, 2661, 2662, 2667, 2673, 2674, 2679, 2686, 2687, 2693, 2699, 2700, 2706, 2712, 2713, 2722, 2729, 2734, 2735, 2740, 2747, 2748, 2754, 2760, 2761, 2770, 2777, 2783, 2784, 2793, 2806, 2807, 2820, 2821, 2834, 2835, 2848, 2849, 2862, 2863, 2876, 2877, 2890, 2891, 2904, 2905, 2918, 2919, 3050, 3062, 3074, 3086, 3098, 3110, 3122, 3134, 3139, 3251, 3263, 3275, 3287, 3299, 3311, 3323, 3328, 3428, 3440, 3452, 3464, 3476, 3488, 3493, 3581, 3593, 3605, 3617, 3629, 3634, 3710, 3722, 3734, 3746, 3751, 3815, 3827, 3839, 3844, 3896, 3908, 3913, 3953, 3958, 3979, 3988, 3993, 3994, 3999, 4005, 4006, 4011, 4017, 4018, 4023, 4029, 4030, 4035, 4041, 4042, 4047, 4053, 4054, 4059, 4065, 4066, 4071, 4077, 4078, 4083, 4090, 4091, 4097, 4103, 4104, 4110, 4116, 4117, 4123, 4129, 4130, 4136, 4142, 4143, 4149, 4155, 4156, 4162, 4168, 4169, 4175, 4181, 4182, 4188, 4194, 4195, 4204, 4211, 4216, 4217, 4222, 4228, 4229, 4234, 4240, 4241, 4246, 4252, 4253, 4258, 4264, 4265, 4270, 4276, 4277, 4282, 4288, 4289, 4294, 4301, 4302, 4308, 4314, 4315, 4321, 4327, 4328, 4334, 4340, 4341, 4347, 4353, 4354, 4360, 4366, 4367, 4373, 4379, 4380, 4386, 4392, 4393, 4402, 4409, 4414, 4415, 4420, 4426, 4427, 4432, 4438, 4439, 4444, 4450, 4451, 4456, 4462, 4463, 4468, 4474, 4475, 4480, 4487, 4488, 4494, 4500, 4501, 4507, 4513, 4514, 4520, 4526, 4527, 4533, 4539, 4540, 4546, 4552, 4553, 4559, 4565, 4566, 4575, 4582, 4587, 4588, 4593, 4599, 4600, 4605, 4611, 4612, 4617, 4623, 4624, 4629, 4635, 4636, 4641, 4648, 4649, 4655, 4661, 4662, 4668, 4674, 4675, 4681, 4687, 4688, 4694, 4700, 4701, 4707, 4713, 4714, 4723, 4730, 4735, 4736, 4741, 4747, 4748, 4753, 4759, 4760, 4765, 4771, 4772, 4777, 4784, 4785, 4791, 4797, 4798, 4804, 4810, 4811, 4817, 4823, 4824, 4830, 4836, 4837, 4846, 4853, 4858, 4859, 4864, 4870, 4871, 4876, 4882, 4883, 4888, 4895, 4896, 4902, 4908, 4909, 4915, 4921, 4922, 4928, 4934, 4935, 4944, 4951, 4956, 4957, 4962, 4968, 4969, 4974, 4981, 4982, 4988, 4994, 4995, 5001, 5007, 5008, 5017, 5024, 5029, 5030, 5035, 5042, 5043, 5049, 5055, 5056, 5065, 5072, 5078, 5079, 5088, 5101, 5102, 5115, 5116, 5129, 5130, 5143, 5144, 5157, 5158, 5171, 5172, 5185, 5186, 5199, 5200, 5319, 5331, 5343, 5355, 5367, 5379, 5391, 5396, 5496, 5508, 5520, 5532, 5544, 5556, 5561, 5649, 5661, 5673, 5685, 5697, 5702, 5778, 5790, 5802, 5814, 5819, 5883, 5895, 5907, 5912, 5964, 5976, 5981, 6021, 6026, 6047, 6056, 6061, 6062, 6067, 6073, 6074, 6079, 6085, 6086, 6091, 6097, 6098, 6103, 6109, 6110, 6115, 6121, 6122, 6127, 6133, 6134, 6139, 6146, 6147, 6153, 6159, 6160, 6166, 6172, 6173, 6179, 6185, 6186, 6192, 6198, 6199, 6205, 6211, 6212, 6218, 6224, 6225, 6231, 6237, 6238, 6247, 6254, 6259, 6260, 6265, 6271, 6272, 6277, 6283, 6284, 6289, 6295, 6296, 6301, 6307, 6308, 6313, 6319, 6320, 6325, 6332, 6333, 6339, 6345, 6346, 6352, 6358, 6359, 6365, 6371, 6372, 6378, 6384, 6385, 6391, 6397, 6398, 6404, 6410, 6411, 6420, 6427, 6432, 6433, 6438, 6444, 6445, 6450, 6456, 6457, 6462, 6468, 6469, 6474, 6480, 6481, 6486, 6493, 6494, 6500, 6506, 6507, 6513, 6519, 6520, 6526, 6532, 6533, 6539, 6545, 6546, 6552, 6558, 6559, 6568, 6575, 6580, 6581, 6586, 6592, 6593, 6598, 6604, 6605, 6610, 6616, 6617, 6622, 6629, 6630, 6636, 6642, 6643, 6649, 6655, 6656, 6662, 6668, 6669, 6675, 6681, 6682, 6691, 6698, 6703, 6704, 6709, 6715, 6716, 6721, 6727, 6728, 6733, 6740, 6741, 6747, 6753, 6754, 6760, 6766, 6767, 6773, 6779, 6780, 6789, 6796, 6801, 6802, 6807, 6813, 6814, 6819, 6826, 6827, 6833, 6839, 6840, 6846, 6852, 6853, 6862, 6869, 6874, 6875, 6880, 6887, 6888, 6894, 6900, 6901, 6910, 6917, 6923, 6924, 6933, 6946, 6947, 6960, 6961, 6974, 6975, 6988, 6989, 7002, 7003, 7016, 7017, 7030, 7031, 7138, 7150, 7162, 7174, 7186, 7198, 7203, 7291, 7303, 7315, 7327, 7339, 7344, 7420, 7432, 7444, 7456, 7461, 7525, 7537, 7549, 7554, 7606, 7618, 7623, 7663, 7668, 7689, 7698, 7703, 7704, 7709, 7715, 7716, 7721, 7727, 7728, 7733, 7739, 7740, 7745, 7751, 7752, 7757, 7763, 7764, 7769, 7776, 7777, 7783, 7789, 7790, 7796, 7802, 7803, 7809, 7815, 7816, 7822, 7828, 7829, 7835, 7841, 7842, 7848, 7854, 7855, 7864, 7871, 7876, 7877, 7882, 7888, 7889, 7894, 7900, 7901, 7906, 7912, 7913, 7918, 7924, 7925, 7930, 7937, 7938, 7944, 7950, 7951, 7957, 7963, 7964, 7970, 7976, 7977, 7983, 7989, 7990, 7996, 8002, 8003, 8012, 8019, 8024, 8025, 8030, 8036, 8037, 8042, 8048, 8049, 8054, 8060, 8061, 8066, 8073, 8074, 8080, 8086, 8087, 8093, 8099, 8100, 8106, 8112, 8113, 8119, 8125, 8126, 8135, 8142, 8147, 8148, 8153, 8159, 8160, 8165, 8171, 8172, 8177, 8184, 8185, 8191, 8197, 8198, 8204, 8210, 8211, 8217, 8223, 8224, 8233, 8240, 8245, 8246, 8251, 8257, 8258, 8263, 8270, 8271, 8277, 8283, 8284, 8290, 8296, 8297, 8306, 8313, 8318, 8319, 8324, 8331, 8332, 8338, 8344, 8345, 8354, 8361, 8367, 8368, 8377, 8390, 8391, 8404, 8405, 8418, 8419, 8432, 8433, 8446, 8447, 8460, 8461, 8556, 8568, 8580, 8592, 8604, 8609, 8685, 8697, 8709, 8721, 8726, 8790, 8802, 8814, 8819, 8871, 8883, 8888, 8928, 8933, 8954, 8963, 8968, 8969, 8974, 8980, 8981, 8986, 8992, 8993, 8998, 9004, 9005, 9010, 9016, 9017, 9022, 9029, 9030, 9036, 9042, 9043, 9049, 9055, 9056, 9062, 9068, 9069, 9075, 9081, 9082, 9088, 9094, 9095, 9104, 9111, 9116, 9117, 9122, 9128, 9129, 9134, 9140, 9141, 9146, 9152, 9153, 9158, 9165, 9166, 9172, 9178, 9179, 9185, 9191, 9192, 9198, 9204, 9205, 9211, 9217, 9218, 9227, 9234, 9239, 9240, 9245, 9251, 9252, 9257, 9263, 9264, 9269, 9276, 9277, 9283, 9289, 9290, 9296, 9302, 9303, 9309, 9315, 9316, 9325, 9332, 9337, 9338, 9343, 9349, 9350, 9355, 9362, 9363, 9369, 9375, 9376, 9382, 9388, 9389, 9398, 9405, 9410, 9411, 9416, 9423, 9424, 9430, 9436, 9437, 9446, 9453, 9459, 9460, 9469, 9482, 9483, 9496, 9497, 9510, 9511, 9524, 9525, 9538, 9539, 9622, 9634, 9646, 9658, 9663, 9727, 9739, 9751, 9756, 9808, 9820, 9825, 9865, 9870, 9891, 9900, 9905, 9906, 9911, 9917, 9918, 9923, 9929, 9930, 9935, 9941, 9942, 9947, 9954, 9955, 9961, 9967, 9968, 9974, 9980, 9981, 9987, 9993, 9994, 10000, 10006, 10007, 10016, 10023, 10028, 10029, 10034, 10040, 10041, 10046, 10052, 10053, 10058, 10065, 10066, 10072, 10078, 10079, 10085, 10091, 10092, 10098, 10104, 10105, 10114, 10121, 10126, 10127, 10132, 10138, 10139, 10144, 10151, 10152, 10158, 10164, 10165, 10171, 10177, 10178, 10187, 10194, 10199, 10200, 10205, 10212, 10213, 10219, 10225, 10226, 10235, 10242, 10248, 10249, 10258, 10271, 10272, 10285, 10286, 10299, 10300, 10313, 10314, 10385, 10397, 10409, 10414, 10466, 10478, 10483, 10523, 10528, 10549, 10558, 10563, 10564, 10569, 10575, 10576, 10581, 10587, 10588, 10593, 10600, 10601, 10607, 10613, 10614, 10620, 10626, 10627, 10633, 10639, 10640, 10649, 10656, 10661, 10662, 10667, 10673, 10674, 10679, 10686, 10687, 10693, 10699, 10700, 10706, 10712, 10713, 10722, 10729, 10734, 10735, 10740, 10747, 10748, 10754, 10760, 10761, 10770, 10777, 10783, 10784, 10793, 10806, 10807, 10820, 10821, 10834, 10835, 10894, 10906, 10911, 10951, 10956, 10977, 10986, 10991, 10992, 10997, 11003, 11004, 11009, 11016, 11017, 11023, 11029, 11030, 11036, 11042, 11043, 11052, 11059, 11064, 11065, 11070, 11077, 11078, 11084, 11090, 11091, 11100, 11107, 11113, 11114, 11123, 11136, 11137, 11150, 11151, 11198, 11203, 11224, 11233, 11238, 11239, 11244, 11251, 11252, 11258, 11264, 11265, 11274, 11281, 11287, 11288, 11297, 11310, 11311, 11339, 11348, 11354, 11355, 11364, 28670, 28671, 28675, 28676, 28680, 28681, 28685, 28686, 28691], "pairs": [[5, 12862], [6, 12363], [19, 11919], [20, 5188], [33, 24242], [34, 7019], [47, 23772], [48, 8449], [61, 21873], [62, 9527], [75, 3936], [76, 10302], [89, 21871], [90, 10823], [103, 3969], [104, 11139], [117, 21191], [118, 11299], [131, 11331], [132, 11955], [154, 5947], [155, 22883], [159, 38], [160, 20188], [161, 11577], [165, 52], [166, 21536], [167, 11596], [171, 24], [172, 17533], [173, 11579], [177, 66], [178, 17537], [179, 11618], [183, 80], [184, 17535], [185, 11580], [189, 94], [190, 17547], [191, 11643], [195, 108], [196, 17527], [197, 11581], [201, 122], [202, 20212], [203, 11671], [207, 136], [208, 2021], [209, 11583], [213, 2797], [214, 147], [215, 11702], [219, 2811], [220, 17481], [221, 11585], [225, 2825], [226, 20178], [227, 11736], [231, 2839], [232, 2047], [233, 11587], [237, 2853], [238, 20175], [239, 11773], [243, 2867], [244, 20170], [245, 11590], [249, 2881], [250, 1690], [251, 11813], [255, 2895], [256, 2073], [257, 12348], [261, 2920], [262, 148], [263, 11957], [268, 4799], [269, 11591], [270, 5202], [274, 2909], [275, 2504], [276, 12374], [281, 2108], [287, 17493], [288, 11377], [293, 17499], [299, 17521], [300, 11381], [305, 17489], [311, 2220], [312, 11385], [317, 2650], [323, 17525], [324, 11389], [329, 2246], [335, 2381], [336, 11393], [341, 2259], [347, 2517], [348, 11397], [353, 2194], [359, 2233], [360, 11401], [365, 2207], [371, 17559], [372, 12102], [377, 2491], [384, 20214], [385, 4197], [391, 22283], [392, 11610], [396, 5127], [397, 17539], [398, 11598], [402, 5113], [403, 2756], [404, 11620], [408, 7041], [409, 20189], [410, 11599], [414, 2929], [415, 20167], [416, 11645], [421, 20209], [422, 11600], [427, 17497], [428, 11673], [433, 2688], [434, 11602], [439, 21530], [440, 11704], [445, 17483], [446, 11604], [451, 17487], [452, 11738], [457, 17491], [458, 11606], [463, 2766], [464, 11775], [469, 1442], [470, 11609], [475, 17519], [476, 11815], [481, 17523], [482, 12313], [487, 17545], [488, 11953], [493, 21600], [494, 13717], [495, 12077], [499, 5141], [500, 17503], [501, 5392], [505, 5155], [506, 17543], [512, 17551], [513, 5557], [518, 21528], [524, 2628], [525, 5698], [530, 20184], [536, 2008], [537, 5815], [542, 17531], [548, 2749], [549, 5908], [554, 2407], [560, 22311], [561, 5977], [566, 2086], [572, 2060], [573, 6022], [578, 2034], [584, 2498], [585, 12100], [590, 2602], [597, 21906], [598, 3138], [604, 23765], [605, 11632], [609, 3331], [610, 19704], [611, 11621], [615, 4205], [616, 1836], [617, 11646], [622, 20203], [623, 11622], [628, 20207], [629, 11674], [634, 20200], [635, 11624], [640, 20182], [641, 11705], [646, 17477], [647, 11626], [652, 20177], [653, 11739], [658, 50], [659, 11628], [664, 2443], [665, 11776], [670, 20169], [671, 11631], [676, 2111], [677, 11816], [682, 20194], [683, 12280], [688, 120], [689, 11952], [694, 21632], [695, 14482], [696, 12074], [700, 5399], [701, 17529], [702, 7199], [706, 6050], [707, 2771], [713, 1687], [714, 7340], [719, 17485], [725, 17517], [726, 7457], [731, 17495], [737, 1587], [738, 7550], [743, 17541], [749, 1875], [750, 7619], [755, 17501], [761, 134], [762, 7664], [767, 17549], [773, 1849], [774, 12098], [779, 1823], [786, 21541], [787, 3327], [793, 21203], [794, 11657], [798, 8416], [799, 20204], [800, 11647], [804, 8430], [805, 20174], [806, 11675], [811, 1665], [812, 11649], [817, 1639], [818, 11706], [823, 17479], [824, 11651], [829, 1613], [830, 11740], [835, 20197], [836, 11653], [841, 143], [842, 11777], [847, 1913], [848, 11656], [853, 2355], [854, 11817], [859, 2511], [860, 12249], [865, 1561], [866, 11949], [871, 21664], [872, 15157], [873, 12066], [877, 8444], [878, 2537], [879, 8605], [883, 8458], [884, 92], [890, 2566], [891, 8722], [896, 21538], [902, 19699], [903, 8815], [908, 21529], [914, 64], [915, 8884], [920, 78], [926, 2789], [927, 8929], [932, 106], [938, 19703], [939, 12096], [944, 19701], [951, 21534], [952, 3492], [958, 19605], [959, 11685], [963, 3637], [964, 22642], [965, 11677], [969, 4576], [970, 1810], [971, 11708], [976, 17469], [977, 11679], [982, 17473], [983, 11742], [988, 17471], [989, 11681], [994, 2547], [995, 11779], [1000, 2701], [1001, 11684], [1006, 2432], [1007, 11819], [1012, 2615], [1013, 12220], [1018, 2524], [1019, 11946], [1024, 21696], [1025, 15742], [1026, 12055], [1030, 5705], [1031, 17557], [1032, 9659], [1036, 6421], [1037, 1797], [1043, 2718], [1044, 9752], [1049, 2479], [1055, 2737], [1056, 9821], [1061, 2578], [1067, 2676], [1068, 9866], [1073, 2708], [1079, 2695], [1080, 12094], [1085, 2622], [1092, 19706], [1093, 3633], [1099, 23775], [1100, 11716], [1104, 10297], [1105, 17475], [1106, 11710], [1110, 10311], [1111, 2664], [1112, 11744], [1117, 2645], [1118, 11712], [1123, 2635], [1124, 11781], [1129, 2284], [1130, 11715], [1135, 2590], [1136, 11821], [1141, 2609], [1142, 12193], [1147, 22308], [1148, 11943], [1153, 21728], [1154, 16237], [1155, 12041], [1159, 10797], [1160, 22309], [1161, 10410], [1165, 10811], [1166, 8], [1172, 21531], [1173, 10479], [1178, 22], [1184, 19705], [1185, 10524], [1190, 17567], [1196, 17563], [1197, 22312], [1202, 17561], [1209, 21532], [1210, 3750], [1216, 19609], [1217, 11750], [1221, 3847], [1222, 19700], [1223, 11746], [1227, 4847], [1228, 1888], [1229, 11783], [1234, 2774], [1235, 11749], [1240, 2653], [1241, 11823], [1246, 2726], [1247, 12168], [1252, 2388], [1253, 11940], [1258, 21760], [1259, 16642], [1260, 12024], [1264, 5915], [1265, 2343], [1266, 10907], [1270, 6692], [1271, 2467], [1277, 2429], [1278, 10952], [1283, 2414], [1289, 2455], [1290, 22643], [1295, 36], [1302, 21533], [1303, 3843], [1309, 23784], [1310, 11787], [1314, 11148], [1315, 2555], [1316, 11786], [1320, 11301], [1321, 2424], [1322, 11826], [1326, 11321], [1327, 2331], [1328, 12145], [1333, 2401], [1334, 11936], [1339, 21792], [1340, 16957], [1341, 12004], [1345, 11312], [1346, 20192], [1347, 11199], [1352, 2375], [1358, 2362], [1359, 22965], [1364, 21247], [1371, 2530], [1372, 3912], [1378, 19613], [1379, 11827], [1383, 3961], [1384, 22641], [1385, 11959], [1389, 5018], [1390, 1862], [1391, 11933], [1396, 21824], [1397, 17182], [1398, 11981], [1402, 6029], [1403, 21542], [1404, 23837], [1408, 6863], [1409, 2319], [1416, 19708], [1417, 3957], [1423, 21204], [1424, 20112], [1429, 21856], [1430, 11870], [1431, 20118], [1437, 19702], [1438, 24451], [1444, 7403], [1457, 23806], [1469, 22916], [1481, 22622], [1493, 22289], [1505, 11396], [1517, 11400], [1529, 11404], [1541, 11408], [1553, 11411], [1558, 20310], [1565, 22619], [1578, 20144], [1591, 21224], [1604, 19675], [1617, 22284], [1630, 19671], [1643, 19673], [1656, 146], [1669, 642], [1684, 3185], [1685, 19672], [1692, 21200], [1697, 5169], [1703, 5183], [1705, 22918], [1717, 22624], [1729, 22291], [1741, 11430], [1753, 11434], [1765, 11438], [1777, 11442], [1789, 11445], [1794, 20406], [1800, 5197], [1801, 21526], [1807, 6937], [1814, 953], [1827, 17417], [1840, 17457], [1853, 17441], [1866, 17429], [1879, 17425], [1892, 17421], [1907, 5253], [1908, 19678], [1915, 21510], [1928, 22626], [1940, 22293], [1952, 11460], [1964, 11464], [1976, 11468], [1988, 11472], [2000, 11475], [2005, 20502], [2012, 19670], [2025, 21515], [2038, 22285], [2051, 19669], [2064, 21513], [2077, 20127], [2090, 22287], [2105, 13299], [2106, 21517], [2113, 20115], [2118, 9473], [2124, 9487], [2126, 22295], [2138, 11486], [2150, 11490], [2162, 11494], [2174, 11498], [2186, 11501], [2191, 20598], [2197, 9501], [2198, 17385], [2204, 9515], [2211, 17461], [2224, 17393], [2237, 17401], [2250, 216], [2263, 17445], [2278, 13325], [2279, 192], [2286, 22592], [2291, 7347], [2297, 7865], [2299, 11508], [2311, 11512], [2323, 11516], [2335, 11520], [2347, 11523], [2352, 20694], [2358, 8612], [2359, 22620], [2365, 8957], [2372, 20134], [2385, 21522], [2398, 145], [2411, 17397], [2426, 13347], [2427, 19676], [2434, 20111], [2439, 10825], [2445, 10836], [2447, 11530], [2459, 11534], [2471, 11538], [2483, 11541], [2488, 20790], [2495, 1373], [2508, 149], [2521, 20126], [2534, 17389], [2549, 13365], [2550, 21514], [2557, 20113], [2562, 7557], [2568, 8136], [2570, 11548], [2582, 11552], [2594, 11555], [2599, 20886], [2605, 8822], [2606, 19674], [2612, 9228], [2619, 20141], [2632, 21518], [2647, 5713], [2648, 21525], [2655, 11373], [2668, 11562], [2680, 11565], [2685, 20982], [2692, 20119], [2705, 21512], [2720, 5725], [2721, 21516], [2728, 5761], [2733, 7671], [2739, 8307], [2741, 11571], [2746, 21078], [2752, 8936], [2753, 21880], [2759, 9399], [2768, 5737], [2769, 21520], [2776, 7121], [2782, 21174], [2791, 5749], [2792, 20166], [2799, 12864], [2800, 19572], [2813, 24241], [2814, 14484], [2827, 19607], [2828, 15159], [2841, 21179], [2842, 15744], [2855, 19611], [2856, 16239], [2869, 21180], [2870, 16644], [2883, 19615], [2884, 16959], [2897, 2879], [2898, 17184], [2911, 17309], [2912, 12900], [2934, 13719], [2935, 12557], [2939, 6965], [2940, 17739], [2941, 6149], [2945, 6951], [2946, 20285], [2947, 12545], [2951, 1439], [2952, 17687], [2953, 6063], [2958, 4786], [2959, 12546], [2964, 4329], [2965, 6075], [2970, 2927], [2971, 12547], [2976, 4945], [2977, 6087], [2982, 4303], [2983, 12549], [2988, 17683], [2989, 6099], [2994, 4355], [2995, 12551], [3000, 22357], [3001, 6111], [3006, 4812], [3007, 12553], [3012, 9], [3013, 6123], [3018, 2928], [3019, 12556], [3024, 17725], [3025, 13258], [3030, 4502], [3031, 12898], [3036, 21568], [3037, 13701], [3038, 13022], [3042, 6979], [3043, 17689], [3044, 12560], [3048, 6993], [3049, 17693], [3055, 4702], [3056, 12379], [3061, 17691], [3067, 4738], [3068, 12383], [3073, 4541], [3079, 4515], [3080, 12387], [3085, 20305], [3091, 4489], [3092, 12391], [3097, 4403], [3103, 20271], [3104, 12395], [3109, 17697], [3115, 4381], [3116, 12399], [3121, 4923], [3127, 4904], [3128, 13045], [3133, 17745], [3140, 21956], [3141, 6240], [3147, 19570], [3148, 12579], [3152, 1910], [3153, 19762], [3154, 6156], [3159, 4131], [3160, 12568], [3165, 5066], [3166, 6169], [3171, 20278], [3172, 12569], [3177, 21570], [3178, 6182], [3183, 3982], [3184, 12571], [3189, 19757], [3190, 6195], [3195, 17695], [3196, 12573], [3201, 17685], [3202, 6208], [3207, 17741], [3208, 12575], [3213, 19759], [3214, 6221], [3219, 297], [3220, 12578], [3225, 17717], [3226, 13225], [3231, 4118], [3232, 12897], [3237, 22044], [3238, 14467], [3239, 13019], [3244, 21573], [3245, 12585], [3250, 17721], [3256, 17729], [3257, 12413], [3262, 17701], [3268, 4170], [3269, 12417], [3274, 4144], [3280, 17699], [3281, 12421], [3286, 17743], [3292, 17747], [3293, 12425], [3298, 17751], [3304, 17719], [3305, 12429], [3310, 17723], [3316, 4650], [3317, 13043], [3322, 4676], [3329, 21560], [3330, 5395], [3336, 19576], [3337, 12604], [3341, 9529], [3342, 4750], [3343, 6342], [3347, 9540], [3348, 20270], [3349, 12594], [3354, 20263], [3355, 6355], [3360, 17731], [3361, 12596], [3366, 17749], [3367, 6368], [3372, 17703], [3373, 12598], [3378, 4793], [3379, 6381], [3384, 2923], [3385, 12600], [3390, 369], [3391, 6394], [3396, 345], [3397, 12603], [3402, 321], [3403, 13194], [3408, 19761], [3409, 12894], [3414, 22082], [3415, 15143], [3416, 13011], [3421, 4897], [3422, 12613], [3427, 5044], [3433, 17727], [3434, 12443], [3439, 4983], [3445, 273], [3446, 12447], [3451, 21561], [3457, 4819], [3458, 12451], [3463, 4832], [3469, 4806], [3470, 12455], [3475, 4842], [3481, 4861], [3482, 13041], [3487, 4873], [3494, 21566], [3495, 5560], [3501, 19574], [3502, 12632], [3506, 2281], [3507, 22684], [3508, 6503], [3513, 4105], [3514, 12624], [3519, 21563], [3520, 6516], [3525, 325], [3526, 12626], [3531, 17757], [3532, 6529], [3537, 17761], [3538, 12628], [3543, 4774], [3544, 6542], [3549, 4885], [3550, 12631], [3555, 17759], [3556, 13165], [3561, 4762], [3562, 12891], [3567, 22116], [3568, 15729], [3569, 13000], [3574, 19764], [3575, 12644], [3580, 4917], [3586, 4959], [3587, 12469], [3592, 4971], [3598, 4930], [3599, 12473], [3604, 4940], [3610, 5003], [3611, 12477], [3616, 5013], [3622, 4990], [3623, 13039], [3628, 5061], [3635, 21562], [3636, 5701], [3642, 19580], [3643, 12663], [3648, 5032], [3649, 6639], [3654, 5051], [3655, 12657], [3660, 5084], [3661, 6652], [3666, 277], [3667, 12659], [3672, 289], [3673, 6665], [3678, 19763], [3679, 12662], [3684, 22354], [3685, 13138], [3690, 337], [3691, 12888], [3696, 22146], [3697, 16225], [3698, 12986], [3703, 301], [3704, 12678], [3709, 22355], [3715, 313], [3716, 12491], [3721, 4719], [3727, 4709], [3728, 12495], [3733, 4670], [3739, 4696], [3740, 22358], [3745, 4683], [3752, 21564], [3753, 5818], [3759, 19578], [3760, 12697], [3764, 2552], [3765, 19758], [3766, 6750], [3770, 9759], [3771, 4183], [3772, 12693], [3777, 20288], [3778, 6763], [3783, 4561], [3784, 12696], [3789, 361], [3790, 13113], [3795, 4724], [3796, 12885], [3801, 22172], [3802, 16631], [3803, 12969], [3807, 10017], [3808, 21565], [3809, 12715], [3813, 10417], [3814, 17767], [3820, 349], [3821, 12509], [3826, 373], [3832, 4614], [3833, 22685], [3838, 17763], [3845, 4825], [3846, 5911], [3852, 19584], [3853, 12734], [3858, 4657], [3859, 6836], [3864, 4638], [3865, 12733], [3870, 4626], [3871, 13090], [3876, 21574], [3877, 12881], [3882, 22194], [3883, 16947], [3884, 12949], [3889, 4602], [3890, 12755], [3895, 4590], [3901, 4571], [3902, 23063], [3907, 21291], [3914, 4554], [3915, 5980], [3921, 19582], [3922, 12774], [3926, 1418], [3927, 22683], [3928, 12904], [3932, 2723], [3933, 4157], [3934, 12878], [3939, 22212], [3940, 17173], [3941, 12926], [3945, 9873], [3946, 19760], [3947, 23895], [3951, 10188], [3952, 19766], [3959, 4528], [3960, 6025], [3966, 21181], [3967, 21171], [3972, 22226], [3973, 12817], [3974, 22229], [3980, 4092], [3981, 24871], [3987, 21878], [3992, 7007], [3998, 7021], [4000, 23016], [4012, 22666], [4024, 22337], [4036, 12394], [4048, 12398], [4060, 12402], [4072, 12406], [4084, 12409], [4089, 6644], [4095, 7032], [4096, 0], [4109, 20240], [4122, 11378], [4135, 19735], [4148, 20217], [4161, 19731], [4174, 20218], [4187, 2926], [4202, 5406], [4203, 19732], [4210, 8462], [4223, 22668], [4235, 22339], [4247, 12424], [4259, 12428], [4271, 12432], [4283, 12436], [4295, 12439], [4300, 8088], [4307, 11402], [4320, 21547], [4333, 22333], [4346, 19729], [4359, 21545], [4372, 20223], [4385, 22335], [4400, 7048], [4401, 21549], [4408, 19657], [4421, 22341], [4433, 12450], [4445, 12454], [4457, 12458], [4469, 12462], [4481, 12465], [4486, 9180], [4493, 17585], [4506, 17657], [4519, 17641], [4532, 17593], [4545, 11394], [4558, 17597], [4573, 8490], [4574, 11386], [4581, 19617], [4594, 12472], [4606, 12476], [4618, 12480], [4630, 12484], [4642, 12487], [4647, 9969], [4654, 22664], [4667, 20230], [4680, 21554], [4693, 2925], [4706, 21546], [4721, 7049], [4722, 19736], [4729, 19641], [4742, 12494], [4754, 12498], [4766, 12502], [4778, 12505], [4783, 9625], [4790, 3], [4803, 3916], [4816, 20222], [4829, 17589], [4844, 7061], [4845, 21548], [4852, 7589], [4857, 10552], [4865, 12512], [4877, 12516], [4889, 12519], [4894, 9718], [4901, 19734], [4914, 20237], [4927, 21550], [4942, 7073], [4943, 21557], [4950, 8668], [4963, 12526], [4975, 12529], [4980, 9681], [4987, 17621], [5000, 20215], [5015, 7085], [5016, 21544], [5023, 9605], [5028, 10531], [5034, 10723], [5036, 12535], [5041, 9693], [5047, 10959], [5048, 21932], [5054, 11053], [5063, 7097], [5064, 21552], [5071, 9791], [5077, 9705], [5086, 7109], [5087, 20262], [5094, 3236], [5095, 13874], [5108, 21206], [5109, 5090], [5122, 21193], [5123, 5104], [5136, 7646], [5137, 5118], [5150, 21216], [5151, 5132], [5164, 7679], [5165, 5146], [5178, 21221], [5179, 5160], [5192, 3971], [5193, 13755], [5215, 20110], [5216, 20479], [5221, 19816], [5222, 13425], [5227, 3077], [5228, 13450], [5233, 6911], [5234, 6261], [5239, 17923], [5240, 13426], [5245, 17895], [5246, 6094], [5251, 2804], [5252, 13428], [5257, 19811], [5258, 6106], [5263, 17943], [5264, 13430], [5269, 17885], [5270, 6118], [5275, 17893], [5276, 13432], [5281, 19813], [5282, 6309], [5287, 510], [5288, 13435], [5293, 17917], [5294, 14077], [5299, 3065], [5300, 6132], [5305, 21628], [5306, 13436], [5307, 1336], [5312, 21605], [5313, 13441], [5318, 20381], [5324, 20366], [5325, 6175], [5330, 6790], [5336, 6828], [5337, 6188], [5342, 17889], [5348, 17901], [5349, 6201], [5354, 3113], [5360, 17941], [5361, 6214], [5366, 6657], [5372, 17921], [5373, 13306], [5378, 6631], [5384, 17949], [5385, 13895], [5390, 3089], [5397, 21592], [5398, 7857], [5404, 23778], [5405, 13461], [5410, 20359], [5411, 6496], [5416, 17929], [5417, 13451], [5422, 6742], [5423, 6280], [5428, 5204], [5429, 13453], [5434, 6521], [5435, 6292], [5440, 6547], [5441, 13455], [5446, 17891], [5447, 6304], [5452, 17899], [5453, 13457], [5458, 6768], [5459, 6470], [5464, 17919], [5465, 13460], [5470, 17927], [5471, 14046], [5476, 17931], [5477, 6318], [5482, 9193], [5483, 3413], [5484, 13866], [5489, 17887], [5490, 6348], [5495, 17903], [5501, 20374], [5502, 6361], [5507, 21602], [5513, 17947], [5514, 6374], [5519, 17951], [5525, 21593], [5526, 6387], [5531, 6495], [5537, 582], [5538, 13332], [5543, 558], [5549, 534], [5550, 13893], [5555, 19815], [5562, 21598], [5563, 7202], [5569, 21509], [5570, 13489], [5575, 22722], [5576, 6441], [5581, 3053], [5582, 6577], [5587, 21595], [5588, 6453], [5593, 22397], [5594, 13483], [5599, 17957], [5600, 6465], [5605, 17897], [5606, 13485], [5611, 19817], [5612, 6606], [5617, 22396], [5618, 13488], [5623, 6360], [5624, 14017], [5629, 17925], [5630, 6479], [5635, 9982], [5636, 3566], [5637, 13855], [5642, 19818], [5643, 13500], [5648, 6386], [5654, 3041], [5655, 6522], [5660, 17961], [5666, 6174], [5667, 6535], [5672, 6226], [5678, 6200], [5679, 13354], [5684, 17959], [5690, 17963], [5691, 13891], [5696, 6148], [5703, 21594], [5704, 7343], [5710, 23781], [5711, 13520], [5716, 6889], [5717, 6589], [5722, 17967], [5723, 6700], [5728, 164], [5729, 6601], [5734, 5097], [5735, 13516], [5740, 5111], [5741, 6717], [5746, 5125], [5747, 13519], [5752, 5153], [5753, 13990], [5758, 5167], [5759, 6615], [5764, 9613], [5765, 3695], [5766, 13841], [5771, 5181], [5772, 6645], [5777, 5195], [5783, 6064], [5784, 6658], [5789, 6076], [5795, 6100], [5796, 13372], [5801, 6112], [5807, 6124], [5808, 22400], [5813, 6155], [5820, 21596], [5821, 7460], [5827, 21511], [5828, 13554], [5833, 19812], [5834, 6712], [5839, 3125], [5840, 6798], [5845, 6569], [5846, 6803], [5851, 20384], [5852, 13553], [5857, 21331], [5858, 13965], [5863, 21606], [5864, 6726], [5869, 9564], [5870, 3800], [5871, 13824], [5876, 21597], [5877, 13571], [5882, 17945], [5888, 6334], [5889, 13386], [5894, 6248], [5900, 5139], [5901, 22723], [5906, 6088], [5913, 6399], [5914, 7553], [5920, 23787], [5921, 13591], [5926, 6136], [5927, 8280], [5932, 6168], [5933, 13590], [5938, 6181], [5939, 13942], [5944, 6194], [5945, 6812], [5950, 9576], [5951, 3881], [5952, 13804], [5957, 6233], [5958, 13611], [5963, 6243], [5969, 6220], [5970, 23157], [5975, 6262], [5982, 6670], [5983, 7622], [5989, 22236], [5990, 13631], [5994, 11206], [5995, 22721], [5996, 13759], [6000, 11227], [6001, 3101], [6002, 6873], [6007, 9588], [6008, 3938], [6009, 13781], [6014, 19814], [6015, 23949], [6020, 19820], [6027, 6347], [6028, 7667], [6034, 21207], [6035, 21151], [6040, 9600], [6041, 13674], [6042, 21861], [6048, 6373], [6049, 25287], [6055, 868], [6068, 5220], [6080, 5232], [6092, 5244], [6104, 5256], [6116, 5268], [6128, 5280], [6140, 5292], [6145, 21624], [6152, 11436], [6165, 21579], [6178, 22377], [6191, 19785], [6204, 21577], [6217, 20319], [6230, 22379], [6245, 11450], [6246, 11420], [6253, 21867], [6266, 5409], [6278, 5421], [6290, 5433], [6302, 5445], [6314, 5457], [6326, 5469], [6331, 21656], [6338, 17785], [6351, 17857], [6364, 17841], [6377, 5736], [6390, 5583], [6403, 5712], [6418, 11476], [6419, 11428], [6426, 22593], [6439, 5574], [6451, 5586], [6463, 5598], [6475, 5610], [6487, 5622], [6492, 21688], [6499, 5841], [6512, 5984], [6525, 20326], [6538, 5206], [6551, 20318], [6566, 796], [6567, 21578], [6574, 20109], [6587, 5715], [6599, 5727], [6611, 5739], [6623, 5751], [6628, 21720], [6635, 21586], [6648, 17], [6661, 5210], [6674, 5430], [6689, 808], [6690, 21580], [6697, 21865], [6710, 5832], [6722, 5844], [6734, 5856], [6739, 21752], [6746, 5607], [6759, 20333], [6772, 12376], [6787, 820], [6788, 21576], [6795, 21183], [6808, 5925], [6820, 5937], [6825, 21784], [6832, 12384], [6845, 17789], [6860, 832], [6861, 21582], [6868, 22595], [6881, 5994], [6886, 21816], [6893, 21584], [6908, 844], [6909, 5229], [6916, 1150], [6922, 21848], [6931, 856], [6932, 20358], [6939, 5401], [6940, 21209], [6953, 19606], [6954, 21187], [6967, 19612], [6968, 21213], [6981, 19610], [6982, 21188], [6995, 19616], [6996, 21218], [7009, 6991], [7010, 19614], [7023, 6039], [7024, 14520], [7046, 19608], [7047, 14228], [7052, 20491], [7053, 7940], [7058, 8355], [7059, 14218], [7064, 20470], [7065, 7724], [7070, 21634], [7071, 14220], [7076, 18079], [7077, 7736], [7082, 19861], [7083, 14222], [7088, 21625], [7089, 7748], [7094, 8101], [7095, 14224], [7100, 5098], [7101, 7914], [7106, 19863], [7107, 14227], [7112, 19865], [7113, 14805], [7118, 3254], [7119, 7762], [7124, 21662], [7125, 5481], [7126, 14631], [7131, 2818], [7132, 7792], [7137, 8234], [7143, 20462], [7144, 7805], [7149, 8272], [7155, 18093], [7156, 7818], [7161, 18149], [7167, 18085], [7168, 7831], [7173, 18141], [7179, 18121], [7180, 14122], [7185, 7965], [7191, 3278], [7192, 14652], [7197, 8075], [7204, 21630], [7205, 9097], [7211, 6935], [7212, 14256], [7217, 22756], [7218, 7885], [7223, 3242], [7224, 8021], [7229, 21627], [7230, 7897], [7235, 18091], [7236, 14250], [7241, 18157], [7242, 7909], [7247, 18097], [7248, 14252], [7253, 19867], [7254, 8050], [7259, 18119], [7260, 14255], [7265, 7804], [7266, 14776], [7271, 18125], [7272, 7923], [7277, 21694], [7278, 5634], [7279, 14620], [7284, 19868], [7285, 14266], [7290, 20495], [7296, 7830], [7297, 7966], [7302, 18161], [7308, 3302], [7309, 7979], [7314, 18101], [7320, 18129], [7321, 14144], [7326, 2944], [7332, 5334], [7333, 14650], [7338, 5358], [7345, 21626], [7346, 8608], [7352, 6949], [7353, 14287], [7358, 5382], [7359, 8033], [7364, 7035], [7365, 8144], [7370, 18095], [7371, 8045], [7376, 18099], [7377, 14283], [7382, 8212], [7383, 8161], [7388, 18123], [7389, 14286], [7394, 18127], [7395, 14749], [7400, 18131], [7401, 8059], [7406, 9637], [7407, 5763], [7408, 14606], [7413, 18087], [7414, 8089], [7419, 18103], [7425, 18159], [7426, 8102], [7431, 22435], [7437, 771], [7438, 14162], [7443, 22434], [7449, 18163], [7450, 22438], [7455, 18117], [7462, 18089], [7463, 8725], [7469, 6963], [7470, 14321], [7475, 19862], [7476, 8156], [7481, 3314], [7482, 8242], [7487, 8013], [7488, 8247], [7493, 7991], [7494, 14320], [7499, 21367], [7500, 14724], [7505, 747], [7506, 8170], [7511, 9730], [7512, 5868], [7513, 14589], [7518, 21629], [7519, 14337], [7524, 18145], [7530, 7778], [7531, 14176], [7536, 7692], [7542, 20480], [7543, 22757], [7548, 18143], [7555, 7843], [7556, 8818], [7562, 6977], [7563, 14358], [7568, 18147], [7569, 9372], [7574, 18151], [7575, 14357], [7580, 18167], [7581, 14701], [7586, 21638], [7587, 8256], [7592, 9799], [7593, 5949], [7594, 14569], [7599, 723], [7600, 14377], [7605, 699], [7611, 5310], [7612, 23247], [7617, 7939], [7624, 8114], [7625, 8887], [7631, 6037], [7632, 14398], [7637, 22755], [7638, 14524], [7643, 3290], [7644, 8317], [7649, 9774], [7650, 6006], [7651, 14546], [7656, 19864], [7657, 23999], [7662, 19870], [7669, 7791], [7670, 8932], [7676, 21189], [7677, 21166], [7682, 9786], [7683, 14441], [7684, 21869], [7690, 7817], [7691, 25699], [7697, 19585], [7710, 7051], [7722, 7063], [7734, 7075], [7746, 7087], [7758, 7099], [7770, 7111], [7775, 21660], [7782, 17975], [7795, 21611], [7808, 20417], [7821, 19837], [7834, 20418], [7847, 20415], [7862, 11484], [7863, 11458], [7870, 10877], [7883, 7216], [7895, 7228], [7907, 7240], [7919, 7252], [7931, 7264], [7936, 21692], [7943, 7483], [7956, 7626], [7969, 20422], [7982, 7037], [7995, 20414], [8010, 11506], [8011, 21610], [8018, 19593], [8031, 7357], [8043, 7369], [8055, 7381], [8067, 7393], [8072, 21726], [8079, 21618], [8092, 31], [8105, 5092], [8118, 7072], [8133, 11524], [8134, 21612], [8141, 19601], [8154, 7474], [8166, 7486], [8178, 7498], [8183, 21758], [8190, 7249], [8203, 20429], [8216, 12414], [8231, 1102], [8232, 21608], [8239, 10315], [8252, 7567], [8264, 7579], [8269, 21790], [8276, 17989], [8289, 17993], [8304, 1114], [8305, 21614], [8312, 19597], [8325, 7636], [8330, 21822], [8337, 21616], [8352, 1126], [8353, 13291], [8360, 19645], [8366, 21854], [8375, 1138], [8376, 20454], [8383, 7276], [8384, 15295], [8397, 9848], [8398, 22282], [8411, 23768], [8412, 24244], [8425, 9881], [8426, 23790], [8439, 19653], [8440, 21201], [8453, 7681], [8454, 15195], [8476, 10449], [8477, 20667], [8482, 22786], [8483, 8977], [8488, 3157], [8489, 9113], [8494, 21659], [8495, 8989], [8500, 5499], [8501, 14927], [8506, 18285], [8507, 9001], [8512, 18297], [8513, 14929], [8518, 19913], [8519, 9142], [8524, 22468], [8525, 14932], [8530, 18317], [8531, 15442], [8536, 18325], [8537, 9015], [8542, 21658], [8543, 14933], [8544, 22884], [8549, 19914], [8550, 14942], [8555, 20591], [8561, 18301], [8562, 9058], [8567, 3467], [8573, 18357], [8574, 9071], [8579, 7177], [8585, 18329], [8586, 14847], [8591, 7153], [8597, 18361], [8598, 15316], [8603, 3443], [8610, 9364], [8611, 10009], [8617, 8379], [8618, 14964], [8623, 2956], [8624, 9125], [8629, 22469], [8630, 9236], [8635, 5547], [8636, 9137], [8641, 8465], [8642, 14960], [8647, 5523], [8648, 9253], [8653, 9304], [8654, 14963], [8659, 18323], [8660, 15415], [8665, 18327], [8666, 9151], [8671, 7411], [8672, 7405], [8673, 15281], [8678, 18287], [8679, 9181], [8684, 18295], [8690, 18299], [8691, 9194], [8696, 18303], [8702, 18331], [8703, 14865], [8708, 18359], [8714, 18363], [8715, 22472], [8720, 18367], [8727, 9326], [8728, 9662], [8734, 8393], [8735, 14998], [8740, 19908], [8741, 9248], [8746, 3479], [8747, 9334], [8752, 9105], [8753, 9339], [8758, 20576], [8759, 14997], [8764, 21399], [8765, 15390], [8770, 9057], [8771, 9262], [8776, 7362], [8777, 7510], [8778, 15264], [8783, 21661], [8784, 15013], [8789, 18293], [8795, 18341], [8796, 14879], [8801, 18345], [8807, 18349], [8808, 22787], [8813, 7141], [8820, 7189], [8821, 9755], [8827, 8407], [8828, 15035], [8833, 7129], [8834, 10161], [8839, 6944], [8840, 15034], [8845, 3419], [8846, 15367], [8851, 21670], [8852, 9348], [8857, 7374], [8858, 7591], [8859, 15244], [8864, 9083], [8865, 15053], [8870, 18343], [8876, 18347], [8877, 23333], [8882, 18351], [8889, 9206], [8890, 9824], [8896, 8421], [8897, 15075], [8902, 22785], [8903, 15199], [8908, 3455], [8909, 9409], [8914, 7165], [8915, 7648], [8916, 15221], [8921, 19910], [8922, 24045], [8927, 19916], [8934, 18321], [8935, 9869], [8941, 21210], [8942, 21147], [8947, 7398], [8948, 15118], [8949, 20106], [8955, 9167], [8956, 26107], [8962, 11152], [8975, 8481], [8987, 8493], [8999, 8505], [9011, 8517], [9023, 8529], [9028, 21690], [9035, 8748], [9048, 8891], [9061, 20518], [9074, 8467], [9087, 20510], [9102, 21674], [9103, 21642], [9110, 21190], [9123, 8622], [9135, 8634], [9147, 8646], [9159, 8658], [9164, 21722], [9171, 21650], [9184, 45], [9197, 5106], [9210, 12448], [9225, 21706], [9226, 21644], [9233, 21874], [9246, 8739], [9258, 8751], [9270, 8763], [9275, 21754], [9282, 8514], [9295, 20525], [9308, 12440], [9323, 21738], [9324, 21640], [9331, 11372], [9344, 8832], [9356, 8844], [9361, 21786], [9368, 14107], [9381, 18189], [9396, 21770], [9397, 21646], [9404, 21866], [9417, 8901], [9422, 21818], [9429, 21648], [9444, 21802], [9445, 13317], [9452, 21868], [9458, 21850], [9467, 21834], [9468, 20550], [9475, 8614], [9476, 19636], [9489, 19634], [9490, 24243], [9503, 19640], [9504, 19655], [9517, 9499], [9518, 19638], [9531, 8946], [9532, 15780], [9554, 10934], [9555, 15551], [9560, 18475], [9561, 9914], [9566, 21691], [9567, 10025], [9572, 22499], [9573, 9926], [9578, 18485], [9579, 15547], [9584, 8387], [9585, 10042], [9590, 19955], [9591, 15550], [9596, 22498], [9597, 15988], [9602, 18517], [9603, 9940], [9608, 7435], [9609, 8670], [9610, 15866], [9615, 3608], [9616, 9970], [9621, 18497], [9627, 18501], [9628, 9983], [9633, 7318], [9639, 18525], [9640, 15481], [9645, 18529], [9651, 3584], [9652, 22502], [9657, 7294], [9664, 10115], [9665, 10642], [9671, 9471], [9672, 15585], [9677, 19950], [9678, 10037], [9683, 3620], [9684, 10123], [9689, 9894], [9690, 10128], [9695, 20672], [9696, 15584], [9701, 21427], [9702, 15963], [9707, 21702], [9708, 10051], [9713, 7528], [9714, 8775], [9715, 15849], [9720, 21693], [9721, 15599], [9726, 18493], [9732, 18541], [9733, 15495], [9738, 18545], [9744, 18549], [9745, 22813], [9750, 7282], [9757, 7330], [9758, 10413], [9764, 9485], [9765, 15622], [9770, 7056], [9771, 10696], [9776, 6958], [9777, 15621], [9782, 18557], [9783, 15940], [9788, 18561], [9789, 10137], [9794, 7597], [9795, 8856], [9796, 15829], [9801, 3346], [9802, 15639], [9807, 2968], [9813, 5640], [9814, 23415], [9819, 9543], [9826, 9995], [9827, 10482], [9833, 8944], [9834, 15662], [9839, 22811], [9840, 15784], [9845, 3596], [9846, 10198], [9851, 7306], [9852, 8913], [9853, 15806], [9858, 19952], [9859, 24087], [9864, 19958], [9871, 18521], [9872, 10527], [9878, 21195], [9879, 21162], [9884, 7584], [9885, 15705], [9886, 20116], [9892, 9956], [9893, 26511], [9899, 140], [9912, 9559], [9924, 9571], [9936, 9583], [9948, 9595], [9953, 21724], [9960, 20635], [9973, 9828], [9986, 20641], [9999, 9545], [10014, 21708], [10015, 21676], [10022, 21182], [10035, 9676], [10047, 9688], [10059, 9700], [10064, 21756], [10071, 14848], [10084, 20621], [10097, 20606], [10112, 21740], [10113, 21672], [10120, 5201], [10133, 9769], [10145, 9781], [10150, 21788], [10157, 5120], [10170, 18389], [10185, 21772], [10186, 21678], [10193, 19589], [10206, 9838], [10211, 21820], [10218, 21680], [10233, 21804], [10234, 5407], [10241, 19625], [10247, 21852], [10256, 21836], [10257, 20646], [10264, 9712], [10265, 16344], [10278, 10967], [10279, 23794], [10292, 11214], [10293, 23792], [10306, 9883], [10307, 16275], [10329, 8854], [10330, 20114], [10335, 19988], [10336, 10572], [10341, 3737], [10342, 10658], [10347, 9480], [10348, 10663], [10353, 20768], [10354, 16081], [10359, 21451], [10360, 16443], [10365, 21734], [10366, 10586], [10371, 7540], [10372, 16082], [10373, 20853], [10378, 21725], [10379, 16095], [10384, 18685], [10390, 18741], [10391, 16024], [10396, 18757], [10402, 7221], [10403, 16365], [10408, 18745], [10415, 7447], [10416, 11045], [10422, 10260], [10423, 16119], [10428, 18749], [10429, 11026], [10434, 18761], [10435, 16118], [10440, 7068], [10441, 16420], [10446, 6972], [10447, 10672], [10452, 9649], [10453, 9793], [10454, 16324], [10459, 3358], [10460, 16135], [10465, 2980], [10471, 5579], [10472, 23493], [10477, 10318], [10484, 18693], [10485, 10910], [10491, 10274], [10492, 16159], [10497, 22833], [10498, 16279], [10503, 3713], [10504, 10733], [10509, 7014], [10510, 9850], [10511, 16301], [10516, 19990], [10517, 24125], [10522, 19996], [10529, 7423], [10530, 10955], [10536, 21214], [10537, 21141], [10542, 7028], [10543, 16202], [10544, 21853], [10550, 18721], [10551, 26911], [10557, 19629], [10570, 10334], [10582, 10346], [10594, 10358], [10599, 9742], [10606, 14866], [10619, 20717], [10632, 20702], [10647, 21736], [10648, 21704], [10655, 21864], [10668, 10427], [10680, 10439], [10685, 9811], [10692, 5134], [10705, 18589], [10720, 21768], [10721, 21710], [10728, 21870], [10741, 10496], [10746, 9856], [10753, 21712], [10768, 21800], [10769, 5419], [10776, 19621], [10782, 9843], [10791, 21832], [10792, 20742], [10799, 10419], [10800, 19656], [10813, 10795], [10814, 19654], [10827, 10541], [10828, 16680], [10850, 11329], [10851, 16526], [10856, 11104], [10857, 16525], [10862, 9494], [10863, 16565], [10868, 20864], [10869, 16807], [10874, 21471], [10875, 11002], [10880, 6986], [10881, 10451], [10882, 16729], [10887, 21766], [10888, 16541], [10893, 18941], [10899, 18957], [10900, 23567], [10905, 18945], [10912, 7080], [10913, 11267], [10919, 10539], [10920, 16566], [10925, 22851], [10926, 16684], [10931, 3806], [10932, 11063], [10937, 7104], [10938, 10508], [10939, 16706], [10944, 10983], [10945, 24159], [10950, 20024], [10957, 7516], [10958, 11202], [10964, 21199], [10965, 21159], [10970, 7116], [10971, 16609], [10972, 20030], [10978, 7233], [10979, 27307], [10985, 21175], [10998, 10855], [11010, 10867], [11015, 7609], [11022, 18839], [11035, 20813], [11050, 21774], [11051, 21742], [11058, 21197], [11071, 10924], [11076, 7654], [11083, 21744], [11098, 21806], [11099, 5431], [11106, 19649], [11112, 7641], [11121, 21838], [11122, 20838], [11129, 10847], [11130, 16883], [11143, 10969], [11144, 16995], [11166, 10916], [11167, 17021], [11172, 22865], [11173, 16999], [11178, 3769], [11179, 11237], [11184, 7479], [11185, 10936], [11186, 21037], [11191, 10803], [11192, 24189], [11197, 20054], [11204, 7000], [11205, 17269], [11211, 21219], [11212, 21133], [11217, 7092], [11218, 16926], [11219, 20060], [11225, 7245], [11226, 27699], [11232, 21196], [11245, 11171], [11250, 7491], [11257, 21776], [11272, 5455], [11273, 5443], [11280, 5479], [11286, 7503], [11295, 5467], [11296, 20934], [11303, 11216], [11304, 17220], [11326, 20080], [11327, 21156], [11332, 7257], [11333, 17153], [11334, 20086], [11340, 7386], [11341, 28087], [11347, 21222], [11353, 3028], [11362, 21126], [11363, 21030], [22981, 10], [23079, 386], [23169, 5099], [23259, 788], [23292, 8402], [23294, 8388], [23341, 9549], [23423, 1094], [23456, 10283], [23458, 10269], [23497, 10845], [23571, 1304], [23606, 11134], [23866, 3026], [23868, 3227], [23870, 3404], [23872, 3557], [23874, 3686], [23876, 3791], [23878, 3872], [23880, 3929], [23922, 5223], [23924, 5412], [23926, 5577], [23928, 5718], [23930, 5835], [23932, 5928], [23934, 5997], [23974, 7054], [23976, 7219], [23978, 7360], [23980, 7477], [23982, 7570], [23984, 7639], [24022, 8484], [24024, 8625], [24026, 8742], [24028, 8835], [24030, 8904], [24066, 9562], [24068, 9679], [24070, 9772], [24072, 9841], [24106, 10337], [24108, 10430], [24110, 10499], [24142, 10858], [24144, 10927], [24174, 11174], [24258, 20140], [24261, 22239], [24262, 429], [24263, 387], [24264, 22885], [24265, 23802], [24266, 600], [24267, 17372], [24268, 807], [24269, 789], [24270, 17370], [24271, 23801], [24272, 150], [24273, 20147], [24274, 22892], [24275, 405], [24276, 17405], [24277, 21521], [24278, 954], [24279, 17376], [24280, 17407], [24281, 1095], [24282, 17374], [24283, 20123], [24284, 168], [24285, 22895], [24286, 477], [24287, 1305], [24288, 17409], [24289, 21519], [24290, 20146], [24291, 17380], [24292, 17411], [24293, 20121], [24294, 17378], [24295, 20124], [24296, 1212], [24297, 22904], [24298, 489], [24299, 453], [24300, 17413], [24301, 20135], [24302, 1374], [24303, 17384], [24304, 17415], [24305, 1419], [24306, 17382], [24307, 264], [24308, 20122], [24315, 20150], [24316, 22898], [24317, 17375], [24318, 20137], [24319, 21223], [24320, 17371], [24321, 17408], [24322, 20153], [24323, 17369], [24324, 17406], [24325, 20131], [24326, 17373], [24327, 22901], [24328, 855], [24329, 20149], [24330, 20160], [24331, 21225], [24332, 17377], [24333, 17412], [24334, 20157], [24335, 17379], [24336, 17410], [24337, 20132], [24338, 20129], [24339, 22907], [24340, 867], [24341, 831], [24342, 20165], [24343, 21884], [24344, 17381], [24345, 17416], [24346, 20162], [24347, 17383], [24348, 17414], [24349, 690], [24350, 20130], [24357, 22238], [24358, 1137], [24359, 20156], [24360, 22888], [24361, 23804], [24362, 20152], [24363, 17436], [24364, 1323], [24365, 20155], [24366, 17434], [24367, 23803], [24368, 20159], [24369, 22910], [24370, 1149], [24371, 20161], [24372, 17453], [24373, 20145], [24374, 1113], [24375, 17440], [24376, 17455], [24377, 20136], [24378, 17438], [24379, 1020], [24380, 20164], [24387, 22914], [24388, 1335], [24389, 17439], [24390, 22912], [24391, 1392], [24392, 17435], [24393, 17456], [24394, 1425], [24395, 17433], [24396, 17454], [24397, 1254], [24398, 17437], [24441, 11915], [24442, 11917], [24443, 11900], [24444, 11901], [24445, 11903], [24446, 11905], [24447, 11907], [24448, 11909], [24449, 11911], [24450, 11913], [24478, 22241], [24479, 2394], [24481, 22935], [24482, 23832], [24484, 17472], [24485, 2368], [24487, 17470], [24488, 23831], [24490, 20195], [24491, 22942], [24493, 17505], [24494, 21537], [24496, 17476], [24497, 17507], [24499, 17474], [24500, 20171], [24502, 22945], [24503, 1652], [24505, 17509], [24506, 21535], [24508, 17480], [24509, 17511], [24511, 17478], [24512, 20172], [24514, 22954], [24515, 114], [24517, 17513], [24518, 20183], [24520, 17484], [24521, 17515], [24523, 17482], [24524, 128], [24525, 20196], [24528, 20173], [24532, 20198], [24533, 22948], [24535, 20185], [24536, 21246], [24538, 17508], [24539, 20201], [24541, 17506], [24542, 20179], [24544, 22951], [24545, 1626], [24547, 20208], [24548, 21248], [24550, 17512], [24551, 20205], [24553, 17510], [24554, 20180], [24556, 22957], [24557, 86], [24559, 20213], [24560, 21910], [24562, 17516], [24563, 20210], [24565, 17514], [24566, 100], [24567, 20199], [24570, 20181], [24574, 22240], [24575, 1600], [24577, 22938], [24578, 23834], [24580, 17536], [24581, 1574], [24583, 17534], [24584, 23833], [24586, 22960], [24587, 58], [24589, 17553], [24590, 20193], [24592, 17540], [24593, 17555], [24595, 17538], [24596, 72], [24597, 20202], [24600, 20187], [24604, 22964], [24605, 30], [24607, 22962], [24608, 16], [24610, 17556], [24611, 2], [24613, 17554], [24614, 44], [24615, 20206], [24618, 20191], [24621, 20211], [24624, 21909], [24680, 20236], [24689, 17572], [24690, 3350], [24691, 3332], [24692, 17570], [24693, 23861], [24694, 3143], [24701, 17576], [24702, 17607], [24703, 3638], [24704, 17574], [24705, 20219], [24706, 3497], [24713, 17580], [24714, 17611], [24715, 3848], [24716, 17578], [24717, 20220], [24718, 3755], [24725, 17584], [24726, 17615], [24727, 3962], [24728, 17582], [24729, 266], [24730, 3917], [24737, 20246], [24738, 22998], [24739, 17575], [24740, 20233], [24741, 21269], [24742, 17571], [24743, 17608], [24744, 20249], [24745, 17569], [24746, 17606], [24747, 20227], [24748, 17573], [24749, 23001], [24750, 3398], [24751, 20245], [24752, 20256], [24753, 21271], [24754, 17577], [24755, 17612], [24756, 20253], [24757, 17579], [24758, 17610], [24759, 20228], [24760, 20225], [24761, 23007], [24762, 3410], [24763, 3374], [24764, 20261], [24765, 21936], [24766, 17581], [24767, 17616], [24768, 20258], [24769, 17583], [24770, 17614], [24771, 3233], [24772, 20226], [24779, 22242], [24780, 3680], [24781, 20252], [24782, 22988], [24783, 23864], [24784, 20248], [24785, 17636], [24786, 3866], [24787, 20251], [24788, 17634], [24789, 23863], [24790, 20255], [24791, 23010], [24792, 3692], [24793, 20257], [24794, 17653], [24795, 20241], [24796, 3656], [24797, 17640], [24798, 17655], [24799, 20232], [24800, 17638], [24801, 3563], [24802, 20260], [24809, 23014], [24810, 3878], [24811, 17639], [24812, 23012], [24813, 3935], [24814, 17635], [24815, 17656], [24816, 3968], [24817, 17633], [24818, 17654], [24819, 3797], [24820, 17637], [24861, 12860], [24863, 12845], [24864, 12846], [24865, 12848], [24866, 12850], [24867, 12852], [24868, 12854], [24869, 12856], [24870, 12858], [24897, 4689], [24898, 22245], [24899, 5021], [24900, 23033], [24901, 23890], [24902, 4948], [24903, 4663], [24904, 17672], [24905, 4850], [24906, 17670], [24907, 23889], [24908, 5069], [24909, 20291], [24910, 23040], [24911, 4579], [24912, 17705], [24913, 21569], [24914, 4910], [24915, 17676], [24916, 17707], [24917, 4996], [24918, 17674], [24919, 20267], [24920, 4727], [24921, 23043], [24922, 357], [24923, 20290], [24924, 17709], [24925, 21567], [24926, 4406], [24927, 17680], [24928, 17711], [24929, 4208], [24930, 17678], [24931, 20268], [24932, 20265], [24933, 23052], [24934, 2894], [24935, 4368], [24939, 17684], [24940, 17715], [24941, 20266], [24945, 20292], [24948, 20269], [24951, 20294], [24952, 23046], [24953, 17675], [24954, 20281], [24955, 21290], [24956, 17671], [24957, 17708], [24958, 20297], [24959, 17669], [24960, 17706], [24961, 20275], [24962, 17673], [24963, 23049], [24964, 333], [24965, 20293], [24966, 20304], [24967, 21292], [24968, 17677], [24969, 17712], [24970, 20301], [24971, 17679], [24972, 17710], [24973, 20276], [24974, 20273], [24975, 23055], [24976, 2866], [24977, 4342], [24981, 17716], [24982, 20306], [24983, 20274], [24987, 20295], [24990, 20277], [24993, 22244], [24994, 309], [24995, 20300], [24996, 23036], [24997, 23892], [24998, 20296], [24999, 17736], [25000, 285], [25001, 20299], [25002, 17734], [25003, 23891], [25004, 20303], [25005, 23058], [25006, 2838], [25007, 4316], [25011, 17740], [25012, 17755], [25013, 20280], [25017, 20298], [25020, 20283], [25023, 23062], [25024, 2810], [25025, 17735], [25029, 17756], [25030, 152], [25031, 17733], [25035, 20302], [25038, 20287], [25041, 20307], [25098, 20332], [25155, 20342], [25156, 23094], [25157, 17775], [25158, 20329], [25159, 21311], [25160, 17771], [25161, 17808], [25162, 20345], [25163, 17769], [25164, 17806], [25165, 20323], [25166, 17773], [25167, 5466], [25168, 23097], [25169, 20341], [25170, 20352], [25171, 21313], [25172, 17777], [25173, 17812], [25174, 20349], [25175, 17779], [25176, 17810], [25177, 20324], [25178, 20321], [25179, 5478], [25180, 23103], [25181, 5442], [25182, 20357], [25183, 21984], [25184, 17781], [25185, 17816], [25186, 20354], [25187, 17783], [25188, 5301], [25189, 17814], [25190, 20322], [25197, 5748], [25198, 22246], [25199, 20348], [25200, 23084], [25201, 23920], [25202, 20344], [25203, 5934], [25204, 17836], [25205, 20347], [25206, 17834], [25207, 23919], [25208, 20351], [25209, 5760], [25210, 23106], [25211, 5724], [25212, 17853], [25213, 20337], [25214, 20356], [25215, 17840], [25216, 17855], [25217, 20353], [25218, 5631], [25219, 17838], [25220, 20328], [25227, 5946], [25228, 23110], [25229, 17839], [25230, 6003], [25231, 23108], [25232, 17835], [25233, 6036], [25234, 17856], [25235, 17833], [25236, 5865], [25237, 17854], [25238, 17837], [25277, 13715], [25280, 3035], [25281, 13703], [25282, 13705], [25283, 13707], [25284, 13709], [25285, 13711], [25286, 13713], [25313, 6534], [25314, 22249], [25315, 6866], [25316, 23127], [25317, 23944], [25318, 6793], [25319, 6508], [25320, 17872], [25321, 6695], [25322, 17870], [25323, 23943], [25324, 6914], [25325, 20387], [25326, 23134], [25327, 6424], [25328, 17905], [25329, 21601], [25330, 6755], [25331, 17876], [25332, 17907], [25333, 6841], [25334, 17874], [25335, 20363], [25336, 6572], [25337, 23137], [25338, 570], [25339, 6053], [25340, 17909], [25341, 21599], [25342, 20386], [25343, 17880], [25344, 17911], [25345, 20361], [25346, 17878], [25347, 20364], [25348, 6251], [25361, 20388], [25364, 20365], [25367, 20390], [25368, 23140], [25369, 17875], [25370, 20377], [25371, 21330], [25372, 17871], [25373, 17908], [25374, 20393], [25375, 17869], [25376, 17906], [25377, 20371], [25378, 17873], [25379, 23143], [25380, 546], [25381, 20389], [25382, 20400], [25383, 21332], [25384, 17877], [25385, 17912], [25386, 20397], [25387, 17879], [25388, 17910], [25389, 20372], [25390, 20369], [25403, 20391], [25406, 20373], [25409, 22248], [25410, 522], [25411, 20396], [25412, 23130], [25413, 23946], [25414, 20392], [25415, 17936], [25416, 498], [25417, 20395], [25418, 17934], [25419, 23945], [25420, 20399], [25433, 20394], [25436, 20379], [25451, 20398], [25454, 20383], [25512, 20428], [25575, 18008], [25576, 20441], [25577, 17969], [25578, 18006], [25579, 20419], [25580, 17973], [25587, 18012], [25588, 20445], [25589, 17979], [25590, 18010], [25591, 20420], [25592, 17977], [25599, 18016], [25600, 20450], [25601, 17983], [25602, 5303], [25603, 18014], [25604, 17981], [25611, 7390], [25612, 22250], [25613, 20444], [25614, 23176], [25615, 23972], [25616, 20440], [25617, 7576], [25618, 18036], [25619, 20443], [25620, 18034], [25621, 23971], [25622, 20447], [25623, 7402], [25624, 23198], [25625, 7366], [25626, 18053], [25627, 20433], [25628, 20452], [25629, 18040], [25630, 18055], [25631, 20449], [25632, 7273], [25633, 18038], [25634, 20424], [25641, 7588], [25642, 23202], [25643, 18039], [25644, 7645], [25645, 23200], [25646, 18035], [25647, 7678], [25648, 18056], [25649, 18033], [25650, 7507], [25651, 18054], [25652, 18037], [25689, 14480], [25693, 5304], [25694, 14470], [25695, 14472], [25696, 14474], [25697, 14476], [25698, 14478], [25725, 7978], [25726, 22253], [25727, 8310], [25728, 23217], [25729, 23994], [25730, 8237], [25731, 7952], [25732, 18072], [25733, 8139], [25734, 18070], [25735, 23993], [25736, 8358], [25737, 20483], [25738, 23224], [25739, 7868], [25740, 18105], [25741, 21633], [25742, 8199], [25743, 18076], [25744, 18107], [25745, 8285], [25746, 18074], [25747, 20459], [25748, 8016], [25749, 23227], [25750, 759], [25751, 20482], [25755, 18080], [25756, 18111], [25757, 20457], [25773, 20484], [25776, 20461], [25779, 20486], [25780, 23230], [25781, 18075], [25782, 20473], [25783, 21366], [25784, 18071], [25785, 18108], [25786, 20489], [25787, 18069], [25788, 18106], [25789, 20467], [25790, 18073], [25791, 23233], [25792, 735], [25793, 20485], [25797, 18112], [25798, 20493], [25799, 20465], [25815, 20487], [25818, 20469], [25821, 22252], [25822, 711], [25823, 20488], [25827, 18136], [25828, 401], [25829, 20492], [25845, 20490], [25848, 20475], [25863, 20494], [25922, 20524], [26021, 8655], [26022, 22254], [26023, 20540], [26024, 23264], [26025, 24020], [26026, 20536], [26027, 8841], [26028, 18236], [26029, 20539], [26030, 18234], [26031, 24019], [26032, 20543], [26033, 8667], [26034, 23286], [26035, 8631], [26036, 18253], [26037, 20529], [26038, 20548], [26039, 18240], [26040, 18255], [26041, 20545], [26042, 8538], [26043, 18238], [26044, 20520], [26051, 8853], [26052, 23290], [26053, 18239], [26054, 8910], [26055, 23288], [26056, 18235], [26057, 8943], [26058, 18256], [26059, 18233], [26060, 8772], [26061, 18254], [26062, 18237], [26097, 15155], [26102, 7123], [26103, 15147], [26104, 15149], [26105, 15151], [26106, 15153], [26133, 9070], [26134, 22257], [26135, 9402], [26136, 23303], [26137, 24040], [26138, 9329], [26139, 9044], [26140, 18272], [26141, 9231], [26142, 18270], [26143, 24039], [26144, 9450], [26145, 20579], [26146, 23310], [26147, 8960], [26148, 18305], [26149, 21665], [26150, 9291], [26151, 18276], [26152, 18307], [26153, 9377], [26154, 18274], [26155, 20555], [26156, 9108], [26181, 20580], [26184, 20557], [26187, 20582], [26188, 23316], [26189, 18275], [26190, 20569], [26191, 21398], [26192, 18271], [26193, 18308], [26194, 20585], [26195, 18269], [26196, 18306], [26197, 20563], [26198, 18273], [26223, 20583], [26226, 20565], [26253, 20586], [26256, 20571], [26328, 20620], [26433, 9778], [26434, 18436], [26435, 20636], [26436, 18434], [26437, 24063], [26438, 20639], [26445, 18440], [26446, 18455], [26447, 20616], [26448, 8540], [26449, 18438], [26450, 20644], [26457, 9790], [26458, 23374], [26459, 18439], [26460, 9847], [26461, 23372], [26462, 18435], [26463, 9880], [26464, 18456], [26465, 18433], [26466, 9709], [26467, 18454], [26468, 18437], [26501, 15740], [26507, 8541], [26508, 15734], [26509, 15736], [26510, 15738], [26537, 8583], [26538, 22261], [26539, 10191], [26540, 23385], [26541, 24082], [26542, 10118], [26543, 8559], [26544, 18472], [26545, 10020], [26546, 18470], [26547, 24081], [26548, 10239], [26549, 20675], [26550, 23392], [26551, 10080], [26555, 18476], [26556, 18507], [26557, 10166], [26585, 20676], [26588, 20653], [26591, 20678], [26592, 23398], [26593, 18471], [26597, 18508], [26598, 20681], [26599, 18469], [26627, 20679], [26630, 20661], [26657, 20682], [26730, 20716], [26859, 10448], [26860, 23454], [26861, 18639], [26862, 10505], [26863, 23452], [26864, 18635], [26865, 10538], [26866, 18656], [26867, 18633], [26868, 10367], [26869, 18654], [26870, 18637], [26901, 16235], [26908, 9607], [26909, 16231], [26910, 16233], [26937, 8700], [26938, 22265], [26939, 10726], [26940, 23463], [26941, 24120], [26942, 10653], [26943, 8676], [26944, 18672], [26945, 10555], [26946, 18670], [26947, 24119], [26948, 10774], [26985, 20772], [26988, 20749], [27027, 20775], [27030, 20757], [27128, 20812], [27263, 10966], [27264, 18856], [27265, 18833], [27266, 10369], [27267, 18854], [27268, 18837], [27297, 16640], [27305, 10370], [27306, 16638], [27333, 8793], [27334, 22269], [27335, 11056], [27339, 8627], [27340, 18872], [27341, 10268], [27381, 20868], [27384, 20845], [27423, 20871], [27522, 20908], [27689, 16955], [27698, 10879], [27773, 20964], [27776, 20941], [28077, 11183], [28161, 21060], [28667, 2907], [28669, 127], [28672, 3144], [28674, 2931], [28677, 7043], [28679, 7208], [28682, 9551], [28684, 9668], [28694, 3564], [28697, 15], [28700, 7274], [28703, 2795], [28706, 29], [28709, 43], [28712, 2809], [28715, 2823], [28718, 57], [28721, 71], [28724, 2837], [28727, 2851], [28730, 85], [28733, 99], [28736, 2865], [28739, 1426], [28741, 11323], [28743, 113], [28744, 17319], [28746, 2893], [28748, 3333], [28751, 3498], [28754, 5212], [28757, 5566], [28760, 3639], [28763, 3756], [28766, 5707], [28769, 5824], [28772, 3849], [28775, 3918], [28778, 5917], [28781, 5986], [28783, 5174], [28785, 3963], [28786, 6031], [28788, 7005], [28790, 7349], [28793, 7466], [28796, 8473], [28799, 8731], [28802, 7559], [28805, 7628], [28808, 8824], [28811, 8893], [28813, 7673], [28815, 8435], [28816, 8938], [28818, 9513], [28820, 9761], [28823, 9830], [28826, 10326], [28829, 10488], [28831, 9875], [28833, 10288], [28834, 10533], [28836, 10809], [28837, 10961], [28839, 11125], [28840, 11163], [28842, 11208]], "retained": [280, 286, 292, 298, 304, 310, 316, 322, 328, 334, 340, 346, 352, 358, 364, 370, 376, 420, 426, 432, 438, 444, 450, 456, 462, 468, 474, 480, 486, 511, 517, 523, 529, 535, 541, 547, 553, 559, 565, 571, 577, 583, 589, 621, 627, 633, 639, 645, 651, 657, 663, 669, 675, 681, 687, 712, 718, 724, 730, 736, 742, 748, 754, 760, 766, 772, 778, 810, 816, 822, 828, 834, 840, 846, 852, 858, 864, 889, 895, 901, 907, 913, 919, 925, 931, 937, 943, 975, 981, 987, 993, 999, 1005, 1011, 1017, 1042, 1048, 1054, 1060, 1066, 1072, 1078, 1084, 1116, 1122, 1128, 1134, 1140, 1146, 1171, 1177, 1183, 1189, 1195, 1201, 1233, 1239, 1245, 1251, 1276, 1282, 1288, 1294, 1332, 1351, 1357, 1363, 1449, 1455, 1461, 1467, 1473, 1479, 1485, 1491, 1497, 1503, 1509, 1515, 1521, 1527, 1533, 1539, 1545, 1551, 1564, 1571, 1577, 1584, 1590, 1597, 1603, 1610, 1616, 1623, 1629, 1636, 1642, 1649, 1655, 1662, 1668, 1675, 1709, 1715, 1721, 1727, 1733, 1739, 1745, 1751, 1757, 1763, 1769, 1775, 1781, 1787, 1813, 1820, 1826, 1833, 1839, 1846, 1852, 1859, 1865, 1872, 1878, 1885, 1891, 1898, 1920, 1926, 1932, 1938, 1944, 1950, 1956, 1962, 1968, 1974, 1980, 1986, 1992, 1998, 2011, 2018, 2024, 2031, 2037, 2044, 2050, 2057, 2063, 2070, 2076, 2083, 2089, 2096, 2130, 2136, 2142, 2148, 2154, 2160, 2166, 2172, 2178, 2184, 2210, 2217, 2223, 2230, 2236, 2243, 2249, 2256, 2262, 2269, 2303, 2309, 2315, 2321, 2327, 2333, 2339, 2345, 2371, 2378, 2384, 2391, 2397, 2404, 2410, 2417, 2451, 2457, 2463, 2469, 2475, 2481, 2494, 2501, 2507, 2514, 2520, 2527, 2533, 2540, 2574, 2580, 2586, 2592, 2618, 2625, 2631, 2638, 2660, 2666, 2672, 2678, 2691, 2698, 2704, 2711, 2957, 2963, 2969, 2975, 2981, 2987, 2993, 2999, 3005, 3011, 3017, 3023, 3029, 3054, 3060, 3066, 3072, 3078, 3084, 3090, 3096, 3102, 3108, 3114, 3120, 3126, 3132, 3158, 3164, 3170, 3176, 3182, 3188, 3194, 3200, 3206, 3212, 3218, 3224, 3230, 3243, 3249, 3255, 3261, 3267, 3273, 3279, 3285, 3291, 3297, 3303, 3309, 3315, 3321, 3353, 3359, 3365, 3371, 3377, 3383, 3389, 3395, 3401, 3407, 3420, 3426, 3432, 3438, 3444, 3450, 3456, 3462, 3468, 3474, 3480, 3486, 3512, 3518, 3524, 3530, 3536, 3542, 3548, 3554, 3560, 3573, 3579, 3585, 3591, 3597, 3603, 3609, 3615, 3621, 3627, 3647, 3653, 3659, 3665, 3671, 3677, 3683, 3689, 3702, 3708, 3714, 3720, 3726, 3732, 3738, 3744, 3776, 3782, 3788, 3794, 3819, 3825, 3831, 3837, 3857, 3863, 3869, 3875, 3888, 3894, 3900, 3906, 4004, 4010, 4016, 4022, 4028, 4034, 4040, 4046, 4052, 4058, 4064, 4070, 4076, 4082, 4102, 4108, 4115, 4121, 4128, 4134, 4141, 4147, 4154, 4160, 4167, 4173, 4180, 4186, 4193, 4215, 4221, 4227, 4233, 4239, 4245, 4251, 4257, 4263, 4269, 4275, 4281, 4287, 4293, 4306, 4313, 4319, 4326, 4332, 4339, 4345, 4352, 4358, 4365, 4371, 4378, 4384, 4391, 4413, 4419, 4425, 4431, 4437, 4443, 4449, 4455, 4461, 4467, 4473, 4479, 4492, 4499, 4505, 4512, 4518, 4525, 4531, 4538, 4544, 4551, 4557, 4564, 4586, 4592, 4598, 4604, 4610, 4616, 4622, 4628, 4634, 4640, 4653, 4660, 4666, 4673, 4679, 4686, 4692, 4699, 4705, 4712, 4734, 4740, 4746, 4752, 4758, 4764, 4770, 4776, 4789, 4796, 4802, 4809, 4815, 4822, 4828, 4835, 4863, 4869, 4875, 4881, 4887, 4900, 4907, 4913, 4920, 4926, 4933, 4955, 4961, 4967, 4973, 4986, 4993, 4999, 5006, 5220, 5226, 5232, 5238, 5244, 5250, 5256, 5262, 5268, 5274, 5280, 5286, 5292, 5298, 5311, 5317, 5323, 5329, 5335, 5341, 5347, 5353, 5359, 5365, 5371, 5377, 5383, 5389, 5409, 5415, 5421, 5427, 5433, 5439, 5445, 5451, 5457, 5463, 5469, 5475, 5488, 5494, 5500, 5506, 5512, 5518, 5524, 5530, 5536, 5542, 5548, 5554, 5574, 5580, 5586, 5592, 5598, 5604, 5610, 5616, 5622, 5628, 5641, 5647, 5653, 5659, 5665, 5671, 5677, 5683, 5689, 5695, 5715, 5721, 5727, 5733, 5739, 5745, 5751, 5757, 5770, 5776, 5782, 5788, 5794, 5800, 5806, 5812, 5832, 5838, 5844, 5850, 5856, 5862, 5875, 5881, 5887, 5893, 5899, 5905, 5925, 5931, 5937, 5943, 5956, 5962, 5968, 5974, 6013, 6019, 6060, 6066, 6072, 6078, 6084, 6090, 6096, 6102, 6108, 6114, 6120, 6126, 6132, 6138, 6151, 6158, 6164, 6171, 6177, 6184, 6190, 6197, 6203, 6210, 6216, 6223, 6229, 6236, 6258, 6264, 6270, 6276, 6282, 6288, 6294, 6300, 6306, 6312, 6318, 6324, 6337, 6344, 6350, 6357, 6363, 6370, 6376, 6383, 6389, 6396, 6402, 6409, 6431, 6437, 6443, 6449, 6455, 6461, 6467, 6473, 6479, 6485, 6498, 6505, 6511, 6518, 6524, 6531, 6537, 6544, 6550, 6557, 6579, 6585, 6591, 6597, 6603, 6609, 6615, 6621, 6634, 6641, 6647, 6654, 6660, 6667, 6673, 6680, 6702, 6708, 6714, 6720, 6726, 6732, 6745, 6752, 6758, 6765, 6771, 6778, 6800, 6806, 6812, 6818, 6831, 6838, 6844, 6851, 6873, 6879, 6892, 6899, 7051, 7057, 7063, 7069, 7075, 7081, 7087, 7093, 7099, 7105, 7111, 7117, 7130, 7136, 7142, 7148, 7154, 7160, 7166, 7172, 7178, 7184, 7190, 7196, 7216, 7222, 7228, 7234, 7240, 7246, 7252, 7258, 7264, 7270, 7283, 7289, 7295, 7301, 7307, 7313, 7319, 7325, 7331, 7337, 7357, 7363, 7369, 7375, 7381, 7387, 7393, 7399, 7412, 7418, 7424, 7430, 7436, 7442, 7448, 7454, 7474, 7480, 7486, 7492, 7498, 7504, 7517, 7523, 7529, 7535, 7541, 7547, 7567, 7573, 7579, 7585, 7598, 7604, 7610, 7616, 7636, 7642, 7655, 7661, 7702, 7708, 7714, 7720, 7726, 7732, 7738, 7744, 7750, 7756, 7762, 7768, 7781, 7788, 7794, 7801, 7807, 7814, 7820, 7827, 7833, 7840, 7846, 7853, 7875, 7881, 7887, 7893, 7899, 7905, 7911, 7917, 7923, 7929, 7942, 7949, 7955, 7962, 7968, 7975, 7981, 7988, 7994, 8001, 8023, 8029, 8035, 8041, 8047, 8053, 8059, 8065, 8078, 8085, 8091, 8098, 8104, 8111, 8117, 8124, 8146, 8152, 8158, 8164, 8170, 8176, 8189, 8196, 8202, 8209, 8215, 8222, 8244, 8250, 8256, 8262, 8275, 8282, 8288, 8295, 8317, 8323, 8336, 8343, 8481, 8487, 8493, 8499, 8505, 8511, 8517, 8523, 8529, 8535, 8548, 8554, 8560, 8566, 8572, 8578, 8584, 8590, 8596, 8602, 8622, 8628, 8634, 8640, 8646, 8652, 8658, 8664, 8677, 8683, 8689, 8695, 8701, 8707, 8713, 8719, 8739, 8745, 8751, 8757, 8763, 8769, 8782, 8788, 8794, 8800, 8806, 8812, 8832, 8838, 8844, 8850, 8863, 8869, 8875, 8881, 8901, 8907, 8920, 8926, 8967, 8973, 8979, 8985, 8991, 8997, 9003, 9009, 9015, 9021, 9034, 9041, 9047, 9054, 9060, 9067, 9073, 9080, 9086, 9093, 9115, 9121, 9127, 9133, 9139, 9145, 9151, 9157, 9170, 9177, 9183, 9190, 9196, 9203, 9209, 9216, 9238, 9244, 9250, 9256, 9262, 9268, 9281, 9288, 9294, 9301, 9307, 9314, 9336, 9342, 9348, 9354, 9367, 9374, 9380, 9387, 9409, 9415, 9428, 9435, 9559, 9565, 9571, 9577, 9583, 9589, 9595, 9601, 9614, 9620, 9626, 9632, 9638, 9644, 9650, 9656, 9676, 9682, 9688, 9694, 9700, 9706, 9719, 9725, 9731, 9737, 9743, 9749, 9769, 9775, 9781, 9787, 9800, 9806, 9812, 9818, 9838, 9844, 9857, 9863, 9904, 9910, 9916, 9922, 9928, 9934, 9940, 9946, 9959, 9966, 9972, 9979, 9985, 9992, 9998, 10005, 10027, 10033, 10039, 10045, 10051, 10057, 10070, 10077, 10083, 10090, 10096, 10103, 10125, 10131, 10137, 10143, 10156, 10163, 10169, 10176, 10198, 10204, 10217, 10224, 10334, 10340, 10346, 10352, 10358, 10364, 10377, 10383, 10389, 10395, 10401, 10407, 10427, 10433, 10439, 10445, 10458, 10464, 10470, 10476, 10496, 10502, 10515, 10521, 10562, 10568, 10574, 10580, 10586, 10592, 10605, 10612, 10618, 10625, 10631, 10638, 10660, 10666, 10672, 10678, 10691, 10698, 10704, 10711, 10733, 10739, 10752, 10759, 10855, 10861, 10867, 10873, 10886, 10892, 10898, 10904, 10924, 10930, 10943, 10949, 10990, 10996, 11002, 11008, 11021, 11028, 11034, 11041, 11063, 11069, 11082, 11089, 11171, 11177, 11190, 11196, 11237, 11243, 11256, 11263, 22918, 22922, 22924, 22926, 22928, 22930, 22932, 22934, 22967, 22969, 22971, 22973, 22975, 22977, 22979, 23016, 23020, 23022, 23024, 23026, 23028, 23030, 23032, 23065, 23067, 23069, 23071, 23073, 23075, 23077, 23159, 23161, 23163, 23165, 23167, 23206, 23208, 23210, 23212, 23216, 23249, 23251, 23253, 23255, 23257, 23296, 23298, 23302, 23335, 23337, 23339, 23378, 23380, 23384, 23417, 23419, 23421, 23462, 23495, 23536, 23569, 23797, 23806, 23808, 23810, 23812, 23814, 23816, 23818, 23820, 23821, 23822, 23823, 23824, 23835, 23836, 23837, 23838, 23839, 23840, 23841, 23842, 23843, 23844, 23845, 23846, 23847, 23848, 23849, 23850, 23851, 23852, 23853, 23854, 23857, 23879, 23882, 23893, 23894, 23895, 23896, 23897, 23898, 23899, 23900, 23901, 23902, 23903, 23904, 23905, 23906, 23907, 23908, 23909, 23910, 23913, 23914, 23933, 23935, 23936, 23942, 23947, 23949, 23951, 23953, 23955, 23957, 23959, 23961, 23966, 23983, 23985, 23986, 23992, 23997, 23999, 24001, 24003, 24005, 24007, 24009, 24010, 24014, 24015, 24029, 24031, 24032, 24037, 24038, 24043, 24045, 24047, 24049, 24051, 24053, 24059, 24071, 24073, 24074, 24079, 24085, 24087, 24089, 24091, 24093, 24094, 24099, 24100, 24109, 24111, 24112, 24116, 24117, 24123, 24125, 24127, 24129, 24136, 24143, 24145, 24146, 24150, 24157, 24159, 24161, 24162, 24168, 24173, 24175, 24176, 24179, 24180, 24187, 24189, 24201, 24202, 24205, 24213, 24214, 24227, 24245, 24246, 24247, 24249, 24250, 24252, 24253, 24255, 24256, 24257, 24259, 24309, 24310, 24311, 24312, 24313, 24314, 24351, 24352, 24353, 24354, 24355, 24356, 24381, 24382, 24383, 24384, 24385, 24386, 24399, 24400, 24401, 24402, 24403, 24404, 24405, 24406, 24407, 24408, 24409, 24410, 24411, 24412, 24413, 24414, 24415, 24416, 24418, 24420, 24421, 24422, 24424, 24426, 24427, 24428, 24430, 24432, 24433, 24434, 24435, 24436, 24437, 24438, 24439, 24440, 24451, 24452, 24453, 24454, 24455, 24456, 24457, 24458, 24459, 24460, 24461, 24462, 24463, 24465, 24466, 24468, 24469, 24471, 24472, 24474, 24475, 24477, 24480, 24483, 24486, 24489, 24492, 24495, 24498, 24501, 24504, 24507, 24510, 24513, 24516, 24519, 24522, 24526, 24527, 24529, 24530, 24531, 24534, 24537, 24540, 24543, 24546, 24549, 24552, 24555, 24558, 24561, 24564, 24568, 24569, 24571, 24572, 24573, 24576, 24579, 24582, 24585, 24588, 24591, 24594, 24598, 24599, 24601, 24602, 24603, 24606, 24609, 24612, 24616, 24617, 24619, 24620, 24622, 24623, 24625, 24626, 24627, 24628, 24629, 24630, 24631, 24632, 24634, 24636, 24637, 24638, 24640, 24642, 24643, 24644, 24646, 24648, 24649, 24650, 24651, 24652, 24653, 24654, 24655, 24656, 24657, 24658, 24659, 24660, 24661, 24662, 24663, 24664, 24665, 24666, 24667, 24668, 24669, 24671, 24672, 24674, 24675, 24677, 24678, 24679, 24681, 24683, 24684, 24685, 24686, 24687, 24688, 24695, 24696, 24697, 24698, 24699, 24700, 24707, 24708, 24709, 24710, 24711, 24712, 24719, 24720, 24721, 24722, 24723, 24724, 24731, 24732, 24733, 24734, 24735, 24736, 24773, 24774, 24775, 24776, 24777, 24778, 24803, 24804, 24805, 24806, 24807, 24808, 24821, 24822, 24823, 24824, 24825, 24826, 24827, 24828, 24829, 24830, 24831, 24832, 24833, 24834, 24835, 24836, 24838, 24840, 24841, 24842, 24844, 24846, 24847, 24848, 24850, 24852, 24853, 24854, 24855, 24856, 24857, 24858, 24859, 24860, 24862, 24871, 24872, 24873, 24874, 24875, 24876, 24877, 24878, 24879, 24880, 24881, 24882, 24885, 24888, 24891, 24894, 24895, 24936, 24937, 24938, 24942, 24943, 24944, 24946, 24947, 24949, 24950, 24978, 24979, 24980, 24984, 24985, 24986, 24988, 24989, 24991, 24992, 25008, 25009, 25010, 25014, 25015, 25016, 25018, 25019, 25021, 25022, 25026, 25027, 25028, 25032, 25033, 25034, 25036, 25037, 25039, 25040, 25042, 25043, 25044, 25045, 25046, 25047, 25048, 25049, 25050, 25051, 25052, 25054, 25056, 25057, 25058, 25060, 25062, 25063, 25064, 25066, 25068, 25069, 25070, 25071, 25072, 25073, 25074, 25075, 25076, 25077, 25078, 25079, 25080, 25081, 25082, 25083, 25084, 25085, 25086, 25087, 25088, 25089, 25090, 25092, 25093, 25095, 25096, 25097, 25099, 25101, 25102, 25103, 25104, 25105, 25106, 25107, 25108, 25109, 25110, 25111, 25112, 25113, 25114, 25115, 25116, 25117, 25118, 25119, 25120, 25121, 25122, 25123, 25124, 25125, 25126, 25127, 25128, 25129, 25130, 25131, 25132, 25133, 25134, 25135, 25136, 25137, 25138, 25139, 25140, 25141, 25142, 25143, 25144, 25145, 25146, 25147, 25148, 25149, 25150, 25151, 25152, 25153, 25154, 25191, 25192, 25193, 25194, 25195, 25196, 25221, 25222, 25223, 25224, 25225, 25226, 25239, 25240, 25241, 25242, 25243, 25244, 25245, 25246, 25247, 25248, 25249, 25250, 25251, 25252, 25253, 25254, 25255, 25256, 25257, 25258, 25260, 25262, 25263, 25264, 25266, 25268, 25269, 25270, 25271, 25272, 25273, 25274, 25275, 25276, 25278, 25279, 25287, 25288, 25289, 25290, 25291, 25292, 25293, 25294, 25295, 25296, 25297, 25298, 25301, 25304, 25306, 25307, 25308, 25309, 25310, 25311, 25349, 25350, 25351, 25352, 25353, 25354, 25355, 25356, 25357, 25358, 25359, 25360, 25362, 25363, 25365, 25366, 25391, 25392, 25393, 25394, 25395, 25396, 25397, 25398, 25399, 25400, 25401, 25402, 25404, 25405, 25407, 25408, 25421, 25422, 25423, 25424, 25425, 25426, 25427, 25428, 25429, 25430, 25431, 25432, 25434, 25435, 25437, 25438, 25439, 25440, 25441, 25442, 25443, 25444, 25445, 25446, 25447, 25448, 25449, 25450, 25452, 25453, 25455, 25456, 25457, 25458, 25459, 25460, 25461, 25462, 25463, 25464, 25465, 25466, 25467, 25468, 25470, 25472, 25473, 25474, 25476, 25478, 25479, 25480, 25481, 25482, 25483, 25484, 25485, 25486, 25487, 25488, 25489, 25490, 25491, 25492, 25493, 25494, 25495, 25496, 25497, 25498, 25499, 25500, 25501, 25502, 25503, 25504, 25506, 25507, 25509, 25510, 25511, 25513, 25515, 25516, 25517, 25518, 25519, 25520, 25521, 25522, 25523, 25524, 25525, 25526, 25527, 25528, 25529, 25530, 25531, 25532, 25533, 25534, 25535, 25536, 25537, 25538, 25539, 25540, 25541, 25542, 25543, 25544, 25545, 25546, 25547, 25548, 25549, 25550, 25551, 25552, 25553, 25554, 25555, 25556, 25557, 25558, 25559, 25560, 25561, 25562, 25563, 25564, 25565, 25566, 25567, 25568, 25569, 25570, 25571, 25572, 25573, 25574, 25581, 25582, 25583, 25584, 25585, 25586, 25593, 25594, 25595, 25596, 25597, 25598, 25605, 25606, 25607, 25608, 25609, 25610, 25635, 25636, 25637, 25638, 25639, 25640, 25653, 25654, 25655, 25656, 25657, 25658, 25659, 25660, 25661, 25662, 25663, 25664, 25665, 25666, 25667, 25668, 25669, 25670, 25672, 25674, 25675, 25676, 25678, 25680, 25681, 25682, 25683, 25684, 25685, 25686, 25687, 25688, 25690, 25691, 25692, 25699, 25700, 25701, 25702, 25703, 25704, 25705, 25706, 25707, 25708, 25709, 25710, 25713, 25716, 25718, 25719, 25720, 25722, 25752, 25753, 25754, 25758, 25759, 25760, 25761, 25762, 25763, 25764, 25765, 25766, 25767, 25768, 25769, 25770, 25771, 25772, 25774, 25775, 25777, 25778, 25794, 25795, 25796, 25800, 25801, 25802, 25803, 25804, 25805, 25806, 25807, 25808, 25809, 25810, 25811, 25812, 25813, 25814, 25816, 25817, 25819, 25820, 25824, 25825, 25826, 25830, 25831, 25832, 25833, 25834, 25835, 25836, 25837, 25838, 25839, 25840, 25841, 25842, 25843, 25844, 25846, 25847, 25849, 25850, 25851, 25852, 25853, 25854, 25855, 25856, 25857, 25858, 25859, 25860, 25861, 25862, 25864, 25865, 25866, 25867, 25868, 25869, 25870, 25871, 25872, 25873, 25874, 25875, 25876, 25877, 25878, 25879, 25880, 25882, 25884, 25885, 25886, 25888, 25890, 25891, 25892, 25893, 25894, 25895, 25896, 25897, 25898, 25899, 25900, 25901, 25902, 25903, 25904, 25905, 25906, 25907, 25908, 25909, 25910, 25911, 25912, 25913, 25914, 25915, 25916, 25917, 25919, 25920, 25921, 25923, 25925, 25926, 25927, 25928, 25929, 25930, 25931, 25932, 25933, 25934, 25935, 25936, 25937, 25938, 25939, 25940, 25941, 25942, 25943, 25944, 25945, 25946, 25947, 25948, 25949, 25950, 25951, 25952, 25953, 25954, 25955, 25956, 25957, 25958, 25959, 25960, 25961, 25962, 25963, 25964, 25965, 25966, 25967, 25968, 25969, 25970, 25971, 25972, 25973, 25974, 25975, 25976, 25977, 25978, 25979, 25980, 25981, 25982, 25983, 25984, 25985, 25986, 25987, 25988, 25989, 25990, 25991, 25992, 25993, 25994, 25995, 25996, 25997, 25998, 25999, 26000, 26001, 26002, 26003, 26004, 26005, 26006, 26007, 26008, 26009, 26010, 26011, 26012, 26013, 26014, 26015, 26016, 26017, 26018, 26019, 26020, 26045, 26046, 26047, 26048, 26049, 26050, 26063, 26064, 26065, 26066, 26067, 26068, 26069, 26070, 26071, 26072, 26073, 26074, 26075, 26076, 26077, 26078, 26079, 26080, 26081, 26082, 26083, 26084, 26086, 26088, 26089, 26090, 26091, 26092, 26093, 26094, 26095, 26096, 26098, 26099, 26100, 26101, 26107, 26108, 26109, 26110, 26111, 26112, 26113, 26114, 26115, 26116, 26117, 26118, 26121, 26123, 26124, 26125, 26126, 26127, 26128, 26130, 26157, 26158, 26159, 26160, 26161, 26162, 26163, 26164, 26165, 26166, 26167, 26168, 26169, 26170, 26171, 26172, 26173, 26174, 26175, 26176, 26177, 26178, 26179, 26180, 26182, 26183, 26185, 26186, 26199, 26200, 26201, 26202, 26203, 26204, 26205, 26206, 26207, 26208, 26209, 26210, 26211, 26212, 26213, 26214, 26215, 26216, 26217, 26218, 26219, 26220, 26221, 26222, 26224, 26225, 26227, 26228, 26229, 26230, 26231, 26232, 26233, 26234, 26235, 26236, 26237, 26238, 26239, 26240, 26241, 26242, 26243, 26244, 26245, 26246, 26247, 26248, 26249, 26250, 26251, 26252, 26254, 26255, 26257, 26258, 26259, 26260, 26261, 26262, 26263, 26264, 26265, 26266, 26267, 26268, 26269, 26270, 26271, 26272, 26273, 26274, 26275, 26276, 26277, 26278, 26279, 26280, 26281, 26282, 26283, 26284, 26285, 26286, 26287, 26288, 26290, 26292, 26293, 26294, 26295, 26296, 26297, 26298, 26299, 26300, 26301, 26302, 26303, 26304, 26305, 26306, 26307, 26308, 26309, 26310, 26311, 26312, 26313, 26314, 26315, 26316, 26317, 26319, 26321, 26322, 26323, 26325, 26326, 26327, 26329, 26331, 26332, 26333, 26334, 26335, 26336, 26337, 26338, 26339, 26340, 26341, 26342, 26343, 26344, 26345, 26346, 26347, 26348, 26349, 26350, 26351, 26352, 26353, 26354, 26355, 26356, 26357, 26358, 26359, 26360, 26361, 26362, 26363, 26364, 26365, 26366, 26367, 26368, 26369, 26370, 26371, 26372, 26373, 26374, 26375, 26376, 26377, 26378, 26379, 26380, 26381, 26382, 26383, 26384, 26385, 26386, 26387, 26388, 26389, 26390, 26391, 26392, 26393, 26394, 26395, 26396, 26397, 26398, 26399, 26400, 26401, 26402, 26403, 26404, 26405, 26406, 26407, 26408, 26409, 26410, 26411, 26412, 26413, 26414, 26415, 26416, 26417, 26418, 26419, 26420, 26421, 26422, 26423, 26424, 26425, 26426, 26427, 26428, 26429, 26430, 26431, 26432, 26439, 26440, 26441, 26442, 26443, 26444, 26451, 26452, 26453, 26454, 26455, 26456, 26469, 26470, 26471, 26472, 26473, 26474, 26475, 26476, 26477, 26478, 26479, 26480, 26481, 26482, 26483, 26484, 26485, 26486, 26487, 26488, 26490, 26492, 26493, 26494, 26495, 26496, 26497, 26498, 26499, 26500, 26502, 26503, 26504, 26505, 26506, 26511, 26512, 26513, 26514, 26515, 26516, 26517, 26518, 26519, 26520, 26521, 26522, 26525, 26527, 26528, 26529, 26531, 26534, 26552, 26553, 26554, 26558, 26559, 26560, 26561, 26562, 26563, 26564, 26565, 26566, 26567, 26568, 26569, 26570, 26571, 26572, 26573, 26574, 26575, 26576, 26577, 26578, 26579, 26580, 26581, 26582, 26583, 26584, 26586, 26587, 26589, 26590, 26594, 26595, 26596, 26600, 26601, 26602, 26603, 26604, 26605, 26606, 26607, 26608, 26609, 26610, 26611, 26612, 26613, 26614, 26615, 26616, 26617, 26618, 26619, 26620, 26621, 26622, 26623, 26624, 26625, 26626, 26628, 26629, 26631, 26632, 26633, 26634, 26635, 26636, 26637, 26638, 26639, 26640, 26641, 26642, 26643, 26644, 26645, 26646, 26647, 26648, 26649, 26650, 26651, 26652, 26653, 26654, 26655, 26656, 26658, 26659, 26660, 26661, 26662, 26663, 26664, 26665, 26666, 26667, 26668, 26669, 26670, 26671, 26672, 26673, 26674, 26675, 26676, 26677, 26678, 26679, 26680, 26681, 26682, 26683, 26684, 26685, 26686, 26687, 26688, 26689, 26690, 26691, 26692, 26694, 26696, 26697, 26698, 26699, 26700, 26701, 26702, 26703, 26704, 26705, 26706, 26707, 26708, 26709, 26710, 26711, 26712, 26713, 26714, 26715, 26716, 26717, 26718, 26719, 26721, 26723, 26724, 26725, 26726, 26727, 26728, 26729, 26731, 26733, 26734, 26735, 26736, 26737, 26738, 26739, 26740, 26741, 26742, 26743, 26744, 26745, 26746, 26747, 26748, 26749, 26750, 26751, 26752, 26753, 26754, 26755, 26756, 26757, 26758, 26759, 26760, 26761, 26762, 26763, 26764, 26765, 26766, 26767, 26768, 26769, 26770, 26771, 26772, 26773, 26774, 26775, 26776, 26777, 26778, 26779, 26780, 26781, 26782, 26783, 26784, 26785, 26786, 26787, 26788, 26789, 26790, 26791, 26792, 26793, 26794, 26795, 26796, 26797, 26798, 26799, 26800, 26801, 26802, 26803, 26804, 26805, 26806, 26807, 26808, 26809, 26810, 26811, 26812, 26813, 26814, 26815, 26816, 26817, 26818, 26819, 26820, 26821, 26822, 26823, 26824, 26825, 26826, 26827, 26828, 26829, 26830, 26831, 26832, 26833, 26834, 26835, 26836, 26837, 26838, 26839, 26840, 26841, 26842, 26843, 26844, 26845, 26846, 26847, 26848, 26849, 26850, 26851, 26852, 26853, 26854, 26855, 26856, 26857, 26858, 26871, 26872, 26873, 26874, 26875, 26876, 26877, 26878, 26879, 26880, 26881, 26882, 26883, 26884, 26885, 26886, 26887, 26888, 26889, 26890, 26891, 26892, 26893, 26894, 26895, 26896, 26897, 26898, 26899, 26900, 26902, 26903, 26904, 26905, 26906, 26907, 26911, 26912, 26913, 26914, 26915, 26916, 26917, 26918, 26919, 26920, 26921, 26922, 26924, 26925, 26926, 26927, 26928, 26929, 26931, 26934, 26949, 26950, 26951, 26952, 26953, 26954, 26955, 26956, 26957, 26958, 26959, 26960, 26961, 26962, 26963, 26964, 26965, 26966, 26967, 26968, 26969, 26970, 26971, 26972, 26973, 26974, 26975, 26976, 26977, 26978, 26979, 26980, 26981, 26982, 26983, 26984, 26986, 26987, 26989, 26990, 26991, 26992, 26993, 26994, 26995, 26996, 26997, 26998, 26999, 27000, 27001, 27002, 27003, 27004, 27005, 27006, 27007, 27008, 27009, 27010, 27011, 27012, 27013, 27014, 27015, 27016, 27017, 27018, 27019, 27020, 27021, 27022, 27023, 27024, 27025, 27026, 27028, 27029, 27031, 27032, 27033, 27034, 27035, 27036, 27037, 27038, 27039, 27040, 27041, 27042, 27043, 27044, 27045, 27046, 27047, 27048, 27049, 27050, 27051, 27052, 27053, 27054, 27055, 27056, 27057, 27058, 27059, 27060, 27061, 27062, 27063, 27064, 27065, 27066, 27067, 27068, 27069, 27070, 27071, 27072, 27073, 27074, 27075, 27076, 27077, 27078, 27079, 27080, 27081, 27082, 27083, 27084, 27085, 27086, 27087, 27088, 27089, 27090, 27091, 27092, 27093, 27094, 27095, 27096, 27097, 27098, 27099, 27100, 27101, 27102, 27103, 27104, 27105, 27106, 27107, 27108, 27109, 27110, 27111, 27112, 27113, 27114, 27115, 27116, 27117, 27119, 27122, 27124, 27125, 27126, 27127, 27129, 27131, 27132, 27133, 27134, 27135, 27136, 27137, 27138, 27139, 27140, 27141, 27142, 27143, 27144, 27145, 27146, 27147, 27148, 27149, 27150, 27151, 27152, 27153, 27154, 27155, 27156, 27157, 27158, 27159, 27160, 27161, 27162, 27163, 27164, 27165, 27166, 27167, 27168, 27169, 27170, 27171, 27172, 27173, 27174, 27175, 27176, 27177, 27178, 27179, 27180, 27181, 27182, 27183, 27184, 27185, 27186, 27187, 27188, 27189, 27190, 27191, 27192, 27193, 27194, 27195, 27196, 27197, 27198, 27199, 27200, 27201, 27202, 27203, 27204, 27205, 27206, 27207, 27208, 27209, 27210, 27211, 27212, 27213, 27214, 27215, 27216, 27217, 27218, 27219, 27220, 27221, 27222, 27223, 27224, 27225, 27226, 27227, 27228, 27229, 27230, 27231, 27232, 27233, 27234, 27235, 27236, 27237, 27238, 27239, 27240, 27241, 27242, 27243, 27244, 27245, 27246, 27247, 27248, 27249, 27250, 27251, 27252, 27253, 27254, 27255, 27256, 27257, 27258, 27259, 27260, 27261, 27262, 27269, 27270, 27271, 27272, 27273, 27274, 27275, 27276, 27277, 27278, 27279, 27280, 27281, 27282, 27283, 27284, 27285, 27286, 27287, 27288, 27289, 27290, 27291, 27292, 27293, 27294, 27295, 27296, 27298, 27299, 27300, 27301, 27302, 27303, 27304, 27307, 27308, 27309, 27310, 27311, 27312, 27313, 27314, 27315, 27316, 27317, 27318, 27320, 27321, 27322, 27324, 27327, 27330, 27336, 27337, 27338, 27342, 27343, 27344, 27345, 27346, 27347, 27348, 27349, 27350, 27351, 27352, 27353, 27354, 27355, 27356, 27357, 27358, 27359, 27360, 27361, 27362, 27363, 27364, 27365, 27366, 27367, 27368, 27369, 27370, 27371, 27372, 27373, 27374, 27375, 27376, 27377, 27378, 27379, 27380, 27382, 27383, 27385, 27386, 27387, 27388, 27389, 27390, 27391, 27392, 27393, 27394, 27395, 27396, 27397, 27398, 27399, 27400, 27401, 27402, 27403, 27404, 27405, 27406, 27407, 27408, 27409, 27410, 27411, 27412, 27413, 27414, 27415, 27416, 27417, 27418, 27419, 27420, 27421, 27422, 27424, 27425, 27426, 27427, 27428, 27429, 27430, 27431, 27432, 27433, 27434, 27435, 27436, 27437, 27438, 27439, 27440, 27441, 27442, 27443, 27444, 27445, 27446, 27447, 27448, 27449, 27450, 27451, 27452, 27453, 27454, 27455, 27456, 27457, 27458, 27459, 27460, 27461, 27462, 27463, 27464, 27465, 27466, 27467, 27468, 27469, 27470, 27471, 27472, 27473, 27474, 27475, 27476, 27477, 27478, 27479, 27480, 27481, 27482, 27483, 27484, 27485, 27486, 27487, 27488, 27489, 27490, 27491, 27492, 27493, 27494, 27495, 27496, 27497, 27498, 27499, 27500, 27501, 27502, 27503, 27504, 27505, 27506, 27507, 27508, 27509, 27510, 27511, 27513, 27516, 27518, 27519, 27520, 27521, 27523, 27525, 27526, 27527, 27528, 27529, 27530, 27531, 27532, 27533, 27534, 27535, 27536, 27537, 27538, 27539, 27540, 27541, 27542, 27543, 27544, 27545, 27546, 27547, 27548, 27549, 27550, 27551, 27552, 27553, 27554, 27555, 27556, 27557, 27558, 27559, 27560, 27561, 27562, 27563, 27564, 27565, 27566, 27567, 27568, 27569, 27570, 27571, 27572, 27573, 27574, 27575, 27576, 27577, 27578, 27579, 27580, 27581, 27582, 27583, 27584, 27585, 27586, 27587, 27588, 27589, 27590, 27591, 27592, 27593, 27594, 27595, 27596, 27597, 27598, 27599, 27600, 27601, 27602, 27603, 27604, 27605, 27606, 27607, 27608, 27609, 27610, 27611, 27612, 27613, 27614, 27615, 27616, 27617, 27618, 27619, 27620, 27621, 27622, 27623, 27624, 27625, 27626, 27627, 27628, 27629, 27630, 27631, 27632, 27633, 27634, 27635, 27636, 27637, 27638, 27639, 27640, 27641, 27642, 27643, 27644, 27645, 27646, 27647, 27648, 27649, 27650, 27651, 27652, 27653, 27654, 27655, 27656, 27657, 27658, 27659, 27660, 27661, 27662, 27663, 27664, 27665, 27666, 27667, 27668, 27669, 27670, 27671, 27672, 27673, 27674, 27675, 27676, 27677, 27678, 27679, 27680, 27681, 27682, 27683, 27684, 27685, 27686, 27687, 27688, 27690, 27691, 27692, 27693, 27694, 27695, 27696, 27697, 27699, 27700, 27701, 27702, 27703, 27704, 27705, 27706, 27707, 27708, 27709, 27710, 27711, 27712, 27713, 27714, 27716, 27719, 27722, 27725, 27726, 27727, 27728, 27729, 27730, 27731, 27732, 27733, 27734, 27735, 27736, 27737, 27738, 27739, 27740, 27741, 27742, 27743, 27744, 27745, 27746, 27747, 27748, 27749, 27750, 27751, 27752, 27753, 27754, 27755, 27756, 27757, 27758, 27759, 27760, 27761, 27762, 27763, 27764, 27765, 27766, 27767, 27768, 27769, 27770, 27771, 27772, 27774, 27775, 27777, 27778, 27779, 27780, 27781, 27782, 27783, 27784, 27785, 27786, 27787, 27788, 27789, 27790, 27791, 27792, 27793, 27794, 27795, 27796, 27797, 27798, 27799, 27800, 27801, 27802, 27803, 27804, 27805, 27806, 27807, 27808, 27809, 27810, 27811, 27812, 27813, 27814, 27815, 27816, 27817, 27818, 27819, 27820, 27821, 27822, 27823, 27824, 27825, 27826, 27827, 27828, 27829, 27830, 27831, 27832, 27833, 27834, 27835, 27836, 27837, 27838, 27839, 27840, 27841, 27842, 27843, 27844, 27845, 27846, 27847, 27848, 27849, 27850, 27851, 27852, 27853, 27854, 27855, 27856, 27857, 27858, 27859, 27860, 27861, 27862, 27863, 27864, 27865, 27866, 27867, 27868, 27869, 27870, 27871, 27872, 27873, 27874, 27875, 27876, 27877, 27878, 27879, 27880, 27881, 27882, 27883, 27884, 27885, 27886, 27887, 27888, 27889, 27890, 27891, 27892, 27893, 27894, 27895, 27896, 27897, 27898, 27899, 27900, 27901, 27903, 27906, 27909, 27911, 27912, 27913, 27915, 27916, 27917, 27918, 27919, 27920, 27921, 27922, 27923, 27924, 27925, 27926, 27927, 27928, 27929, 27930, 27931, 27932, 27933, 27934, 27935, 27936, 27937, 27938, 27939, 27940, 27941, 27942, 27943, 27944, 27945, 27946, 27947, 27948, 27949, 27950, 27951, 27952, 27953, 27954, 27955, 27956, 27957, 27958, 27959, 27960, 27961, 27962, 27963, 27964, 27965, 27966, 27967, 27968, 27969, 27970, 27971, 27972, 27973, 27974, 27975, 27976, 27977, 27978, 27979, 27980, 27981, 27982, 27983, 27984, 27985, 27986, 27987, 27988, 27989, 27990, 27991, 27992, 27993, 27994, 27995, 27996, 27997, 27998, 27999, 28000, 28001, 28002, 28003, 28004, 28005, 28006, 28007, 28008, 28009, 28010, 28011, 28012, 28013, 28014, 28015, 28016, 28017, 28018, 28019, 28020, 28021, 28022, 28023, 28024, 28025, 28026, 28027, 28028, 28029, 28030, 28031, 28032, 28033, 28034, 28035, 28036, 28037, 28038, 28039, 28040, 28041, 28042, 28043, 28044, 28045, 28046, 28047, 28048, 28049, 28050, 28051, 28052, 28053, 28054, 28055, 28056, 28057, 28058, 28059, 28060, 28061, 28062, 28063, 28064, 28065, 28066, 28067, 28068, 28069, 28070, 28071, 28072, 28073, 28074, 28075, 28076, 28078, 28079, 28080, 28081, 28082, 28083, 28084, 28085, 28086, 28087, 28088, 28089, 28090, 28091, 28092, 28093, 28094, 28095, 28096, 28097, 28098, 28099, 28101, 28104, 28107, 28110, 28113, 28114, 28115, 28116, 28117, 28118, 28119, 28120, 28121, 28122, 28123, 28124, 28125, 28126, 28127, 28128, 28129, 28130, 28131, 28132, 28133, 28134, 28135, 28136, 28137, 28138, 28139, 28140, 28141, 28142, 28143, 28144, 28145, 28146, 28147, 28148, 28149, 28150, 28151, 28152, 28153, 28154, 28155, 28156, 28157, 28158, 28159, 28160, 28162, 28163, 28164, 28165, 28166, 28167, 28168, 28169, 28170, 28171, 28172, 28173, 28174, 28175, 28176, 28177, 28178, 28179, 28180, 28181, 28182, 28183, 28184, 28185, 28186, 28187, 28188, 28189, 28190, 28191, 28192, 28193, 28194, 28195, 28196, 28197, 28198, 28199, 28200, 28201, 28202, 28203, 28204, 28205, 28206, 28207, 28208, 28209, 28210, 28211, 28212, 28213, 28214, 28215, 28216, 28217, 28218, 28219, 28220, 28221, 28222, 28223, 28224, 28225, 28226, 28227, 28228, 28229, 28230, 28231, 28232, 28233, 28234, 28235, 28236, 28237, 28238, 28239, 28240, 28241, 28242, 28243, 28244, 28245, 28246, 28247, 28248, 28249, 28250, 28251, 28252, 28253, 28254, 28255, 28256, 28257, 28258, 28259, 28260, 28261, 28262, 28263, 28264, 28265, 28266, 28267, 28268, 28269, 28270, 28271, 28272, 28273, 28274, 28275, 28276, 28277, 28278, 28279, 28280, 28281, 28282, 28283, 28284, 28285, 28286, 28287, 28289, 28292, 28295, 28297, 28298, 28299, 28301, 28302, 28303, 28304, 28305, 28306, 28307, 28308, 28309, 28310, 28311, 28312, 28313, 28314, 28315, 28316, 28317, 28318, 28319, 28320, 28321, 28322, 28323, 28324, 28325, 28326, 28327, 28328, 28329, 28330, 28331, 28332, 28333, 28334, 28335, 28336, 28337, 28338, 28339, 28340, 28341, 28342, 28343, 28344, 28345, 28346, 28347, 28348, 28349, 28350, 28351, 28352, 28353, 28354, 28355, 28356, 28357, 28358, 28359, 28360, 28361, 28362, 28363, 28364, 28365, 28366, 28367, 28368, 28369, 28370, 28371, 28372, 28373, 28374, 28375, 28376, 28377, 28378, 28379, 28380, 28381, 28382, 28383, 28384, 28385, 28386, 28387, 28388, 28389, 28390, 28391, 28392, 28393, 28394, 28395, 28396, 28397, 28398, 28399, 28400, 28401, 28402, 28403, 28404, 28405, 28406, 28407, 28408, 28409, 28410, 28411, 28412, 28413, 28414, 28415, 28416, 28417, 28418, 28419, 28420, 28421, 28422, 28423, 28424, 28425, 28426, 28427, 28428, 28429, 28430, 28431, 28432, 28433, 28434, 28435, 28436, 28437, 28438, 28439, 28440, 28441, 28442, 28443, 28444, 28445, 28446, 28447, 28448, 28449, 28450, 28451, 28452, 28453, 28454, 28455, 28456, 28457, 28458, 28459, 28460, 28461, 28462, 28463, 28464, 28465, 28466, 28467, 28468, 28469, 28470, 28471, 28472, 28473, 28474, 28475, 28476, 28477, 28478, 28479, 28480, 28481, 28482, 28483, 28485, 28488, 28491, 28494, 28497, 28498, 28499, 28500, 28501, 28502, 28503, 28504, 28505, 28506, 28507, 28508, 28509, 28510, 28511, 28512, 28513, 28514, 28515, 28516, 28517, 28518, 28519, 28520, 28521, 28522, 28523, 28524, 28525, 28526, 28527, 28528, 28529, 28530, 28531, 28532, 28533, 28534, 28535, 28536, 28537, 28538, 28539, 28540, 28541, 28542, 28543, 28544, 28545, 28546, 28547, 28548, 28549, 28550, 28551, 28552, 28553, 28554, 28555, 28556, 28557, 28558, 28559, 28560, 28561, 28562, 28563, 28564, 28565, 28566, 28567, 28568, 28569, 28570, 28571, 28572, 28573, 28574, 28575, 28576, 28577, 28578, 28579, 28580, 28581, 28582, 28583, 28584, 28585, 28586, 28587, 28588, 28589, 28590, 28591, 28592, 28593, 28594, 28595, 28596, 28597, 28598, 28599, 28600, 28601, 28602, 28603, 28604, 28605, 28606, 28607, 28608, 28609, 28610, 28611, 28612, 28613, 28614, 28615, 28616, 28617, 28618, 28619, 28620, 28621, 28622, 28623, 28624, 28625, 28626, 28627, 28628, 28629, 28630, 28631, 28632, 28633, 28634, 28635, 28636, 28637, 28638, 28639, 28640, 28641, 28642, 28643, 28644, 28645, 28646, 28647, 28648, 28649, 28650, 28651, 28652, 28653, 28654, 28655, 28656, 28657, 28658, 28659, 28660, 28661, 28662, 28663, 28664, 28665, 28666, 28668, 28673, 28678, 28683, 28687, 28688, 28689, 28690, 28693, 28695, 28696, 28698, 28699, 28701, 28702, 28704, 28705, 28707, 28708, 28710, 28711, 28713, 28714, 28716, 28717, 28719, 28720, 28722, 28723, 28725, 28726, 28728, 28729, 28731, 28732, 28734, 28735, 28737, 28738, 28740, 28742, 28745, 28747, 28749, 28750, 28752, 28753, 28755, 28756, 28758, 28759, 28761, 28762, 28764, 28765, 28767, 28768, 28770, 28771, 28773, 28774, 28776, 28777, 28779, 28780, 28782, 28784, 28787, 28789, 28791, 28792, 28794, 28795, 28797, 28798, 28800, 28801, 28803, 28804, 28806, 28807, 28809, 28810, 28812, 28814, 28817, 28819, 28821, 28822, 28824, 28825, 28827, 28828, 28830, 28832, 28835, 28838, 28841]} diff --git a/research/gauge-recycling/row.json b/research/gauge-recycling/row.json new file mode 100644 index 0000000000..3e8decb316 --- /dev/null +++ b/research/gauge-recycling/row.json @@ -0,0 +1,99 @@ +{ + "R": 23979, + "W_per_vertex": 27521, + "auxiliary_histogram": { + "1": 53068, + "10": 175, + "11": 338, + "12": 216, + "13": 501, + "14": 110, + "15": 628, + "16": 896, + "17": 1529, + "18": 635, + "19": 622, + "2": 64844, + "20": 2244, + "21": 262, + "3": 12759, + "4": 10846, + "5": 5848, + "6": 1619, + "7": 688, + "8": 1142, + "9": 497 + }, + "child_histogram": { + "1": 188580, + "10": 525, + "11": 1014, + "12": 648, + "13": 1536, + "14": 330, + "15": 1884, + "16": 4257, + "17": 5109, + "18": 2823, + "19": 9441, + "2": 201164, + "20": 6732, + "21": 789, + "22": 75, + "3": 38445, + "4": 33162, + "48": 237, + "5": 17577, + "51": 140, + "54": 806, + "57": 3651, + "6": 4857, + "60": 9, + "7": 2064, + "8": 3426, + "9": 1491 + }, + "copied_center_histogram": { + "22": 23 + }, + "deficit_per_vertex": 2024, + "eliminated_roles": 1549, + "h": 23, + "loss": 506, + "m": 69, + "omitted_roles": 1835, + "rank_per_vertex": 1896925, + "recycled_roles": 3338, + "selected_rank_histogram": { + "16": 237, + "17": 140, + "18": 806, + "19": 3651, + "20": 9 + }, + "selected_roles": 4843, + "source_data_histogram": { + "1": 5061, + "13": 11, + "16": 198, + "17": 22, + "19": 1540, + "3": 23, + "4": 208, + "5": 11 + }, + "source_manifest": "references/partial-gauge/pr97/SOURCE.json", + "source_manifest_sha256": "68fb539abcd6df21d142e4e204b6e9482eb7f9cd3907650f54bd058070266596", + "target_data_histogram": { + "1": 4731, + "16": 325, + "17": 152, + "18": 306, + "19": 985, + "2": 1030, + "21": 1, + "22": 2, + "3": 33 + }, + "v": 1771 +} diff --git a/research/gauge-recycling/verify.py b/research/gauge-recycling/verify.py new file mode 100644 index 0000000000..1772da32c3 --- /dev/null +++ b/research/gauge-recycling/verify.py @@ -0,0 +1,70 @@ +#!/usr/bin/env python3 +"""Verify the gauge/recycling composition; stdlib, run without -O. + +Default transports the geometry check from PR150 via exact fresh-move equality. +Run PR150's verifier first, or use --frames to rebuild those exact Q checks here. +""" +import json +import random +import sys +from collections import Counter +from fractions import Fraction as Q +from pathlib import Path + +HERE = Path(__file__).resolve().parent +BASE = HERE.parent / 'bit-reuse-147' +sys.path.insert(0, str(BASE)) +import word147 +import price147 + + +def main(): + assert not sys.flags.optimize, 'run without -O' + _, W, _, S, record, folder = word147.load_schedule() + oldplan = json.loads((BASE / 'plan.json').read_text()) + plan = json.loads((HERE / 'plan.json').read_text()) + assert plan['elim'] == oldplan['elim'] and plan['pairs'] == oldplan['pairs'] + old = word147.Word(S, **oldplan) + word = word147.Word(S, **plan) + added = word.level - old.level + assert old.level <= word.level + assert Counter(S.f[b] for b in added) == {16: 165, 17: 22} + assert all(word.p[b] == p for b, p in old.p.items()) + assert all(word.death[d] < word.p[b] for b, d in plan['pairs']) + led = word.ledger() + row = word.row(led, record) + assert row == json.loads((HERE / 'row.json').read_text()) + fresh = word.new_moves(led) + assert fresh == old.new_moves(old.ledger()) and len(fresh) == 4878 + delta = Counter({int(r): n for r, n in row['child_histogram'].items()}) + delta.subtract({int(r): n for r, n in old.row(old.ledger(), record)['child_histogram'].items()}) + assert {r: n for r, n in delta.items() if n} == { + 1: 339, 2: 597, 3: 405, 4: 45, 16: 693, 17: -183, + 18: -489, 19: -495, 20: -87, 48: 165, 51: 22} + print('PASS plan, timetable, ledger, histogram; exact equality of all 4878 fresh moves', flush=True) + if '--frames' in sys.argv: + from frames147 import Exact + exact = Exact(S, W, folder) + for reg, a, b in fresh: + assert exact.inside(a, b), (reg, a, b) + assert exact.nondegenerate(a) and exact.nondegenerate(b) + print('PASS rebuilt exact Q nesting/nondegeneracy of all fresh moves', flush=True) + outputs = {(c, tuple(T)): n for c, T, n in W['outputs']} + for ring in (2, 0): + assert word.complete(ring, outputs) + print('PASS complete formal scalar identity over', 'F2' if ring else 'Z', flush=True) + rng = random.Random(20261009) + for tamper in ('stale', 'early', 'vlast'): + assert not word.replay(0, rng, outputs, tamper), tamper + print('PASS stale/early/wrong-inverse negative controls', flush=True) + for atom, expected in ((Q(1, 2000), Q(472143085, 10**12)), + (Q(473, 10**6), Q(472154791, 10**12))): + result = price147.price(row, atom) + assert result['coarse'] == Q(472806533, 10**12) + assert result['kappa'] == expected + print('PASS exact assembly, atom', atom, 'kappa', expected, flush=True) + print('PASS conditional composition; inherited interfaces remain assumptions') + + +if __name__ == '__main__': + main()