Skip to content

Instantly share code, notes, and snippets.

@kim-em
Last active September 16, 2026 08:37
Show Gist options
  • Select an option

  • Save kim-em/4d7bece74951307a0023976d7acb7b31 to your computer and use it in GitHub Desktop.

Select an option

Save kim-em/4d7bece74951307a0023976d7acb7b31 to your computer and use it in GitHub Desktop.
PrimeCert interval versus quadratic-nonresidue kernel replay

PrimeCert interval witness replay

Place IntervalBench.lean at PrimeCertTest/IntervalBench.lean on the PR branch and run:

INTERVAL_SAMPLES=/tmp/interval-samples.csv lake build PrimeCertTest.IntervalBench

Lean 4.33.0. Each sample uses a fresh Kernel.check, after imports and expression construction. The equality application checks the result; false-result controls must fail. Four adjacent AB/BA blocks, 64 checks per arm per block. A is the existing prime quadratic-nonresidue mode (7, 3, 3); B is the new interval mode. The latter two cases are the two Curve25519 cube-root nodes. CSV columns: block, r, interval, repetition, nanoseconds. record.json contains the CPU affinity and host context. unaffined-samples.csv retains the earlier completed run without CPU affinity. These timings cover just the nonsquare obligation, not the whole primality certificate.

{
"cpu": 0,
"load_before": [
3.2314453125,
3.3984375,
3.904296875
],
"rows": [
{
"block": 0,
"arm": "m1",
"stdout": "\u2139 [70/70] Built HexPrimality.SieveToolsProbe (1.3s)\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_WITNESS_CONTROL rejected\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1261680\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1269531\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1214580\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1191776\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1189093\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1177886\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1187490\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1182313\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\nBuild completed successfully (70 jobs).\n",
"stderr": "",
"returncode": 0,
"source": "module\npublic import HexPrimality.Cert\npublic import Lean\npublic meta import Lean\npublic section\nset_option maxRecDepth 100000\nopen Hex.Nat\nmutual\n@[expose] def oldCheck : PrimeCert \u2192 Bool\n | .small n => tableSearch n\n | .pock n fs => checkPockArith n fs && oldChildren fs\n | .pock3 n r s w fs => checkPock3Arith n r s w fs && oldChildren fs\n | .pock3Sieve n r s w m fs => checkPock3SieveArith n r s w m fs && oldChildren fs\n@[expose] def oldChildren : List (Nat \u00d7 Nat \u00d7 PrimeCert) \u2192 Bool\n | [] => true\n | (_, _, c) :: cs => oldCheck c && oldChildren cs\nend\n\ndef certificate : PrimeCert := .pock3 9223372036904058881 1677731 167772 1677730 [(3, 19, .small 2), (2, 0, .small 5)]\ntheorem oldResult : oldCheck certificate = true := by decide +kernel\ntheorem result : Hex.Nat.Prime 9223372036904058881 := Hex.Nat.prime_of_checkPrimeAt (c := certificate) (by decide +kernel)\n\nmeta partial def inlineLocal (env : Lean.Environment) (e : Lean.Expr) : Lean.Expr :=\n e.replace fun sub => match sub with\n | .const n levels =>\n if env.isImportedConst n then none else\n match env.find? n with\n | some info => (info.value? (allowOpaque := true)).map fun value =>\n inlineLocal env (value.instantiateLevelParams info.levelParams levels)\n | none => none\n | _ => none\n\nrun_cmd do\n let env \u2190 Lean.getEnv\n let some (.thmInfo info) := env.find? `result\n | throwError \"missing result theorem\"\n let value := inlineLocal env info.value\n let type := inlineLocal env info.type\n unless (value.getUsedConstants ++ type.getUsedConstants).all env.isImportedConst do\n throwError \"unexpanded local proof dependency\"\n -- The identity application checks the proof against its declared goal type.\n let proof := Lean.mkApp (Lean.mkLambda `h .default type (Lean.mkBVar 0)) value\n -- Explicitly finish pending elaboration-time kernel tasks before timing.\n let ready \u2190 IO.mkRef env.toKernelEnv\n let ready \u2190 ready.get\n let env := Lean.Environment.ofKernelEnv ready\n -- An invalid equality must be rejected by this same kernel entry point.\n let badType := Lean.mkApp3 (Lean.mkConst ``Eq [.succ .zero])\n (Lean.mkConst ``Bool) (Lean.mkConst ``Bool.true) (Lean.mkConst ``Bool.false)\n let badProof := Lean.mkApp (Lean.mkLambda `h .default badType (Lean.mkBVar 0))\n Lean.reflBoolTrue\n match Lean.Kernel.check env {} badProof with\n | .error _ => pure ()\n | .ok _ => throwError \"kernel accepted the negative control\"\n let corrupt := value.replace fun e => match e with\n | .lit (.natVal n) => if n == 9223372036904058881 then some (Lean.mkRawNatLit (n + 2)) else none\n | _ => none\n if corrupt == value then throwError \"subject corruption did not change the proof\"\n let corrupt := Lean.mkApp (Lean.mkLambda `h .default type (Lean.mkBVar 0)) corrupt\n match Lean.Kernel.check env {} corrupt with\n | .error _ => pure ()\n | .ok _ => throwError \"kernel accepted the corrupted proof\"\n -- Change only a Hex witness base: subjects, products, and ordering remain\n -- intact, so this control must reach the witness arithmetic.\n let corruptWitness := value.replace fun e => Id.run do\n unless e.isAppOfArity `Hex.Nat.PrimeCert.pock 2 ||\n e.isAppOfArity `Hex.Nat.PrimeCert.pock3 5 ||\n e.isAppOfArity `Hex.Nat.PrimeCert.pock3Sieve 6 do return none\n let args := e.getAppArgs\n let fs := args.back!\n unless fs.isAppOfArity ``List.cons 3 do return none\n let fsArgs := fs.getAppArgs\n let entry := fsArgs[1]!\n unless entry.isAppOfArity ``Prod.mk 4 do return none\n let entryArgs := entry.getAppArgs\n let entry := Lean.mkAppN entry.getAppFn (entryArgs.set! 2 (Lean.mkRawNatLit 0))\n let fs := Lean.mkAppN fs.getAppFn (fsArgs.set! 1 entry)\n return some (Lean.mkAppN e.getAppFn (args.set! (args.size - 1) fs))\n let needsWitness := value.getUsedConstants.any fun name =>\n name == `Hex.Nat.PrimeCert.pock || name == `Hex.Nat.PrimeCert.pock3 ||\n name == `Hex.Nat.PrimeCert.pock3Sieve\n if needsWitness && corruptWitness == value then\n throwError \"witness corruption did not change the proof\"\n if corruptWitness != value then\n let bad := Lean.mkApp (Lean.mkLambda `h .default type (Lean.mkBVar 0)) corruptWitness\n match Lean.Kernel.check env {} bad with\n | .error _ => pure ()\n | .ok _ => throwError \"kernel accepted the zero witness base\"\n Lean.logInfo \"DIRECT_WITNESS_CONTROL rejected\"\n for _ in [:8] do\n let input \u2190 IO.mkRef (env, proof)\n let (env, proof) \u2190 input.get\n let start \u2190 IO.monoNanosNow\n let checked \u2190 IO.mkRef (Lean.Kernel.check env {} proof)\n let checked \u2190 checked.get\n let stop \u2190 IO.monoNanosNow\n match checked with\n | .error _ => throwError \"kernel recheck failed\"\n | .ok _ => pure ()\n Lean.logInfo m!\"DIRECT_KERNEL_NS {stop - start}\"\n Lean.logInfo m!\"DIRECT_DEPENDENCIES {value.getUsedConstants}\"\n",
"ns": [
1261680,
1269531,
1214580,
1191776,
1189093,
1177886,
1187490,
1182313
]
},
{
"block": 0,
"arm": "m4",
"stdout": "\u2139 [70/70] Built HexPrimality.SieveToolsProbe (1.3s)\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_WITNESS_CONTROL rejected\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1027243\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 993423\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 986442\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1034273\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 970819\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 968166\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 962127\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 956548\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\nBuild completed successfully (70 jobs).\n",
"stderr": "",
"returncode": 0,
"source": "module\npublic import HexPrimality.Cert\npublic import Lean\npublic meta import Lean\npublic section\nset_option maxRecDepth 100000\nopen Hex.Nat\nmutual\n@[expose] def oldCheck : PrimeCert \u2192 Bool\n | .small n => tableSearch n\n | .pock n fs => checkPockArith n fs && oldChildren fs\n | .pock3 n r s w fs => checkPock3Arith n r s w fs && oldChildren fs\n | .pock3Sieve n r s w m fs => checkPock3SieveArith n r s w m fs && oldChildren fs\n@[expose] def oldChildren : List (Nat \u00d7 Nat \u00d7 PrimeCert) \u2192 Bool\n | [] => true\n | (_, _, c) :: cs => oldCheck c && oldChildren cs\nend\n\ndef certificate : PrimeCert := .pock3Sieve 9223372036904058881 47 4194304 0 4 [(3, 19, .small 2)]\ntheorem oldResult : oldCheck certificate = true := by decide +kernel\ntheorem result : Hex.Nat.Prime 9223372036904058881 := Hex.Nat.prime_of_checkPrimeAt (c := certificate) (by decide +kernel)\n\nmeta partial def inlineLocal (env : Lean.Environment) (e : Lean.Expr) : Lean.Expr :=\n e.replace fun sub => match sub with\n | .const n levels =>\n if env.isImportedConst n then none else\n match env.find? n with\n | some info => (info.value? (allowOpaque := true)).map fun value =>\n inlineLocal env (value.instantiateLevelParams info.levelParams levels)\n | none => none\n | _ => none\n\nrun_cmd do\n let env \u2190 Lean.getEnv\n let some (.thmInfo info) := env.find? `result\n | throwError \"missing result theorem\"\n let value := inlineLocal env info.value\n let type := inlineLocal env info.type\n unless (value.getUsedConstants ++ type.getUsedConstants).all env.isImportedConst do\n throwError \"unexpanded local proof dependency\"\n -- The identity application checks the proof against its declared goal type.\n let proof := Lean.mkApp (Lean.mkLambda `h .default type (Lean.mkBVar 0)) value\n -- Explicitly finish pending elaboration-time kernel tasks before timing.\n let ready \u2190 IO.mkRef env.toKernelEnv\n let ready \u2190 ready.get\n let env := Lean.Environment.ofKernelEnv ready\n -- An invalid equality must be rejected by this same kernel entry point.\n let badType := Lean.mkApp3 (Lean.mkConst ``Eq [.succ .zero])\n (Lean.mkConst ``Bool) (Lean.mkConst ``Bool.true) (Lean.mkConst ``Bool.false)\n let badProof := Lean.mkApp (Lean.mkLambda `h .default badType (Lean.mkBVar 0))\n Lean.reflBoolTrue\n match Lean.Kernel.check env {} badProof with\n | .error _ => pure ()\n | .ok _ => throwError \"kernel accepted the negative control\"\n let corrupt := value.replace fun e => match e with\n | .lit (.natVal n) => if n == 9223372036904058881 then some (Lean.mkRawNatLit (n + 2)) else none\n | _ => none\n if corrupt == value then throwError \"subject corruption did not change the proof\"\n let corrupt := Lean.mkApp (Lean.mkLambda `h .default type (Lean.mkBVar 0)) corrupt\n match Lean.Kernel.check env {} corrupt with\n | .error _ => pure ()\n | .ok _ => throwError \"kernel accepted the corrupted proof\"\n -- Change only a Hex witness base: subjects, products, and ordering remain\n -- intact, so this control must reach the witness arithmetic.\n let corruptWitness := value.replace fun e => Id.run do\n unless e.isAppOfArity `Hex.Nat.PrimeCert.pock 2 ||\n e.isAppOfArity `Hex.Nat.PrimeCert.pock3 5 ||\n e.isAppOfArity `Hex.Nat.PrimeCert.pock3Sieve 6 do return none\n let args := e.getAppArgs\n let fs := args.back!\n unless fs.isAppOfArity ``List.cons 3 do return none\n let fsArgs := fs.getAppArgs\n let entry := fsArgs[1]!\n unless entry.isAppOfArity ``Prod.mk 4 do return none\n let entryArgs := entry.getAppArgs\n let entry := Lean.mkAppN entry.getAppFn (entryArgs.set! 2 (Lean.mkRawNatLit 0))\n let fs := Lean.mkAppN fs.getAppFn (fsArgs.set! 1 entry)\n return some (Lean.mkAppN e.getAppFn (args.set! (args.size - 1) fs))\n let needsWitness := value.getUsedConstants.any fun name =>\n name == `Hex.Nat.PrimeCert.pock || name == `Hex.Nat.PrimeCert.pock3 ||\n name == `Hex.Nat.PrimeCert.pock3Sieve\n if needsWitness && corruptWitness == value then\n throwError \"witness corruption did not change the proof\"\n if corruptWitness != value then\n let bad := Lean.mkApp (Lean.mkLambda `h .default type (Lean.mkBVar 0)) corruptWitness\n match Lean.Kernel.check env {} bad with\n | .error _ => pure ()\n | .ok _ => throwError \"kernel accepted the zero witness base\"\n Lean.logInfo \"DIRECT_WITNESS_CONTROL rejected\"\n for _ in [:8] do\n let input \u2190 IO.mkRef (env, proof)\n let (env, proof) \u2190 input.get\n let start \u2190 IO.monoNanosNow\n let checked \u2190 IO.mkRef (Lean.Kernel.check env {} proof)\n let checked \u2190 checked.get\n let stop \u2190 IO.monoNanosNow\n match checked with\n | .error _ => throwError \"kernel recheck failed\"\n | .ok _ => pure ()\n Lean.logInfo m!\"DIRECT_KERNEL_NS {stop - start}\"\n Lean.logInfo m!\"DIRECT_DEPENDENCIES {value.getUsedConstants}\"\n",
"ns": [
1027243,
993423,
986442,
1034273,
970819,
968166,
962127,
956548
]
},
{
"block": 1,
"arm": "m4",
"stdout": "\u2139 [70/70] Replayed HexPrimality.SieveToolsProbe\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_WITNESS_CONTROL rejected\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1027243\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 993423\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 986442\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1034273\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 970819\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 968166\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 962127\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 956548\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\nBuild completed successfully (70 jobs).\n",
"stderr": "",
"returncode": 0,
"source": "module\npublic import HexPrimality.Cert\npublic import Lean\npublic meta import Lean\npublic section\nset_option maxRecDepth 100000\nopen Hex.Nat\nmutual\n@[expose] def oldCheck : PrimeCert \u2192 Bool\n | .small n => tableSearch n\n | .pock n fs => checkPockArith n fs && oldChildren fs\n | .pock3 n r s w fs => checkPock3Arith n r s w fs && oldChildren fs\n | .pock3Sieve n r s w m fs => checkPock3SieveArith n r s w m fs && oldChildren fs\n@[expose] def oldChildren : List (Nat \u00d7 Nat \u00d7 PrimeCert) \u2192 Bool\n | [] => true\n | (_, _, c) :: cs => oldCheck c && oldChildren cs\nend\n\ndef certificate : PrimeCert := .pock3Sieve 9223372036904058881 47 4194304 0 4 [(3, 19, .small 2)]\ntheorem oldResult : oldCheck certificate = true := by decide +kernel\ntheorem result : Hex.Nat.Prime 9223372036904058881 := Hex.Nat.prime_of_checkPrimeAt (c := certificate) (by decide +kernel)\n\nmeta partial def inlineLocal (env : Lean.Environment) (e : Lean.Expr) : Lean.Expr :=\n e.replace fun sub => match sub with\n | .const n levels =>\n if env.isImportedConst n then none else\n match env.find? n with\n | some info => (info.value? (allowOpaque := true)).map fun value =>\n inlineLocal env (value.instantiateLevelParams info.levelParams levels)\n | none => none\n | _ => none\n\nrun_cmd do\n let env \u2190 Lean.getEnv\n let some (.thmInfo info) := env.find? `result\n | throwError \"missing result theorem\"\n let value := inlineLocal env info.value\n let type := inlineLocal env info.type\n unless (value.getUsedConstants ++ type.getUsedConstants).all env.isImportedConst do\n throwError \"unexpanded local proof dependency\"\n -- The identity application checks the proof against its declared goal type.\n let proof := Lean.mkApp (Lean.mkLambda `h .default type (Lean.mkBVar 0)) value\n -- Explicitly finish pending elaboration-time kernel tasks before timing.\n let ready \u2190 IO.mkRef env.toKernelEnv\n let ready \u2190 ready.get\n let env := Lean.Environment.ofKernelEnv ready\n -- An invalid equality must be rejected by this same kernel entry point.\n let badType := Lean.mkApp3 (Lean.mkConst ``Eq [.succ .zero])\n (Lean.mkConst ``Bool) (Lean.mkConst ``Bool.true) (Lean.mkConst ``Bool.false)\n let badProof := Lean.mkApp (Lean.mkLambda `h .default badType (Lean.mkBVar 0))\n Lean.reflBoolTrue\n match Lean.Kernel.check env {} badProof with\n | .error _ => pure ()\n | .ok _ => throwError \"kernel accepted the negative control\"\n let corrupt := value.replace fun e => match e with\n | .lit (.natVal n) => if n == 9223372036904058881 then some (Lean.mkRawNatLit (n + 2)) else none\n | _ => none\n if corrupt == value then throwError \"subject corruption did not change the proof\"\n let corrupt := Lean.mkApp (Lean.mkLambda `h .default type (Lean.mkBVar 0)) corrupt\n match Lean.Kernel.check env {} corrupt with\n | .error _ => pure ()\n | .ok _ => throwError \"kernel accepted the corrupted proof\"\n -- Change only a Hex witness base: subjects, products, and ordering remain\n -- intact, so this control must reach the witness arithmetic.\n let corruptWitness := value.replace fun e => Id.run do\n unless e.isAppOfArity `Hex.Nat.PrimeCert.pock 2 ||\n e.isAppOfArity `Hex.Nat.PrimeCert.pock3 5 ||\n e.isAppOfArity `Hex.Nat.PrimeCert.pock3Sieve 6 do return none\n let args := e.getAppArgs\n let fs := args.back!\n unless fs.isAppOfArity ``List.cons 3 do return none\n let fsArgs := fs.getAppArgs\n let entry := fsArgs[1]!\n unless entry.isAppOfArity ``Prod.mk 4 do return none\n let entryArgs := entry.getAppArgs\n let entry := Lean.mkAppN entry.getAppFn (entryArgs.set! 2 (Lean.mkRawNatLit 0))\n let fs := Lean.mkAppN fs.getAppFn (fsArgs.set! 1 entry)\n return some (Lean.mkAppN e.getAppFn (args.set! (args.size - 1) fs))\n let needsWitness := value.getUsedConstants.any fun name =>\n name == `Hex.Nat.PrimeCert.pock || name == `Hex.Nat.PrimeCert.pock3 ||\n name == `Hex.Nat.PrimeCert.pock3Sieve\n if needsWitness && corruptWitness == value then\n throwError \"witness corruption did not change the proof\"\n if corruptWitness != value then\n let bad := Lean.mkApp (Lean.mkLambda `h .default type (Lean.mkBVar 0)) corruptWitness\n match Lean.Kernel.check env {} bad with\n | .error _ => pure ()\n | .ok _ => throwError \"kernel accepted the zero witness base\"\n Lean.logInfo \"DIRECT_WITNESS_CONTROL rejected\"\n for _ in [:8] do\n let input \u2190 IO.mkRef (env, proof)\n let (env, proof) \u2190 input.get\n let start \u2190 IO.monoNanosNow\n let checked \u2190 IO.mkRef (Lean.Kernel.check env {} proof)\n let checked \u2190 checked.get\n let stop \u2190 IO.monoNanosNow\n match checked with\n | .error _ => throwError \"kernel recheck failed\"\n | .ok _ => pure ()\n Lean.logInfo m!\"DIRECT_KERNEL_NS {stop - start}\"\n Lean.logInfo m!\"DIRECT_DEPENDENCIES {value.getUsedConstants}\"\n",
"ns": [
1027243,
993423,
986442,
1034273,
970819,
968166,
962127,
956548
]
},
{
"block": 1,
"arm": "m1",
"stdout": "\u2139 [70/70] Built HexPrimality.SieveToolsProbe (1.3s)\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_WITNESS_CONTROL rejected\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1257264\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1220570\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1259448\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1199929\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1188922\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1186960\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1186279\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1182913\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\nBuild completed successfully (70 jobs).\n",
"stderr": "",
"returncode": 0,
"source": "module\npublic import HexPrimality.Cert\npublic import Lean\npublic meta import Lean\npublic section\nset_option maxRecDepth 100000\nopen Hex.Nat\nmutual\n@[expose] def oldCheck : PrimeCert \u2192 Bool\n | .small n => tableSearch n\n | .pock n fs => checkPockArith n fs && oldChildren fs\n | .pock3 n r s w fs => checkPock3Arith n r s w fs && oldChildren fs\n | .pock3Sieve n r s w m fs => checkPock3SieveArith n r s w m fs && oldChildren fs\n@[expose] def oldChildren : List (Nat \u00d7 Nat \u00d7 PrimeCert) \u2192 Bool\n | [] => true\n | (_, _, c) :: cs => oldCheck c && oldChildren cs\nend\n\ndef certificate : PrimeCert := .pock3 9223372036904058881 1677731 167772 1677730 [(3, 19, .small 2), (2, 0, .small 5)]\ntheorem oldResult : oldCheck certificate = true := by decide +kernel\ntheorem result : Hex.Nat.Prime 9223372036904058881 := Hex.Nat.prime_of_checkPrimeAt (c := certificate) (by decide +kernel)\n\nmeta partial def inlineLocal (env : Lean.Environment) (e : Lean.Expr) : Lean.Expr :=\n e.replace fun sub => match sub with\n | .const n levels =>\n if env.isImportedConst n then none else\n match env.find? n with\n | some info => (info.value? (allowOpaque := true)).map fun value =>\n inlineLocal env (value.instantiateLevelParams info.levelParams levels)\n | none => none\n | _ => none\n\nrun_cmd do\n let env \u2190 Lean.getEnv\n let some (.thmInfo info) := env.find? `result\n | throwError \"missing result theorem\"\n let value := inlineLocal env info.value\n let type := inlineLocal env info.type\n unless (value.getUsedConstants ++ type.getUsedConstants).all env.isImportedConst do\n throwError \"unexpanded local proof dependency\"\n -- The identity application checks the proof against its declared goal type.\n let proof := Lean.mkApp (Lean.mkLambda `h .default type (Lean.mkBVar 0)) value\n -- Explicitly finish pending elaboration-time kernel tasks before timing.\n let ready \u2190 IO.mkRef env.toKernelEnv\n let ready \u2190 ready.get\n let env := Lean.Environment.ofKernelEnv ready\n -- An invalid equality must be rejected by this same kernel entry point.\n let badType := Lean.mkApp3 (Lean.mkConst ``Eq [.succ .zero])\n (Lean.mkConst ``Bool) (Lean.mkConst ``Bool.true) (Lean.mkConst ``Bool.false)\n let badProof := Lean.mkApp (Lean.mkLambda `h .default badType (Lean.mkBVar 0))\n Lean.reflBoolTrue\n match Lean.Kernel.check env {} badProof with\n | .error _ => pure ()\n | .ok _ => throwError \"kernel accepted the negative control\"\n let corrupt := value.replace fun e => match e with\n | .lit (.natVal n) => if n == 9223372036904058881 then some (Lean.mkRawNatLit (n + 2)) else none\n | _ => none\n if corrupt == value then throwError \"subject corruption did not change the proof\"\n let corrupt := Lean.mkApp (Lean.mkLambda `h .default type (Lean.mkBVar 0)) corrupt\n match Lean.Kernel.check env {} corrupt with\n | .error _ => pure ()\n | .ok _ => throwError \"kernel accepted the corrupted proof\"\n -- Change only a Hex witness base: subjects, products, and ordering remain\n -- intact, so this control must reach the witness arithmetic.\n let corruptWitness := value.replace fun e => Id.run do\n unless e.isAppOfArity `Hex.Nat.PrimeCert.pock 2 ||\n e.isAppOfArity `Hex.Nat.PrimeCert.pock3 5 ||\n e.isAppOfArity `Hex.Nat.PrimeCert.pock3Sieve 6 do return none\n let args := e.getAppArgs\n let fs := args.back!\n unless fs.isAppOfArity ``List.cons 3 do return none\n let fsArgs := fs.getAppArgs\n let entry := fsArgs[1]!\n unless entry.isAppOfArity ``Prod.mk 4 do return none\n let entryArgs := entry.getAppArgs\n let entry := Lean.mkAppN entry.getAppFn (entryArgs.set! 2 (Lean.mkRawNatLit 0))\n let fs := Lean.mkAppN fs.getAppFn (fsArgs.set! 1 entry)\n return some (Lean.mkAppN e.getAppFn (args.set! (args.size - 1) fs))\n let needsWitness := value.getUsedConstants.any fun name =>\n name == `Hex.Nat.PrimeCert.pock || name == `Hex.Nat.PrimeCert.pock3 ||\n name == `Hex.Nat.PrimeCert.pock3Sieve\n if needsWitness && corruptWitness == value then\n throwError \"witness corruption did not change the proof\"\n if corruptWitness != value then\n let bad := Lean.mkApp (Lean.mkLambda `h .default type (Lean.mkBVar 0)) corruptWitness\n match Lean.Kernel.check env {} bad with\n | .error _ => pure ()\n | .ok _ => throwError \"kernel accepted the zero witness base\"\n Lean.logInfo \"DIRECT_WITNESS_CONTROL rejected\"\n for _ in [:8] do\n let input \u2190 IO.mkRef (env, proof)\n let (env, proof) \u2190 input.get\n let start \u2190 IO.monoNanosNow\n let checked \u2190 IO.mkRef (Lean.Kernel.check env {} proof)\n let checked \u2190 checked.get\n let stop \u2190 IO.monoNanosNow\n match checked with\n | .error _ => throwError \"kernel recheck failed\"\n | .ok _ => pure ()\n Lean.logInfo m!\"DIRECT_KERNEL_NS {stop - start}\"\n Lean.logInfo m!\"DIRECT_DEPENDENCIES {value.getUsedConstants}\"\n",
"ns": [
1257264,
1220570,
1259448,
1199929,
1188922,
1186960,
1186279,
1182913
]
},
{
"block": 2,
"arm": "m1",
"stdout": "\u2139 [70/70] Replayed HexPrimality.SieveToolsProbe\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_WITNESS_CONTROL rejected\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1257264\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1220570\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1259448\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1199929\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1188922\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1186960\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1186279\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1182913\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\nBuild completed successfully (70 jobs).\n",
"stderr": "",
"returncode": 0,
"source": "module\npublic import HexPrimality.Cert\npublic import Lean\npublic meta import Lean\npublic section\nset_option maxRecDepth 100000\nopen Hex.Nat\nmutual\n@[expose] def oldCheck : PrimeCert \u2192 Bool\n | .small n => tableSearch n\n | .pock n fs => checkPockArith n fs && oldChildren fs\n | .pock3 n r s w fs => checkPock3Arith n r s w fs && oldChildren fs\n | .pock3Sieve n r s w m fs => checkPock3SieveArith n r s w m fs && oldChildren fs\n@[expose] def oldChildren : List (Nat \u00d7 Nat \u00d7 PrimeCert) \u2192 Bool\n | [] => true\n | (_, _, c) :: cs => oldCheck c && oldChildren cs\nend\n\ndef certificate : PrimeCert := .pock3 9223372036904058881 1677731 167772 1677730 [(3, 19, .small 2), (2, 0, .small 5)]\ntheorem oldResult : oldCheck certificate = true := by decide +kernel\ntheorem result : Hex.Nat.Prime 9223372036904058881 := Hex.Nat.prime_of_checkPrimeAt (c := certificate) (by decide +kernel)\n\nmeta partial def inlineLocal (env : Lean.Environment) (e : Lean.Expr) : Lean.Expr :=\n e.replace fun sub => match sub with\n | .const n levels =>\n if env.isImportedConst n then none else\n match env.find? n with\n | some info => (info.value? (allowOpaque := true)).map fun value =>\n inlineLocal env (value.instantiateLevelParams info.levelParams levels)\n | none => none\n | _ => none\n\nrun_cmd do\n let env \u2190 Lean.getEnv\n let some (.thmInfo info) := env.find? `result\n | throwError \"missing result theorem\"\n let value := inlineLocal env info.value\n let type := inlineLocal env info.type\n unless (value.getUsedConstants ++ type.getUsedConstants).all env.isImportedConst do\n throwError \"unexpanded local proof dependency\"\n -- The identity application checks the proof against its declared goal type.\n let proof := Lean.mkApp (Lean.mkLambda `h .default type (Lean.mkBVar 0)) value\n -- Explicitly finish pending elaboration-time kernel tasks before timing.\n let ready \u2190 IO.mkRef env.toKernelEnv\n let ready \u2190 ready.get\n let env := Lean.Environment.ofKernelEnv ready\n -- An invalid equality must be rejected by this same kernel entry point.\n let badType := Lean.mkApp3 (Lean.mkConst ``Eq [.succ .zero])\n (Lean.mkConst ``Bool) (Lean.mkConst ``Bool.true) (Lean.mkConst ``Bool.false)\n let badProof := Lean.mkApp (Lean.mkLambda `h .default badType (Lean.mkBVar 0))\n Lean.reflBoolTrue\n match Lean.Kernel.check env {} badProof with\n | .error _ => pure ()\n | .ok _ => throwError \"kernel accepted the negative control\"\n let corrupt := value.replace fun e => match e with\n | .lit (.natVal n) => if n == 9223372036904058881 then some (Lean.mkRawNatLit (n + 2)) else none\n | _ => none\n if corrupt == value then throwError \"subject corruption did not change the proof\"\n let corrupt := Lean.mkApp (Lean.mkLambda `h .default type (Lean.mkBVar 0)) corrupt\n match Lean.Kernel.check env {} corrupt with\n | .error _ => pure ()\n | .ok _ => throwError \"kernel accepted the corrupted proof\"\n -- Change only a Hex witness base: subjects, products, and ordering remain\n -- intact, so this control must reach the witness arithmetic.\n let corruptWitness := value.replace fun e => Id.run do\n unless e.isAppOfArity `Hex.Nat.PrimeCert.pock 2 ||\n e.isAppOfArity `Hex.Nat.PrimeCert.pock3 5 ||\n e.isAppOfArity `Hex.Nat.PrimeCert.pock3Sieve 6 do return none\n let args := e.getAppArgs\n let fs := args.back!\n unless fs.isAppOfArity ``List.cons 3 do return none\n let fsArgs := fs.getAppArgs\n let entry := fsArgs[1]!\n unless entry.isAppOfArity ``Prod.mk 4 do return none\n let entryArgs := entry.getAppArgs\n let entry := Lean.mkAppN entry.getAppFn (entryArgs.set! 2 (Lean.mkRawNatLit 0))\n let fs := Lean.mkAppN fs.getAppFn (fsArgs.set! 1 entry)\n return some (Lean.mkAppN e.getAppFn (args.set! (args.size - 1) fs))\n let needsWitness := value.getUsedConstants.any fun name =>\n name == `Hex.Nat.PrimeCert.pock || name == `Hex.Nat.PrimeCert.pock3 ||\n name == `Hex.Nat.PrimeCert.pock3Sieve\n if needsWitness && corruptWitness == value then\n throwError \"witness corruption did not change the proof\"\n if corruptWitness != value then\n let bad := Lean.mkApp (Lean.mkLambda `h .default type (Lean.mkBVar 0)) corruptWitness\n match Lean.Kernel.check env {} bad with\n | .error _ => pure ()\n | .ok _ => throwError \"kernel accepted the zero witness base\"\n Lean.logInfo \"DIRECT_WITNESS_CONTROL rejected\"\n for _ in [:8] do\n let input \u2190 IO.mkRef (env, proof)\n let (env, proof) \u2190 input.get\n let start \u2190 IO.monoNanosNow\n let checked \u2190 IO.mkRef (Lean.Kernel.check env {} proof)\n let checked \u2190 checked.get\n let stop \u2190 IO.monoNanosNow\n match checked with\n | .error _ => throwError \"kernel recheck failed\"\n | .ok _ => pure ()\n Lean.logInfo m!\"DIRECT_KERNEL_NS {stop - start}\"\n Lean.logInfo m!\"DIRECT_DEPENDENCIES {value.getUsedConstants}\"\n",
"ns": [
1257264,
1220570,
1259448,
1199929,
1188922,
1186960,
1186279,
1182913
]
},
{
"block": 2,
"arm": "m4",
"stdout": "\u2139 [70/70] Built HexPrimality.SieveToolsProbe (1.3s)\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_WITNESS_CONTROL rejected\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1035335\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1002676\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1042386\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 978731\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 974275\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 965521\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 968265\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 967354\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\nBuild completed successfully (70 jobs).\n",
"stderr": "",
"returncode": 0,
"source": "module\npublic import HexPrimality.Cert\npublic import Lean\npublic meta import Lean\npublic section\nset_option maxRecDepth 100000\nopen Hex.Nat\nmutual\n@[expose] def oldCheck : PrimeCert \u2192 Bool\n | .small n => tableSearch n\n | .pock n fs => checkPockArith n fs && oldChildren fs\n | .pock3 n r s w fs => checkPock3Arith n r s w fs && oldChildren fs\n | .pock3Sieve n r s w m fs => checkPock3SieveArith n r s w m fs && oldChildren fs\n@[expose] def oldChildren : List (Nat \u00d7 Nat \u00d7 PrimeCert) \u2192 Bool\n | [] => true\n | (_, _, c) :: cs => oldCheck c && oldChildren cs\nend\n\ndef certificate : PrimeCert := .pock3Sieve 9223372036904058881 47 4194304 0 4 [(3, 19, .small 2)]\ntheorem oldResult : oldCheck certificate = true := by decide +kernel\ntheorem result : Hex.Nat.Prime 9223372036904058881 := Hex.Nat.prime_of_checkPrimeAt (c := certificate) (by decide +kernel)\n\nmeta partial def inlineLocal (env : Lean.Environment) (e : Lean.Expr) : Lean.Expr :=\n e.replace fun sub => match sub with\n | .const n levels =>\n if env.isImportedConst n then none else\n match env.find? n with\n | some info => (info.value? (allowOpaque := true)).map fun value =>\n inlineLocal env (value.instantiateLevelParams info.levelParams levels)\n | none => none\n | _ => none\n\nrun_cmd do\n let env \u2190 Lean.getEnv\n let some (.thmInfo info) := env.find? `result\n | throwError \"missing result theorem\"\n let value := inlineLocal env info.value\n let type := inlineLocal env info.type\n unless (value.getUsedConstants ++ type.getUsedConstants).all env.isImportedConst do\n throwError \"unexpanded local proof dependency\"\n -- The identity application checks the proof against its declared goal type.\n let proof := Lean.mkApp (Lean.mkLambda `h .default type (Lean.mkBVar 0)) value\n -- Explicitly finish pending elaboration-time kernel tasks before timing.\n let ready \u2190 IO.mkRef env.toKernelEnv\n let ready \u2190 ready.get\n let env := Lean.Environment.ofKernelEnv ready\n -- An invalid equality must be rejected by this same kernel entry point.\n let badType := Lean.mkApp3 (Lean.mkConst ``Eq [.succ .zero])\n (Lean.mkConst ``Bool) (Lean.mkConst ``Bool.true) (Lean.mkConst ``Bool.false)\n let badProof := Lean.mkApp (Lean.mkLambda `h .default badType (Lean.mkBVar 0))\n Lean.reflBoolTrue\n match Lean.Kernel.check env {} badProof with\n | .error _ => pure ()\n | .ok _ => throwError \"kernel accepted the negative control\"\n let corrupt := value.replace fun e => match e with\n | .lit (.natVal n) => if n == 9223372036904058881 then some (Lean.mkRawNatLit (n + 2)) else none\n | _ => none\n if corrupt == value then throwError \"subject corruption did not change the proof\"\n let corrupt := Lean.mkApp (Lean.mkLambda `h .default type (Lean.mkBVar 0)) corrupt\n match Lean.Kernel.check env {} corrupt with\n | .error _ => pure ()\n | .ok _ => throwError \"kernel accepted the corrupted proof\"\n -- Change only a Hex witness base: subjects, products, and ordering remain\n -- intact, so this control must reach the witness arithmetic.\n let corruptWitness := value.replace fun e => Id.run do\n unless e.isAppOfArity `Hex.Nat.PrimeCert.pock 2 ||\n e.isAppOfArity `Hex.Nat.PrimeCert.pock3 5 ||\n e.isAppOfArity `Hex.Nat.PrimeCert.pock3Sieve 6 do return none\n let args := e.getAppArgs\n let fs := args.back!\n unless fs.isAppOfArity ``List.cons 3 do return none\n let fsArgs := fs.getAppArgs\n let entry := fsArgs[1]!\n unless entry.isAppOfArity ``Prod.mk 4 do return none\n let entryArgs := entry.getAppArgs\n let entry := Lean.mkAppN entry.getAppFn (entryArgs.set! 2 (Lean.mkRawNatLit 0))\n let fs := Lean.mkAppN fs.getAppFn (fsArgs.set! 1 entry)\n return some (Lean.mkAppN e.getAppFn (args.set! (args.size - 1) fs))\n let needsWitness := value.getUsedConstants.any fun name =>\n name == `Hex.Nat.PrimeCert.pock || name == `Hex.Nat.PrimeCert.pock3 ||\n name == `Hex.Nat.PrimeCert.pock3Sieve\n if needsWitness && corruptWitness == value then\n throwError \"witness corruption did not change the proof\"\n if corruptWitness != value then\n let bad := Lean.mkApp (Lean.mkLambda `h .default type (Lean.mkBVar 0)) corruptWitness\n match Lean.Kernel.check env {} bad with\n | .error _ => pure ()\n | .ok _ => throwError \"kernel accepted the zero witness base\"\n Lean.logInfo \"DIRECT_WITNESS_CONTROL rejected\"\n for _ in [:8] do\n let input \u2190 IO.mkRef (env, proof)\n let (env, proof) \u2190 input.get\n let start \u2190 IO.monoNanosNow\n let checked \u2190 IO.mkRef (Lean.Kernel.check env {} proof)\n let checked \u2190 checked.get\n let stop \u2190 IO.monoNanosNow\n match checked with\n | .error _ => throwError \"kernel recheck failed\"\n | .ok _ => pure ()\n Lean.logInfo m!\"DIRECT_KERNEL_NS {stop - start}\"\n Lean.logInfo m!\"DIRECT_DEPENDENCIES {value.getUsedConstants}\"\n",
"ns": [
1035335,
1002676,
1042386,
978731,
974275,
965521,
968265,
967354
]
},
{
"block": 3,
"arm": "m4",
"stdout": "\u2139 [70/70] Replayed HexPrimality.SieveToolsProbe\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_WITNESS_CONTROL rejected\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1035335\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1002676\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1042386\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 978731\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 974275\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 965521\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 968265\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 967354\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\nBuild completed successfully (70 jobs).\n",
"stderr": "",
"returncode": 0,
"source": "module\npublic import HexPrimality.Cert\npublic import Lean\npublic meta import Lean\npublic section\nset_option maxRecDepth 100000\nopen Hex.Nat\nmutual\n@[expose] def oldCheck : PrimeCert \u2192 Bool\n | .small n => tableSearch n\n | .pock n fs => checkPockArith n fs && oldChildren fs\n | .pock3 n r s w fs => checkPock3Arith n r s w fs && oldChildren fs\n | .pock3Sieve n r s w m fs => checkPock3SieveArith n r s w m fs && oldChildren fs\n@[expose] def oldChildren : List (Nat \u00d7 Nat \u00d7 PrimeCert) \u2192 Bool\n | [] => true\n | (_, _, c) :: cs => oldCheck c && oldChildren cs\nend\n\ndef certificate : PrimeCert := .pock3Sieve 9223372036904058881 47 4194304 0 4 [(3, 19, .small 2)]\ntheorem oldResult : oldCheck certificate = true := by decide +kernel\ntheorem result : Hex.Nat.Prime 9223372036904058881 := Hex.Nat.prime_of_checkPrimeAt (c := certificate) (by decide +kernel)\n\nmeta partial def inlineLocal (env : Lean.Environment) (e : Lean.Expr) : Lean.Expr :=\n e.replace fun sub => match sub with\n | .const n levels =>\n if env.isImportedConst n then none else\n match env.find? n with\n | some info => (info.value? (allowOpaque := true)).map fun value =>\n inlineLocal env (value.instantiateLevelParams info.levelParams levels)\n | none => none\n | _ => none\n\nrun_cmd do\n let env \u2190 Lean.getEnv\n let some (.thmInfo info) := env.find? `result\n | throwError \"missing result theorem\"\n let value := inlineLocal env info.value\n let type := inlineLocal env info.type\n unless (value.getUsedConstants ++ type.getUsedConstants).all env.isImportedConst do\n throwError \"unexpanded local proof dependency\"\n -- The identity application checks the proof against its declared goal type.\n let proof := Lean.mkApp (Lean.mkLambda `h .default type (Lean.mkBVar 0)) value\n -- Explicitly finish pending elaboration-time kernel tasks before timing.\n let ready \u2190 IO.mkRef env.toKernelEnv\n let ready \u2190 ready.get\n let env := Lean.Environment.ofKernelEnv ready\n -- An invalid equality must be rejected by this same kernel entry point.\n let badType := Lean.mkApp3 (Lean.mkConst ``Eq [.succ .zero])\n (Lean.mkConst ``Bool) (Lean.mkConst ``Bool.true) (Lean.mkConst ``Bool.false)\n let badProof := Lean.mkApp (Lean.mkLambda `h .default badType (Lean.mkBVar 0))\n Lean.reflBoolTrue\n match Lean.Kernel.check env {} badProof with\n | .error _ => pure ()\n | .ok _ => throwError \"kernel accepted the negative control\"\n let corrupt := value.replace fun e => match e with\n | .lit (.natVal n) => if n == 9223372036904058881 then some (Lean.mkRawNatLit (n + 2)) else none\n | _ => none\n if corrupt == value then throwError \"subject corruption did not change the proof\"\n let corrupt := Lean.mkApp (Lean.mkLambda `h .default type (Lean.mkBVar 0)) corrupt\n match Lean.Kernel.check env {} corrupt with\n | .error _ => pure ()\n | .ok _ => throwError \"kernel accepted the corrupted proof\"\n -- Change only a Hex witness base: subjects, products, and ordering remain\n -- intact, so this control must reach the witness arithmetic.\n let corruptWitness := value.replace fun e => Id.run do\n unless e.isAppOfArity `Hex.Nat.PrimeCert.pock 2 ||\n e.isAppOfArity `Hex.Nat.PrimeCert.pock3 5 ||\n e.isAppOfArity `Hex.Nat.PrimeCert.pock3Sieve 6 do return none\n let args := e.getAppArgs\n let fs := args.back!\n unless fs.isAppOfArity ``List.cons 3 do return none\n let fsArgs := fs.getAppArgs\n let entry := fsArgs[1]!\n unless entry.isAppOfArity ``Prod.mk 4 do return none\n let entryArgs := entry.getAppArgs\n let entry := Lean.mkAppN entry.getAppFn (entryArgs.set! 2 (Lean.mkRawNatLit 0))\n let fs := Lean.mkAppN fs.getAppFn (fsArgs.set! 1 entry)\n return some (Lean.mkAppN e.getAppFn (args.set! (args.size - 1) fs))\n let needsWitness := value.getUsedConstants.any fun name =>\n name == `Hex.Nat.PrimeCert.pock || name == `Hex.Nat.PrimeCert.pock3 ||\n name == `Hex.Nat.PrimeCert.pock3Sieve\n if needsWitness && corruptWitness == value then\n throwError \"witness corruption did not change the proof\"\n if corruptWitness != value then\n let bad := Lean.mkApp (Lean.mkLambda `h .default type (Lean.mkBVar 0)) corruptWitness\n match Lean.Kernel.check env {} bad with\n | .error _ => pure ()\n | .ok _ => throwError \"kernel accepted the zero witness base\"\n Lean.logInfo \"DIRECT_WITNESS_CONTROL rejected\"\n for _ in [:8] do\n let input \u2190 IO.mkRef (env, proof)\n let (env, proof) \u2190 input.get\n let start \u2190 IO.monoNanosNow\n let checked \u2190 IO.mkRef (Lean.Kernel.check env {} proof)\n let checked \u2190 checked.get\n let stop \u2190 IO.monoNanosNow\n match checked with\n | .error _ => throwError \"kernel recheck failed\"\n | .ok _ => pure ()\n Lean.logInfo m!\"DIRECT_KERNEL_NS {stop - start}\"\n Lean.logInfo m!\"DIRECT_DEPENDENCIES {value.getUsedConstants}\"\n",
"ns": [
1035335,
1002676,
1042386,
978731,
974275,
965521,
968265,
967354
]
},
{
"block": 3,
"arm": "m1",
"stdout": "\u2139 [70/70] Built HexPrimality.SieveToolsProbe (1.3s)\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_WITNESS_CONTROL rejected\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1250123\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1216513\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1193489\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1245787\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1196273\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1187290\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1181812\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1175964\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\nBuild completed successfully (70 jobs).\n",
"stderr": "",
"returncode": 0,
"source": "module\npublic import HexPrimality.Cert\npublic import Lean\npublic meta import Lean\npublic section\nset_option maxRecDepth 100000\nopen Hex.Nat\nmutual\n@[expose] def oldCheck : PrimeCert \u2192 Bool\n | .small n => tableSearch n\n | .pock n fs => checkPockArith n fs && oldChildren fs\n | .pock3 n r s w fs => checkPock3Arith n r s w fs && oldChildren fs\n | .pock3Sieve n r s w m fs => checkPock3SieveArith n r s w m fs && oldChildren fs\n@[expose] def oldChildren : List (Nat \u00d7 Nat \u00d7 PrimeCert) \u2192 Bool\n | [] => true\n | (_, _, c) :: cs => oldCheck c && oldChildren cs\nend\n\ndef certificate : PrimeCert := .pock3 9223372036904058881 1677731 167772 1677730 [(3, 19, .small 2), (2, 0, .small 5)]\ntheorem oldResult : oldCheck certificate = true := by decide +kernel\ntheorem result : Hex.Nat.Prime 9223372036904058881 := Hex.Nat.prime_of_checkPrimeAt (c := certificate) (by decide +kernel)\n\nmeta partial def inlineLocal (env : Lean.Environment) (e : Lean.Expr) : Lean.Expr :=\n e.replace fun sub => match sub with\n | .const n levels =>\n if env.isImportedConst n then none else\n match env.find? n with\n | some info => (info.value? (allowOpaque := true)).map fun value =>\n inlineLocal env (value.instantiateLevelParams info.levelParams levels)\n | none => none\n | _ => none\n\nrun_cmd do\n let env \u2190 Lean.getEnv\n let some (.thmInfo info) := env.find? `result\n | throwError \"missing result theorem\"\n let value := inlineLocal env info.value\n let type := inlineLocal env info.type\n unless (value.getUsedConstants ++ type.getUsedConstants).all env.isImportedConst do\n throwError \"unexpanded local proof dependency\"\n -- The identity application checks the proof against its declared goal type.\n let proof := Lean.mkApp (Lean.mkLambda `h .default type (Lean.mkBVar 0)) value\n -- Explicitly finish pending elaboration-time kernel tasks before timing.\n let ready \u2190 IO.mkRef env.toKernelEnv\n let ready \u2190 ready.get\n let env := Lean.Environment.ofKernelEnv ready\n -- An invalid equality must be rejected by this same kernel entry point.\n let badType := Lean.mkApp3 (Lean.mkConst ``Eq [.succ .zero])\n (Lean.mkConst ``Bool) (Lean.mkConst ``Bool.true) (Lean.mkConst ``Bool.false)\n let badProof := Lean.mkApp (Lean.mkLambda `h .default badType (Lean.mkBVar 0))\n Lean.reflBoolTrue\n match Lean.Kernel.check env {} badProof with\n | .error _ => pure ()\n | .ok _ => throwError \"kernel accepted the negative control\"\n let corrupt := value.replace fun e => match e with\n | .lit (.natVal n) => if n == 9223372036904058881 then some (Lean.mkRawNatLit (n + 2)) else none\n | _ => none\n if corrupt == value then throwError \"subject corruption did not change the proof\"\n let corrupt := Lean.mkApp (Lean.mkLambda `h .default type (Lean.mkBVar 0)) corrupt\n match Lean.Kernel.check env {} corrupt with\n | .error _ => pure ()\n | .ok _ => throwError \"kernel accepted the corrupted proof\"\n -- Change only a Hex witness base: subjects, products, and ordering remain\n -- intact, so this control must reach the witness arithmetic.\n let corruptWitness := value.replace fun e => Id.run do\n unless e.isAppOfArity `Hex.Nat.PrimeCert.pock 2 ||\n e.isAppOfArity `Hex.Nat.PrimeCert.pock3 5 ||\n e.isAppOfArity `Hex.Nat.PrimeCert.pock3Sieve 6 do return none\n let args := e.getAppArgs\n let fs := args.back!\n unless fs.isAppOfArity ``List.cons 3 do return none\n let fsArgs := fs.getAppArgs\n let entry := fsArgs[1]!\n unless entry.isAppOfArity ``Prod.mk 4 do return none\n let entryArgs := entry.getAppArgs\n let entry := Lean.mkAppN entry.getAppFn (entryArgs.set! 2 (Lean.mkRawNatLit 0))\n let fs := Lean.mkAppN fs.getAppFn (fsArgs.set! 1 entry)\n return some (Lean.mkAppN e.getAppFn (args.set! (args.size - 1) fs))\n let needsWitness := value.getUsedConstants.any fun name =>\n name == `Hex.Nat.PrimeCert.pock || name == `Hex.Nat.PrimeCert.pock3 ||\n name == `Hex.Nat.PrimeCert.pock3Sieve\n if needsWitness && corruptWitness == value then\n throwError \"witness corruption did not change the proof\"\n if corruptWitness != value then\n let bad := Lean.mkApp (Lean.mkLambda `h .default type (Lean.mkBVar 0)) corruptWitness\n match Lean.Kernel.check env {} bad with\n | .error _ => pure ()\n | .ok _ => throwError \"kernel accepted the zero witness base\"\n Lean.logInfo \"DIRECT_WITNESS_CONTROL rejected\"\n for _ in [:8] do\n let input \u2190 IO.mkRef (env, proof)\n let (env, proof) \u2190 input.get\n let start \u2190 IO.monoNanosNow\n let checked \u2190 IO.mkRef (Lean.Kernel.check env {} proof)\n let checked \u2190 checked.get\n let stop \u2190 IO.monoNanosNow\n match checked with\n | .error _ => throwError \"kernel recheck failed\"\n | .ok _ => pure ()\n Lean.logInfo m!\"DIRECT_KERNEL_NS {stop - start}\"\n Lean.logInfo m!\"DIRECT_DEPENDENCIES {value.getUsedConstants}\"\n",
"ns": [
1250123,
1216513,
1193489,
1245787,
1196273,
1187290,
1181812,
1175964
]
}
],
"load_after": [
3.35009765625,
3.4189453125,
3.90625
],
"invalid_reason": "Consecutive identical sources replayed Lake logs instead of executing fresh kernel checks."
}
{
"cpu": 0,
"load_before": [
3.6943359375,
3.51123046875,
3.91943359375
],
"rows": [
{
"block": 0,
"arm": "m1",
"stdout": "\u2139 [70/70] Built HexPrimality.SieveToolsProbe (1.3s)\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_WITNESS_CONTROL rejected\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1277594\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1302702\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1207980\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1204115\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1193720\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1191136\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1191337\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1185898\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\nBuild completed successfully (70 jobs).\n",
"stderr": "",
"returncode": 0,
"source": "module\npublic import HexPrimality.Cert\npublic import Lean\npublic meta import Lean\npublic section\nset_option maxRecDepth 100000\nopen Hex.Nat\nmutual\n@[expose] def oldCheck : PrimeCert \u2192 Bool\n | .small n => tableSearch n\n | .pock n fs => checkPockArith n fs && oldChildren fs\n | .pock3 n r s w fs => checkPock3Arith n r s w fs && oldChildren fs\n | .pock3Sieve n r s w m fs => checkPock3SieveArith n r s w m fs && oldChildren fs\n@[expose] def oldChildren : List (Nat \u00d7 Nat \u00d7 PrimeCert) \u2192 Bool\n | [] => true\n | (_, _, c) :: cs => oldCheck c && oldChildren cs\nend\n\ndef certificate : PrimeCert := .pock3 9223372036904058881 1677731 167772 1677730 [(3, 19, .small 2), (2, 0, .small 5)]\ntheorem oldResult : oldCheck certificate = true := by decide +kernel\ntheorem result : Hex.Nat.Prime 9223372036904058881 := Hex.Nat.prime_of_checkPrimeAt (c := certificate) (by decide +kernel)\n\nmeta partial def inlineLocal (env : Lean.Environment) (e : Lean.Expr) : Lean.Expr :=\n e.replace fun sub => match sub with\n | .const n levels =>\n if env.isImportedConst n then none else\n match env.find? n with\n | some info => (info.value? (allowOpaque := true)).map fun value =>\n inlineLocal env (value.instantiateLevelParams info.levelParams levels)\n | none => none\n | _ => none\n\nrun_cmd do\n let env \u2190 Lean.getEnv\n let some (.thmInfo info) := env.find? `result\n | throwError \"missing result theorem\"\n let value := inlineLocal env info.value\n let type := inlineLocal env info.type\n unless (value.getUsedConstants ++ type.getUsedConstants).all env.isImportedConst do\n throwError \"unexpanded local proof dependency\"\n -- The identity application checks the proof against its declared goal type.\n let proof := Lean.mkApp (Lean.mkLambda `h .default type (Lean.mkBVar 0)) value\n -- Explicitly finish pending elaboration-time kernel tasks before timing.\n let ready \u2190 IO.mkRef env.toKernelEnv\n let ready \u2190 ready.get\n let env := Lean.Environment.ofKernelEnv ready\n -- An invalid equality must be rejected by this same kernel entry point.\n let badType := Lean.mkApp3 (Lean.mkConst ``Eq [.succ .zero])\n (Lean.mkConst ``Bool) (Lean.mkConst ``Bool.true) (Lean.mkConst ``Bool.false)\n let badProof := Lean.mkApp (Lean.mkLambda `h .default badType (Lean.mkBVar 0))\n Lean.reflBoolTrue\n match Lean.Kernel.check env {} badProof with\n | .error _ => pure ()\n | .ok _ => throwError \"kernel accepted the negative control\"\n let corrupt := value.replace fun e => match e with\n | .lit (.natVal n) => if n == 9223372036904058881 then some (Lean.mkRawNatLit (n + 2)) else none\n | _ => none\n if corrupt == value then throwError \"subject corruption did not change the proof\"\n let corrupt := Lean.mkApp (Lean.mkLambda `h .default type (Lean.mkBVar 0)) corrupt\n match Lean.Kernel.check env {} corrupt with\n | .error _ => pure ()\n | .ok _ => throwError \"kernel accepted the corrupted proof\"\n -- Change only a Hex witness base: subjects, products, and ordering remain\n -- intact, so this control must reach the witness arithmetic.\n let corruptWitness := value.replace fun e => Id.run do\n unless e.isAppOfArity `Hex.Nat.PrimeCert.pock 2 ||\n e.isAppOfArity `Hex.Nat.PrimeCert.pock3 5 ||\n e.isAppOfArity `Hex.Nat.PrimeCert.pock3Sieve 6 do return none\n let args := e.getAppArgs\n let fs := args.back!\n unless fs.isAppOfArity ``List.cons 3 do return none\n let fsArgs := fs.getAppArgs\n let entry := fsArgs[1]!\n unless entry.isAppOfArity ``Prod.mk 4 do return none\n let entryArgs := entry.getAppArgs\n let entry := Lean.mkAppN entry.getAppFn (entryArgs.set! 2 (Lean.mkRawNatLit 0))\n let fs := Lean.mkAppN fs.getAppFn (fsArgs.set! 1 entry)\n return some (Lean.mkAppN e.getAppFn (args.set! (args.size - 1) fs))\n let needsWitness := value.getUsedConstants.any fun name =>\n name == `Hex.Nat.PrimeCert.pock || name == `Hex.Nat.PrimeCert.pock3 ||\n name == `Hex.Nat.PrimeCert.pock3Sieve\n if needsWitness && corruptWitness == value then\n throwError \"witness corruption did not change the proof\"\n if corruptWitness != value then\n let bad := Lean.mkApp (Lean.mkLambda `h .default type (Lean.mkBVar 0)) corruptWitness\n match Lean.Kernel.check env {} bad with\n | .error _ => pure ()\n | .ok _ => throwError \"kernel accepted the zero witness base\"\n Lean.logInfo \"DIRECT_WITNESS_CONTROL rejected\"\n for _ in [:8] do\n let input \u2190 IO.mkRef (env, proof)\n let (env, proof) \u2190 input.get\n let start \u2190 IO.monoNanosNow\n let checked \u2190 IO.mkRef (Lean.Kernel.check env {} proof)\n let checked \u2190 checked.get\n let stop \u2190 IO.monoNanosNow\n match checked with\n | .error _ => throwError \"kernel recheck failed\"\n | .ok _ => pure ()\n Lean.logInfo m!\"DIRECT_KERNEL_NS {stop - start}\"\n Lean.logInfo m!\"DIRECT_DEPENDENCIES {value.getUsedConstants}\"\n\n-- Measurement block 0, arm m1.\n",
"ns": [
1277594,
1302702,
1207980,
1204115,
1193720,
1191136,
1191337,
1185898
]
},
{
"block": 0,
"arm": "m4",
"stdout": "\u2139 [70/70] Built HexPrimality.SieveToolsProbe (1.3s)\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_WITNESS_CONTROL rejected\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1028285\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 992482\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 987313\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 966193\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 962978\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 949147\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 953464\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 952462\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\nBuild completed successfully (70 jobs).\n",
"stderr": "",
"returncode": 0,
"source": "module\npublic import HexPrimality.Cert\npublic import Lean\npublic meta import Lean\npublic section\nset_option maxRecDepth 100000\nopen Hex.Nat\nmutual\n@[expose] def oldCheck : PrimeCert \u2192 Bool\n | .small n => tableSearch n\n | .pock n fs => checkPockArith n fs && oldChildren fs\n | .pock3 n r s w fs => checkPock3Arith n r s w fs && oldChildren fs\n | .pock3Sieve n r s w m fs => checkPock3SieveArith n r s w m fs && oldChildren fs\n@[expose] def oldChildren : List (Nat \u00d7 Nat \u00d7 PrimeCert) \u2192 Bool\n | [] => true\n | (_, _, c) :: cs => oldCheck c && oldChildren cs\nend\n\ndef certificate : PrimeCert := .pock3Sieve 9223372036904058881 47 4194304 0 4 [(3, 19, .small 2)]\ntheorem oldResult : oldCheck certificate = true := by decide +kernel\ntheorem result : Hex.Nat.Prime 9223372036904058881 := Hex.Nat.prime_of_checkPrimeAt (c := certificate) (by decide +kernel)\n\nmeta partial def inlineLocal (env : Lean.Environment) (e : Lean.Expr) : Lean.Expr :=\n e.replace fun sub => match sub with\n | .const n levels =>\n if env.isImportedConst n then none else\n match env.find? n with\n | some info => (info.value? (allowOpaque := true)).map fun value =>\n inlineLocal env (value.instantiateLevelParams info.levelParams levels)\n | none => none\n | _ => none\n\nrun_cmd do\n let env \u2190 Lean.getEnv\n let some (.thmInfo info) := env.find? `result\n | throwError \"missing result theorem\"\n let value := inlineLocal env info.value\n let type := inlineLocal env info.type\n unless (value.getUsedConstants ++ type.getUsedConstants).all env.isImportedConst do\n throwError \"unexpanded local proof dependency\"\n -- The identity application checks the proof against its declared goal type.\n let proof := Lean.mkApp (Lean.mkLambda `h .default type (Lean.mkBVar 0)) value\n -- Explicitly finish pending elaboration-time kernel tasks before timing.\n let ready \u2190 IO.mkRef env.toKernelEnv\n let ready \u2190 ready.get\n let env := Lean.Environment.ofKernelEnv ready\n -- An invalid equality must be rejected by this same kernel entry point.\n let badType := Lean.mkApp3 (Lean.mkConst ``Eq [.succ .zero])\n (Lean.mkConst ``Bool) (Lean.mkConst ``Bool.true) (Lean.mkConst ``Bool.false)\n let badProof := Lean.mkApp (Lean.mkLambda `h .default badType (Lean.mkBVar 0))\n Lean.reflBoolTrue\n match Lean.Kernel.check env {} badProof with\n | .error _ => pure ()\n | .ok _ => throwError \"kernel accepted the negative control\"\n let corrupt := value.replace fun e => match e with\n | .lit (.natVal n) => if n == 9223372036904058881 then some (Lean.mkRawNatLit (n + 2)) else none\n | _ => none\n if corrupt == value then throwError \"subject corruption did not change the proof\"\n let corrupt := Lean.mkApp (Lean.mkLambda `h .default type (Lean.mkBVar 0)) corrupt\n match Lean.Kernel.check env {} corrupt with\n | .error _ => pure ()\n | .ok _ => throwError \"kernel accepted the corrupted proof\"\n -- Change only a Hex witness base: subjects, products, and ordering remain\n -- intact, so this control must reach the witness arithmetic.\n let corruptWitness := value.replace fun e => Id.run do\n unless e.isAppOfArity `Hex.Nat.PrimeCert.pock 2 ||\n e.isAppOfArity `Hex.Nat.PrimeCert.pock3 5 ||\n e.isAppOfArity `Hex.Nat.PrimeCert.pock3Sieve 6 do return none\n let args := e.getAppArgs\n let fs := args.back!\n unless fs.isAppOfArity ``List.cons 3 do return none\n let fsArgs := fs.getAppArgs\n let entry := fsArgs[1]!\n unless entry.isAppOfArity ``Prod.mk 4 do return none\n let entryArgs := entry.getAppArgs\n let entry := Lean.mkAppN entry.getAppFn (entryArgs.set! 2 (Lean.mkRawNatLit 0))\n let fs := Lean.mkAppN fs.getAppFn (fsArgs.set! 1 entry)\n return some (Lean.mkAppN e.getAppFn (args.set! (args.size - 1) fs))\n let needsWitness := value.getUsedConstants.any fun name =>\n name == `Hex.Nat.PrimeCert.pock || name == `Hex.Nat.PrimeCert.pock3 ||\n name == `Hex.Nat.PrimeCert.pock3Sieve\n if needsWitness && corruptWitness == value then\n throwError \"witness corruption did not change the proof\"\n if corruptWitness != value then\n let bad := Lean.mkApp (Lean.mkLambda `h .default type (Lean.mkBVar 0)) corruptWitness\n match Lean.Kernel.check env {} bad with\n | .error _ => pure ()\n | .ok _ => throwError \"kernel accepted the zero witness base\"\n Lean.logInfo \"DIRECT_WITNESS_CONTROL rejected\"\n for _ in [:8] do\n let input \u2190 IO.mkRef (env, proof)\n let (env, proof) \u2190 input.get\n let start \u2190 IO.monoNanosNow\n let checked \u2190 IO.mkRef (Lean.Kernel.check env {} proof)\n let checked \u2190 checked.get\n let stop \u2190 IO.monoNanosNow\n match checked with\n | .error _ => throwError \"kernel recheck failed\"\n | .ok _ => pure ()\n Lean.logInfo m!\"DIRECT_KERNEL_NS {stop - start}\"\n Lean.logInfo m!\"DIRECT_DEPENDENCIES {value.getUsedConstants}\"\n\n-- Measurement block 0, arm m4.\n",
"ns": [
1028285,
992482,
987313,
966193,
962978,
949147,
953464,
952462
]
},
{
"block": 1,
"arm": "m4",
"stdout": "\u2139 [70/70] Built HexPrimality.SieveToolsProbe (1.3s)\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_WITNESS_CONTROL rejected\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1134873\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1007153\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1050347\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 971380\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 961375\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 967163\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 965872\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 962316\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\nBuild completed successfully (70 jobs).\n",
"stderr": "",
"returncode": 0,
"source": "module\npublic import HexPrimality.Cert\npublic import Lean\npublic meta import Lean\npublic section\nset_option maxRecDepth 100000\nopen Hex.Nat\nmutual\n@[expose] def oldCheck : PrimeCert \u2192 Bool\n | .small n => tableSearch n\n | .pock n fs => checkPockArith n fs && oldChildren fs\n | .pock3 n r s w fs => checkPock3Arith n r s w fs && oldChildren fs\n | .pock3Sieve n r s w m fs => checkPock3SieveArith n r s w m fs && oldChildren fs\n@[expose] def oldChildren : List (Nat \u00d7 Nat \u00d7 PrimeCert) \u2192 Bool\n | [] => true\n | (_, _, c) :: cs => oldCheck c && oldChildren cs\nend\n\ndef certificate : PrimeCert := .pock3Sieve 9223372036904058881 47 4194304 0 4 [(3, 19, .small 2)]\ntheorem oldResult : oldCheck certificate = true := by decide +kernel\ntheorem result : Hex.Nat.Prime 9223372036904058881 := Hex.Nat.prime_of_checkPrimeAt (c := certificate) (by decide +kernel)\n\nmeta partial def inlineLocal (env : Lean.Environment) (e : Lean.Expr) : Lean.Expr :=\n e.replace fun sub => match sub with\n | .const n levels =>\n if env.isImportedConst n then none else\n match env.find? n with\n | some info => (info.value? (allowOpaque := true)).map fun value =>\n inlineLocal env (value.instantiateLevelParams info.levelParams levels)\n | none => none\n | _ => none\n\nrun_cmd do\n let env \u2190 Lean.getEnv\n let some (.thmInfo info) := env.find? `result\n | throwError \"missing result theorem\"\n let value := inlineLocal env info.value\n let type := inlineLocal env info.type\n unless (value.getUsedConstants ++ type.getUsedConstants).all env.isImportedConst do\n throwError \"unexpanded local proof dependency\"\n -- The identity application checks the proof against its declared goal type.\n let proof := Lean.mkApp (Lean.mkLambda `h .default type (Lean.mkBVar 0)) value\n -- Explicitly finish pending elaboration-time kernel tasks before timing.\n let ready \u2190 IO.mkRef env.toKernelEnv\n let ready \u2190 ready.get\n let env := Lean.Environment.ofKernelEnv ready\n -- An invalid equality must be rejected by this same kernel entry point.\n let badType := Lean.mkApp3 (Lean.mkConst ``Eq [.succ .zero])\n (Lean.mkConst ``Bool) (Lean.mkConst ``Bool.true) (Lean.mkConst ``Bool.false)\n let badProof := Lean.mkApp (Lean.mkLambda `h .default badType (Lean.mkBVar 0))\n Lean.reflBoolTrue\n match Lean.Kernel.check env {} badProof with\n | .error _ => pure ()\n | .ok _ => throwError \"kernel accepted the negative control\"\n let corrupt := value.replace fun e => match e with\n | .lit (.natVal n) => if n == 9223372036904058881 then some (Lean.mkRawNatLit (n + 2)) else none\n | _ => none\n if corrupt == value then throwError \"subject corruption did not change the proof\"\n let corrupt := Lean.mkApp (Lean.mkLambda `h .default type (Lean.mkBVar 0)) corrupt\n match Lean.Kernel.check env {} corrupt with\n | .error _ => pure ()\n | .ok _ => throwError \"kernel accepted the corrupted proof\"\n -- Change only a Hex witness base: subjects, products, and ordering remain\n -- intact, so this control must reach the witness arithmetic.\n let corruptWitness := value.replace fun e => Id.run do\n unless e.isAppOfArity `Hex.Nat.PrimeCert.pock 2 ||\n e.isAppOfArity `Hex.Nat.PrimeCert.pock3 5 ||\n e.isAppOfArity `Hex.Nat.PrimeCert.pock3Sieve 6 do return none\n let args := e.getAppArgs\n let fs := args.back!\n unless fs.isAppOfArity ``List.cons 3 do return none\n let fsArgs := fs.getAppArgs\n let entry := fsArgs[1]!\n unless entry.isAppOfArity ``Prod.mk 4 do return none\n let entryArgs := entry.getAppArgs\n let entry := Lean.mkAppN entry.getAppFn (entryArgs.set! 2 (Lean.mkRawNatLit 0))\n let fs := Lean.mkAppN fs.getAppFn (fsArgs.set! 1 entry)\n return some (Lean.mkAppN e.getAppFn (args.set! (args.size - 1) fs))\n let needsWitness := value.getUsedConstants.any fun name =>\n name == `Hex.Nat.PrimeCert.pock || name == `Hex.Nat.PrimeCert.pock3 ||\n name == `Hex.Nat.PrimeCert.pock3Sieve\n if needsWitness && corruptWitness == value then\n throwError \"witness corruption did not change the proof\"\n if corruptWitness != value then\n let bad := Lean.mkApp (Lean.mkLambda `h .default type (Lean.mkBVar 0)) corruptWitness\n match Lean.Kernel.check env {} bad with\n | .error _ => pure ()\n | .ok _ => throwError \"kernel accepted the zero witness base\"\n Lean.logInfo \"DIRECT_WITNESS_CONTROL rejected\"\n for _ in [:8] do\n let input \u2190 IO.mkRef (env, proof)\n let (env, proof) \u2190 input.get\n let start \u2190 IO.monoNanosNow\n let checked \u2190 IO.mkRef (Lean.Kernel.check env {} proof)\n let checked \u2190 checked.get\n let stop \u2190 IO.monoNanosNow\n match checked with\n | .error _ => throwError \"kernel recheck failed\"\n | .ok _ => pure ()\n Lean.logInfo m!\"DIRECT_KERNEL_NS {stop - start}\"\n Lean.logInfo m!\"DIRECT_DEPENDENCIES {value.getUsedConstants}\"\n\n-- Measurement block 1, arm m4.\n",
"ns": [
1134873,
1007153,
1050347,
971380,
961375,
967163,
965872,
962316
]
},
{
"block": 1,
"arm": "m1",
"stdout": "\u2139 [70/70] Built HexPrimality.SieveToolsProbe (1.3s)\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_WITNESS_CONTROL rejected\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1277524\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1296692\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1208993\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1195012\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1185017\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1187571\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1175473\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1178547\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\nBuild completed successfully (70 jobs).\n",
"stderr": "",
"returncode": 0,
"source": "module\npublic import HexPrimality.Cert\npublic import Lean\npublic meta import Lean\npublic section\nset_option maxRecDepth 100000\nopen Hex.Nat\nmutual\n@[expose] def oldCheck : PrimeCert \u2192 Bool\n | .small n => tableSearch n\n | .pock n fs => checkPockArith n fs && oldChildren fs\n | .pock3 n r s w fs => checkPock3Arith n r s w fs && oldChildren fs\n | .pock3Sieve n r s w m fs => checkPock3SieveArith n r s w m fs && oldChildren fs\n@[expose] def oldChildren : List (Nat \u00d7 Nat \u00d7 PrimeCert) \u2192 Bool\n | [] => true\n | (_, _, c) :: cs => oldCheck c && oldChildren cs\nend\n\ndef certificate : PrimeCert := .pock3 9223372036904058881 1677731 167772 1677730 [(3, 19, .small 2), (2, 0, .small 5)]\ntheorem oldResult : oldCheck certificate = true := by decide +kernel\ntheorem result : Hex.Nat.Prime 9223372036904058881 := Hex.Nat.prime_of_checkPrimeAt (c := certificate) (by decide +kernel)\n\nmeta partial def inlineLocal (env : Lean.Environment) (e : Lean.Expr) : Lean.Expr :=\n e.replace fun sub => match sub with\n | .const n levels =>\n if env.isImportedConst n then none else\n match env.find? n with\n | some info => (info.value? (allowOpaque := true)).map fun value =>\n inlineLocal env (value.instantiateLevelParams info.levelParams levels)\n | none => none\n | _ => none\n\nrun_cmd do\n let env \u2190 Lean.getEnv\n let some (.thmInfo info) := env.find? `result\n | throwError \"missing result theorem\"\n let value := inlineLocal env info.value\n let type := inlineLocal env info.type\n unless (value.getUsedConstants ++ type.getUsedConstants).all env.isImportedConst do\n throwError \"unexpanded local proof dependency\"\n -- The identity application checks the proof against its declared goal type.\n let proof := Lean.mkApp (Lean.mkLambda `h .default type (Lean.mkBVar 0)) value\n -- Explicitly finish pending elaboration-time kernel tasks before timing.\n let ready \u2190 IO.mkRef env.toKernelEnv\n let ready \u2190 ready.get\n let env := Lean.Environment.ofKernelEnv ready\n -- An invalid equality must be rejected by this same kernel entry point.\n let badType := Lean.mkApp3 (Lean.mkConst ``Eq [.succ .zero])\n (Lean.mkConst ``Bool) (Lean.mkConst ``Bool.true) (Lean.mkConst ``Bool.false)\n let badProof := Lean.mkApp (Lean.mkLambda `h .default badType (Lean.mkBVar 0))\n Lean.reflBoolTrue\n match Lean.Kernel.check env {} badProof with\n | .error _ => pure ()\n | .ok _ => throwError \"kernel accepted the negative control\"\n let corrupt := value.replace fun e => match e with\n | .lit (.natVal n) => if n == 9223372036904058881 then some (Lean.mkRawNatLit (n + 2)) else none\n | _ => none\n if corrupt == value then throwError \"subject corruption did not change the proof\"\n let corrupt := Lean.mkApp (Lean.mkLambda `h .default type (Lean.mkBVar 0)) corrupt\n match Lean.Kernel.check env {} corrupt with\n | .error _ => pure ()\n | .ok _ => throwError \"kernel accepted the corrupted proof\"\n -- Change only a Hex witness base: subjects, products, and ordering remain\n -- intact, so this control must reach the witness arithmetic.\n let corruptWitness := value.replace fun e => Id.run do\n unless e.isAppOfArity `Hex.Nat.PrimeCert.pock 2 ||\n e.isAppOfArity `Hex.Nat.PrimeCert.pock3 5 ||\n e.isAppOfArity `Hex.Nat.PrimeCert.pock3Sieve 6 do return none\n let args := e.getAppArgs\n let fs := args.back!\n unless fs.isAppOfArity ``List.cons 3 do return none\n let fsArgs := fs.getAppArgs\n let entry := fsArgs[1]!\n unless entry.isAppOfArity ``Prod.mk 4 do return none\n let entryArgs := entry.getAppArgs\n let entry := Lean.mkAppN entry.getAppFn (entryArgs.set! 2 (Lean.mkRawNatLit 0))\n let fs := Lean.mkAppN fs.getAppFn (fsArgs.set! 1 entry)\n return some (Lean.mkAppN e.getAppFn (args.set! (args.size - 1) fs))\n let needsWitness := value.getUsedConstants.any fun name =>\n name == `Hex.Nat.PrimeCert.pock || name == `Hex.Nat.PrimeCert.pock3 ||\n name == `Hex.Nat.PrimeCert.pock3Sieve\n if needsWitness && corruptWitness == value then\n throwError \"witness corruption did not change the proof\"\n if corruptWitness != value then\n let bad := Lean.mkApp (Lean.mkLambda `h .default type (Lean.mkBVar 0)) corruptWitness\n match Lean.Kernel.check env {} bad with\n | .error _ => pure ()\n | .ok _ => throwError \"kernel accepted the zero witness base\"\n Lean.logInfo \"DIRECT_WITNESS_CONTROL rejected\"\n for _ in [:8] do\n let input \u2190 IO.mkRef (env, proof)\n let (env, proof) \u2190 input.get\n let start \u2190 IO.monoNanosNow\n let checked \u2190 IO.mkRef (Lean.Kernel.check env {} proof)\n let checked \u2190 checked.get\n let stop \u2190 IO.monoNanosNow\n match checked with\n | .error _ => throwError \"kernel recheck failed\"\n | .ok _ => pure ()\n Lean.logInfo m!\"DIRECT_KERNEL_NS {stop - start}\"\n Lean.logInfo m!\"DIRECT_DEPENDENCIES {value.getUsedConstants}\"\n\n-- Measurement block 1, arm m1.\n",
"ns": [
1277524,
1296692,
1208993,
1195012,
1185017,
1187571,
1175473,
1178547
]
},
{
"block": 2,
"arm": "m1",
"stdout": "\u2139 [70/70] Built HexPrimality.SieveToolsProbe (1.3s)\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_WITNESS_CONTROL rejected\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1252266\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1213399\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1198647\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1193089\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1191296\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1190195\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1187511\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1183024\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\nBuild completed successfully (70 jobs).\n",
"stderr": "",
"returncode": 0,
"source": "module\npublic import HexPrimality.Cert\npublic import Lean\npublic meta import Lean\npublic section\nset_option maxRecDepth 100000\nopen Hex.Nat\nmutual\n@[expose] def oldCheck : PrimeCert \u2192 Bool\n | .small n => tableSearch n\n | .pock n fs => checkPockArith n fs && oldChildren fs\n | .pock3 n r s w fs => checkPock3Arith n r s w fs && oldChildren fs\n | .pock3Sieve n r s w m fs => checkPock3SieveArith n r s w m fs && oldChildren fs\n@[expose] def oldChildren : List (Nat \u00d7 Nat \u00d7 PrimeCert) \u2192 Bool\n | [] => true\n | (_, _, c) :: cs => oldCheck c && oldChildren cs\nend\n\ndef certificate : PrimeCert := .pock3 9223372036904058881 1677731 167772 1677730 [(3, 19, .small 2), (2, 0, .small 5)]\ntheorem oldResult : oldCheck certificate = true := by decide +kernel\ntheorem result : Hex.Nat.Prime 9223372036904058881 := Hex.Nat.prime_of_checkPrimeAt (c := certificate) (by decide +kernel)\n\nmeta partial def inlineLocal (env : Lean.Environment) (e : Lean.Expr) : Lean.Expr :=\n e.replace fun sub => match sub with\n | .const n levels =>\n if env.isImportedConst n then none else\n match env.find? n with\n | some info => (info.value? (allowOpaque := true)).map fun value =>\n inlineLocal env (value.instantiateLevelParams info.levelParams levels)\n | none => none\n | _ => none\n\nrun_cmd do\n let env \u2190 Lean.getEnv\n let some (.thmInfo info) := env.find? `result\n | throwError \"missing result theorem\"\n let value := inlineLocal env info.value\n let type := inlineLocal env info.type\n unless (value.getUsedConstants ++ type.getUsedConstants).all env.isImportedConst do\n throwError \"unexpanded local proof dependency\"\n -- The identity application checks the proof against its declared goal type.\n let proof := Lean.mkApp (Lean.mkLambda `h .default type (Lean.mkBVar 0)) value\n -- Explicitly finish pending elaboration-time kernel tasks before timing.\n let ready \u2190 IO.mkRef env.toKernelEnv\n let ready \u2190 ready.get\n let env := Lean.Environment.ofKernelEnv ready\n -- An invalid equality must be rejected by this same kernel entry point.\n let badType := Lean.mkApp3 (Lean.mkConst ``Eq [.succ .zero])\n (Lean.mkConst ``Bool) (Lean.mkConst ``Bool.true) (Lean.mkConst ``Bool.false)\n let badProof := Lean.mkApp (Lean.mkLambda `h .default badType (Lean.mkBVar 0))\n Lean.reflBoolTrue\n match Lean.Kernel.check env {} badProof with\n | .error _ => pure ()\n | .ok _ => throwError \"kernel accepted the negative control\"\n let corrupt := value.replace fun e => match e with\n | .lit (.natVal n) => if n == 9223372036904058881 then some (Lean.mkRawNatLit (n + 2)) else none\n | _ => none\n if corrupt == value then throwError \"subject corruption did not change the proof\"\n let corrupt := Lean.mkApp (Lean.mkLambda `h .default type (Lean.mkBVar 0)) corrupt\n match Lean.Kernel.check env {} corrupt with\n | .error _ => pure ()\n | .ok _ => throwError \"kernel accepted the corrupted proof\"\n -- Change only a Hex witness base: subjects, products, and ordering remain\n -- intact, so this control must reach the witness arithmetic.\n let corruptWitness := value.replace fun e => Id.run do\n unless e.isAppOfArity `Hex.Nat.PrimeCert.pock 2 ||\n e.isAppOfArity `Hex.Nat.PrimeCert.pock3 5 ||\n e.isAppOfArity `Hex.Nat.PrimeCert.pock3Sieve 6 do return none\n let args := e.getAppArgs\n let fs := args.back!\n unless fs.isAppOfArity ``List.cons 3 do return none\n let fsArgs := fs.getAppArgs\n let entry := fsArgs[1]!\n unless entry.isAppOfArity ``Prod.mk 4 do return none\n let entryArgs := entry.getAppArgs\n let entry := Lean.mkAppN entry.getAppFn (entryArgs.set! 2 (Lean.mkRawNatLit 0))\n let fs := Lean.mkAppN fs.getAppFn (fsArgs.set! 1 entry)\n return some (Lean.mkAppN e.getAppFn (args.set! (args.size - 1) fs))\n let needsWitness := value.getUsedConstants.any fun name =>\n name == `Hex.Nat.PrimeCert.pock || name == `Hex.Nat.PrimeCert.pock3 ||\n name == `Hex.Nat.PrimeCert.pock3Sieve\n if needsWitness && corruptWitness == value then\n throwError \"witness corruption did not change the proof\"\n if corruptWitness != value then\n let bad := Lean.mkApp (Lean.mkLambda `h .default type (Lean.mkBVar 0)) corruptWitness\n match Lean.Kernel.check env {} bad with\n | .error _ => pure ()\n | .ok _ => throwError \"kernel accepted the zero witness base\"\n Lean.logInfo \"DIRECT_WITNESS_CONTROL rejected\"\n for _ in [:8] do\n let input \u2190 IO.mkRef (env, proof)\n let (env, proof) \u2190 input.get\n let start \u2190 IO.monoNanosNow\n let checked \u2190 IO.mkRef (Lean.Kernel.check env {} proof)\n let checked \u2190 checked.get\n let stop \u2190 IO.monoNanosNow\n match checked with\n | .error _ => throwError \"kernel recheck failed\"\n | .ok _ => pure ()\n Lean.logInfo m!\"DIRECT_KERNEL_NS {stop - start}\"\n Lean.logInfo m!\"DIRECT_DEPENDENCIES {value.getUsedConstants}\"\n\n-- Measurement block 2, arm m1.\n",
"ns": [
1252266,
1213399,
1198647,
1193089,
1191296,
1190195,
1187511,
1183024
]
},
{
"block": 2,
"arm": "m4",
"stdout": "\u2139 [70/70] Built HexPrimality.SieveToolsProbe (1.3s)\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_WITNESS_CONTROL rejected\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1068625\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1087793\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 989967\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 973042\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 965301\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 957269\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 967014\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 964840\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\nBuild completed successfully (70 jobs).\n",
"stderr": "",
"returncode": 0,
"source": "module\npublic import HexPrimality.Cert\npublic import Lean\npublic meta import Lean\npublic section\nset_option maxRecDepth 100000\nopen Hex.Nat\nmutual\n@[expose] def oldCheck : PrimeCert \u2192 Bool\n | .small n => tableSearch n\n | .pock n fs => checkPockArith n fs && oldChildren fs\n | .pock3 n r s w fs => checkPock3Arith n r s w fs && oldChildren fs\n | .pock3Sieve n r s w m fs => checkPock3SieveArith n r s w m fs && oldChildren fs\n@[expose] def oldChildren : List (Nat \u00d7 Nat \u00d7 PrimeCert) \u2192 Bool\n | [] => true\n | (_, _, c) :: cs => oldCheck c && oldChildren cs\nend\n\ndef certificate : PrimeCert := .pock3Sieve 9223372036904058881 47 4194304 0 4 [(3, 19, .small 2)]\ntheorem oldResult : oldCheck certificate = true := by decide +kernel\ntheorem result : Hex.Nat.Prime 9223372036904058881 := Hex.Nat.prime_of_checkPrimeAt (c := certificate) (by decide +kernel)\n\nmeta partial def inlineLocal (env : Lean.Environment) (e : Lean.Expr) : Lean.Expr :=\n e.replace fun sub => match sub with\n | .const n levels =>\n if env.isImportedConst n then none else\n match env.find? n with\n | some info => (info.value? (allowOpaque := true)).map fun value =>\n inlineLocal env (value.instantiateLevelParams info.levelParams levels)\n | none => none\n | _ => none\n\nrun_cmd do\n let env \u2190 Lean.getEnv\n let some (.thmInfo info) := env.find? `result\n | throwError \"missing result theorem\"\n let value := inlineLocal env info.value\n let type := inlineLocal env info.type\n unless (value.getUsedConstants ++ type.getUsedConstants).all env.isImportedConst do\n throwError \"unexpanded local proof dependency\"\n -- The identity application checks the proof against its declared goal type.\n let proof := Lean.mkApp (Lean.mkLambda `h .default type (Lean.mkBVar 0)) value\n -- Explicitly finish pending elaboration-time kernel tasks before timing.\n let ready \u2190 IO.mkRef env.toKernelEnv\n let ready \u2190 ready.get\n let env := Lean.Environment.ofKernelEnv ready\n -- An invalid equality must be rejected by this same kernel entry point.\n let badType := Lean.mkApp3 (Lean.mkConst ``Eq [.succ .zero])\n (Lean.mkConst ``Bool) (Lean.mkConst ``Bool.true) (Lean.mkConst ``Bool.false)\n let badProof := Lean.mkApp (Lean.mkLambda `h .default badType (Lean.mkBVar 0))\n Lean.reflBoolTrue\n match Lean.Kernel.check env {} badProof with\n | .error _ => pure ()\n | .ok _ => throwError \"kernel accepted the negative control\"\n let corrupt := value.replace fun e => match e with\n | .lit (.natVal n) => if n == 9223372036904058881 then some (Lean.mkRawNatLit (n + 2)) else none\n | _ => none\n if corrupt == value then throwError \"subject corruption did not change the proof\"\n let corrupt := Lean.mkApp (Lean.mkLambda `h .default type (Lean.mkBVar 0)) corrupt\n match Lean.Kernel.check env {} corrupt with\n | .error _ => pure ()\n | .ok _ => throwError \"kernel accepted the corrupted proof\"\n -- Change only a Hex witness base: subjects, products, and ordering remain\n -- intact, so this control must reach the witness arithmetic.\n let corruptWitness := value.replace fun e => Id.run do\n unless e.isAppOfArity `Hex.Nat.PrimeCert.pock 2 ||\n e.isAppOfArity `Hex.Nat.PrimeCert.pock3 5 ||\n e.isAppOfArity `Hex.Nat.PrimeCert.pock3Sieve 6 do return none\n let args := e.getAppArgs\n let fs := args.back!\n unless fs.isAppOfArity ``List.cons 3 do return none\n let fsArgs := fs.getAppArgs\n let entry := fsArgs[1]!\n unless entry.isAppOfArity ``Prod.mk 4 do return none\n let entryArgs := entry.getAppArgs\n let entry := Lean.mkAppN entry.getAppFn (entryArgs.set! 2 (Lean.mkRawNatLit 0))\n let fs := Lean.mkAppN fs.getAppFn (fsArgs.set! 1 entry)\n return some (Lean.mkAppN e.getAppFn (args.set! (args.size - 1) fs))\n let needsWitness := value.getUsedConstants.any fun name =>\n name == `Hex.Nat.PrimeCert.pock || name == `Hex.Nat.PrimeCert.pock3 ||\n name == `Hex.Nat.PrimeCert.pock3Sieve\n if needsWitness && corruptWitness == value then\n throwError \"witness corruption did not change the proof\"\n if corruptWitness != value then\n let bad := Lean.mkApp (Lean.mkLambda `h .default type (Lean.mkBVar 0)) corruptWitness\n match Lean.Kernel.check env {} bad with\n | .error _ => pure ()\n | .ok _ => throwError \"kernel accepted the zero witness base\"\n Lean.logInfo \"DIRECT_WITNESS_CONTROL rejected\"\n for _ in [:8] do\n let input \u2190 IO.mkRef (env, proof)\n let (env, proof) \u2190 input.get\n let start \u2190 IO.monoNanosNow\n let checked \u2190 IO.mkRef (Lean.Kernel.check env {} proof)\n let checked \u2190 checked.get\n let stop \u2190 IO.monoNanosNow\n match checked with\n | .error _ => throwError \"kernel recheck failed\"\n | .ok _ => pure ()\n Lean.logInfo m!\"DIRECT_KERNEL_NS {stop - start}\"\n Lean.logInfo m!\"DIRECT_DEPENDENCIES {value.getUsedConstants}\"\n\n-- Measurement block 2, arm m4.\n",
"ns": [
1068625,
1087793,
989967,
973042,
965301,
957269,
967014,
964840
]
},
{
"block": 3,
"arm": "m4",
"stdout": "\u2139 [70/70] Built HexPrimality.SieveToolsProbe (1.3s)\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_WITNESS_CONTROL rejected\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1046131\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1065450\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 993503\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 975416\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 973604\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 961336\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 968245\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 958150\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3Sieve,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\nBuild completed successfully (70 jobs).\n",
"stderr": "",
"returncode": 0,
"source": "module\npublic import HexPrimality.Cert\npublic import Lean\npublic meta import Lean\npublic section\nset_option maxRecDepth 100000\nopen Hex.Nat\nmutual\n@[expose] def oldCheck : PrimeCert \u2192 Bool\n | .small n => tableSearch n\n | .pock n fs => checkPockArith n fs && oldChildren fs\n | .pock3 n r s w fs => checkPock3Arith n r s w fs && oldChildren fs\n | .pock3Sieve n r s w m fs => checkPock3SieveArith n r s w m fs && oldChildren fs\n@[expose] def oldChildren : List (Nat \u00d7 Nat \u00d7 PrimeCert) \u2192 Bool\n | [] => true\n | (_, _, c) :: cs => oldCheck c && oldChildren cs\nend\n\ndef certificate : PrimeCert := .pock3Sieve 9223372036904058881 47 4194304 0 4 [(3, 19, .small 2)]\ntheorem oldResult : oldCheck certificate = true := by decide +kernel\ntheorem result : Hex.Nat.Prime 9223372036904058881 := Hex.Nat.prime_of_checkPrimeAt (c := certificate) (by decide +kernel)\n\nmeta partial def inlineLocal (env : Lean.Environment) (e : Lean.Expr) : Lean.Expr :=\n e.replace fun sub => match sub with\n | .const n levels =>\n if env.isImportedConst n then none else\n match env.find? n with\n | some info => (info.value? (allowOpaque := true)).map fun value =>\n inlineLocal env (value.instantiateLevelParams info.levelParams levels)\n | none => none\n | _ => none\n\nrun_cmd do\n let env \u2190 Lean.getEnv\n let some (.thmInfo info) := env.find? `result\n | throwError \"missing result theorem\"\n let value := inlineLocal env info.value\n let type := inlineLocal env info.type\n unless (value.getUsedConstants ++ type.getUsedConstants).all env.isImportedConst do\n throwError \"unexpanded local proof dependency\"\n -- The identity application checks the proof against its declared goal type.\n let proof := Lean.mkApp (Lean.mkLambda `h .default type (Lean.mkBVar 0)) value\n -- Explicitly finish pending elaboration-time kernel tasks before timing.\n let ready \u2190 IO.mkRef env.toKernelEnv\n let ready \u2190 ready.get\n let env := Lean.Environment.ofKernelEnv ready\n -- An invalid equality must be rejected by this same kernel entry point.\n let badType := Lean.mkApp3 (Lean.mkConst ``Eq [.succ .zero])\n (Lean.mkConst ``Bool) (Lean.mkConst ``Bool.true) (Lean.mkConst ``Bool.false)\n let badProof := Lean.mkApp (Lean.mkLambda `h .default badType (Lean.mkBVar 0))\n Lean.reflBoolTrue\n match Lean.Kernel.check env {} badProof with\n | .error _ => pure ()\n | .ok _ => throwError \"kernel accepted the negative control\"\n let corrupt := value.replace fun e => match e with\n | .lit (.natVal n) => if n == 9223372036904058881 then some (Lean.mkRawNatLit (n + 2)) else none\n | _ => none\n if corrupt == value then throwError \"subject corruption did not change the proof\"\n let corrupt := Lean.mkApp (Lean.mkLambda `h .default type (Lean.mkBVar 0)) corrupt\n match Lean.Kernel.check env {} corrupt with\n | .error _ => pure ()\n | .ok _ => throwError \"kernel accepted the corrupted proof\"\n -- Change only a Hex witness base: subjects, products, and ordering remain\n -- intact, so this control must reach the witness arithmetic.\n let corruptWitness := value.replace fun e => Id.run do\n unless e.isAppOfArity `Hex.Nat.PrimeCert.pock 2 ||\n e.isAppOfArity `Hex.Nat.PrimeCert.pock3 5 ||\n e.isAppOfArity `Hex.Nat.PrimeCert.pock3Sieve 6 do return none\n let args := e.getAppArgs\n let fs := args.back!\n unless fs.isAppOfArity ``List.cons 3 do return none\n let fsArgs := fs.getAppArgs\n let entry := fsArgs[1]!\n unless entry.isAppOfArity ``Prod.mk 4 do return none\n let entryArgs := entry.getAppArgs\n let entry := Lean.mkAppN entry.getAppFn (entryArgs.set! 2 (Lean.mkRawNatLit 0))\n let fs := Lean.mkAppN fs.getAppFn (fsArgs.set! 1 entry)\n return some (Lean.mkAppN e.getAppFn (args.set! (args.size - 1) fs))\n let needsWitness := value.getUsedConstants.any fun name =>\n name == `Hex.Nat.PrimeCert.pock || name == `Hex.Nat.PrimeCert.pock3 ||\n name == `Hex.Nat.PrimeCert.pock3Sieve\n if needsWitness && corruptWitness == value then\n throwError \"witness corruption did not change the proof\"\n if corruptWitness != value then\n let bad := Lean.mkApp (Lean.mkLambda `h .default type (Lean.mkBVar 0)) corruptWitness\n match Lean.Kernel.check env {} bad with\n | .error _ => pure ()\n | .ok _ => throwError \"kernel accepted the zero witness base\"\n Lean.logInfo \"DIRECT_WITNESS_CONTROL rejected\"\n for _ in [:8] do\n let input \u2190 IO.mkRef (env, proof)\n let (env, proof) \u2190 input.get\n let start \u2190 IO.monoNanosNow\n let checked \u2190 IO.mkRef (Lean.Kernel.check env {} proof)\n let checked \u2190 checked.get\n let stop \u2190 IO.monoNanosNow\n match checked with\n | .error _ => throwError \"kernel recheck failed\"\n | .ok _ => pure ()\n Lean.logInfo m!\"DIRECT_KERNEL_NS {stop - start}\"\n Lean.logInfo m!\"DIRECT_DEPENDENCIES {value.getUsedConstants}\"\n\n-- Measurement block 3, arm m4.\n",
"ns": [
1046131,
1065450,
993503,
975416,
973604,
961336,
968245,
958150
]
},
{
"block": 3,
"arm": "m1",
"stdout": "\u2139 [70/70] Built HexPrimality.SieveToolsProbe (1.3s)\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_WITNESS_CONTROL rejected\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1249562\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1213179\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1266197\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1205898\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1190104\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1186599\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1186038\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_KERNEL_NS 1181872\ninfo: HexPrimality/SieveToolsProbe.lean:33:0: DIRECT_DEPENDENCIES [Hex.Nat.prime_of_checkPrimeAt,\n OfNat.ofNat,\n Nat,\n instOfNatNat,\n Hex.Nat.PrimeCert.pock3,\n List.cons,\n Prod,\n Hex.Nat.PrimeCert,\n Prod.mk,\n Hex.Nat.PrimeCert.small,\n List.nil,\n of_decide_eq_true,\n Eq,\n Bool,\n Bool.and,\n BEq.beq,\n instBEqOfDecidableEq,\n instDecidableEqNat,\n Hex.Nat.PrimeCert.subject,\n Hex.Nat.checkPrime,\n Bool.true,\n instDecidableEqBool,\n id,\n Decidable.decide,\n Eq.refl]\nBuild completed successfully (70 jobs).\n",
"stderr": "",
"returncode": 0,
"source": "module\npublic import HexPrimality.Cert\npublic import Lean\npublic meta import Lean\npublic section\nset_option maxRecDepth 100000\nopen Hex.Nat\nmutual\n@[expose] def oldCheck : PrimeCert \u2192 Bool\n | .small n => tableSearch n\n | .pock n fs => checkPockArith n fs && oldChildren fs\n | .pock3 n r s w fs => checkPock3Arith n r s w fs && oldChildren fs\n | .pock3Sieve n r s w m fs => checkPock3SieveArith n r s w m fs && oldChildren fs\n@[expose] def oldChildren : List (Nat \u00d7 Nat \u00d7 PrimeCert) \u2192 Bool\n | [] => true\n | (_, _, c) :: cs => oldCheck c && oldChildren cs\nend\n\ndef certificate : PrimeCert := .pock3 9223372036904058881 1677731 167772 1677730 [(3, 19, .small 2), (2, 0, .small 5)]\ntheorem oldResult : oldCheck certificate = true := by decide +kernel\ntheorem result : Hex.Nat.Prime 9223372036904058881 := Hex.Nat.prime_of_checkPrimeAt (c := certificate) (by decide +kernel)\n\nmeta partial def inlineLocal (env : Lean.Environment) (e : Lean.Expr) : Lean.Expr :=\n e.replace fun sub => match sub with\n | .const n levels =>\n if env.isImportedConst n then none else\n match env.find? n with\n | some info => (info.value? (allowOpaque := true)).map fun value =>\n inlineLocal env (value.instantiateLevelParams info.levelParams levels)\n | none => none\n | _ => none\n\nrun_cmd do\n let env \u2190 Lean.getEnv\n let some (.thmInfo info) := env.find? `result\n | throwError \"missing result theorem\"\n let value := inlineLocal env info.value\n let type := inlineLocal env info.type\n unless (value.getUsedConstants ++ type.getUsedConstants).all env.isImportedConst do\n throwError \"unexpanded local proof dependency\"\n -- The identity application checks the proof against its declared goal type.\n let proof := Lean.mkApp (Lean.mkLambda `h .default type (Lean.mkBVar 0)) value\n -- Explicitly finish pending elaboration-time kernel tasks before timing.\n let ready \u2190 IO.mkRef env.toKernelEnv\n let ready \u2190 ready.get\n let env := Lean.Environment.ofKernelEnv ready\n -- An invalid equality must be rejected by this same kernel entry point.\n let badType := Lean.mkApp3 (Lean.mkConst ``Eq [.succ .zero])\n (Lean.mkConst ``Bool) (Lean.mkConst ``Bool.true) (Lean.mkConst ``Bool.false)\n let badProof := Lean.mkApp (Lean.mkLambda `h .default badType (Lean.mkBVar 0))\n Lean.reflBoolTrue\n match Lean.Kernel.check env {} badProof with\n | .error _ => pure ()\n | .ok _ => throwError \"kernel accepted the negative control\"\n let corrupt := value.replace fun e => match e with\n | .lit (.natVal n) => if n == 9223372036904058881 then some (Lean.mkRawNatLit (n + 2)) else none\n | _ => none\n if corrupt == value then throwError \"subject corruption did not change the proof\"\n let corrupt := Lean.mkApp (Lean.mkLambda `h .default type (Lean.mkBVar 0)) corrupt\n match Lean.Kernel.check env {} corrupt with\n | .error _ => pure ()\n | .ok _ => throwError \"kernel accepted the corrupted proof\"\n -- Change only a Hex witness base: subjects, products, and ordering remain\n -- intact, so this control must reach the witness arithmetic.\n let corruptWitness := value.replace fun e => Id.run do\n unless e.isAppOfArity `Hex.Nat.PrimeCert.pock 2 ||\n e.isAppOfArity `Hex.Nat.PrimeCert.pock3 5 ||\n e.isAppOfArity `Hex.Nat.PrimeCert.pock3Sieve 6 do return none\n let args := e.getAppArgs\n let fs := args.back!\n unless fs.isAppOfArity ``List.cons 3 do return none\n let fsArgs := fs.getAppArgs\n let entry := fsArgs[1]!\n unless entry.isAppOfArity ``Prod.mk 4 do return none\n let entryArgs := entry.getAppArgs\n let entry := Lean.mkAppN entry.getAppFn (entryArgs.set! 2 (Lean.mkRawNatLit 0))\n let fs := Lean.mkAppN fs.getAppFn (fsArgs.set! 1 entry)\n return some (Lean.mkAppN e.getAppFn (args.set! (args.size - 1) fs))\n let needsWitness := value.getUsedConstants.any fun name =>\n name == `Hex.Nat.PrimeCert.pock || name == `Hex.Nat.PrimeCert.pock3 ||\n name == `Hex.Nat.PrimeCert.pock3Sieve\n if needsWitness && corruptWitness == value then\n throwError \"witness corruption did not change the proof\"\n if corruptWitness != value then\n let bad := Lean.mkApp (Lean.mkLambda `h .default type (Lean.mkBVar 0)) corruptWitness\n match Lean.Kernel.check env {} bad with\n | .error _ => pure ()\n | .ok _ => throwError \"kernel accepted the zero witness base\"\n Lean.logInfo \"DIRECT_WITNESS_CONTROL rejected\"\n for _ in [:8] do\n let input \u2190 IO.mkRef (env, proof)\n let (env, proof) \u2190 input.get\n let start \u2190 IO.monoNanosNow\n let checked \u2190 IO.mkRef (Lean.Kernel.check env {} proof)\n let checked \u2190 checked.get\n let stop \u2190 IO.monoNanosNow\n match checked with\n | .error _ => throwError \"kernel recheck failed\"\n | .ok _ => pure ()\n Lean.logInfo m!\"DIRECT_KERNEL_NS {stop - start}\"\n Lean.logInfo m!\"DIRECT_DEPENDENCIES {value.getUsedConstants}\"\n\n-- Measurement block 3, arm m1.\n",
"ns": [
1249562,
1213179,
1266197,
1205898,
1190104,
1186599,
1186038,
1181872
]
}
],
"load_after": [
3.91064453125,
3.568359375,
3.931640625
]
}

Hex sieve replay comparison

Source: hex-dev 0e25d5f94. Target: 9223372036904058881 (64 bits).

Certificate Factor product Median kernel replay
Original pock3, m=1 2^20 × 5 1.193 ms
New pock3Sieve, m=4 2^20 0.970 ms

These are direct Lean.Kernel.check timings with the local proof expanded, not whole build times or native certificate construction. Both proofs use the same current Hex checker. The new certificate removes one witness entry in exchange for three divisor exclusions. This single example shows that tradeoff; it does not establish a general speedup.

Four adjacent blocks alternate arm order; each build performs eight fresh kernel checks. Every completed sample, full Lean source, output and shared-host load record is in hex-sieve-record.json. CPU affinity is selected by a lock. The runner changes source per arm/block so Lake cannot replay cached build logs. Invalid equality, subject and witness controls must be rejected.

An initial run mistakenly reused cached build logs. Its complete record is retained separately as hex-sieve-invalid-cached-log-record.json and is excluded from these timings because those entries are not new executions.

To reproduce on Linux, check out the source commit, run lake build, then:

python3 hex-sieve-replay.py /path/to/hex-dev /tmp/hex-sieve-replay

The summary above takes the median of all 32 observations per arm. This manual experiment is not added to CI. Host-specific absolute times will vary.

from pathlib import Path
import sys,json,math,subprocess,os,fcntl,statistics,re
root=Path(sys.argv[1]).resolve();sys.path.insert(0,str(root))
from scripts.bench.primality_table_replay import HEADER
from scripts.bench.primality_kernel_direct import SUFFIX
out=Path(sys.argv[2]).resolve();out.mkdir(parents=True,exist_ok=True)
n=9223372036904058881;F=2**20*5;R=(n-1)//F;r=R%(2*F);s=R//(2*F);w=math.isqrt(max(0,r*r-8*s))
a=next(a for a in range(2,100) if math.gcd(pow(a,(n-1)//5,n)-1,n)==1)
old=f'.pock3 {n} {r} {s} {w} [(3, 19, .small 2), ({a}, 0, .small 5)]'
new=f'.pock3Sieve {n} 47 4194304 0 4 [(3, 19, .small 2)]'
for cpu in sorted(os.sched_getaffinity(0)):
f=open(f'/tmp/hex-benchmark-cpu-{cpu}.lock','w')
try:fcntl.flock(f,fcntl.LOCK_EX|fcntl.LOCK_NB)
except BlockingIOError:f.close();continue
break
os.sched_setaffinity(0,{cpu});record=dict(cpu=cpu,load_before=os.getloadavg(),rows=[])
p=root/'HexPrimality/SieveToolsProbe.lean';assert not p.exists()
try:
for block in range(4):
for arm,cert in ([('m1',old),('m4',new)] if block%2==0 else [('m4',new),('m1',old)]):
src=HEADER.replace('public import HexPrimality.Cert','public import HexPrimality.Cert\npublic import Lean\npublic meta import Lean')
src+=f'\ndef certificate : PrimeCert := {cert}\ntheorem oldResult : oldCheck certificate = true := by decide +kernel\ntheorem result : Hex.Nat.Prime {n} := Hex.Nat.prime_of_checkPrimeAt (c := certificate) (by decide +kernel)\n'
suffix=SUFFIX.replace('RESULT_NAME','result').replace('SUBJECT',str(n))
marker=suffix.index(' let input ← IO.mkRef (env, proof)')
suffix=suffix[:marker]+' for _ in [:8] do\n'+'\n'.join(' '+l for l in suffix[marker:].splitlines())+'\n'
src+=suffix+f"\n-- Measurement block {block}, arm {arm}.\n";p.write_text(src)
res=subprocess.run(['lake','build','HexPrimality.SieveToolsProbe'],cwd=root,capture_output=True,text=True)
row=dict(block=block,arm=arm,stdout=res.stdout,stderr=res.stderr,returncode=res.returncode,source=src)
row['ns']=list(map(int,re.findall(r'DIRECT_KERNEL_NS (\d+)',res.stdout)))
record['rows'].append(row);(out/'record.json').write_text(json.dumps(record,indent=2))
if res.returncode or len(row['ns'])!=8 or 'DIRECT_WITNESS_CONTROL rejected' not in res.stdout:raise RuntimeError(res.stdout+res.stderr)
print(block,arm,statistics.median(row['ns'])/1000,flush=True)
finally:p.unlink()
record['load_after']=os.getloadavg();(out/'record.json').write_text(json.dumps(record,indent=2))
module
import Lean
import PrimeCert.Pocklington3
meta import Lean
open Lean
set_option maxRecDepth 10000
run_cmd do
let ready ← IO.mkRef (← getEnv).toKernelEnv
let env := Environment.ofKernelEnv (← ready.get)
let some path ← IO.getEnv "INTERVAL_SAMPLES" | throwError "set INTERVAL_SAMPLES"
let file ← IO.FS.Handle.mk path .write
let cases : List (Nat × Nat × Nat × Nat) :=
[(69, 9, 68, 7), (4028945, 289, 4028944, 3),
(2028478494862525422475607, 22304740449229861598212, 2028478494862525422475606, 3)]
for block in [:4] do
for (r, s, w, prime) in cases do
let arms := if block % 2 == 0 then [false, true] else [true, false]
for interval in arms do
let mode := if interval then
mkApp (mkConst ``PrimeCert.Pocklington3CertMode.interval) (mkRawNatLit w)
else mkApp2 (mkConst ``PrimeCert.Pocklington3CertMode.prime) (mkRawNatLit prime)
(mkConst (if prime == 3 then ``Nat.prime_three else ``Nat.prime_seven))
let lhs := mkApp3 (mkConst ``PrimeCert.Pocklington3CertMode.calculate)
mode (mkRawNatLit r) (mkRawNatLit s)
let mkProof (b : Bool) :=
let rhs := mkConst (if b then ``Bool.true else ``Bool.false)
let type := mkApp3 (mkConst ``Eq [.succ .zero]) (mkConst ``Bool) lhs rhs
mkApp (mkLambda `h .default type (mkBVar 0))
(mkApp2 (mkConst ``Eq.refl [.succ .zero]) (mkConst ``Bool) rhs)
let bad ← IO.mkRef (Kernel.check env {} (mkProof false))
if (← bad.get).isOk then throwError "accepted wrong result"
for i in [:64] do
let input ← IO.mkRef (env, mkProof true)
let (env, term) ← input.get
let start ← IO.monoNanosNow
let result ← IO.mkRef (Kernel.check env {} term)
let result ← result.get
let stop ← IO.monoNanosNow
let _ ← ofExceptKernelException result
file.putStrLn s!"{block},{r},{interval},{i},{stop-start}"
file.flush
-- Retain fresh kernel checks under CPU affinity.
{
"cpu": 90,
"host": "chungus2",
"load_before": [
15.0458984375,
30.59130859375,
25.25537109375
],
"stdout": "\u2714 [1954/1954] Built PrimeCertTest.IntervalBench (803ms)\nBuild completed successfully (1954 jobs).\n",
"stderr": "",
"returncode": 0,
"load_after": [
15.0458984375,
30.59130859375,
25.25537109375
]
}
[
{
"n": 339392917,
"bits": 29,
"r": 17329,
"s": 1,
"w": 17328,
"p": 3
},
{
"n": 73471,
"bits": 17,
"r": 69,
"s": 9,
"w": 68,
"p": 7
},
{
"n": 32560621,
"bits": 25,
"r": 301,
"s": 134,
"w": 299,
"p": 7
},
{
"n": 3586530508831189,
"bits": 52,
"r": 71523,
"s": 20763,
"w": 71521,
"p": 11
},
{
"n": 236684654874665389773181956283167565443541280517430278333971,
"bits": 198,
"r": 111028891713715270858633,
"s": 2169430279732,
"w": 111028891713715270858632,
"p": 3
},
{
"n": 1809751,
"bits": 21,
"r": 239,
"s": 14,
"w": 238,
"p": 11
},
{
"n": 1923133,
"bits": 21,
"r": 631,
"s": 3,
"w": 630,
"p": 5
},
{
"n": 430751,
"bits": 19,
"r": 223,
"s": 3,
"w": 222,
"p": 7
},
{
"n": 31757755568855353,
"bits": 55,
"r": 1184777,
"s": 1337,
"w": 1184776,
"p": 5
},
{
"n": 74058212732561358302231226437062788676166966415465897661863160754340907,
"bits": 236,
"r": 284551513249666376365123,
"s": 275754422668509854114502,
"w": 284551513249666376365119,
"p": 5
},
{
"n": 411743,
"bits": 19,
"r": 23,
"s": 61,
"w": 6,
"p": 3
},
{
"n": 1469495262398780123809,
"bits": 71,
"r": 1728651,
"s": 4232391,
"w": 1728641,
"p": 5
},
{
"n": 97859369123353,
"bits": 47,
"r": 5439,
"s": 2319,
"w": 5437,
"p": 7
},
{
"n": 726838724295606890549323807888004534353641360687318060281490199180612328166730772686396383698676545930088884461843637361053498018365439,
"bits": 448,
"r": 523890102151522916311113076301980070234414163719,
"s": 3637867751654793328228610486390601899590,
"w": 523890102151522916311113076301980070234414163718,
"p": 3
},
{
"n": 18913,
"bits": 15,
"r": 5,
"s": 1,
"w": 4,
"p": 3
},
{
"n": 1257559732178653,
"bits": 51,
"r": 306251,
"s": 139,
"w": 306250,
"p": 3
}
]
{
"cpu": 0,
"load_before": [
3.31884765625,
6.9140625,
8.5810546875
],
"cases": 16,
"stdout": "\u2714 [1962/1963] Built PrimeCertTest.ReplacementTest (2.5s)\n\u26a0 [1963/1963] Built PrimeCertTest.ReplacementBench (3.1s)\nwarning: PrimeCertTest/ReplacementBench.lean:27:100: This line exceeds the 100 character limit, please shorten it!\n\nNote: This linter can be disabled with `set_option linter.style.longLine false`\nwarning: PrimeCertTest/ReplacementBench.lean:37:100: This line exceeds the 100 character limit, please shorten it!\n\nNote: This linter can be disabled with `set_option linter.style.longLine false`\nBuild completed successfully (1963 jobs).\n",
"stderr": "",
"returncode": 0,
"load_after": [
3.45361328125,
6.8818359375,
8.5615234375
]
}

Replacing PrimeCert prime-QNR checks with interval checks

Local read-only review experiment on PR #170 at 3bfb28c. All 16 positive-QNR nodes from PrimeCertTest/PrimeListTest.lean were converted; the complete converted file built successfully, including Curve25519, Curve448 and the unchanged 3914-bit Proth example.

Fresh kernel checks of the nonsquare mode only, after imports and expression construction. Four alternating adjacent AB/BA blocks, 64 samples per arm per block; every completed sample retained. Wrong-result controls rejected. This is not total certificate replay or construction timing. Existing factor sets and auxiliary prime declarations retained.

Certificate bits QNR prime QNR µs Interval µs Speedup
29 3 63.44 29.62 2.14×
17 7 72.43 29.66 2.44×
25 7 72.49 29.63 2.45×
52 11 80.72 29.57 2.73×
198 3 63.96 31.42 2.04×
21 11 80.96 29.65 2.73×
21 5 71.99 29.69 2.42×
19 7 72.38 29.61 2.44×
55 5 71.74 29.61 2.42×
236 5 72.85 31.60 2.31×
19 3 63.53 29.67 2.14×
71 5 71.91 29.69 2.42×
47 7 72.79 29.71 2.45×
448 3 64.29 31.53 2.04×
15 3 63.69 29.65 2.15×
51 3 63.60 29.72 2.14×

Speedup range 2.04–2.73×; median per-node speedup 2.42×.

Reproduce

On PrimeCert commit 3bfb28c9e6bd890a3c8a2da3bf86799108cfe01c (the version exposing both modes), copy ReplacementBench.lean and ReplacementTest.lean into PrimeCertTest/, then run:

INTERVAL_SAMPLES=/tmp/replacement-samples.csv lake build PrimeCertTest.ReplacementBench PrimeCertTest.ReplacementTest

The benchmark hard-codes all sixteen cases, comparing each original prime-QNR witness against its interval witness. ReplacementTest.lean contains the converted complete example corpus. The measured run used CPU affinity (CPU 0); all raw samples and host context are included. These timings compare the two mode checks before removal of the QNR constructor. They do not measure automatic witness construction, import savings, or whole-certificate build times.

0 17329 false 0 95632
0 17329 false 1 76363
0 17329 false 2 68302
0 17329 false 3 65937
0 17329 false 4 64456
0 17329 false 5 64556
0 17329 false 6 180157
0 17329 false 7 69643
0 17329 false 8 64745
0 17329 false 9 64115
0 17329 false 10 63333
0 17329 false 11 63614
0 17329 false 12 63074
0 17329 false 13 63544
0 17329 false 14 63143
0 17329 false 15 63094
0 17329 false 16 63344
0 17329 false 17 62963
0 17329 false 18 62943
0 17329 false 19 67039
0 17329 false 20 63124
0 17329 false 21 63965
0 17329 false 22 63014
0 17329 false 23 63343
0 17329 false 24 62873
0 17329 false 25 62793
0 17329 false 26 62813
0 17329 false 27 62783
0 17329 false 28 63144
0 17329 false 29 64926
0 17329 false 30 63975
0 17329 false 31 63314
0 17329 false 32 63404
0 17329 false 33 62663
0 17329 false 34 66108
0 17329 false 35 63093
0 17329 false 36 63093
0 17329 false 37 62914
0 17329 false 38 62823
0 17329 false 39 62523
0 17329 false 40 63063
0 17329 false 41 63504
0 17329 false 42 62793
0 17329 false 43 62983
0 17329 false 44 62764
0 17329 false 45 63093
0 17329 false 46 63133
0 17329 false 47 62914
0 17329 false 48 63123
0 17329 false 49 62684
0 17329 false 50 99227
0 17329 false 51 69203
0 17329 false 52 64706
0 17329 false 53 64135
0 17329 false 54 63304
0 17329 false 55 63214
0 17329 false 56 63194
0 17329 false 57 63274
0 17329 false 58 62983
0 17329 false 59 63394
0 17329 false 60 63053
0 17329 false 61 63054
0 17329 false 62 62473
0 17329 false 63 63034
0 17329 true 0 34061
0 17329 true 1 31216
0 17329 true 2 29955
0 17329 true 3 29654
0 17329 true 4 29484
0 17329 true 5 29764
0 17329 true 6 30024
0 17329 true 7 29274
0 17329 true 8 29704
0 17329 true 9 29644
0 17329 true 10 29604
0 17329 true 11 29804
0 17329 true 12 29304
0 17329 true 13 29474
0 17329 true 14 29664
0 17329 true 15 29463
0 17329 true 16 29544
0 17329 true 17 29523
0 17329 true 18 29254
0 17329 true 19 29323
0 17329 true 20 29615
0 17329 true 21 29364
0 17329 true 22 29644
0 17329 true 23 29634
0 17329 true 24 29393
0 17329 true 25 29634
0 17329 true 26 30034
0 17329 true 27 29553
0 17329 true 28 32368
0 17329 true 29 29464
0 17329 true 30 29403
0 17329 true 31 29774
0 17329 true 32 29463
0 17329 true 33 29644
0 17329 true 34 29324
0 17329 true 35 30054
0 17329 true 36 29474
0 17329 true 37 29424
0 17329 true 38 29574
0 17329 true 39 29474
0 17329 true 40 29454
0 17329 true 41 29364
0 17329 true 42 29614
0 17329 true 43 29324
0 17329 true 44 29253
0 17329 true 45 29534
0 17329 true 46 29454
0 17329 true 47 29744
0 17329 true 48 29674
0 17329 true 49 29664
0 17329 true 50 29423
0 17329 true 51 29704
0 17329 true 52 29594
0 17329 true 53 29304
0 17329 true 54 29634
0 17329 true 55 29684
0 17329 true 56 29523
0 17329 true 57 29573
0 17329 true 58 29403
0 17329 true 59 45828
0 17329 true 60 32047
0 17329 true 61 30636
0 17329 true 62 30135
0 17329 true 63 29324
0 69 false 0 82101
0 69 false 1 74831
0 69 false 2 74010
0 69 false 3 73409
0 69 false 4 72787
0 69 false 5 72808
0 69 false 6 72307
0 69 false 7 72798
0 69 false 8 75141
0 69 false 9 72688
0 69 false 10 72027
0 69 false 11 72187
0 69 false 12 72167
0 69 false 13 71967
0 69 false 14 72307
0 69 false 15 72377
0 69 false 16 72006
0 69 false 17 72437
0 69 false 18 72248
0 69 false 19 72207
0 69 false 20 72087
0 69 false 21 74520
0 69 false 22 72487
0 69 false 23 71967
0 69 false 24 72407
0 69 false 25 72157
0 69 false 26 71737
0 69 false 27 72428
0 69 false 28 71836
0 69 false 29 72076
0 69 false 30 72257
0 69 false 31 71696
0 69 false 32 72137
0 69 false 33 72047
0 69 false 34 71927
0 69 false 35 3101969
0 69 false 36 83593
0 69 false 37 74951
0 69 false 38 72547
0 69 false 39 72277
0 69 false 40 72006
0 69 false 41 72157
0 69 false 42 72637
0 69 false 43 71866
0 69 false 44 72227
0 69 false 45 72027
0 69 false 46 71857
0 69 false 47 76984
0 69 false 48 72367
0 69 false 49 72057
0 69 false 50 72157
0 69 false 51 71747
0 69 false 52 72077
0 69 false 53 71656
0 69 false 54 72518
0 69 false 55 71486
0 69 false 56 71816
0 69 false 57 72127
0 69 false 58 71557
0 69 false 59 71446
0 69 false 60 72087
0 69 false 61 74992
0 69 false 62 73009
0 69 false 63 72157
0 69 true 0 33399
0 69 true 1 30825
0 69 true 2 30074
0 69 true 3 29945
0 69 true 4 29624
0 69 true 5 29684
0 69 true 6 29393
0 69 true 7 29804
0 69 true 8 29784
0 69 true 9 29414
0 69 true 10 29664
0 69 true 11 29503
0 69 true 12 29263
0 69 true 13 29554
0 69 true 14 29333
0 69 true 15 29675
0 69 true 16 29514
0 69 true 17 29354
0 69 true 18 29193
0 69 true 19 29654
0 69 true 20 29243
0 69 true 21 3046327
0 69 true 22 32659
0 69 true 23 30205
0 69 true 24 29834
0 69 true 25 29774
0 69 true 26 29744
0 69 true 27 29894
0 69 true 28 29684
0 69 true 29 29374
0 69 true 30 29464
0 69 true 31 29574
0 69 true 32 29544
0 69 true 33 29554
0 69 true 34 29103
0 69 true 35 29594
0 69 true 36 29444
0 69 true 37 29443
0 69 true 38 29463
0 69 true 39 29533
0 69 true 40 29254
0 69 true 41 29354
0 69 true 42 29113
0 69 true 43 29343
0 69 true 44 28963
0 69 true 45 29464
0 69 true 46 29013
0 69 true 47 29965
0 69 true 48 29403
0 69 true 49 29403
0 69 true 50 29254
0 69 true 51 32878
0 69 true 52 29514
0 69 true 53 29734
0 69 true 54 29333
0 69 true 55 29444
0 69 true 56 29654
0 69 true 57 29514
0 69 true 58 29373
0 69 true 59 29604
0 69 true 60 29263
0 69 true 61 29954
0 69 true 62 29233
0 69 true 63 29484
0 301 false 0 80820
0 301 false 1 74480
0 301 false 2 73048
0 301 false 3 72457
0 301 false 4 72207
0 301 false 5 71747
0 301 false 6 76403
0 301 false 7 71906
0 301 false 8 72628
0 301 false 9 71957
0 301 false 10 72237
0 301 false 11 71917
0 301 false 12 71436
0 301 false 13 72217
0 301 false 14 72227
0 301 false 15 72217
0 301 false 16 71857
0 301 false 17 71406
0 301 false 18 71136
0 301 false 19 3087408
0 301 false 20 80850
0 301 false 21 73238
0 301 false 22 72688
0 301 false 23 72608
0 301 false 24 72417
0 301 false 25 72067
0 301 false 26 71787
0 301 false 27 72027
0 301 false 28 71676
0 301 false 29 72778
0 301 false 30 72227
0 301 false 31 72017
0 301 false 32 74661
0 301 false 33 72347
0 301 false 34 71836
0 301 false 35 71857
0 301 false 36 71967
0 301 false 37 71847
0 301 false 38 72217
0 301 false 39 72207
0 301 false 40 71937
0 301 false 41 72227
0 301 false 42 72006
0 301 false 43 71647
0 301 false 44 72026
0 301 false 45 74661
0 301 false 46 72077
0 301 false 47 71977
0 301 false 48 71767
0 301 false 49 71506
0 301 false 50 72026
0 301 false 51 71656
0 301 false 52 72277
0 301 false 53 71967
0 301 false 54 72087
0 301 false 55 72037
0 301 false 56 72167
0 301 false 57 72097
0 301 false 58 3080788
0 301 false 59 97124
0 301 false 60 78747
0 301 false 61 74260
0 301 false 62 72407
0 301 false 63 72257
0 301 true 0 32999
0 301 true 1 30625
0 301 true 2 29473
0 301 true 3 29695
0 301 true 4 29423
0 301 true 5 29424
0 301 true 6 29504
0 301 true 7 29854
0 301 true 8 29694
0 301 true 9 29764
0 301 true 10 29684
0 301 true 11 29234
0 301 true 12 29704
0 301 true 13 29684
0 301 true 14 29323
0 301 true 15 33740
0 301 true 16 29494
0 301 true 17 29514
0 301 true 18 29564
0 301 true 19 29523
0 301 true 20 29644
0 301 true 21 29514
0 301 true 22 29524
0 301 true 23 29344
0 301 true 24 29454
0 301 true 25 29294
0 301 true 26 29674
0 301 true 27 29413
0 301 true 28 29144
0 301 true 29 29664
0 301 true 30 29224
0 301 true 31 29263
0 301 true 32 29113
0 301 true 33 29464
0 301 true 34 29283
0 301 true 35 30405
0 301 true 36 30455
0 301 true 37 29273
0 301 true 38 29794
0 301 true 39 29454
0 301 true 40 29744
0 301 true 41 29494
0 301 true 42 29574
0 301 true 43 29734
0 301 true 44 29714
0 301 true 45 29634
0 301 true 46 33289
0 301 true 47 29484
0 301 true 48 29244
0 301 true 49 29604
0 301 true 50 29323
0 301 true 51 29684
0 301 true 52 29324
0 301 true 53 29574
0 301 true 54 29273
0 301 true 55 29323
0 301 true 56 29384
0 301 true 57 29564
0 301 true 58 29554
0 301 true 59 28722
0 301 true 60 29584
0 301 true 61 29003
0 301 true 62 29464
0 301 true 63 29524
0 71523 false 0 88441
0 71523 false 1 83093
0 71523 false 2 80880
0 71523 false 3 3095169
0 71523 false 4 91806
0 71523 false 5 82302
0 71523 false 6 81690
0 71523 false 7 79998
0 71523 false 8 80909
0 71523 false 9 80619
0 71523 false 10 80239
0 71523 false 11 80599
0 71523 false 12 79989
0 71523 false 13 80740
0 71523 false 14 84355
0 71523 false 15 80479
0 71523 false 16 80079
0 71523 false 17 80379
0 71523 false 18 79898
0 71523 false 19 80219
0 71523 false 20 80289
0 71523 false 21 80399
0 71523 false 22 80269
0 71523 false 23 79728
0 71523 false 24 80038
0 71523 false 25 80119
0 71523 false 26 82292
0 71523 false 27 80489
0 71523 false 28 80429
0 71523 false 29 80329
0 71523 false 30 80349
0 71523 false 31 79979
0 71523 false 32 80599
0 71523 false 33 80309
0 71523 false 34 79779
0 71523 false 35 80248
0 71523 false 36 80199
0 71523 false 37 79828
0 71523 false 38 79719
0 71523 false 39 107990
0 71523 false 40 87870
0 71523 false 41 83023
0 71523 false 42 81321
0 71523 false 43 80299
0 71523 false 44 80449
0 71523 false 45 80199
0 71523 false 46 79939
0 71523 false 47 79979
0 71523 false 48 80330
0 71523 false 49 80068
0 71523 false 50 79758
0 71523 false 51 83473
0 71523 false 52 80550
0 71523 false 53 80219
0 71523 false 54 80049
0 71523 false 55 80379
0 71523 false 56 81611
0 71523 false 57 80569
0 71523 false 58 80259
0 71523 false 59 80279
0 71523 false 60 80149
0 71523 false 61 80168
0 71523 false 62 80189
0 71523 false 63 83775
0 71523 true 0 33239
0 71523 true 1 30315
0 71523 true 2 29664
0 71523 true 3 29494
0 71523 true 4 29514
0 71523 true 5 29834
0 71523 true 6 29364
0 71523 true 7 29614
0 71523 true 8 29794
0 71523 true 9 29434
0 71523 true 10 29694
0 71523 true 11 29253
0 71523 true 12 29574
0 71523 true 13 29083
0 71523 true 14 29834
0 71523 true 15 29564
0 71523 true 16 29604
0 71523 true 17 29243
0 71523 true 18 29414
0 71523 true 19 29414
0 71523 true 20 29444
0 71523 true 21 29794
0 71523 true 22 29584
0 71523 true 23 29273
0 71523 true 24 29564
0 71523 true 25 29514
0 71523 true 26 29563
0 71523 true 27 29483
0 71523 true 28 3106917
0 71523 true 29 34542
0 71523 true 30 30776
0 71523 true 31 29233
0 71523 true 32 29534
0 71523 true 33 29464
0 71523 true 34 29744
0 71523 true 35 29374
0 71523 true 36 29494
0 71523 true 37 29534
0 71523 true 38 29273
0 71523 true 39 29474
0 71523 true 40 29484
0 71523 true 41 29103
0 71523 true 42 29695
0 71523 true 43 29063
0 71523 true 44 29263
0 71523 true 45 29203
0 71523 true 46 29534
0 71523 true 47 29424
0 71523 true 48 29604
0 71523 true 49 29504
0 71523 true 50 29764
0 71523 true 51 29344
0 71523 true 52 29393
0 71523 true 53 29244
0 71523 true 54 29574
0 71523 true 55 29093
0 71523 true 56 31526
0 71523 true 57 29144
0 71523 true 58 29363
0 71523 true 59 29344
0 71523 true 60 29143
0 71523 true 61 28893
0 71523 true 62 29204
0 71523 true 63 29684
0 111028891713715270858633 false 0 72798
0 111028891713715270858633 false 1 66909
0 111028891713715270858633 false 2 64746
0 111028891713715270858633 false 3 64145
0 111028891713715270858633 false 4 63554
0 111028891713715270858633 false 5 63715
0 111028891713715270858633 false 6 63964
0 111028891713715270858633 false 7 63354
0 111028891713715270858633 false 8 67209
0 111028891713715270858633 false 9 64005
0 111028891713715270858633 false 10 63894
0 111028891713715270858633 false 11 63874
0 111028891713715270858633 false 12 63764
0 111028891713715270858633 false 13 63264
0 111028891713715270858633 false 14 63294
0 111028891713715270858633 false 15 63424
0 111028891713715270858633 false 16 63474
0 111028891713715270858633 false 17 63834
0 111028891713715270858633 false 18 63525
0 111028891713715270858633 false 19 63244
0 111028891713715270858633 false 20 63013
0 111028891713715270858633 false 21 63344
0 111028891713715270858633 false 22 3073277
0 111028891713715270858633 false 23 76113
0 111028891713715270858633 false 24 66278
0 111028891713715270858633 false 25 64386
0 111028891713715270858633 false 26 64146
0 111028891713715270858633 false 27 63515
0 111028891713715270858633 false 28 64025
0 111028891713715270858633 false 29 63204
0 111028891713715270858633 false 30 63214
0 111028891713715270858633 false 31 62984
0 111028891713715270858633 false 32 63534
0 111028891713715270858633 false 33 63194
0 111028891713715270858633 false 34 63374
0 111028891713715270858633 false 35 63434
0 111028891713715270858633 false 36 67460
0 111028891713715270858633 false 37 63494
0 111028891713715270858633 false 38 63223
0 111028891713715270858633 false 39 63123
0 111028891713715270858633 false 40 63044
0 111028891713715270858633 false 41 63143
0 111028891713715270858633 false 42 63595
0 111028891713715270858633 false 43 63354
0 111028891713715270858633 false 44 63404
0 111028891713715270858633 false 45 63164
0 111028891713715270858633 false 46 63484
0 111028891713715270858633 false 47 63534
0 111028891713715270858633 false 48 63594
0 111028891713715270858633 false 49 63804
0 111028891713715270858633 false 50 66439
0 111028891713715270858633 false 51 63434
0 111028891713715270858633 false 52 63234
0 111028891713715270858633 false 53 63985
0 111028891713715270858633 false 54 63574
0 111028891713715270858633 false 55 63494
0 111028891713715270858633 false 56 63383
0 111028891713715270858633 false 57 63475
0 111028891713715270858633 false 58 63474
0 111028891713715270858633 false 59 63705
0 111028891713715270858633 false 60 63634
0 111028891713715270858633 false 61 63684
0 111028891713715270858633 false 62 63224
0 111028891713715270858633 false 63 63254
0 111028891713715270858633 true 0 43995
0 111028891713715270858633 true 1 34561
0 111028891713715270858633 true 2 32638
0 111028891713715270858633 true 3 31617
0 111028891713715270858633 true 4 31517
0 111028891713715270858633 true 5 31166
0 111028891713715270858633 true 6 31447
0 111028891713715270858633 true 7 31597
0 111028891713715270858633 true 8 31376
0 111028891713715270858633 true 9 31237
0 111028891713715270858633 true 10 31617
0 111028891713715270858633 true 11 31517
0 111028891713715270858633 true 12 31376
0 111028891713715270858633 true 13 31176
0 111028891713715270858633 true 14 31276
0 111028891713715270858633 true 15 31406
0 111028891713715270858633 true 16 31146
0 111028891713715270858633 true 17 31046
0 111028891713715270858633 true 18 31317
0 111028891713715270858633 true 19 30946
0 111028891713715270858633 true 20 31446
0 111028891713715270858633 true 21 31687
0 111028891713715270858633 true 22 31286
0 111028891713715270858633 true 23 31497
0 111028891713715270858633 true 24 34641
0 111028891713715270858633 true 25 32068
0 111028891713715270858633 true 26 31176
0 111028891713715270858633 true 27 31277
0 111028891713715270858633 true 28 31086
0 111028891713715270858633 true 29 31036
0 111028891713715270858633 true 30 31657
0 111028891713715270858633 true 31 31307
0 111028891713715270858633 true 32 31076
0 111028891713715270858633 true 33 31166
0 111028891713715270858633 true 34 31437
0 111028891713715270858633 true 35 31347
0 111028891713715270858633 true 36 31337
0 111028891713715270858633 true 37 31587
0 111028891713715270858633 true 38 31296
0 111028891713715270858633 true 39 31426
0 111028891713715270858633 true 40 31056
0 111028891713715270858633 true 41 31146
0 111028891713715270858633 true 42 31547
0 111028891713715270858633 true 43 31146
0 111028891713715270858633 true 44 31026
0 111028891713715270858633 true 45 31156
0 111028891713715270858633 true 46 31126
0 111028891713715270858633 true 47 31257
0 111028891713715270858633 true 48 31056
0 111028891713715270858633 true 49 31367
0 111028891713715270858633 true 50 3321885
0 111028891713715270858633 true 51 50445
0 111028891713715270858633 true 52 36124
0 111028891713715270858633 true 53 33079
0 111028891713715270858633 true 54 31898
0 111028891713715270858633 true 55 31517
0 111028891713715270858633 true 56 32338
0 111028891713715270858633 true 57 31737
0 111028891713715270858633 true 58 31296
0 111028891713715270858633 true 59 31196
0 111028891713715270858633 true 60 31597
0 111028891713715270858633 true 61 31106
0 111028891713715270858633 true 62 31036
0 111028891713715270858633 true 63 31127
0 239 false 0 100118
0 239 false 1 85647
0 239 false 2 82613
0 239 false 3 80589
0 239 false 4 81060
0 239 false 5 82342
0 239 false 6 80870
0 239 false 7 80660
0 239 false 8 80399
0 239 false 9 80670
0 239 false 10 81191
0 239 false 11 85276
0 239 false 12 80560
0 239 false 13 80740
0 239 false 14 81050
0 239 false 15 79849
0 239 false 16 80169
0 239 false 17 80529
0 239 false 18 80880
0 239 false 19 81701
0 239 false 20 81221
0 239 false 21 80730
0 239 false 22 81510
0 239 false 23 83815
0 239 false 24 80720
0 239 false 25 81170
0 239 false 26 80960
0 239 false 27 80369
0 239 false 28 81170
0 239 false 29 80670
0 239 false 30 81080
0 239 false 31 81541
0 239 false 32 80830
0 239 false 33 80339
0 239 false 34 80580
0 239 false 35 83664
0 239 false 36 81051
0 239 false 37 80569
0 239 false 38 80780
0 239 false 39 80830
0 239 false 40 80309
0 239 false 41 80429
0 239 false 42 80228
0 239 false 43 80310
0 239 false 44 80519
0 239 false 45 81040
0 239 false 46 80330
0 239 false 47 84274
0 239 false 48 80911
0 239 false 49 81030
0 239 false 50 81651
0 239 false 51 80118
0 239 false 52 80749
0 239 false 53 80449
0 239 false 54 80419
0 239 false 55 80620
0 239 false 56 81150
0 239 false 57 80700
0 239 false 58 80630
0 239 false 59 177524
0 239 false 60 81921
0 239 false 61 80569
0 239 false 62 80730
0 239 false 63 80029
0 239 true 0 33039
0 239 true 1 30405
0 239 true 2 29453
0 239 true 3 29644
0 239 true 4 29815
0 239 true 5 29474
0 239 true 6 29413
0 239 true 7 29544
0 239 true 8 29934
0 239 true 9 29804
0 239 true 10 29193
0 239 true 11 29404
0 239 true 12 29484
0 239 true 13 33489
0 239 true 14 29594
0 239 true 15 29333
0 239 true 16 29344
0 239 true 17 29574
0 239 true 18 29784
0 239 true 19 29644
0 239 true 20 29344
0 239 true 21 29443
0 239 true 22 29424
0 239 true 23 29393
0 239 true 24 29254
0 239 true 25 29083
0 239 true 26 29584
0 239 true 27 29454
0 239 true 28 29954
0 239 true 29 29284
0 239 true 30 29664
0 239 true 31 29264
0 239 true 32 29233
0 239 true 33 29774
0 239 true 34 29214
0 239 true 35 29513
0 239 true 36 29193
0 239 true 37 29725
0 239 true 38 29504
0 239 true 39 29223
0 239 true 40 29424
0 239 true 41 29524
0 239 true 42 29183
0 239 true 43 29203
0 239 true 44 31717
0 239 true 45 29354
0 239 true 46 29714
0 239 true 47 29504
0 239 true 48 29524
0 239 true 49 29183
0 239 true 50 29193
0 239 true 51 29443
0 239 true 52 29404
0 239 true 53 29163
0 239 true 54 29393
0 239 true 55 29644
0 239 true 56 29113
0 239 true 57 29624
0 239 true 58 29263
0 239 true 59 29444
0 239 true 60 29484
0 239 true 61 29363
0 239 true 62 29424
0 239 true 63 29574
0 631 false 0 78977
0 631 false 1 74510
0 631 false 2 72748
0 631 false 3 75492
0 631 false 4 72517
0 631 false 5 72587
0 631 false 6 72117
0 631 false 7 71867
0 631 false 8 71836
0 631 false 9 72367
0 631 false 10 72337
0 631 false 11 72027
0 631 false 12 71737
0 631 false 13 72027
0 631 false 14 71225
0 631 false 15 72007
0 631 false 16 77404
0 631 false 17 72077
0 631 false 18 72267
0 631 false 19 71626
0 631 false 20 71756
0 631 false 21 72277
0 631 false 22 72157
0 631 false 23 72208
0 631 false 24 71546
0 631 false 25 71736
0 631 false 26 71597
0 631 false 27 72567
0 631 false 28 71737
0 631 false 29 75362
0 631 false 30 71656
0 631 false 31 71626
0 631 false 32 72167
0 631 false 33 71355
0 631 false 34 71917
0 631 false 35 71957
0 631 false 36 71887
0 631 false 37 72207
0 631 false 38 71746
0 631 false 39 72156
0 631 false 40 72087
0 631 false 41 71877
0 631 false 42 74681
0 631 false 43 71717
0 631 false 44 72197
0 631 false 45 71806
0 631 false 46 72116
0 631 false 47 72338
0 631 false 48 72477
0 631 false 49 71727
0 631 false 50 71816
0 631 false 51 72258
0 631 false 52 71946
0 631 false 53 71626
0 631 false 54 72207
0 631 false 55 71887
0 631 false 56 74219
0 631 false 57 72127
0 631 false 58 71746
0 631 false 59 71496
0 631 false 60 71927
0 631 false 61 71746
0 631 false 62 71556
0 631 false 63 71936
0 631 true 0 32829
0 631 true 1 30765
0 631 true 2 29974
0 631 true 3 30035
0 631 true 4 29864
0 631 true 5 29775
0 631 true 6 29764
0 631 true 7 29493
0 631 true 8 29603
0 631 true 9 29884
0 631 true 10 29594
0 631 true 11 33429
0 631 true 12 29784
0 631 true 13 29824
0 631 true 14 29384
0 631 true 15 29484
0 631 true 16 29694
0 631 true 17 29474
0 631 true 18 29414
0 631 true 19 30135
0 631 true 20 29454
0 631 true 21 29925
0 631 true 22 29243
0 631 true 23 29804
0 631 true 24 29564
0 631 true 25 29654
0 631 true 26 29504
0 631 true 27 29704
0 631 true 28 29634
0 631 true 29 29283
0 631 true 30 29563
0 631 true 31 29554
0 631 true 32 29374
0 631 true 33 29503
0 631 true 34 29323
0 631 true 35 29534
0 631 true 36 29594
0 631 true 37 29453
0 631 true 38 29374
0 631 true 39 29624
0 631 true 40 29334
0 631 true 41 103374
0 631 true 42 31297
0 631 true 43 29824
0 631 true 44 29574
0 631 true 45 29634
0 631 true 46 29934
0 631 true 47 29424
0 631 true 48 29564
0 631 true 49 29664
0 631 true 50 29594
0 631 true 51 29513
0 631 true 52 29684
0 631 true 53 29434
0 631 true 54 29934
0 631 true 55 29464
0 631 true 56 29734
0 631 true 57 29433
0 631 true 58 29814
0 631 true 59 29674
0 631 true 60 29694
0 631 true 61 29855
0 631 true 62 29513
0 631 true 63 29653
0 223 false 0 78987
0 223 false 1 78076
0 223 false 2 73248
0 223 false 3 72908
0 223 false 4 72787
0 223 false 5 72788
0 223 false 6 72157
0 223 false 7 72487
0 223 false 8 72127
0 223 false 9 72067
0 223 false 10 72447
0 223 false 11 72458
0 223 false 12 72297
0 223 false 13 72287
0 223 false 14 75802
0 223 false 15 72207
0 223 false 16 72147
0 223 false 17 72388
0 223 false 18 72557
0 223 false 19 73229
0 223 false 20 72808
0 223 false 21 71956
0 223 false 22 72127
0 223 false 23 72688
0 223 false 24 72808
0 223 false 25 72568
0 223 false 26 72467
0 223 false 27 75813
0 223 false 28 72137
0 223 false 29 72407
0 223 false 30 72848
0 223 false 31 71787
0 223 false 32 71956
0 223 false 33 72137
0 223 false 34 72037
0 223 false 35 72948
0 223 false 36 72327
0 223 false 37 72057
0 223 false 38 72087
0 223 false 39 71916
0 223 false 40 76323
0 223 false 41 72888
0 223 false 42 72218
0 223 false 43 72117
0 223 false 44 72447
0 223 false 45 72017
0 223 false 46 71786
0 223 false 47 72468
0 223 false 48 71887
0 223 false 49 72207
0 223 false 50 72547
0 223 false 51 72417
0 223 false 52 72157
0 223 false 53 72558
0 223 false 54 75642
0 223 false 55 72518
0 223 false 56 72007
0 223 false 57 72157
0 223 false 58 72117
0 223 false 59 71546
0 223 false 60 72368
0 223 false 61 70915
0 223 false 62 72227
0 223 false 63 72427
0 223 true 0 32058
0 223 true 1 30264
0 223 true 2 30155
0 223 true 3 28332
0 223 true 4 29463
0 223 true 5 29574
0 223 true 6 32799
0 223 true 7 29624
0 223 true 8 29404
0 223 true 9 29564
0 223 true 10 29534
0 223 true 11 29554
0 223 true 12 30024
0 223 true 13 29624
0 223 true 14 29384
0 223 true 15 29944
0 223 true 16 29393
0 223 true 17 29473
0 223 true 18 29344
0 223 true 19 29694
0 223 true 20 29774
0 223 true 21 29574
0 223 true 22 29604
0 223 true 23 29504
0 223 true 24 29534
0 223 true 25 29554
0 223 true 26 29514
0 223 true 27 29844
0 223 true 28 29073
0 223 true 29 29404
0 223 true 30 29324
0 223 true 31 29263
0 223 true 32 29624
0 223 true 33 29384
0 223 true 34 29524
0 223 true 35 29213
0 223 true 36 29554
0 223 true 37 29584
0 223 true 38 29484
0 223 true 39 29594
0 223 true 40 29644
0 223 true 41 29504
0 223 true 42 29614
0 223 true 43 29324
0 223 true 44 29754
0 223 true 45 29243
0 223 true 46 29364
0 223 true 47 29684
0 223 true 48 29293
0 223 true 49 29604
0 223 true 50 29494
0 223 true 51 29644
0 223 true 52 29394
0 223 true 53 29353
0 223 true 54 29444
0 223 true 55 29523
0 223 true 56 29303
0 223 true 57 29353
0 223 true 58 29534
0 223 true 59 29343
0 223 true 60 29414
0 223 true 61 29444
0 223 true 62 29403
0 223 true 63 29654
0 1184777 false 0 81641
0 1184777 false 1 73408
0 1184777 false 2 72187
0 1184777 false 3 72618
0 1184777 false 4 72207
0 1184777 false 5 71596
0 1184777 false 6 71846
0 1184777 false 7 71537
0 1184777 false 8 71997
0 1184777 false 9 72057
0 1184777 false 10 71576
0 1184777 false 11 71396
0 1184777 false 12 71917
0 1184777 false 13 75592
0 1184777 false 14 72287
0 1184777 false 15 71116
0 1184777 false 16 72037
0 1184777 false 17 72027
0 1184777 false 18 71696
0 1184777 false 19 71517
0 1184777 false 20 71285
0 1184777 false 21 72097
0 1184777 false 22 71466
0 1184777 false 23 71786
0 1184777 false 24 71035
0 1184777 false 25 71526
0 1184777 false 26 74871
0 1184777 false 27 72087
0 1184777 false 28 71626
0 1184777 false 29 71205
0 1184777 false 30 71256
0 1184777 false 31 71777
0 1184777 false 32 71806
0 1184777 false 33 71666
0 1184777 false 34 71366
0 1184777 false 35 71195
0 1184777 false 36 71516
0 1184777 false 37 71776
0 1184777 false 38 71456
0 1184777 false 39 71546
0 1184777 false 40 74680
0 1184777 false 41 71857
0 1184777 false 42 71296
0 1184777 false 43 71806
0 1184777 false 44 71667
0 1184777 false 45 72097
0 1184777 false 46 71696
0 1184777 false 47 71466
0 1184777 false 48 71346
0 1184777 false 49 71436
0 1184777 false 50 71396
0 1184777 false 51 71457
0 1184777 false 52 71887
0 1184777 false 53 74861
0 1184777 false 54 71897
0 1184777 false 55 71646
0 1184777 false 56 71136
0 1184777 false 57 71516
0 1184777 false 58 71906
0 1184777 false 59 71466
0 1184777 false 60 71787
0 1184777 false 61 71356
0 1184777 false 62 71546
0 1184777 false 63 71105
0 1184777 true 0 31878
0 1184777 true 1 30135
0 1184777 true 2 29944
0 1184777 true 3 29804
0 1184777 true 4 29664
0 1184777 true 5 33290
0 1184777 true 6 29724
0 1184777 true 7 29664
0 1184777 true 8 29554
0 1184777 true 9 29484
0 1184777 true 10 29814
0 1184777 true 11 29744
0 1184777 true 12 29744
0 1184777 true 13 29614
0 1184777 true 14 29974
0 1184777 true 15 29744
0 1184777 true 16 29584
0 1184777 true 17 29834
0 1184777 true 18 29514
0 1184777 true 19 29614
0 1184777 true 20 29214
0 1184777 true 21 29543
0 1184777 true 22 29715
0 1184777 true 23 29684
0 1184777 true 24 29464
0 1184777 true 25 29644
0 1184777 true 26 29553
0 1184777 true 27 29353
0 1184777 true 28 29694
0 1184777 true 29 29824
0 1184777 true 30 29865
0 1184777 true 31 29103
0 1184777 true 32 29684
0 1184777 true 33 29524
0 1184777 true 34 29404
0 1184777 true 35 50755
0 1184777 true 36 29644
0 1184777 true 37 29524
0 1184777 true 38 29804
0 1184777 true 39 29504
0 1184777 true 40 30095
0 1184777 true 41 29814
0 1184777 true 42 29714
0 1184777 true 43 29654
0 1184777 true 44 29794
0 1184777 true 45 29574
0 1184777 true 46 29444
0 1184777 true 47 29884
0 1184777 true 48 30005
0 1184777 true 49 29373
0 1184777 true 50 29514
0 1184777 true 51 29614
0 1184777 true 52 29724
0 1184777 true 53 29514
0 1184777 true 54 29574
0 1184777 true 55 29844
0 1184777 true 56 29593
0 1184777 true 57 29784
0 1184777 true 58 29874
0 1184777 true 59 29544
0 1184777 true 60 29464
0 1184777 true 61 29895
0 1184777 true 62 29684
0 1184777 true 63 29854
0 284551513249666376365123 false 0 77474
0 284551513249666376365123 false 1 73649
0 284551513249666376365123 false 2 73599
0 284551513249666376365123 false 3 73299
0 284551513249666376365123 false 4 72567
0 284551513249666376365123 false 5 72447
0 284551513249666376365123 false 6 73129
0 284551513249666376365123 false 7 73018
0 284551513249666376365123 false 8 72828
0 284551513249666376365123 false 9 73019
0 284551513249666376365123 false 10 70725
0 284551513249666376365123 false 11 75822
0 284551513249666376365123 false 12 72618
0 284551513249666376365123 false 13 73248
0 284551513249666376365123 false 14 72327
0 284551513249666376365123 false 15 72557
0 284551513249666376365123 false 16 72167
0 284551513249666376365123 false 17 72687
0 284551513249666376365123 false 18 72448
0 284551513249666376365123 false 19 73019
0 284551513249666376365123 false 20 72348
0 284551513249666376365123 false 21 72547
0 284551513249666376365123 false 22 72397
0 284551513249666376365123 false 23 72848
0 284551513249666376365123 false 24 76233
0 284551513249666376365123 false 25 72798
0 284551513249666376365123 false 26 72738
0 284551513249666376365123 false 27 72868
0 284551513249666376365123 false 28 73489
0 284551513249666376365123 false 29 72247
0 284551513249666376365123 false 30 72477
0 284551513249666376365123 false 31 72387
0 284551513249666376365123 false 32 72697
0 284551513249666376365123 false 33 72508
0 284551513249666376365123 false 34 72258
0 284551513249666376365123 false 35 72317
0 284551513249666376365123 false 36 77465
0 284551513249666376365123 false 37 72918
0 284551513249666376365123 false 38 72408
0 284551513249666376365123 false 39 72338
0 284551513249666376365123 false 40 72337
0 284551513249666376365123 false 41 73238
0 284551513249666376365123 false 42 72087
0 284551513249666376365123 false 43 72317
0 284551513249666376365123 false 44 72577
0 284551513249666376365123 false 45 72558
0 284551513249666376365123 false 46 72428
0 284551513249666376365123 false 47 72688
0 284551513249666376365123 false 48 72638
0 284551513249666376365123 false 49 76864
0 284551513249666376365123 false 50 73108
0 284551513249666376365123 false 51 73209
0 284551513249666376365123 false 52 72928
0 284551513249666376365123 false 53 72448
0 284551513249666376365123 false 54 72597
0 284551513249666376365123 false 55 72437
0 284551513249666376365123 false 56 72507
0 284551513249666376365123 false 57 72758
0 284551513249666376365123 false 58 72938
0 284551513249666376365123 false 59 73028
0 284551513249666376365123 false 60 72898
0 284551513249666376365123 false 61 75212
0 284551513249666376365123 false 62 73109
0 284551513249666376365123 false 63 72297
0 284551513249666376365123 true 0 34531
0 284551513249666376365123 true 1 32889
0 284551513249666376365123 true 2 32137
0 284551513249666376365123 true 3 31687
0 284551513249666376365123 true 4 31567
0 284551513249666376365123 true 5 31627
0 284551513249666376365123 true 6 31095
0 284551513249666376365123 true 7 31667
0 284551513249666376365123 true 8 31387
0 284551513249666376365123 true 9 31336
0 284551513249666376365123 true 10 31827
0 284551513249666376365123 true 11 31587
0 284551513249666376365123 true 12 31497
0 284551513249666376365123 true 13 31086
0 284551513249666376365123 true 14 31477
0 284551513249666376365123 true 15 31667
0 284551513249666376365123 true 16 31907
0 284551513249666376365123 true 17 31136
0 284551513249666376365123 true 18 31367
0 284551513249666376365123 true 19 34712
0 284551513249666376365123 true 20 31547
0 284551513249666376365123 true 21 31617
0 284551513249666376365123 true 22 31887
0 284551513249666376365123 true 23 31246
0 284551513249666376365123 true 24 31837
0 284551513249666376365123 true 25 31146
0 284551513249666376365123 true 26 31697
0 284551513249666376365123 true 27 31618
0 284551513249666376365123 true 28 31277
0 284551513249666376365123 true 29 31577
0 284551513249666376365123 true 30 31497
0 284551513249666376365123 true 31 31446
0 284551513249666376365123 true 32 31487
0 284551513249666376365123 true 33 31577
0 284551513249666376365123 true 34 31376
0 284551513249666376365123 true 35 31296
0 284551513249666376365123 true 36 31557
0 284551513249666376365123 true 37 31396
0 284551513249666376365123 true 38 31546
0 284551513249666376365123 true 39 31477
0 284551513249666376365123 true 40 31306
0 284551513249666376365123 true 41 31627
0 284551513249666376365123 true 42 31477
0 284551513249666376365123 true 43 31597
0 284551513249666376365123 true 44 31547
0 284551513249666376365123 true 45 34992
0 284551513249666376365123 true 46 31277
0 284551513249666376365123 true 47 31327
0 284551513249666376365123 true 48 31727
0 284551513249666376365123 true 49 31507
0 284551513249666376365123 true 50 31547
0 284551513249666376365123 true 51 31476
0 284551513249666376365123 true 52 31467
0 284551513249666376365123 true 53 31547
0 284551513249666376365123 true 54 31356
0 284551513249666376365123 true 55 31287
0 284551513249666376365123 true 56 31677
0 284551513249666376365123 true 57 31386
0 284551513249666376365123 true 58 31487
0 284551513249666376365123 true 59 31716
0 284551513249666376365123 true 60 31427
0 284551513249666376365123 true 61 31557
0 284551513249666376365123 true 62 31106
0 284551513249666376365123 true 63 31797
0 23 false 0 68852
0 23 false 1 65227
0 23 false 2 66298
0 23 false 3 63945
0 23 false 4 63584
0 23 false 5 63385
0 23 false 6 64155
0 23 false 7 63604
0 23 false 8 63454
0 23 false 9 63284
0 23 false 10 63284
0 23 false 11 63114
0 23 false 12 63354
0 23 false 13 63554
0 23 false 14 63895
0 23 false 15 63594
0 23 false 16 63054
0 23 false 17 67090
0 23 false 18 63104
0 23 false 19 63504
0 23 false 20 62833
0 23 false 21 63114
0 23 false 22 63384
0 23 false 23 63965
0 23 false 24 63444
0 23 false 25 63534
0 23 false 26 63555
0 23 false 27 63454
0 23 false 28 63443
0 23 false 29 63445
0 23 false 30 63854
0 23 false 31 64005
0 23 false 32 66919
0 23 false 33 63645
0 23 false 34 63173
0 23 false 35 63505
0 23 false 36 62963
0 23 false 37 63464
0 23 false 38 63544
0 23 false 39 63314
0 23 false 40 63834
0 23 false 41 63234
0 23 false 42 63744
0 23 false 43 63343
0 23 false 44 63675
0 23 false 45 63394
0 23 false 46 63464
0 23 false 47 67270
0 23 false 48 63514
0 23 false 49 63204
0 23 false 50 63074
0 23 false 51 63424
0 23 false 52 63574
0 23 false 53 63284
0 23 false 54 63113
0 23 false 55 63604
0 23 false 56 63564
0 23 false 57 63043
0 23 false 58 63424
0 23 false 59 63454
0 23 false 60 63304
0 23 false 61 62983
0 23 false 62 66228
0 23 false 63 63384
0 23 true 0 31937
0 23 true 1 30535
0 23 true 2 29985
0 23 true 3 29875
0 23 true 4 29553
0 23 true 5 29895
0 23 true 6 29734
0 23 true 7 29293
0 23 true 8 29644
0 23 true 9 29824
0 23 true 10 30025
0 23 true 11 29433
0 23 true 12 29544
0 23 true 13 29644
0 23 true 14 30014
0 23 true 15 29464
0 23 true 16 29884
0 23 true 17 29674
0 23 true 18 29584
0 23 true 19 29574
0 23 true 20 29554
0 23 true 21 29624
0 23 true 22 29584
0 23 true 23 29864
0 23 true 24 29274
0 23 true 25 29784
0 23 true 26 33009
0 23 true 27 29263
0 23 true 28 29573
0 23 true 29 29915
0 23 true 30 29724
0 23 true 31 30155
0 23 true 32 29654
0 23 true 33 29484
0 23 true 34 29444
0 23 true 35 29533
0 23 true 36 29124
0 23 true 37 29433
0 23 true 38 29844
0 23 true 39 29604
0 23 true 40 29514
0 23 true 41 29554
0 23 true 42 29584
0 23 true 43 29675
0 23 true 44 29454
0 23 true 45 29294
0 23 true 46 29643
0 23 true 47 29403
0 23 true 48 30045
0 23 true 49 29333
0 23 true 50 29624
0 23 true 51 29604
0 23 true 52 29363
0 23 true 53 28943
0 23 true 54 29363
0 23 true 55 29483
0 23 true 56 29534
0 23 true 57 29855
0 23 true 58 29974
0 23 true 59 29684
0 23 true 60 29694
0 23 true 61 29484
0 23 true 62 29864
0 23 true 63 29834
0 1728651 false 0 76113
0 1728651 false 1 73259
0 1728651 false 2 72337
0 1728651 false 3 71766
0 1728651 false 4 72477
0 1728651 false 5 71917
0 1728651 false 6 71386
0 1728651 false 7 71586
0 1728651 false 8 74010
0 1728651 false 9 71977
0 1728651 false 10 71976
0 1728651 false 11 71796
0 1728651 false 12 71506
0 1728651 false 13 71526
0 1728651 false 14 71506
0 1728651 false 15 71846
0 1728651 false 16 72348
0 1728651 false 17 71375
0 1728651 false 18 71657
0 1728651 false 19 71386
0 1728651 false 20 71757
0 1728651 false 21 71516
0 1728651 false 22 77876
0 1728651 false 23 71005
0 1728651 false 24 71997
0 1728651 false 25 71726
0 1728651 false 26 71927
0 1728651 false 27 71666
0 1728651 false 28 71907
0 1728651 false 29 71686
0 1728651 false 30 71466
0 1728651 false 31 71786
0 1728651 false 32 71626
0 1728651 false 33 71947
0 1728651 false 34 71987
0 1728651 false 35 74801
0 1728651 false 36 71957
0 1728651 false 37 71355
0 1728651 false 38 72077
0 1728651 false 39 71876
0 1728651 false 40 71336
0 1728651 false 41 71757
0 1728651 false 42 71726
0 1728651 false 43 71596
0 1728651 false 44 71957
0 1728651 false 45 71446
0 1728651 false 46 71666
0 1728651 false 47 71757
0 1728651 false 48 74530
0 1728651 false 49 71596
0 1728651 false 50 71125
0 1728651 false 51 71807
0 1728651 false 52 72077
0 1728651 false 53 71947
0 1728651 false 54 71386
0 1728651 false 55 71857
0 1728651 false 56 71596
0 1728651 false 57 71637
0 1728651 false 58 71646
0 1728651 false 59 71366
0 1728651 false 60 71997
0 1728651 false 61 71636
0 1728651 false 62 73599
0 1728651 false 63 72317
0 1728651 true 0 32218
0 1728651 true 1 30495
0 1728651 true 2 30225
0 1728651 true 3 29904
0 1728651 true 4 29794
0 1728651 true 5 29754
0 1728651 true 6 29784
0 1728651 true 7 29213
0 1728651 true 8 29884
0 1728651 true 9 29423
0 1728651 true 10 29604
0 1728651 true 11 29674
0 1728651 true 12 29774
0 1728651 true 13 29624
0 1728651 true 14 29874
0 1728651 true 15 29534
0 1728651 true 16 29604
0 1728651 true 17 29724
0 1728651 true 18 29564
0 1728651 true 19 29534
0 1728651 true 20 29764
0 1728651 true 21 29864
0 1728651 true 22 29804
0 1728651 true 23 29514
0 1728651 true 24 29593
0 1728651 true 25 29794
0 1728651 true 26 29554
0 1728651 true 27 29544
0 1728651 true 28 29814
0 1728651 true 29 29654
0 1728651 true 30 29795
0 1728651 true 31 29594
0 1728651 true 32 29494
0 1728651 true 33 29584
0 1728651 true 34 29363
0 1728651 true 35 29874
0 1728651 true 36 29594
0 1728651 true 37 29483
0 1728651 true 38 29654
0 1728651 true 39 29543
0 1728651 true 40 29664
0 1728651 true 41 29684
0 1728651 true 42 29564
0 1728651 true 43 29464
0 1728651 true 44 29624
0 1728651 true 45 29754
0 1728651 true 46 29363
0 1728651 true 47 29343
0 1728651 true 48 29834
0 1728651 true 49 29614
0 1728651 true 50 29494
0 1728651 true 51 29484
0 1728651 true 52 29564
0 1728651 true 53 29493
0 1728651 true 54 29614
0 1728651 true 55 32688
0 1728651 true 56 29444
0 1728651 true 57 29644
0 1728651 true 58 29774
0 1728651 true 59 29494
0 1728651 true 60 29694
0 1728651 true 61 29244
0 1728651 true 62 29694
0 1728651 true 63 29834
0 5439 false 0 78396
0 5439 false 1 74380
0 5439 false 2 73419
0 5439 false 3 73198
0 5439 false 4 72468
0 5439 false 5 72727
0 5439 false 6 72617
0 5439 false 7 72568
0 5439 false 8 76413
0 5439 false 9 72568
0 5439 false 10 72237
0 5439 false 11 72388
0 5439 false 12 72357
0 5439 false 13 72337
0 5439 false 14 72447
0 5439 false 15 72177
0 5439 false 16 72508
0 5439 false 17 72627
0 5439 false 18 72277
0 5439 false 19 72347
0 5439 false 20 72588
0 5439 false 21 76523
0 5439 false 22 72859
0 5439 false 23 72618
0 5439 false 24 72557
0 5439 false 25 72287
0 5439 false 26 72477
0 5439 false 27 73118
0 5439 false 28 72327
0 5439 false 29 72207
0 5439 false 30 72217
0 5439 false 31 72738
0 5439 false 32 72257
0 5439 false 33 72347
0 5439 false 34 75152
0 5439 false 35 72878
0 5439 false 36 72277
0 5439 false 37 72468
0 5439 false 38 72287
0 5439 false 39 72518
0 5439 false 40 72838
0 5439 false 41 72377
0 5439 false 42 72677
0 5439 false 43 72878
0 5439 false 44 72658
0 5439 false 45 72478
0 5439 false 46 72648
0 5439 false 47 167137
0 5439 false 48 73659
0 5439 false 49 73008
0 5439 false 50 72859
0 5439 false 51 72848
0 5439 false 52 72417
0 5439 false 53 72958
0 5439 false 54 72477
0 5439 false 55 72748
0 5439 false 56 72477
0 5439 false 57 72667
0 5439 false 58 73029
0 5439 false 59 75432
0 5439 false 60 72717
0 5439 false 61 72637
0 5439 false 62 72328
0 5439 false 63 72387
0 5439 true 0 32578
0 5439 true 1 30645
0 5439 true 2 30265
0 5439 true 3 29704
0 5439 true 4 29564
0 5439 true 5 29945
0 5439 true 6 29454
0 5439 true 7 29824
0 5439 true 8 29414
0 5439 true 9 29744
0 5439 true 10 29825
0 5439 true 11 29805
0 5439 true 12 29884
0 5439 true 13 29855
0 5439 true 14 29494
0 5439 true 15 29284
0 5439 true 16 29714
0 5439 true 17 29574
0 5439 true 18 33279
0 5439 true 19 29934
0 5439 true 20 29714
0 5439 true 21 29634
0 5439 true 22 29684
0 5439 true 23 29414
0 5439 true 24 29735
0 5439 true 25 29573
0 5439 true 26 29805
0 5439 true 27 29804
0 5439 true 28 29674
0 5439 true 29 29383
0 5439 true 30 29875
0 5439 true 31 29714
0 5439 true 32 29824
0 5439 true 33 29714
0 5439 true 34 29713
0 5439 true 35 29363
0 5439 true 36 29955
0 5439 true 37 30044
0 5439 true 38 29394
0 5439 true 39 29794
0 5439 true 40 29734
0 5439 true 41 29704
0 5439 true 42 29724
0 5439 true 43 29734
0 5439 true 44 29855
0 5439 true 45 29834
0 5439 true 46 29684
0 5439 true 47 29564
0 5439 true 48 29774
0 5439 true 49 32188
0 5439 true 50 29795
0 5439 true 51 29814
0 5439 true 52 29794
0 5439 true 53 29764
0 5439 true 54 29874
0 5439 true 55 29483
0 5439 true 56 29704
0 5439 true 57 29875
0 5439 true 58 29764
0 5439 true 59 29834
0 5439 true 60 29594
0 5439 true 61 29794
0 5439 true 62 29814
0 5439 true 63 29434
0 523890102151522916311113076301980070234414163719 false 0 69473
0 523890102151522916311113076301980070234414163719 false 1 66278
0 523890102151522916311113076301980070234414163719 false 2 64586
0 523890102151522916311113076301980070234414163719 false 3 64455
0 523890102151522916311113076301980070234414163719 false 4 64736
0 523890102151522916311113076301980070234414163719 false 5 64746
0 523890102151522916311113076301980070234414163719 false 6 64496
0 523890102151522916311113076301980070234414163719 false 7 64065
0 523890102151522916311113076301980070234414163719 false 8 64436
0 523890102151522916311113076301980070234414163719 false 9 64306
0 523890102151522916311113076301980070234414163719 false 10 64486
0 523890102151522916311113076301980070234414163719 false 11 64445
0 523890102151522916311113076301980070234414163719 false 12 63974
0 523890102151522916311113076301980070234414163719 false 13 64656
0 523890102151522916311113076301980070234414163719 false 14 64215
0 523890102151522916311113076301980070234414163719 false 15 64055
0 523890102151522916311113076301980070234414163719 false 16 64215
0 523890102151522916311113076301980070234414163719 false 17 67300
0 523890102151522916311113076301980070234414163719 false 18 64666
0 523890102151522916311113076301980070234414163719 false 19 64265
0 523890102151522916311113076301980070234414163719 false 20 64466
0 523890102151522916311113076301980070234414163719 false 21 64345
0 523890102151522916311113076301980070234414163719 false 22 64787
0 523890102151522916311113076301980070234414163719 false 23 64726
0 523890102151522916311113076301980070234414163719 false 24 64366
0 523890102151522916311113076301980070234414163719 false 25 63805
0 523890102151522916311113076301980070234414163719 false 26 63925
0 523890102151522916311113076301980070234414163719 false 27 64255
0 523890102151522916311113076301980070234414163719 false 28 64446
0 523890102151522916311113076301980070234414163719 false 29 67070
0 523890102151522916311113076301980070234414163719 false 30 64525
0 523890102151522916311113076301980070234414163719 false 31 64635
0 523890102151522916311113076301980070234414163719 false 32 63634
0 523890102151522916311113076301980070234414163719 false 33 63655
0 523890102151522916311113076301980070234414163719 false 34 63935
0 523890102151522916311113076301980070234414163719 false 35 64266
0 523890102151522916311113076301980070234414163719 false 36 64505
0 523890102151522916311113076301980070234414163719 false 37 64175
0 523890102151522916311113076301980070234414163719 false 38 64215
0 523890102151522916311113076301980070234414163719 false 39 63725
0 523890102151522916311113076301980070234414163719 false 40 64355
0 523890102151522916311113076301980070234414163719 false 41 68342
0 523890102151522916311113076301980070234414163719 false 42 64155
0 523890102151522916311113076301980070234414163719 false 43 64405
0 523890102151522916311113076301980070234414163719 false 44 64395
0 523890102151522916311113076301980070234414163719 false 45 64275
0 523890102151522916311113076301980070234414163719 false 46 63955
0 523890102151522916311113076301980070234414163719 false 47 63945
0 523890102151522916311113076301980070234414163719 false 48 63794
0 523890102151522916311113076301980070234414163719 false 49 65196
0 523890102151522916311113076301980070234414163719 false 50 64185
0 523890102151522916311113076301980070234414163719 false 51 63715
0 523890102151522916311113076301980070234414163719 false 52 64345
0 523890102151522916311113076301980070234414163719 false 53 67780
0 523890102151522916311113076301980070234414163719 false 54 63825
0 523890102151522916311113076301980070234414163719 false 55 64245
0 523890102151522916311113076301980070234414163719 false 56 63755
0 523890102151522916311113076301980070234414163719 false 57 64355
0 523890102151522916311113076301980070234414163719 false 58 63785
0 523890102151522916311113076301980070234414163719 false 59 63874
0 523890102151522916311113076301980070234414163719 false 60 63744
0 523890102151522916311113076301980070234414163719 false 61 64436
0 523890102151522916311113076301980070234414163719 false 62 63874
0 523890102151522916311113076301980070234414163719 false 63 64126
0 523890102151522916311113076301980070234414163719 true 0 34171
0 523890102151522916311113076301980070234414163719 true 1 32128
0 523890102151522916311113076301980070234414163719 true 2 31867
0 523890102151522916311113076301980070234414163719 true 3 31898
0 523890102151522916311113076301980070234414163719 true 4 31707
0 523890102151522916311113076301980070234414163719 true 5 31517
0 523890102151522916311113076301980070234414163719 true 6 31627
0 523890102151522916311113076301980070234414163719 true 7 31606
0 523890102151522916311113076301980070234414163719 true 8 31396
0 523890102151522916311113076301980070234414163719 true 9 31297
0 523890102151522916311113076301980070234414163719 true 10 31196
0 523890102151522916311113076301980070234414163719 true 11 31456
0 523890102151522916311113076301980070234414163719 true 12 31557
0 523890102151522916311113076301980070234414163719 true 13 31727
0 523890102151522916311113076301980070234414163719 true 14 31567
0 523890102151522916311113076301980070234414163719 true 15 31627
0 523890102151522916311113076301980070234414163719 true 16 31336
0 523890102151522916311113076301980070234414163719 true 17 31557
0 523890102151522916311113076301980070234414163719 true 18 31196
0 523890102151522916311113076301980070234414163719 true 19 31486
0 523890102151522916311113076301980070234414163719 true 20 31537
0 523890102151522916311113076301980070234414163719 true 21 31566
0 523890102151522916311113076301980070234414163719 true 22 34100
0 523890102151522916311113076301980070234414163719 true 23 31436
0 523890102151522916311113076301980070234414163719 true 24 31797
0 523890102151522916311113076301980070234414163719 true 25 31397
0 523890102151522916311113076301980070234414163719 true 26 31377
0 523890102151522916311113076301980070234414163719 true 27 31857
0 523890102151522916311113076301980070234414163719 true 28 31457
0 523890102151522916311113076301980070234414163719 true 29 31487
0 523890102151522916311113076301980070234414163719 true 30 31647
0 523890102151522916311113076301980070234414163719 true 31 31337
0 523890102151522916311113076301980070234414163719 true 32 31186
0 523890102151522916311113076301980070234414163719 true 33 31567
0 523890102151522916311113076301980070234414163719 true 34 31747
0 523890102151522916311113076301980070234414163719 true 35 31206
0 523890102151522916311113076301980070234414163719 true 36 31437
0 523890102151522916311113076301980070234414163719 true 37 31496
0 523890102151522916311113076301980070234414163719 true 38 31166
0 523890102151522916311113076301980070234414163719 true 39 31136
0 523890102151522916311113076301980070234414163719 true 40 31266
0 523890102151522916311113076301980070234414163719 true 41 31597
0 523890102151522916311113076301980070234414163719 true 42 31347
0 523890102151522916311113076301980070234414163719 true 43 31457
0 523890102151522916311113076301980070234414163719 true 44 31397
0 523890102151522916311113076301980070234414163719 true 45 31416
0 523890102151522916311113076301980070234414163719 true 46 31146
0 523890102151522916311113076301980070234414163719 true 47 31416
0 523890102151522916311113076301980070234414163719 true 48 31487
0 523890102151522916311113076301980070234414163719 true 49 31396
0 523890102151522916311113076301980070234414163719 true 50 31537
0 523890102151522916311113076301980070234414163719 true 51 31447
0 523890102151522916311113076301980070234414163719 true 52 31366
0 523890102151522916311113076301980070234414163719 true 53 31337
0 523890102151522916311113076301980070234414163719 true 54 31276
0 523890102151522916311113076301980070234414163719 true 55 31467
0 523890102151522916311113076301980070234414163719 true 56 31496
0 523890102151522916311113076301980070234414163719 true 57 31437
0 523890102151522916311113076301980070234414163719 true 58 31587
0 523890102151522916311113076301980070234414163719 true 59 31376
0 523890102151522916311113076301980070234414163719 true 60 31697
0 523890102151522916311113076301980070234414163719 true 61 31506
0 523890102151522916311113076301980070234414163719 true 62 31467
0 523890102151522916311113076301980070234414163719 true 63 34190
0 5 false 0 68251
0 5 false 1 65477
0 5 false 2 65237
0 5 false 3 63935
0 5 false 4 63935
0 5 false 5 64315
0 5 false 6 63344
0 5 false 7 64376
0 5 false 8 63824
0 5 false 9 63565
0 5 false 10 63885
0 5 false 11 63524
0 5 false 12 67000
0 5 false 13 63915
0 5 false 14 63414
0 5 false 15 63725
0 5 false 16 63674
0 5 false 17 63534
0 5 false 18 63184
0 5 false 19 63735
0 5 false 20 63565
0 5 false 21 63664
0 5 false 22 63144
0 5 false 23 63494
0 5 false 24 63424
0 5 false 25 63224
0 5 false 26 63624
0 5 false 27 66459
0 5 false 28 63354
0 5 false 29 63214
0 5 false 30 63184
0 5 false 31 63424
0 5 false 32 63825
0 5 false 33 62943
0 5 false 34 63294
0 5 false 35 62793
0 5 false 36 63143
0 5 false 37 62964
0 5 false 38 63905
0 5 false 39 62813
0 5 false 40 63163
0 5 false 41 63193
0 5 false 42 67170
0 5 false 43 63594
0 5 false 44 63504
0 5 false 45 63494
0 5 false 46 63515
0 5 false 47 63894
0 5 false 48 63604
0 5 false 49 63394
0 5 false 50 63344
0 5 false 51 63885
0 5 false 52 63234
0 5 false 53 63744
0 5 false 54 63334
0 5 false 55 63445
0 5 false 56 63464
0 5 false 57 65677
0 5 false 58 63704
0 5 false 59 63294
0 5 false 60 63254
0 5 false 61 63754
0 5 false 62 63624
0 5 false 63 63885
0 5 true 0 31988
0 5 true 1 30465
0 5 true 2 30195
0 5 true 3 29614
0 5 true 4 29754
0 5 true 5 29694
0 5 true 6 29654
0 5 true 7 29774
0 5 true 8 29474
0 5 true 9 30124
0 5 true 10 29584
0 5 true 11 29604
0 5 true 12 29353
0 5 true 13 29514
0 5 true 14 29404
0 5 true 15 29664
0 5 true 16 32618
0 5 true 17 29644
0 5 true 18 29564
0 5 true 19 29233
0 5 true 20 29514
0 5 true 21 29624
0 5 true 22 29484
0 5 true 23 29394
0 5 true 24 29884
0 5 true 25 29544
0 5 true 26 29504
0 5 true 27 29604
0 5 true 28 29524
0 5 true 29 29504
0 5 true 30 29463
0 5 true 31 29563
0 5 true 32 29574
0 5 true 33 29654
0 5 true 34 29815
0 5 true 35 29704
0 5 true 36 29494
0 5 true 37 29804
0 5 true 38 29364
0 5 true 39 29714
0 5 true 40 29434
0 5 true 41 29534
0 5 true 42 29524
0 5 true 43 29594
0 5 true 44 29233
0 5 true 45 29734
0 5 true 46 29894
0 5 true 47 33670
0 5 true 48 29273
0 5 true 49 29634
0 5 true 50 29454
0 5 true 51 29574
0 5 true 52 29704
0 5 true 53 29604
0 5 true 54 29734
0 5 true 55 29334
0 5 true 56 29524
0 5 true 57 29634
0 5 true 58 29704
0 5 true 59 29343
0 5 true 60 29664
0 5 true 61 29594
0 5 true 62 29463
0 5 true 63 29424
0 306251 false 0 67360
0 306251 false 1 65567
0 306251 false 2 64306
0 306251 false 3 64015
0 306251 false 4 64065
0 306251 false 5 66729
0 306251 false 6 64015
0 306251 false 7 63334
0 306251 false 8 63725
0 306251 false 9 62984
0 306251 false 10 63554
0 306251 false 11 63665
0 306251 false 12 63774
0 306251 false 13 64065
0 306251 false 14 63064
0 306251 false 15 63434
0 306251 false 16 63454
0 306251 false 17 62963
0 306251 false 18 63334
0 306251 false 19 63514
0 306251 false 20 67350
0 306251 false 21 63304
0 306251 false 22 63434
0 306251 false 23 63804
0 306251 false 24 63104
0 306251 false 25 63394
0 306251 false 26 63454
0 306251 false 27 63514
0 306251 false 28 63174
0 306251 false 29 63434
0 306251 false 30 63314
0 306251 false 31 63074
0 306251 false 32 63254
0 306251 false 33 63854
0 306251 false 34 63344
0 306251 false 35 67339
0 306251 false 36 63403
0 306251 false 37 63785
0 306251 false 38 63164
0 306251 false 39 63624
0 306251 false 40 63654
0 306251 false 41 63344
0 306251 false 42 63604
0 306251 false 43 63464
0 306251 false 44 63363
0 306251 false 45 63073
0 306251 false 46 63204
0 306251 false 47 63164
0 306251 false 48 63644
0 306251 false 49 63634
0 306251 false 50 65818
0 306251 false 51 63864
0 306251 false 52 63535
0 306251 false 53 63935
0 306251 false 54 63054
0 306251 false 55 63364
0 306251 false 56 63614
0 306251 false 57 63765
0 306251 false 58 63404
0 306251 false 59 63725
0 306251 false 60 63775
0 306251 false 61 63585
0 306251 false 62 63303
0 306251 false 63 63694
0 306251 true 0 32268
0 306251 true 1 33219
0 306251 true 2 30455
0 306251 true 3 29745
0 306251 true 4 29624
0 306251 true 5 29684
0 306251 true 6 29734
0 306251 true 7 29624
0 306251 true 8 29765
0 306251 true 9 29464
0 306251 true 10 29975
0 306251 true 11 29513
0 306251 true 12 29584
0 306251 true 13 29824
0 306251 true 14 29675
0 306251 true 15 29443
0 306251 true 16 29874
0 306251 true 17 30014
0 306251 true 18 29384
0 306251 true 19 29513
0 306251 true 20 30155
0 306251 true 21 29734
0 306251 true 22 29714
0 306251 true 23 29734
0 306251 true 24 29694
0 306251 true 25 29955
0 306251 true 26 29664
0 306251 true 27 29764
0 306251 true 28 29644
0 306251 true 29 29764
0 306251 true 30 29534
0 306251 true 31 29584
0 306251 true 32 32268
0 306251 true 33 30164
0 306251 true 34 29875
0 306251 true 35 29915
0 306251 true 36 29554
0 306251 true 37 29433
0 306251 true 38 29934
0 306251 true 39 29534
0 306251 true 40 29514
0 306251 true 41 29604
0 306251 true 42 29884
0 306251 true 43 29554
0 306251 true 44 29654
0 306251 true 45 29704
0 306251 true 46 29513
0 306251 true 47 29655
0 306251 true 48 29844
0 306251 true 49 29473
0 306251 true 50 29815
0 306251 true 51 29624
0 306251 true 52 29804
0 306251 true 53 29725
0 306251 true 54 29183
0 306251 true 55 29604
0 306251 true 56 29814
0 306251 true 57 29834
0 306251 true 58 29324
0 306251 true 59 29383
0 306251 true 60 29804
0 306251 true 61 29704
0 306251 true 62 32959
0 306251 true 63 29494
1 17329 true 0 31217
1 17329 true 1 30316
1 17329 true 2 29664
1 17329 true 3 29644
1 17329 true 4 29644
1 17329 true 5 28983
1 17329 true 6 29974
1 17329 true 7 29534
1 17329 true 8 29754
1 17329 true 9 29684
1 17329 true 10 29584
1 17329 true 11 29734
1 17329 true 12 29564
1 17329 true 13 29403
1 17329 true 14 29904
1 17329 true 15 29814
1 17329 true 16 29714
1 17329 true 17 29514
1 17329 true 18 29864
1 17329 true 19 29824
1 17329 true 20 29624
1 17329 true 21 29614
1 17329 true 22 29444
1 17329 true 23 29343
1 17329 true 24 29594
1 17329 true 25 29484
1 17329 true 26 29353
1 17329 true 27 32158
1 17329 true 28 29664
1 17329 true 29 29403
1 17329 true 30 29523
1 17329 true 31 29314
1 17329 true 32 29584
1 17329 true 33 29513
1 17329 true 34 29364
1 17329 true 35 29444
1 17329 true 36 29695
1 17329 true 37 29473
1 17329 true 38 29434
1 17329 true 39 29804
1 17329 true 40 29564
1 17329 true 41 29784
1 17329 true 42 29304
1 17329 true 43 29614
1 17329 true 44 29704
1 17329 true 45 29103
1 17329 true 46 29314
1 17329 true 47 29644
1 17329 true 48 29444
1 17329 true 49 29313
1 17329 true 50 29564
1 17329 true 51 29494
1 17329 true 52 29894
1 17329 true 53 29504
1 17329 true 54 29504
1 17329 true 55 29413
1 17329 true 56 29764
1 17329 true 57 29643
1 17329 true 58 32417
1 17329 true 59 29364
1 17329 true 60 29334
1 17329 true 61 29624
1 17329 true 62 29393
1 17329 true 63 29714
1 17329 false 0 68411
1 17329 false 1 65147
1 17329 false 2 64255
1 17329 false 3 63825
1 17329 false 4 64045
1 17329 false 5 63324
1 17329 false 6 63674
1 17329 false 7 63164
1 17329 false 8 63414
1 17329 false 9 63123
1 17329 false 10 67150
1 17329 false 11 63203
1 17329 false 12 63053
1 17329 false 13 63283
1 17329 false 14 63545
1 17329 false 15 62963
1 17329 false 16 63484
1 17329 false 17 63344
1 17329 false 18 63384
1 17329 false 19 63464
1 17329 false 20 63414
1 17329 false 21 63575
1 17329 false 22 63123
1 17329 false 23 63374
1 17329 false 24 63193
1 17329 false 25 63084
1 17329 false 26 63054
1 17329 false 27 63183
1 17329 false 28 63754
1 17329 false 29 63424
1 17329 false 30 63494
1 17329 false 31 63935
1 17329 false 32 63695
1 17329 false 33 63123
1 17329 false 34 63855
1 17329 false 35 63004
1 17329 false 36 63273
1 17329 false 37 63394
1 17329 false 38 63343
1 17329 false 39 63544
1 17329 false 40 63213
1 17329 false 41 67120
1 17329 false 42 63754
1 17329 false 43 63624
1 17329 false 44 63494
1 17329 false 45 63013
1 17329 false 46 63795
1 17329 false 47 62943
1 17329 false 48 63084
1 17329 false 49 63194
1 17329 false 50 63324
1 17329 false 51 63144
1 17329 false 52 63063
1 17329 false 53 63073
1 17329 false 54 63434
1 17329 false 55 63835
1 17329 false 56 66038
1 17329 false 57 63464
1 17329 false 58 63324
1 17329 false 59 63344
1 17329 false 60 63754
1 17329 false 61 63094
1 17329 false 62 63254
1 17329 false 63 63334
1 69 true 0 31898
1 69 true 1 30937
1 69 true 2 29854
1 69 true 3 29524
1 69 true 4 29814
1 69 true 5 29894
1 69 true 6 29313
1 69 true 7 29624
1 69 true 8 29984
1 69 true 9 29704
1 69 true 10 29784
1 69 true 11 30074
1 69 true 12 31947
1 69 true 13 29975
1 69 true 14 29664
1 69 true 15 30055
1 69 true 16 29613
1 69 true 17 29474
1 69 true 18 29604
1 69 true 19 29804
1 69 true 20 29574
1 69 true 21 29143
1 69 true 22 29594
1 69 true 23 155240
1 69 true 24 31827
1 69 true 25 30325
1 69 true 26 29634
1 69 true 27 29725
1 69 true 28 29764
1 69 true 29 29984
1 69 true 30 29554
1 69 true 31 29564
1 69 true 32 29684
1 69 true 33 29374
1 69 true 34 29654
1 69 true 35 29994
1 69 true 36 29614
1 69 true 37 29944
1 69 true 38 29524
1 69 true 39 32388
1 69 true 40 30255
1 69 true 41 29594
1 69 true 42 29784
1 69 true 43 29463
1 69 true 44 29715
1 69 true 45 29504
1 69 true 46 29544
1 69 true 47 29905
1 69 true 48 29554
1 69 true 49 29815
1 69 true 50 29524
1 69 true 51 29294
1 69 true 52 29504
1 69 true 53 30005
1 69 true 54 29644
1 69 true 55 30004
1 69 true 56 29594
1 69 true 57 29404
1 69 true 58 29453
1 69 true 59 29334
1 69 true 60 29443
1 69 true 61 29794
1 69 true 62 29333
1 69 true 63 29814
1 69 false 0 78276
1 69 false 1 78356
1 69 false 2 73649
1 69 false 3 73199
1 69 false 4 72438
1 69 false 5 72758
1 69 false 6 72617
1 69 false 7 72898
1 69 false 8 72187
1 69 false 9 72317
1 69 false 10 72137
1 69 false 11 72497
1 69 false 12 72698
1 69 false 13 72337
1 69 false 14 75983
1 69 false 15 72787
1 69 false 16 72247
1 69 false 17 72738
1 69 false 18 72658
1 69 false 19 72518
1 69 false 20 73048
1 69 false 21 72478
1 69 false 22 72648
1 69 false 23 72237
1 69 false 24 72217
1 69 false 25 72357
1 69 false 26 72938
1 69 false 27 75402
1 69 false 28 72588
1 69 false 29 72317
1 69 false 30 72828
1 69 false 31 72427
1 69 false 32 72667
1 69 false 33 72077
1 69 false 34 72678
1 69 false 35 72187
1 69 false 36 72318
1 69 false 37 72557
1 69 false 38 71837
1 69 false 39 71987
1 69 false 40 75862
1 69 false 41 72407
1 69 false 42 72307
1 69 false 43 72338
1 69 false 44 72277
1 69 false 45 72307
1 69 false 46 72006
1 69 false 47 72137
1 69 false 48 72247
1 69 false 49 72478
1 69 false 50 72427
1 69 false 51 72077
1 69 false 52 72177
1 69 false 53 71997
1 69 false 54 122561
1 69 false 55 72688
1 69 false 56 73189
1 69 false 57 72508
1 69 false 58 72368
1 69 false 59 72517
1 69 false 60 72297
1 69 false 61 72408
1 69 false 62 72377
1 69 false 63 72087
1 301 true 0 32337
1 301 true 1 30936
1 301 true 2 29934
1 301 true 3 29734
1 301 true 4 33369
1 301 true 5 29304
1 301 true 6 29724
1 301 true 7 29534
1 301 true 8 29815
1 301 true 9 29755
1 301 true 10 29794
1 301 true 11 29333
1 301 true 12 29875
1 301 true 13 29845
1 301 true 14 29574
1 301 true 15 29653
1 301 true 16 29454
1 301 true 17 29354
1 301 true 18 29674
1 301 true 19 29774
1 301 true 20 29363
1 301 true 21 29624
1 301 true 22 29484
1 301 true 23 29654
1 301 true 24 29604
1 301 true 25 29794
1 301 true 26 29294
1 301 true 27 29604
1 301 true 28 29774
1 301 true 29 29674
1 301 true 30 29394
1 301 true 31 29774
1 301 true 32 29163
1 301 true 33 29694
1 301 true 34 29414
1 301 true 35 33319
1 301 true 36 29544
1 301 true 37 29494
1 301 true 38 29443
1 301 true 39 29765
1 301 true 40 29453
1 301 true 41 29394
1 301 true 42 29804
1 301 true 43 29714
1 301 true 44 29604
1 301 true 45 29704
1 301 true 46 29634
1 301 true 47 29554
1 301 true 48 29624
1 301 true 49 29654
1 301 true 50 29804
1 301 true 51 29633
1 301 true 52 29885
1 301 true 53 29954
1 301 true 54 29684
1 301 true 55 29424
1 301 true 56 29894
1 301 true 57 29554
1 301 true 58 29563
1 301 true 59 29604
1 301 true 60 29464
1 301 true 61 29774
1 301 true 62 30215
1 301 true 63 29423
1 301 false 0 76984
1 301 false 1 74150
1 301 false 2 72958
1 301 false 3 73168
1 301 false 4 72898
1 301 false 5 72948
1 301 false 6 72628
1 301 false 7 72929
1 301 false 8 72027
1 301 false 9 72387
1 301 false 10 71997
1 301 false 11 72177
1 301 false 12 75762
1 301 false 13 72297
1 301 false 14 71897
1 301 false 15 72828
1 301 false 16 73218
1 301 false 17 72077
1 301 false 18 72337
1 301 false 19 72237
1 301 false 20 72198
1 301 false 21 72567
1 301 false 22 72498
1 301 false 23 72748
1 301 false 24 72187
1 301 false 25 74691
1 301 false 26 73179
1 301 false 27 71896
1 301 false 28 72317
1 301 false 29 72357
1 301 false 30 72538
1 301 false 31 72147
1 301 false 32 72077
1 301 false 33 72057
1 301 false 34 72077
1 301 false 35 71756
1 301 false 36 71796
1 301 false 37 72357
1 301 false 38 72268
1 301 false 39 74490
1 301 false 40 72288
1 301 false 41 72127
1 301 false 42 72658
1 301 false 43 71776
1 301 false 44 72137
1 301 false 45 72437
1 301 false 46 72327
1 301 false 47 71797
1 301 false 48 72047
1 301 false 49 71786
1 301 false 50 72698
1 301 false 51 72197
1 301 false 52 78046
1 301 false 53 72378
1 301 false 54 72247
1 301 false 55 72087
1 301 false 56 71807
1 301 false 57 71566
1 301 false 58 72477
1 301 false 59 72117
1 301 false 60 72247
1 301 false 61 72107
1 301 false 62 71957
1 301 false 63 72197
1 71523 true 0 32368
1 71523 true 1 30656
1 71523 true 2 30154
1 71523 true 3 29715
1 71523 true 4 29715
1 71523 true 5 29613
1 71523 true 6 29724
1 71523 true 7 29434
1 71523 true 8 29313
1 71523 true 9 29714
1 71523 true 10 29844
1 71523 true 11 29384
1 71523 true 12 29603
1 71523 true 13 29353
1 71523 true 14 29374
1 71523 true 15 29503
1 71523 true 16 29424
1 71523 true 17 29844
1 71523 true 18 29564
1 71523 true 19 29563
1 71523 true 20 29714
1 71523 true 21 30004
1 71523 true 22 29264
1 71523 true 23 29423
1 71523 true 24 29303
1 71523 true 25 29574
1 71523 true 26 29464
1 71523 true 27 29503
1 71523 true 28 29593
1 71523 true 29 29373
1 71523 true 30 29544
1 71523 true 31 29714
1 71523 true 32 33400
1 71523 true 33 29614
1 71523 true 34 29063
1 71523 true 35 29614
1 71523 true 36 29724
1 71523 true 37 29503
1 71523 true 38 29454
1 71523 true 39 29374
1 71523 true 40 29614
1 71523 true 41 29774
1 71523 true 42 29344
1 71523 true 43 29263
1 71523 true 44 29733
1 71523 true 45 29503
1 71523 true 46 29634
1 71523 true 47 29584
1 71523 true 48 29244
1 71523 true 49 29464
1 71523 true 50 29344
1 71523 true 51 29824
1 71523 true 52 29484
1 71523 true 53 29424
1 71523 true 54 29253
1 71523 true 55 29534
1 71523 true 56 29564
1 71523 true 57 29623
1 71523 true 58 29473
1 71523 true 59 29574
1 71523 true 60 29374
1 71523 true 61 29834
1 71523 true 62 29634
1 71523 true 63 1747611
1 71523 false 0 93529
1 71523 false 1 89052
1 71523 false 2 83254
1 71523 false 3 82232
1 71523 false 4 82513
1 71523 false 5 82793
1 71523 false 6 82473
1 71523 false 7 82222
1 71523 false 8 81901
1 71523 false 9 81631
1 71523 false 10 80610
1 71523 false 11 81200
1 71523 false 12 84265
1 71523 false 13 80629
1 71523 false 14 80530
1 71523 false 15 80299
1 71523 false 16 80690
1 71523 false 17 80619
1 71523 false 18 80640
1 71523 false 19 81111
1 71523 false 20 80930
1 71523 false 21 80519
1 71523 false 22 80610
1 71523 false 23 80740
1 71523 false 24 83384
1 71523 false 25 80790
1 71523 false 26 80750
1 71523 false 27 80910
1 71523 false 28 80780
1 71523 false 29 80550
1 71523 false 30 80860
1 71523 false 31 80659
1 71523 false 32 80740
1 71523 false 33 80509
1 71523 false 34 80139
1 71523 false 35 81171
1 71523 false 36 83704
1 71523 false 37 80730
1 71523 false 38 80660
1 71523 false 39 80809
1 71523 false 40 80940
1 71523 false 41 80600
1 71523 false 42 80149
1 71523 false 43 78727
1 71523 false 44 80619
1 71523 false 45 80679
1 71523 false 46 80250
1 71523 false 47 80329
1 71523 false 48 83383
1 71523 false 49 80770
1 71523 false 50 81080
1 71523 false 51 80559
1 71523 false 52 79769
1 71523 false 53 80629
1 71523 false 54 80990
1 71523 false 55 80660
1 71523 false 56 80640
1 71523 false 57 80970
1 71523 false 58 80820
1 71523 false 59 81310
1 71523 false 60 85167
1 71523 false 61 80629
1 71523 false 62 81151
1 71523 false 63 80870
1 111028891713715270858633 true 0 34240
1 111028891713715270858633 true 1 32478
1 111028891713715270858633 true 2 31707
1 111028891713715270858633 true 3 31927
1 111028891713715270858633 true 4 31506
1 111028891713715270858633 true 5 31637
1 111028891713715270858633 true 6 31737
1 111028891713715270858633 true 7 31377
1 111028891713715270858633 true 8 31296
1 111028891713715270858633 true 9 31387
1 111028891713715270858633 true 10 32037
1 111028891713715270858633 true 11 31537
1 111028891713715270858633 true 12 31647
1 111028891713715270858633 true 13 31366
1 111028891713715270858633 true 14 31737
1 111028891713715270858633 true 15 31406
1 111028891713715270858633 true 16 34852
1 111028891713715270858633 true 17 31497
1 111028891713715270858633 true 18 31547
1 111028891713715270858633 true 19 31286
1 111028891713715270858633 true 20 31627
1 111028891713715270858633 true 21 31357
1 111028891713715270858633 true 22 31327
1 111028891713715270858633 true 23 31246
1 111028891713715270858633 true 24 31217
1 111028891713715270858633 true 25 31196
1 111028891713715270858633 true 26 31016
1 111028891713715270858633 true 27 31337
1 111028891713715270858633 true 28 31707
1 111028891713715270858633 true 29 31217
1 111028891713715270858633 true 30 31417
1 111028891713715270858633 true 31 31516
1 111028891713715270858633 true 32 31507
1 111028891713715270858633 true 33 31297
1 111028891713715270858633 true 34 31146
1 111028891713715270858633 true 35 31537
1 111028891713715270858633 true 36 31226
1 111028891713715270858633 true 37 31487
1 111028891713715270858633 true 38 31367
1 111028891713715270858633 true 39 31307
1 111028891713715270858633 true 40 31477
1 111028891713715270858633 true 41 31446
1 111028891713715270858633 true 42 31707
1 111028891713715270858633 true 43 31056
1 111028891713715270858633 true 44 31547
1 111028891713715270858633 true 45 31246
1 111028891713715270858633 true 46 31116
1 111028891713715270858633 true 47 31807
1 111028891713715270858633 true 48 31397
1 111028891713715270858633 true 49 31387
1 111028891713715270858633 true 50 31557
1 111028891713715270858633 true 51 31476
1 111028891713715270858633 true 52 31216
1 111028891713715270858633 true 53 31507
1 111028891713715270858633 true 54 31437
1 111028891713715270858633 true 55 31156
1 111028891713715270858633 true 56 31497
1 111028891713715270858633 true 57 31256
1 111028891713715270858633 true 58 31827
1 111028891713715270858633 true 59 31356
1 111028891713715270858633 true 60 31457
1 111028891713715270858633 true 61 31277
1 111028891713715270858633 true 62 31166
1 111028891713715270858633 true 63 31517
1 111028891713715270858633 false 0 72768
1 111028891713715270858633 false 1 66248
1 111028891713715270858633 false 2 64716
1 111028891713715270858633 false 3 64516
1 111028891713715270858633 false 4 64415
1 111028891713715270858633 false 5 64225
1 111028891713715270858633 false 6 64125
1 111028891713715270858633 false 7 64385
1 111028891713715270858633 false 8 64135
1 111028891713715270858633 false 9 64335
1 111028891713715270858633 false 10 63895
1 111028891713715270858633 false 11 64245
1 111028891713715270858633 false 12 63895
1 111028891713715270858633 false 13 63884
1 111028891713715270858633 false 14 67230
1 111028891713715270858633 false 15 64456
1 111028891713715270858633 false 16 63955
1 111028891713715270858633 false 17 63625
1 111028891713715270858633 false 18 63855
1 111028891713715270858633 false 19 63805
1 111028891713715270858633 false 20 64186
1 111028891713715270858633 false 21 64616
1 111028891713715270858633 false 22 63684
1 111028891713715270858633 false 23 64455
1 111028891713715270858633 false 24 63515
1 111028891713715270858633 false 25 64085
1 111028891713715270858633 false 26 63545
1 111028891713715270858633 false 27 63805
1 111028891713715270858633 false 28 67100
1 111028891713715270858633 false 29 64104
1 111028891713715270858633 false 30 63905
1 111028891713715270858633 false 31 63965
1 111028891713715270858633 false 32 63895
1 111028891713715270858633 false 33 64025
1 111028891713715270858633 false 34 63905
1 111028891713715270858633 false 35 63705
1 111028891713715270858633 false 36 64115
1 111028891713715270858633 false 37 63624
1 111028891713715270858633 false 38 63835
1 111028891713715270858633 false 39 63865
1 111028891713715270858633 false 40 63925
1 111028891713715270858633 false 41 63684
1 111028891713715270858633 false 42 67089
1 111028891713715270858633 false 43 64025
1 111028891713715270858633 false 44 63674
1 111028891713715270858633 false 45 64025
1 111028891713715270858633 false 46 64205
1 111028891713715270858633 false 47 63814
1 111028891713715270858633 false 48 63885
1 111028891713715270858633 false 49 63674
1 111028891713715270858633 false 50 63705
1 111028891713715270858633 false 51 63985
1 111028891713715270858633 false 52 63965
1 111028891713715270858633 false 53 63844
1 111028891713715270858633 false 54 63565
1 111028891713715270858633 false 55 63113
1 111028891713715270858633 false 56 66338
1 111028891713715270858633 false 57 64255
1 111028891713715270858633 false 58 63934
1 111028891713715270858633 false 59 63975
1 111028891713715270858633 false 60 64005
1 111028891713715270858633 false 61 64456
1 111028891713715270858633 false 62 63474
1 111028891713715270858633 false 63 65126
1 239 true 0 32419
1 239 true 1 30545
1 239 true 2 30245
1 239 true 3 29955
1 239 true 4 29313
1 239 true 5 29624
1 239 true 6 29614
1 239 true 7 29434
1 239 true 8 29554
1 239 true 9 30095
1 239 true 10 29825
1 239 true 11 30244
1 239 true 12 33179
1 239 true 13 29534
1 239 true 14 29484
1 239 true 15 29684
1 239 true 16 30105
1 239 true 17 29624
1 239 true 18 29775
1 239 true 19 29734
1 239 true 20 29944
1 239 true 21 29874
1 239 true 22 29554
1 239 true 23 29524
1 239 true 24 29594
1 239 true 25 29584
1 239 true 26 29604
1 239 true 27 29914
1 239 true 28 29403
1 239 true 29 29453
1 239 true 30 29594
1 239 true 31 29734
1 239 true 32 29734
1 239 true 33 29554
1 239 true 34 29564
1 239 true 35 29614
1 239 true 36 29704
1 239 true 37 29604
1 239 true 38 29444
1 239 true 39 29604
1 239 true 40 30154
1 239 true 41 29434
1 239 true 42 32629
1 239 true 43 29504
1 239 true 44 29894
1 239 true 45 29753
1 239 true 46 29444
1 239 true 47 29734
1 239 true 48 30025
1 239 true 49 29875
1 239 true 50 29744
1 239 true 51 29734
1 239 true 52 29784
1 239 true 53 29814
1 239 true 54 29374
1 239 true 55 29534
1 239 true 56 29584
1 239 true 57 29885
1 239 true 58 29834
1 239 true 59 29464
1 239 true 60 29624
1 239 true 61 29394
1 239 true 62 29984
1 239 true 63 29394
1 239 false 0 86408
1 239 false 1 82682
1 239 false 2 85357
1 239 false 3 81351
1 239 false 4 80920
1 239 false 5 80760
1 239 false 6 80730
1 239 false 7 80900
1 239 false 8 80780
1 239 false 9 80439
1 239 false 10 80630
1 239 false 11 80899
1 239 false 12 81180
1 239 false 13 80800
1 239 false 14 83644
1 239 false 15 80479
1 239 false 16 80700
1 239 false 17 80780
1 239 false 18 80790
1 239 false 19 80859
1 239 false 20 80209
1 239 false 21 80770
1 239 false 22 80389
1 239 false 23 80299
1 239 false 24 80189
1 239 false 25 80700
1 239 false 26 83734
1 239 false 27 80519
1 239 false 28 80038
1 239 false 29 80659
1 239 false 30 80961
1 239 false 31 80309
1 239 false 32 81070
1 239 false 33 80800
1 239 false 34 80870
1 239 false 35 80670
1 239 false 36 81100
1 239 false 37 80469
1 239 false 38 84496
1 239 false 39 80911
1 239 false 40 80359
1 239 false 41 80990
1 239 false 42 80930
1 239 false 43 80880
1 239 false 44 80549
1 239 false 45 80719
1 239 false 46 81331
1 239 false 47 81040
1 239 false 48 80469
1 239 false 49 81251
1 239 false 50 80550
1 239 false 51 80630
1 239 false 52 80649
1 239 false 53 80789
1 239 false 54 80420
1 239 false 55 81080
1 239 false 56 80660
1 239 false 57 80639
1 239 false 58 80690
1 239 false 59 80329
1 239 false 60 80990
1 239 false 61 82542
1 239 false 62 80459
1 239 false 63 80739
1 631 true 0 32218
1 631 true 1 30235
1 631 true 2 29955
1 631 true 3 30084
1 631 true 4 29895
1 631 true 5 29504
1 631 true 6 29994
1 631 true 7 29714
1 631 true 8 29634
1 631 true 9 29564
1 631 true 10 29624
1 631 true 11 29554
1 631 true 12 29644
1 631 true 13 29954
1 631 true 14 29664
1 631 true 15 29805
1 631 true 16 29644
1 631 true 17 29574
1 631 true 18 29644
1 631 true 19 29724
1 631 true 20 29634
1 631 true 21 29864
1 631 true 22 29444
1 631 true 23 31897
1 631 true 24 29504
1 631 true 25 29794
1 631 true 26 29934
1 631 true 27 29664
1 631 true 28 29464
1 631 true 29 29794
1 631 true 30 30014
1 631 true 31 29574
1 631 true 32 29504
1 631 true 33 29874
1 631 true 34 29584
1 631 true 35 29825
1 631 true 36 29483
1 631 true 37 29765
1 631 true 38 30005
1 631 true 39 29744
1 631 true 40 29533
1 631 true 41 29885
1 631 true 42 29675
1 631 true 43 29844
1 631 true 44 29653
1 631 true 45 29865
1 631 true 46 29774
1 631 true 47 29835
1 631 true 48 29904
1 631 true 49 29844
1 631 true 50 29654
1 631 true 51 29404
1 631 true 52 29764
1 631 true 53 29393
1 631 true 54 32138
1 631 true 55 29784
1 631 true 56 29484
1 631 true 57 29504
1 631 true 58 29824
1 631 true 59 29784
1 631 true 60 29504
1 631 true 61 29644
1 631 true 62 29764
1 631 true 63 29253
1 631 false 0 76643
1 631 false 1 73039
1 631 false 2 72978
1 631 false 3 72438
1 631 false 4 71907
1 631 false 5 72407
1 631 false 6 72207
1 631 false 7 75162
1 631 false 8 72197
1 631 false 9 72457
1 631 false 10 72047
1 631 false 11 71716
1 631 false 12 71486
1 631 false 13 72126
1 631 false 14 72116
1 631 false 15 71636
1 631 false 16 72237
1 631 false 17 72367
1 631 false 18 72156
1 631 false 19 71376
1 631 false 20 71617
1 631 false 21 74841
1 631 false 22 72247
1 631 false 23 71566
1 631 false 24 71526
1 631 false 25 71897
1 631 false 26 72036
1 631 false 27 71967
1 631 false 28 72057
1 631 false 29 71646
1 631 false 30 72087
1 631 false 31 71936
1 631 false 32 72158
1 631 false 33 71476
1 631 false 34 74080
1 631 false 35 71736
1 631 false 36 72137
1 631 false 37 72177
1 631 false 38 71596
1 631 false 39 71636
1 631 false 40 72097
1 631 false 41 71837
1 631 false 42 71836
1 631 false 43 71616
1 631 false 44 71506
1 631 false 45 71636
1 631 false 46 72027
1 631 false 47 75181
1 631 false 48 71637
1 631 false 49 72147
1 631 false 50 71856
1 631 false 51 71716
1 631 false 52 71796
1 631 false 53 71516
1 631 false 54 71736
1 631 false 55 71807
1 631 false 56 71385
1 631 false 57 71587
1 631 false 58 71957
1 631 false 59 71926
1 631 false 60 71767
1 631 false 61 74911
1 631 false 62 71937
1 631 false 63 71506
1 223 true 0 31727
1 223 true 1 30896
1 223 true 2 29924
1 223 true 3 29774
1 223 true 4 29514
1 223 true 5 30004
1 223 true 6 29494
1 223 true 7 29955
1 223 true 8 29733
1 223 true 9 29794
1 223 true 10 30075
1 223 true 11 30024
1 223 true 12 29394
1 223 true 13 29784
1 223 true 14 29644
1 223 true 15 29484
1 223 true 16 29604
1 223 true 17 29744
1 223 true 18 29594
1 223 true 19 29414
1 223 true 20 29664
1 223 true 21 29864
1 223 true 22 32488
1 223 true 23 29804
1 223 true 24 29974
1 223 true 25 29443
1 223 true 26 29503
1 223 true 27 29474
1 223 true 28 29734
1 223 true 29 29774
1 223 true 30 29694
1 223 true 31 29714
1 223 true 32 29504
1 223 true 33 29644
1 223 true 34 29794
1 223 true 35 29584
1 223 true 36 29604
1 223 true 37 29394
1 223 true 38 29674
1 223 true 39 29484
1 223 true 40 29633
1 223 true 41 29574
1 223 true 42 29514
1 223 true 43 29513
1 223 true 44 29214
1 223 true 45 29724
1 223 true 46 29283
1 223 true 47 29314
1 223 true 48 29684
1 223 true 49 29594
1 223 true 50 29383
1 223 true 51 29805
1 223 true 52 29644
1 223 true 53 32539
1 223 true 54 29764
1 223 true 55 29724
1 223 true 56 29434
1 223 true 57 29464
1 223 true 58 29724
1 223 true 59 29604
1 223 true 60 29584
1 223 true 61 29654
1 223 true 62 29494
1 223 true 63 29523
1 223 false 0 77715
1 223 false 1 73259
1 223 false 2 73189
1 223 false 3 72748
1 223 false 4 72547
1 223 false 5 72558
1 223 false 6 72968
1 223 false 7 74951
1 223 false 8 72888
1 223 false 9 72307
1 223 false 10 72257
1 223 false 11 72167
1 223 false 12 71936
1 223 false 13 72097
1 223 false 14 72277
1 223 false 15 72067
1 223 false 16 72267
1 223 false 17 71736
1 223 false 18 72838
1 223 false 19 72598
1 223 false 20 77215
1 223 false 21 72247
1 223 false 22 72488
1 223 false 23 72578
1 223 false 24 72047
1 223 false 25 71536
1 223 false 26 71747
1 223 false 27 72107
1 223 false 28 72758
1 223 false 29 71626
1 223 false 30 71857
1 223 false 31 72468
1 223 false 32 71927
1 223 false 33 75202
1 223 false 34 72307
1 223 false 35 71887
1 223 false 36 72437
1 223 false 37 71346
1 223 false 38 72227
1 223 false 39 71866
1 223 false 40 71606
1 223 false 41 72047
1 223 false 42 71727
1 223 false 43 71826
1 223 false 44 72347
1 223 false 45 71807
1 223 false 46 72297
1 223 false 47 74751
1 223 false 48 71997
1 223 false 49 72237
1 223 false 50 72388
1 223 false 51 72167
1 223 false 52 71746
1 223 false 53 71987
1 223 false 54 71606
1 223 false 55 71716
1 223 false 56 72046
1 223 false 57 72478
1 223 false 58 72437
1 223 false 59 71917
1 223 false 60 74511
1 223 false 61 72158
1 223 false 62 71926
1 223 false 63 72016
1 1184777 true 0 31928
1 1184777 true 1 30465
1 1184777 true 2 29784
1 1184777 true 3 29694
1 1184777 true 4 29433
1 1184777 true 5 29604
1 1184777 true 6 29594
1 1184777 true 7 29584
1 1184777 true 8 29504
1 1184777 true 9 30034
1 1184777 true 10 29434
1 1184777 true 11 29614
1 1184777 true 12 29373
1 1184777 true 13 29644
1 1184777 true 14 29845
1 1184777 true 15 29704
1 1184777 true 16 29263
1 1184777 true 17 29754
1 1184777 true 18 29504
1 1184777 true 19 29804
1 1184777 true 20 32889
1 1184777 true 21 29313
1 1184777 true 22 29324
1 1184777 true 23 29553
1 1184777 true 24 29133
1 1184777 true 25 29714
1 1184777 true 26 29344
1 1184777 true 27 29294
1 1184777 true 28 29474
1 1184777 true 29 29714
1 1184777 true 30 29815
1 1184777 true 31 29714
1 1184777 true 32 29384
1 1184777 true 33 29243
1 1184777 true 34 29474
1 1184777 true 35 29343
1 1184777 true 36 29043
1 1184777 true 37 29404
1 1184777 true 38 29153
1 1184777 true 39 29714
1 1184777 true 40 29654
1 1184777 true 41 29524
1 1184777 true 42 29464
1 1184777 true 43 29543
1 1184777 true 44 29383
1 1184777 true 45 28923
1 1184777 true 46 29544
1 1184777 true 47 29383
1 1184777 true 48 29284
1 1184777 true 49 29463
1 1184777 true 50 29854
1 1184777 true 51 32828
1 1184777 true 52 29314
1 1184777 true 53 29243
1 1184777 true 54 29263
1 1184777 true 55 29374
1 1184777 true 56 29384
1 1184777 true 57 29343
1 1184777 true 58 29414
1 1184777 true 59 29393
1 1184777 true 60 29724
1 1184777 true 61 29524
1 1184777 true 62 29644
1 1184777 true 63 29654
1 1184777 false 0 75832
1 1184777 false 1 73049
1 1184777 false 2 72026
1 1184777 false 3 71577
1 1184777 false 4 72017
1 1184777 false 5 71937
1 1184777 false 6 75552
1 1184777 false 7 71947
1 1184777 false 8 71275
1 1184777 false 9 71626
1 1184777 false 10 72638
1 1184777 false 11 71526
1 1184777 false 12 71236
1 1184777 false 13 71376
1 1184777 false 14 71827
1 1184777 false 15 71676
1 1184777 false 16 71717
1 1184777 false 17 71385
1 1184777 false 18 71486
1 1184777 false 19 75342
1 1184777 false 20 71697
1 1184777 false 21 71506
1 1184777 false 22 71416
1 1184777 false 23 71786
1 1184777 false 24 71316
1 1184777 false 25 71997
1 1184777 false 26 71676
1 1184777 false 27 71296
1 1184777 false 28 70755
1 1184777 false 29 71596
1 1184777 false 30 70985
1 1184777 false 31 71385
1 1184777 false 32 71937
1 1184777 false 33 74010
1 1184777 false 34 71937
1 1184777 false 35 71055
1 1184777 false 36 71476
1 1184777 false 37 71737
1 1184777 false 38 71696
1 1184777 false 39 71826
1 1184777 false 40 71687
1 1184777 false 41 71746
1 1184777 false 42 71236
1 1184777 false 43 71977
1 1184777 false 44 71496
1 1184777 false 45 71416
1 1184777 false 46 74480
1 1184777 false 47 71987
1 1184777 false 48 71366
1 1184777 false 49 71556
1 1184777 false 50 72097
1 1184777 false 51 71586
1 1184777 false 52 71135
1 1184777 false 53 71766
1 1184777 false 54 71136
1 1184777 false 55 71446
1 1184777 false 56 71706
1 1184777 false 57 71666
1 1184777 false 58 71936
1 1184777 false 59 71476
1 1184777 false 60 74911
1 1184777 false 61 71876
1 1184777 false 62 71647
1 1184777 false 63 71315
1 284551513249666376365123 true 0 35062
1 284551513249666376365123 true 1 32548
1 284551513249666376365123 true 2 31978
1 284551513249666376365123 true 3 31577
1 284551513249666376365123 true 4 31597
1 284551513249666376365123 true 5 31597
1 284551513249666376365123 true 6 31757
1 284551513249666376365123 true 7 31737
1 284551513249666376365123 true 8 31487
1 284551513249666376365123 true 9 31948
1 284551513249666376365123 true 10 31597
1 284551513249666376365123 true 11 31437
1 284551513249666376365123 true 12 31377
1 284551513249666376365123 true 13 31747
1 284551513249666376365123 true 14 31767
1 284551513249666376365123 true 15 31587
1 284551513249666376365123 true 16 34380
1 284551513249666376365123 true 17 31617
1 284551513249666376365123 true 18 31677
1 284551513249666376365123 true 19 31506
1 284551513249666376365123 true 20 31356
1 284551513249666376365123 true 21 31647
1 284551513249666376365123 true 22 31597
1 284551513249666376365123 true 23 31356
1 284551513249666376365123 true 24 31687
1 284551513249666376365123 true 25 31546
1 284551513249666376365123 true 26 31527
1 284551513249666376365123 true 27 31527
1 284551513249666376365123 true 28 31517
1 284551513249666376365123 true 29 31416
1 284551513249666376365123 true 30 31807
1 284551513249666376365123 true 31 31487
1 284551513249666376365123 true 32 31506
1 284551513249666376365123 true 33 31767
1 284551513249666376365123 true 34 31387
1 284551513249666376365123 true 35 31547
1 284551513249666376365123 true 36 31356
1 284551513249666376365123 true 37 31447
1 284551513249666376365123 true 38 31557
1 284551513249666376365123 true 39 31747
1 284551513249666376365123 true 40 31417
1 284551513249666376365123 true 41 31577
1 284551513249666376365123 true 42 34000
1 284551513249666376365123 true 43 31416
1 284551513249666376365123 true 44 31296
1 284551513249666376365123 true 45 31837
1 284551513249666376365123 true 46 31386
1 284551513249666376365123 true 47 31566
1 284551513249666376365123 true 48 31617
1 284551513249666376365123 true 49 31466
1 284551513249666376365123 true 50 31246
1 284551513249666376365123 true 51 31607
1 284551513249666376365123 true 52 31417
1 284551513249666376365123 true 53 31647
1 284551513249666376365123 true 54 31697
1 284551513249666376365123 true 55 31276
1 284551513249666376365123 true 56 31397
1 284551513249666376365123 true 57 31396
1 284551513249666376365123 true 58 31397
1 284551513249666376365123 true 59 31697
1 284551513249666376365123 true 60 31266
1 284551513249666376365123 true 61 31557
1 284551513249666376365123 true 62 31506
1 284551513249666376365123 true 63 31346
1 284551513249666376365123 false 0 81221
1 284551513249666376365123 false 1 74591
1 284551513249666376365123 false 2 73810
1 284551513249666376365123 false 3 73970
1 284551513249666376365123 false 4 71176
1 284551513249666376365123 false 5 72517
1 284551513249666376365123 false 6 72918
1 284551513249666376365123 false 7 72588
1 284551513249666376365123 false 8 72117
1 284551513249666376365123 false 9 72989
1 284551513249666376365123 false 10 72438
1 284551513249666376365123 false 11 73169
1 284551513249666376365123 false 12 72817
1 284551513249666376365123 false 13 72788
1 284551513249666376365123 false 14 72147
1 284551513249666376365123 false 15 72868
1 284551513249666376365123 false 16 73139
1 284551513249666376365123 false 17 72768
1 284551513249666376365123 false 18 73189
1 284551513249666376365123 false 19 72697
1 284551513249666376365123 false 20 72949
1 284551513249666376365123 false 21 72808
1 284551513249666376365123 false 22 72618
1 284551513249666376365123 false 23 72618
1 284551513249666376365123 false 24 73328
1 284551513249666376365123 false 25 75552
1 284551513249666376365123 false 26 73249
1 284551513249666376365123 false 27 73028
1 284551513249666376365123 false 28 72828
1 284551513249666376365123 false 29 72417
1 284551513249666376365123 false 30 72628
1 284551513249666376365123 false 31 72487
1 284551513249666376365123 false 32 72979
1 284551513249666376365123 false 33 72408
1 284551513249666376365123 false 34 72587
1 284551513249666376365123 false 35 72998
1 284551513249666376365123 false 36 72467
1 284551513249666376365123 false 37 75652
1 284551513249666376365123 false 38 73158
1 284551513249666376365123 false 39 72828
1 284551513249666376365123 false 40 72397
1 284551513249666376365123 false 41 72587
1 284551513249666376365123 false 42 72708
1 284551513249666376365123 false 43 72878
1 284551513249666376365123 false 44 73059
1 284551513249666376365123 false 45 72797
1 284551513249666376365123 false 46 72698
1 284551513249666376365123 false 47 72778
1 284551513249666376365123 false 48 72798
1 284551513249666376365123 false 49 72447
1 284551513249666376365123 false 50 74721
1 284551513249666376365123 false 51 72738
1 284551513249666376365123 false 52 73218
1 284551513249666376365123 false 53 72508
1 284551513249666376365123 false 54 73189
1 284551513249666376365123 false 55 72668
1 284551513249666376365123 false 56 73028
1 284551513249666376365123 false 57 72598
1 284551513249666376365123 false 58 72507
1 284551513249666376365123 false 59 72988
1 284551513249666376365123 false 60 72828
1 284551513249666376365123 false 61 72708
1 284551513249666376365123 false 62 75352
1 284551513249666376365123 false 63 72878
1 23 true 0 32238
1 23 true 1 30866
1 23 true 2 30476
1 23 true 3 29854
1 23 true 4 30064
1 23 true 5 29424
1 23 true 6 29594
1 23 true 7 29975
1 23 true 8 29413
1 23 true 9 29564
1 23 true 10 29774
1 23 true 11 29885
1 23 true 12 29554
1 23 true 13 29744
1 23 true 14 29474
1 23 true 15 29905
1 23 true 16 29493
1 23 true 17 29815
1 23 true 18 29454
1 23 true 19 29694
1 23 true 20 29864
1 23 true 21 29664
1 23 true 22 29414
1 23 true 23 29664
1 23 true 24 29964
1 23 true 25 32368
1 23 true 26 29794
1 23 true 27 29674
1 23 true 28 29483
1 23 true 29 29674
1 23 true 30 29914
1 23 true 31 29443
1 23 true 32 30045
1 23 true 33 29384
1 23 true 34 29453
1 23 true 35 29684
1 23 true 36 29514
1 23 true 37 29493
1 23 true 38 29744
1 23 true 39 29794
1 23 true 40 29454
1 23 true 41 29484
1 23 true 42 29533
1 23 true 43 29865
1 23 true 44 29674
1 23 true 45 29804
1 23 true 46 29433
1 23 true 47 29744
1 23 true 48 29674
1 23 true 49 29724
1 23 true 50 29684
1 23 true 51 29774
1 23 true 52 29674
1 23 true 53 29504
1 23 true 54 29463
1 23 true 55 29584
1 23 true 56 31898
1 23 true 57 29444
1 23 true 58 29854
1 23 true 59 29784
1 23 true 60 30065
1 23 true 61 29624
1 23 true 62 29764
1 23 true 63 29574
1 23 false 0 68151
1 23 false 1 65617
1 23 false 2 64866
1 23 false 3 63914
1 23 false 4 63935
1 23 false 5 63835
1 23 false 6 63484
1 23 false 7 63444
1 23 false 8 63785
1 23 false 9 97865
1 23 false 10 67010
1 23 false 11 64085
1 23 false 12 64236
1 23 false 13 63313
1 23 false 14 63515
1 23 false 15 63444
1 23 false 16 63123
1 23 false 17 63354
1 23 false 18 63314
1 23 false 19 63544
1 23 false 20 63014
1 23 false 21 63194
1 23 false 22 63233
1 23 false 23 63414
1 23 false 24 66349
1 23 false 25 63494
1 23 false 26 63824
1 23 false 27 63014
1 23 false 28 63494
1 23 false 29 63384
1 23 false 30 63034
1 23 false 31 63354
1 23 false 32 63213
1 23 false 33 63283
1 23 false 34 63494
1 23 false 35 63173
1 23 false 36 63454
1 23 false 37 63574
1 23 false 38 63584
1 23 false 39 65587
1 23 false 40 63774
1 23 false 41 63234
1 23 false 42 63585
1 23 false 43 63274
1 23 false 44 64014
1 23 false 45 63535
1 23 false 46 63405
1 23 false 47 62963
1 23 false 48 63254
1 23 false 49 63514
1 23 false 50 63835
1 23 false 51 64035
1 23 false 52 63314
1 23 false 53 63604
1 23 false 54 66388
1 23 false 55 62984
1 23 false 56 63424
1 23 false 57 63264
1 23 false 58 63164
1 23 false 59 63113
1 23 false 60 63605
1 23 false 61 63123
1 23 false 62 63173
1 23 false 63 63774
1 1728651 true 0 32207
1 1728651 true 1 30906
1 1728651 true 2 30075
1 1728651 true 3 29754
1 1728651 true 4 29634
1 1728651 true 5 30245
1 1728651 true 6 29794
1 1728651 true 7 29594
1 1728651 true 8 29694
1 1728651 true 9 32097
1 1728651 true 10 29815
1 1728651 true 11 29563
1 1728651 true 12 29814
1 1728651 true 13 29493
1 1728651 true 14 29493
1 1728651 true 15 29684
1 1728651 true 16 29835
1 1728651 true 17 29795
1 1728651 true 18 29483
1 1728651 true 19 29604
1 1728651 true 20 29484
1 1728651 true 21 29634
1 1728651 true 22 29664
1 1728651 true 23 29264
1 1728651 true 24 29573
1 1728651 true 25 29884
1 1728651 true 26 29534
1 1728651 true 27 29924
1 1728651 true 28 29464
1 1728651 true 29 29614
1 1728651 true 30 29935
1 1728651 true 31 29403
1 1728651 true 32 29184
1 1728651 true 33 30054
1 1728651 true 34 29644
1 1728651 true 35 29543
1 1728651 true 36 29554
1 1728651 true 37 29824
1 1728651 true 38 29945
1 1728651 true 39 32078
1 1728651 true 40 29543
1 1728651 true 41 29444
1 1728651 true 42 29484
1 1728651 true 43 29433
1 1728651 true 44 29704
1 1728651 true 45 29753
1 1728651 true 46 29674
1 1728651 true 47 29654
1 1728651 true 48 29524
1 1728651 true 49 29914
1 1728651 true 50 29183
1 1728651 true 51 29604
1 1728651 true 52 29674
1 1728651 true 53 29514
1 1728651 true 54 29754
1 1728651 true 55 29594
1 1728651 true 56 29774
1 1728651 true 57 29444
1 1728651 true 58 29854
1 1728651 true 59 29835
1 1728651 true 60 29784
1 1728651 true 61 29393
1 1728651 true 62 29413
1 1728651 true 63 29494
1 1728651 false 0 76483
1 1728651 false 1 75943
1 1728651 false 2 72768
1 1728651 false 3 71916
1 1728651 false 4 72197
1 1728651 false 5 71936
1 1728651 false 6 72087
1 1728651 false 7 72017
1 1728651 false 8 72588
1 1728651 false 9 71726
1 1728651 false 10 72027
1 1728651 false 11 71186
1 1728651 false 12 72918
1 1728651 false 13 71676
1 1728651 false 14 74390
1 1728651 false 15 71416
1 1728651 false 16 71897
1 1728651 false 17 71616
1 1728651 false 18 71706
1 1728651 false 19 71907
1 1728651 false 20 71756
1 1728651 false 21 71556
1 1728651 false 22 72217
1 1728651 false 23 71536
1 1728651 false 24 72598
1 1728651 false 25 71426
1 1728651 false 26 71626
1 1728651 false 27 71807
1 1728651 false 28 74440
1 1728651 false 29 71957
1 1728651 false 30 71877
1 1728651 false 31 71646
1 1728651 false 32 71637
1 1728651 false 33 71526
1 1728651 false 34 71375
1 1728651 false 35 71946
1 1728651 false 36 71326
1 1728651 false 37 71827
1 1728651 false 38 71366
1 1728651 false 39 71546
1 1728651 false 40 71506
1 1728651 false 41 75122
1 1728651 false 42 71416
1 1728651 false 43 71816
1 1728651 false 44 71926
1 1728651 false 45 71967
1 1728651 false 46 71376
1 1728651 false 47 72197
1 1728651 false 48 71416
1 1728651 false 49 72177
1 1728651 false 50 71606
1 1728651 false 51 71966
1 1728651 false 52 71937
1 1728651 false 53 72027
1 1728651 false 54 75331
1 1728651 false 55 71687
1 1728651 false 56 71826
1 1728651 false 57 71486
1 1728651 false 58 71666
1 1728651 false 59 71786
1 1728651 false 60 71496
1 1728651 false 61 71877
1 1728651 false 62 71967
1 1728651 false 63 71426
1 5439 true 0 32117
1 5439 true 1 30535
1 5439 true 2 30225
1 5439 true 3 29604
1 5439 true 4 29835
1 5439 true 5 29694
1 5439 true 6 29734
1 5439 true 7 29764
1 5439 true 8 29975
1 5439 true 9 29934
1 5439 true 10 29865
1 5439 true 11 29674
1 5439 true 12 29874
1 5439 true 13 29804
1 5439 true 14 29764
1 5439 true 15 29674
1 5439 true 16 29624
1 5439 true 17 29744
1 5439 true 18 29564
1 5439 true 19 29664
1 5439 true 20 29613
1 5439 true 21 29955
1 5439 true 22 29534
1 5439 true 23 29654
1 5439 true 24 29644
1 5439 true 25 29795
1 5439 true 26 29804
1 5439 true 27 29644
1 5439 true 28 29323
1 5439 true 29 29523
1 5439 true 30 29354
1 5439 true 31 29844
1 5439 true 32 29494
1 5439 true 33 29574
1 5439 true 34 29263
1 5439 true 35 29634
1 5439 true 36 29834
1 5439 true 37 29644
1 5439 true 38 32328
1 5439 true 39 29473
1 5439 true 40 29584
1 5439 true 41 29864
1 5439 true 42 29284
1 5439 true 43 29463
1 5439 true 44 29653
1 5439 true 45 29634
1 5439 true 46 29674
1 5439 true 47 29493
1 5439 true 48 29835
1 5439 true 49 29534
1 5439 true 50 29844
1 5439 true 51 29945
1 5439 true 52 29473
1 5439 true 53 29414
1 5439 true 54 30015
1 5439 true 55 29604
1 5439 true 56 29934
1 5439 true 57 29544
1 5439 true 58 29694
1 5439 true 59 29764
1 5439 true 60 29554
1 5439 true 61 29784
1 5439 true 62 29444
1 5439 true 63 29784
1 5439 false 0 80930
1 5439 false 1 74290
1 5439 false 2 73659
1 5439 false 3 72498
1 5439 false 4 72858
1 5439 false 5 73188
1 5439 false 6 72767
1 5439 false 7 72497
1 5439 false 8 72838
1 5439 false 9 72978
1 5439 false 10 72799
1 5439 false 11 72747
1 5439 false 12 72617
1 5439 false 13 73039
1 5439 false 14 75052
1 5439 false 15 72618
1 5439 false 16 72878
1 5439 false 17 72678
1 5439 false 18 73018
1 5439 false 19 72958
1 5439 false 20 72608
1 5439 false 21 72217
1 5439 false 22 72948
1 5439 false 23 72597
1 5439 false 24 72588
1 5439 false 25 72307
1 5439 false 26 73018
1 5439 false 27 74591
1 5439 false 28 73560
1 5439 false 29 72608
1 5439 false 30 72868
1 5439 false 31 72678
1 5439 false 32 72848
1 5439 false 33 72678
1 5439 false 34 72457
1 5439 false 35 72217
1 5439 false 36 72497
1 5439 false 37 72878
1 5439 false 38 72648
1 5439 false 39 72297
1 5439 false 40 76023
1 5439 false 41 72287
1 5439 false 42 72657
1 5439 false 43 73018
1 5439 false 44 72657
1 5439 false 45 72968
1 5439 false 46 72378
1 5439 false 47 71906
1 5439 false 48 72538
1 5439 false 49 72778
1 5439 false 50 73008
1 5439 false 51 72557
1 5439 false 52 72638
1 5439 false 53 75472
1 5439 false 54 72968
1 5439 false 55 72868
1 5439 false 56 72868
1 5439 false 57 72848
1 5439 false 58 72417
1 5439 false 59 72868
1 5439 false 60 72788
1 5439 false 61 72688
1 5439 false 62 72367
1 5439 false 63 72377
1 523890102151522916311113076301980070234414163719 true 0 34271
1 523890102151522916311113076301980070234414163719 true 1 32498
1 523890102151522916311113076301980070234414163719 true 2 31897
1 523890102151522916311113076301980070234414163719 true 3 34982
1 523890102151522916311113076301980070234414163719 true 4 31657
1 523890102151522916311113076301980070234414163719 true 5 31257
1 523890102151522916311113076301980070234414163719 true 6 31747
1 523890102151522916311113076301980070234414163719 true 7 31637
1 523890102151522916311113076301980070234414163719 true 8 31878
1 523890102151522916311113076301980070234414163719 true 9 31387
1 523890102151522916311113076301980070234414163719 true 10 31657
1 523890102151522916311113076301980070234414163719 true 11 31367
1 523890102151522916311113076301980070234414163719 true 12 31497
1 523890102151522916311113076301980070234414163719 true 13 31397
1 523890102151522916311113076301980070234414163719 true 14 31627
1 523890102151522916311113076301980070234414163719 true 15 31397
1 523890102151522916311113076301980070234414163719 true 16 31466
1 523890102151522916311113076301980070234414163719 true 17 31587
1 523890102151522916311113076301980070234414163719 true 18 31527
1 523890102151522916311113076301980070234414163719 true 19 31737
1 523890102151522916311113076301980070234414163719 true 20 31897
1 523890102151522916311113076301980070234414163719 true 21 31626
1 523890102151522916311113076301980070234414163719 true 22 31477
1 523890102151522916311113076301980070234414163719 true 23 34892
1 523890102151522916311113076301980070234414163719 true 24 31517
1 523890102151522916311113076301980070234414163719 true 25 31597
1 523890102151522916311113076301980070234414163719 true 26 31727
1 523890102151522916311113076301980070234414163719 true 27 31567
1 523890102151522916311113076301980070234414163719 true 28 31346
1 523890102151522916311113076301980070234414163719 true 29 31476
1 523890102151522916311113076301980070234414163719 true 30 31687
1 523890102151522916311113076301980070234414163719 true 31 31647
1 523890102151522916311113076301980070234414163719 true 32 31677
1 523890102151522916311113076301980070234414163719 true 33 31497
1 523890102151522916311113076301980070234414163719 true 34 31727
1 523890102151522916311113076301980070234414163719 true 35 31437
1 523890102151522916311113076301980070234414163719 true 36 31527
1 523890102151522916311113076301980070234414163719 true 37 31537
1 523890102151522916311113076301980070234414163719 true 38 31446
1 523890102151522916311113076301980070234414163719 true 39 31537
1 523890102151522916311113076301980070234414163719 true 40 31387
1 523890102151522916311113076301980070234414163719 true 41 31346
1 523890102151522916311113076301980070234414163719 true 42 31336
1 523890102151522916311113076301980070234414163719 true 43 33720
1 523890102151522916311113076301980070234414163719 true 44 32348
1 523890102151522916311113076301980070234414163719 true 45 31357
1 523890102151522916311113076301980070234414163719 true 46 31367
1 523890102151522916311113076301980070234414163719 true 47 31817
1 523890102151522916311113076301980070234414163719 true 48 31186
1 523890102151522916311113076301980070234414163719 true 49 31637
1 523890102151522916311113076301980070234414163719 true 50 31537
1 523890102151522916311113076301980070234414163719 true 51 31967
1 523890102151522916311113076301980070234414163719 true 52 31727
1 523890102151522916311113076301980070234414163719 true 53 31266
1 523890102151522916311113076301980070234414163719 true 54 31347
1 523890102151522916311113076301980070234414163719 true 55 31507
1 523890102151522916311113076301980070234414163719 true 56 31496
1 523890102151522916311113076301980070234414163719 true 57 31347
1 523890102151522916311113076301980070234414163719 true 58 31276
1 523890102151522916311113076301980070234414163719 true 59 31747
1 523890102151522916311113076301980070234414163719 true 60 31307
1 523890102151522916311113076301980070234414163719 true 61 31527
1 523890102151522916311113076301980070234414163719 true 62 31486
1 523890102151522916311113076301980070234414163719 true 63 31327
1 523890102151522916311113076301980070234414163719 false 0 69443
1 523890102151522916311113076301980070234414163719 false 1 65758
1 523890102151522916311113076301980070234414163719 false 2 65226
1 523890102151522916311113076301980070234414163719 false 3 64376
1 523890102151522916311113076301980070234414163719 false 4 64436
1 523890102151522916311113076301980070234414163719 false 5 64195
1 523890102151522916311113076301980070234414163719 false 6 64616
1 523890102151522916311113076301980070234414163719 false 7 64736
1 523890102151522916311113076301980070234414163719 false 8 64015
1 523890102151522916311113076301980070234414163719 false 9 64816
1 523890102151522916311113076301980070234414163719 false 10 64245
1 523890102151522916311113076301980070234414163719 false 11 64045
1 523890102151522916311113076301980070234414163719 false 12 64015
1 523890102151522916311113076301980070234414163719 false 13 63765
1 523890102151522916311113076301980070234414163719 false 14 63984
1 523890102151522916311113076301980070234414163719 false 15 64135
1 523890102151522916311113076301980070234414163719 false 16 64316
1 523890102151522916311113076301980070234414163719 false 17 64165
1 523890102151522916311113076301980070234414163719 false 18 65086
1 523890102151522916311113076301980070234414163719 false 19 64015
1 523890102151522916311113076301980070234414163719 false 20 64085
1 523890102151522916311113076301980070234414163719 false 21 63494
1 523890102151522916311113076301980070234414163719 false 22 64325
1 523890102151522916311113076301980070234414163719 false 23 63735
1 523890102151522916311113076301980070234414163719 false 24 64245
1 523890102151522916311113076301980070234414163719 false 25 63544
1 523890102151522916311113076301980070234414163719 false 26 64185
1 523890102151522916311113076301980070234414163719 false 27 64155
1 523890102151522916311113076301980070234414163719 false 28 63424
1 523890102151522916311113076301980070234414163719 false 29 64686
1 523890102151522916311113076301980070234414163719 false 30 64286
1 523890102151522916311113076301980070234414163719 false 31 64126
1 523890102151522916311113076301980070234414163719 false 32 63714
1 523890102151522916311113076301980070234414163719 false 33 63965
1 523890102151522916311113076301980070234414163719 false 34 64286
1 523890102151522916311113076301980070234414163719 false 35 66158
1 523890102151522916311113076301980070234414163719 false 36 64015
1 523890102151522916311113076301980070234414163719 false 37 64035
1 523890102151522916311113076301980070234414163719 false 38 63924
1 523890102151522916311113076301980070234414163719 false 39 64186
1 523890102151522916311113076301980070234414163719 false 40 63664
1 523890102151522916311113076301980070234414163719 false 41 64436
1 523890102151522916311113076301980070234414163719 false 42 64075
1 523890102151522916311113076301980070234414163719 false 43 63965
1 523890102151522916311113076301980070234414163719 false 44 64315
1 523890102151522916311113076301980070234414163719 false 45 63965
1 523890102151522916311113076301980070234414163719 false 46 63885
1 523890102151522916311113076301980070234414163719 false 47 68382
1 523890102151522916311113076301980070234414163719 false 48 64355
1 523890102151522916311113076301980070234414163719 false 49 64044
1 523890102151522916311113076301980070234414163719 false 50 63584
1 523890102151522916311113076301980070234414163719 false 51 64075
1 523890102151522916311113076301980070234414163719 false 52 64396
1 523890102151522916311113076301980070234414163719 false 53 63885
1 523890102151522916311113076301980070234414163719 false 54 64195
1 523890102151522916311113076301980070234414163719 false 55 63744
1 523890102151522916311113076301980070234414163719 false 56 64475
1 523890102151522916311113076301980070234414163719 false 57 64155
1 523890102151522916311113076301980070234414163719 false 58 63715
1 523890102151522916311113076301980070234414163719 false 59 67970
1 523890102151522916311113076301980070234414163719 false 60 64505
1 523890102151522916311113076301980070234414163719 false 61 63925
1 523890102151522916311113076301980070234414163719 false 62 63714
1 523890102151522916311113076301980070234414163719 false 63 63845
1 5 true 0 31827
1 5 true 1 30535
1 5 true 2 29804
1 5 true 3 29894
1 5 true 4 29844
1 5 true 5 29494
1 5 true 6 29594
1 5 true 7 29704
1 5 true 8 29804
1 5 true 9 30355
1 5 true 10 29904
1 5 true 11 29644
1 5 true 12 29674
1 5 true 13 29003
1 5 true 14 29985
1 5 true 15 29553
1 5 true 16 29564
1 5 true 17 29424
1 5 true 18 29884
1 5 true 19 30024
1 5 true 20 29744
1 5 true 21 29413
1 5 true 22 29584
1 5 true 23 29754
1 5 true 24 29574
1 5 true 25 29584
1 5 true 26 29464
1 5 true 27 29513
1 5 true 28 29655
1 5 true 29 29394
1 5 true 30 29564
1 5 true 31 29664
1 5 true 32 29484
1 5 true 33 29614
1 5 true 34 29574
1 5 true 35 29744
1 5 true 36 29234
1 5 true 37 29914
1 5 true 38 29664
1 5 true 39 29844
1 5 true 40 29854
1 5 true 41 29504
1 5 true 42 29514
1 5 true 43 29664
1 5 true 44 29524
1 5 true 45 29854
1 5 true 46 29484
1 5 true 47 29834
1 5 true 48 33029
1 5 true 49 29544
1 5 true 50 29604
1 5 true 51 29764
1 5 true 52 29503
1 5 true 53 29634
1 5 true 54 29564
1 5 true 55 29794
1 5 true 56 29654
1 5 true 57 29113
1 5 true 58 29574
1 5 true 59 29824
1 5 true 60 29644
1 5 true 61 29493
1 5 true 62 29544
1 5 true 63 29554
1 5 false 0 68251
1 5 false 1 65227
1 5 false 2 64325
1 5 false 3 63794
1 5 false 4 64215
1 5 false 5 63624
1 5 false 6 66459
1 5 false 7 63955
1 5 false 8 63584
1 5 false 9 63364
1 5 false 10 63854
1 5 false 11 63635
1 5 false 12 63694
1 5 false 13 63013
1 5 false 14 63474
1 5 false 15 63765
1 5 false 16 64265
1 5 false 17 63394
1 5 false 18 63454
1 5 false 19 62994
1 5 false 20 64115
1 5 false 21 65768
1 5 false 22 63674
1 5 false 23 63504
1 5 false 24 63334
1 5 false 25 63474
1 5 false 26 63745
1 5 false 27 75061
1 5 false 28 63785
1 5 false 29 61391
1 5 false 30 63394
1 5 false 31 63625
1 5 false 32 63665
1 5 false 33 63384
1 5 false 34 63414
1 5 false 35 62793
1 5 false 36 63284
1 5 false 37 63124
1 5 false 38 63304
1 5 false 39 63995
1 5 false 40 63133
1 5 false 41 63405
1 5 false 42 63253
1 5 false 43 63675
1 5 false 44 63824
1 5 false 45 63414
1 5 false 46 63664
1 5 false 47 64165
1 5 false 48 63915
1 5 false 49 63605
1 5 false 50 63094
1 5 false 51 66578
1 5 false 52 63024
1 5 false 53 64065
1 5 false 54 63434
1 5 false 55 64115
1 5 false 56 63674
1 5 false 57 63645
1 5 false 58 63424
1 5 false 59 63864
1 5 false 60 63283
1 5 false 61 63624
1 5 false 62 63374
1 5 false 63 63624
1 306251 true 0 32438
1 306251 true 1 30726
1 306251 true 2 32057
1 306251 true 3 29684
1 306251 true 4 29764
1 306251 true 5 29764
1 306251 true 6 29634
1 306251 true 7 29814
1 306251 true 8 29805
1 306251 true 9 29774
1 306251 true 10 29654
1 306251 true 11 29854
1 306251 true 12 29794
1 306251 true 13 29644
1 306251 true 14 29855
1 306251 true 15 29784
1 306251 true 16 29554
1 306251 true 17 29644
1 306251 true 18 29804
1 306251 true 19 29894
1 306251 true 20 29384
1 306251 true 21 29905
1 306251 true 22 29673
1 306251 true 23 29654
1 306251 true 24 29825
1 306251 true 25 29714
1 306251 true 26 29674
1 306251 true 27 29734
1 306251 true 28 30024
1 306251 true 29 29774
1 306251 true 30 29713
1 306251 true 31 29944
1 306251 true 32 30004
1 306251 true 33 29814
1 306251 true 34 29784
1 306251 true 35 29744
1 306251 true 36 29954
1 306251 true 37 29884
1 306251 true 38 29864
1 306251 true 39 29654
1 306251 true 40 29464
1 306251 true 41 29774
1 306251 true 42 29724
1 306251 true 43 29313
1 306251 true 44 29684
1 306251 true 45 29965
1 306251 true 46 29583
1 306251 true 47 29884
1 306251 true 48 29674
1 306251 true 49 29634
1 306251 true 50 29644
1 306251 true 51 29734
1 306251 true 52 29133
1 306251 true 53 29854
1 306251 true 54 29534
1 306251 true 55 29654
1 306251 true 56 29664
1 306251 true 57 29564
1 306251 true 58 29533
1 306251 true 59 29755
1 306251 true 60 29664
1 306251 true 61 29524
1 306251 true 62 29774
1 306251 true 63 32318
1 306251 false 0 67830
1 306251 false 1 65487
1 306251 false 2 64215
1 306251 false 3 64055
1 306251 false 4 63935
1 306251 false 5 63844
1 306251 false 6 64155
1 306251 false 7 64014
1 306251 false 8 64054
1 306251 false 9 63795
1 306251 false 10 63564
1 306251 false 11 63625
1 306251 false 12 63694
1 306251 false 13 66829
1 306251 false 14 63495
1 306251 false 15 63684
1 306251 false 16 63915
1 306251 false 17 63595
1 306251 false 18 63624
1 306251 false 19 63635
1 306251 false 20 63574
1 306251 false 21 63885
1 306251 false 22 63314
1 306251 false 23 64305
1 306251 false 24 63645
1 306251 false 25 63494
1 306251 false 26 63324
1 306251 false 27 63184
1 306251 false 28 66699
1 306251 false 29 63494
1 306251 false 30 63204
1 306251 false 31 63284
1 306251 false 32 63394
1 306251 false 33 63765
1 306251 false 34 63224
1 306251 false 35 63825
1 306251 false 36 63764
1 306251 false 37 63544
1 306251 false 38 62994
1 306251 false 39 63945
1 306251 false 40 63704
1 306251 false 41 63384
1 306251 false 42 63564
1 306251 false 43 66128
1 306251 false 44 63444
1 306251 false 45 63484
1 306251 false 46 63654
1 306251 false 47 63684
1 306251 false 48 63845
1 306251 false 49 63123
1 306251 false 50 64015
1 306251 false 51 63174
1 306251 false 52 63544
1 306251 false 53 63464
1 306251 false 54 63564
1 306251 false 55 63524
1 306251 false 56 63895
1 306251 false 57 63915
1 306251 false 58 66679
1 306251 false 59 63324
1 306251 false 60 63705
1 306251 false 61 63594
1 306251 false 62 63774
1 306251 false 63 63454
2 17329 false 0 65928
2 17329 false 1 64356
2 17329 false 2 63704
2 17329 false 3 63655
2 17329 false 4 63484
2 17329 false 5 63785
2 17329 false 6 63284
2 17329 false 7 66088
2 17329 false 8 63824
2 17329 false 9 63614
2 17329 false 10 63764
2 17329 false 11 63344
2 17329 false 12 63735
2 17329 false 13 63574
2 17329 false 14 64055
2 17329 false 15 63775
2 17329 false 16 63344
2 17329 false 17 64125
2 17329 false 18 63344
2 17329 false 19 63224
2 17329 false 20 63534
2 17329 false 21 63304
2 17329 false 22 63454
2 17329 false 23 63404
2 17329 false 24 63974
2 17329 false 25 63454
2 17329 false 26 63484
2 17329 false 27 63424
2 17329 false 28 63204
2 17329 false 29 63374
2 17329 false 30 62873
2 17329 false 31 63675
2 17329 false 32 63624
2 17329 false 33 63464
2 17329 false 34 63344
2 17329 false 35 63434
2 17329 false 36 63895
2 17329 false 37 63834
2 17329 false 38 68301
2 17329 false 39 63524
2 17329 false 40 63444
2 17329 false 41 63494
2 17329 false 42 63234
2 17329 false 43 63154
2 17329 false 44 63394
2 17329 false 45 63013
2 17329 false 46 63485
2 17329 false 47 63223
2 17329 false 48 63495
2 17329 false 49 63164
2 17329 false 50 63364
2 17329 false 51 63534
2 17329 false 52 63224
2 17329 false 53 68772
2 17329 false 54 63655
2 17329 false 55 63754
2 17329 false 56 63925
2 17329 false 57 63544
2 17329 false 58 63614
2 17329 false 59 63564
2 17329 false 60 63364
2 17329 false 61 63204
2 17329 false 62 63625
2 17329 false 63 63414
2 17329 true 0 32488
2 17329 true 1 31006
2 17329 true 2 29974
2 17329 true 3 29384
2 17329 true 4 29904
2 17329 true 5 29824
2 17329 true 6 32458
2 17329 true 7 29334
2 17329 true 8 29674
2 17329 true 9 29944
2 17329 true 10 29744
2 17329 true 11 29764
2 17329 true 12 29504
2 17329 true 13 29544
2 17329 true 14 29584
2 17329 true 15 29794
2 17329 true 16 29764
2 17329 true 17 29654
2 17329 true 18 29924
2 17329 true 19 29514
2 17329 true 20 29905
2 17329 true 21 29845
2 17329 true 22 29784
2 17329 true 23 29554
2 17329 true 24 29553
2 17329 true 25 29835
2 17329 true 26 29754
2 17329 true 27 29744
2 17329 true 28 29694
2 17329 true 29 29974
2 17329 true 30 29484
2 17329 true 31 29624
2 17329 true 32 29453
2 17329 true 33 29834
2 17329 true 34 29584
2 17329 true 35 29594
2 17329 true 36 29343
2 17329 true 37 32298
2 17329 true 38 30004
2 17329 true 39 29734
2 17329 true 40 29774
2 17329 true 41 29695
2 17329 true 42 29363
2 17329 true 43 29954
2 17329 true 44 29554
2 17329 true 45 29594
2 17329 true 46 29574
2 17329 true 47 29454
2 17329 true 48 29473
2 17329 true 49 29604
2 17329 true 50 29995
2 17329 true 51 29503
2 17329 true 52 29504
2 17329 true 53 29914
2 17329 true 54 29514
2 17329 true 55 29834
2 17329 true 56 29414
2 17329 true 57 29564
2 17329 true 58 29814
2 17329 true 59 29473
2 17329 true 60 29554
2 17329 true 61 30074
2 17329 true 62 29664
2 17329 true 63 29424
2 69 false 0 81220
2 69 false 1 74811
2 69 false 2 73498
2 69 false 3 72567
2 69 false 4 72758
2 69 false 5 72928
2 69 false 6 72908
2 69 false 7 72767
2 69 false 8 72377
2 69 false 9 72498
2 69 false 10 72368
2 69 false 11 72598
2 69 false 12 72558
2 69 false 13 75692
2 69 false 14 72337
2 69 false 15 72838
2 69 false 16 72497
2 69 false 17 72528
2 69 false 18 72347
2 69 false 19 72578
2 69 false 20 72558
2 69 false 21 72317
2 69 false 22 72658
2 69 false 23 72067
2 69 false 24 71996
2 69 false 25 72448
2 69 false 26 74791
2 69 false 27 72297
2 69 false 28 72598
2 69 false 29 72487
2 69 false 30 72578
2 69 false 31 72688
2 69 false 32 72738
2 69 false 33 72097
2 69 false 34 72508
2 69 false 35 72618
2 69 false 36 72608
2 69 false 37 72598
2 69 false 38 72187
2 69 false 39 78817
2 69 false 40 72247
2 69 false 41 72417
2 69 false 42 72207
2 69 false 43 72328
2 69 false 44 72307
2 69 false 45 72107
2 69 false 46 72417
2 69 false 47 71727
2 69 false 48 72367
2 69 false 49 72638
2 69 false 50 72698
2 69 false 51 72728
2 69 false 52 72147
2 69 false 53 74630
2 69 false 54 72798
2 69 false 55 72327
2 69 false 56 72057
2 69 false 57 72487
2 69 false 58 72868
2 69 false 59 72247
2 69 false 60 72818
2 69 false 61 72317
2 69 false 62 72267
2 69 false 63 72227
2 69 true 0 32098
2 69 true 1 30496
2 69 true 2 29985
2 69 true 3 32738
2 69 true 4 29844
2 69 true 5 29634
2 69 true 6 29764
2 69 true 7 29805
2 69 true 8 29493
2 69 true 9 29764
2 69 true 10 29474
2 69 true 11 29524
2 69 true 12 29764
2 69 true 13 29364
2 69 true 14 29454
2 69 true 15 29624
2 69 true 16 29844
2 69 true 17 29674
2 69 true 18 29473
2 69 true 19 29715
2 69 true 20 29724
2 69 true 21 29634
2 69 true 22 29764
2 69 true 23 29503
2 69 true 24 29654
2 69 true 25 29393
2 69 true 26 29724
2 69 true 27 29654
2 69 true 28 29624
2 69 true 29 29834
2 69 true 30 29554
2 69 true 31 29544
2 69 true 32 29524
2 69 true 33 30014
2 69 true 34 32248
2 69 true 35 29654
2 69 true 36 29634
2 69 true 37 29403
2 69 true 38 29594
2 69 true 39 29734
2 69 true 40 29554
2 69 true 41 29564
2 69 true 42 29494
2 69 true 43 29694
2 69 true 44 29774
2 69 true 45 29694
2 69 true 46 29363
2 69 true 47 29904
2 69 true 48 29584
2 69 true 49 29564
2 69 true 50 29814
2 69 true 51 29694
2 69 true 52 29654
2 69 true 53 29383
2 69 true 54 29454
2 69 true 55 29504
2 69 true 56 29754
2 69 true 57 29654
2 69 true 58 29353
2 69 true 59 29464
2 69 true 60 29684
2 69 true 61 29854
2 69 true 62 29564
2 69 true 63 29624
2 301 false 0 76783
2 301 false 1 74010
2 301 false 2 73569
2 301 false 3 72747
2 301 false 4 72818
2 301 false 5 72728
2 301 false 6 73128
2 301 false 7 72648
2 301 false 8 72618
2 301 false 9 72988
2 301 false 10 72968
2 301 false 11 72427
2 301 false 12 75001
2 301 false 13 72838
2 301 false 14 72818
2 301 false 15 72467
2 301 false 16 72899
2 301 false 17 72718
2 301 false 18 72608
2 301 false 19 72327
2 301 false 20 72437
2 301 false 21 72868
2 301 false 22 72197
2 301 false 23 72999
2 301 false 24 73228
2 301 false 25 76213
2 301 false 26 72368
2 301 false 27 72849
2 301 false 28 72537
2 301 false 29 72598
2 301 false 30 72638
2 301 false 31 72527
2 301 false 32 72598
2 301 false 33 72577
2 301 false 34 72608
2 301 false 35 73159
2 301 false 36 72387
2 301 false 37 72518
2 301 false 38 74711
2 301 false 39 72177
2 301 false 40 72548
2 301 false 41 72708
2 301 false 42 72197
2 301 false 43 72537
2 301 false 44 72577
2 301 false 45 72628
2 301 false 46 72357
2 301 false 47 72568
2 301 false 48 72949
2 301 false 49 72427
2 301 false 50 72387
2 301 false 51 72657
2 301 false 52 75321
2 301 false 53 72628
2 301 false 54 72958
2 301 false 55 72447
2 301 false 56 72798
2 301 false 57 72568
2 301 false 58 72467
2 301 false 59 72778
2 301 false 60 72518
2 301 false 61 72097
2 301 false 62 72738
2 301 false 63 73129
2 301 true 0 32118
2 301 true 1 32578
2 301 true 2 30235
2 301 true 3 29794
2 301 true 4 29644
2 301 true 5 29884
2 301 true 6 29694
2 301 true 7 29764
2 301 true 8 29725
2 301 true 9 29114
2 301 true 10 29433
2 301 true 11 29393
2 301 true 12 29784
2 301 true 13 29294
2 301 true 14 29443
2 301 true 15 29814
2 301 true 16 29584
2 301 true 17 29955
2 301 true 18 29634
2 301 true 19 29594
2 301 true 20 29644
2 301 true 21 29283
2 301 true 22 29524
2 301 true 23 29434
2 301 true 24 29443
2 301 true 25 29885
2 301 true 26 29354
2 301 true 27 29834
2 301 true 28 29434
2 301 true 29 29684
2 301 true 30 29614
2 301 true 31 29734
2 301 true 32 32748
2 301 true 33 29654
2 301 true 34 29203
2 301 true 35 29504
2 301 true 36 29123
2 301 true 37 28162
2 301 true 38 29333
2 301 true 39 29764
2 301 true 40 29414
2 301 true 41 29273
2 301 true 42 29384
2 301 true 43 29674
2 301 true 44 29424
2 301 true 45 29464
2 301 true 46 29583
2 301 true 47 29654
2 301 true 48 29363
2 301 true 49 29944
2 301 true 50 29614
2 301 true 51 29404
2 301 true 52 29493
2 301 true 53 29724
2 301 true 54 29633
2 301 true 55 29825
2 301 true 56 29734
2 301 true 57 29514
2 301 true 58 29403
2 301 true 59 29614
2 301 true 60 29814
2 301 true 61 29824
2 301 true 62 29684
2 301 true 63 29504
2 71523 false 0 85958
2 71523 false 1 82923
2 71523 false 2 81902
2 71523 false 3 80910
2 71523 false 4 81070
2 71523 false 5 80800
2 71523 false 6 80770
2 71523 false 7 80740
2 71523 false 8 81040
2 71523 false 9 80169
2 71523 false 10 84585
2 71523 false 11 80689
2 71523 false 12 81321
2 71523 false 13 80509
2 71523 false 14 80450
2 71523 false 15 80159
2 71523 false 16 81200
2 71523 false 17 80560
2 71523 false 18 80509
2 71523 false 19 80349
2 71523 false 20 80719
2 71523 false 21 84265
2 71523 false 22 80549
2 71523 false 23 80950
2 71523 false 24 80559
2 71523 false 25 81441
2 71523 false 26 80659
2 71523 false 27 80400
2 71523 false 28 80419
2 71523 false 29 79969
2 71523 false 30 80639
2 71523 false 31 80530
2 71523 false 32 80710
2 71523 false 33 84675
2 71523 false 34 80259
2 71523 false 35 80359
2 71523 false 36 81131
2 71523 false 37 81150
2 71523 false 38 80510
2 71523 false 39 80309
2 71523 false 40 80350
2 71523 false 41 80709
2 71523 false 42 80419
2 71523 false 43 80740
2 71523 false 44 80169
2 71523 false 45 83333
2 71523 false 46 80239
2 71523 false 47 81090
2 71523 false 48 80650
2 71523 false 49 81490
2 71523 false 50 80469
2 71523 false 51 80339
2 71523 false 52 80710
2 71523 false 53 80870
2 71523 false 54 80800
2 71523 false 55 80720
2 71523 false 56 80769
2 71523 false 57 97444
2 71523 false 58 81561
2 71523 false 59 80790
2 71523 false 60 81221
2 71523 false 61 80860
2 71523 false 62 81621
2 71523 false 63 80479
2 71523 true 0 31827
2 71523 true 1 30084
2 71523 true 2 29864
2 71523 true 3 29664
2 71523 true 4 29974
2 71523 true 5 29704
2 71523 true 6 29023
2 71523 true 7 29424
2 71523 true 8 29614
2 71523 true 9 30034
2 71523 true 10 29524
2 71523 true 11 29654
2 71523 true 12 32669
2 71523 true 13 29824
2 71523 true 14 29764
2 71523 true 15 29754
2 71523 true 16 29364
2 71523 true 17 29553
2 71523 true 18 29684
2 71523 true 19 29504
2 71523 true 20 29874
2 71523 true 21 29694
2 71523 true 22 29404
2 71523 true 23 30114
2 71523 true 24 29634
2 71523 true 25 29564
2 71523 true 26 29704
2 71523 true 27 29714
2 71523 true 28 29654
2 71523 true 29 29714
2 71523 true 30 29564
2 71523 true 31 29734
2 71523 true 32 29373
2 71523 true 33 29774
2 71523 true 34 29715
2 71523 true 35 29764
2 71523 true 36 29343
2 71523 true 37 29434
2 71523 true 38 29564
2 71523 true 39 29583
2 71523 true 40 29774
2 71523 true 41 29304
2 71523 true 42 29414
2 71523 true 43 32318
2 71523 true 44 29904
2 71523 true 45 29614
2 71523 true 46 29394
2 71523 true 47 29524
2 71523 true 48 29754
2 71523 true 49 29494
2 71523 true 50 29854
2 71523 true 51 29023
2 71523 true 52 29554
2 71523 true 53 29604
2 71523 true 54 29564
2 71523 true 55 29343
2 71523 true 56 29764
2 71523 true 57 29584
2 71523 true 58 29334
2 71523 true 59 29523
2 71523 true 60 29735
2 71523 true 61 29514
2 71523 true 62 29374
2 71523 true 63 29494
2 111028891713715270858633 false 0 68352
2 111028891713715270858633 false 1 65497
2 111028891713715270858633 false 2 64706
2 111028891713715270858633 false 3 66989
2 111028891713715270858633 false 4 63794
2 111028891713715270858633 false 5 64135
2 111028891713715270858633 false 6 64235
2 111028891713715270858633 false 7 63935
2 111028891713715270858633 false 8 64115
2 111028891713715270858633 false 9 63565
2 111028891713715270858633 false 10 63935
2 111028891713715270858633 false 11 64306
2 111028891713715270858633 false 12 64176
2 111028891713715270858633 false 13 64525
2 111028891713715270858633 false 14 62592
2 111028891713715270858633 false 15 63595
2 111028891713715270858633 false 16 63814
2 111028891713715270858633 false 17 66579
2 111028891713715270858633 false 18 63504
2 111028891713715270858633 false 19 64466
2 111028891713715270858633 false 20 63995
2 111028891713715270858633 false 21 63995
2 111028891713715270858633 false 22 63534
2 111028891713715270858633 false 23 64155
2 111028891713715270858633 false 24 63554
2 111028891713715270858633 false 25 63504
2 111028891713715270858633 false 26 63664
2 111028891713715270858633 false 27 63995
2 111028891713715270858633 false 28 63715
2 111028891713715270858633 false 29 63905
2 111028891713715270858633 false 30 63924
2 111028891713715270858633 false 31 66489
2 111028891713715270858633 false 32 64225
2 111028891713715270858633 false 33 63925
2 111028891713715270858633 false 34 63874
2 111028891713715270858633 false 35 63845
2 111028891713715270858633 false 36 64135
2 111028891713715270858633 false 37 63815
2 111028891713715270858633 false 38 64045
2 111028891713715270858633 false 39 64215
2 111028891713715270858633 false 40 64095
2 111028891713715270858633 false 41 63694
2 111028891713715270858633 false 42 64085
2 111028891713715270858633 false 43 63725
2 111028891713715270858633 false 44 63865
2 111028891713715270858633 false 45 66989
2 111028891713715270858633 false 46 64466
2 111028891713715270858633 false 47 64466
2 111028891713715270858633 false 48 63605
2 111028891713715270858633 false 49 64476
2 111028891713715270858633 false 50 63654
2 111028891713715270858633 false 51 64045
2 111028891713715270858633 false 52 63835
2 111028891713715270858633 false 53 64556
2 111028891713715270858633 false 54 63925
2 111028891713715270858633 false 55 64355
2 111028891713715270858633 false 56 64095
2 111028891713715270858633 false 57 63834
2 111028891713715270858633 false 58 64015
2 111028891713715270858633 false 59 66268
2 111028891713715270858633 false 60 64126
2 111028891713715270858633 false 61 64155
2 111028891713715270858633 false 62 64366
2 111028891713715270858633 false 63 63734
2 111028891713715270858633 true 0 33801
2 111028891713715270858633 true 1 32558
2 111028891713715270858633 true 2 31967
2 111028891713715270858633 true 3 31787
2 111028891713715270858633 true 4 31286
2 111028891713715270858633 true 5 31747
2 111028891713715270858633 true 6 31627
2 111028891713715270858633 true 7 31416
2 111028891713715270858633 true 8 31487
2 111028891713715270858633 true 9 31456
2 111028891713715270858633 true 10 31657
2 111028891713715270858633 true 11 31286
2 111028891713715270858633 true 12 31587
2 111028891713715270858633 true 13 31526
2 111028891713715270858633 true 14 31527
2 111028891713715270858633 true 15 34141
2 111028891713715270858633 true 16 31467
2 111028891713715270858633 true 17 31436
2 111028891713715270858633 true 18 31216
2 111028891713715270858633 true 19 31326
2 111028891713715270858633 true 20 31317
2 111028891713715270858633 true 21 31397
2 111028891713715270858633 true 22 31376
2 111028891713715270858633 true 23 31206
2 111028891713715270858633 true 24 31347
2 111028891713715270858633 true 25 31287
2 111028891713715270858633 true 26 31367
2 111028891713715270858633 true 27 31296
2 111028891713715270858633 true 28 31347
2 111028891713715270858633 true 29 31307
2 111028891713715270858633 true 30 31517
2 111028891713715270858633 true 31 31467
2 111028891713715270858633 true 32 31197
2 111028891713715270858633 true 33 31416
2 111028891713715270858633 true 34 31306
2 111028891713715270858633 true 35 31858
2 111028891713715270858633 true 36 31016
2 111028891713715270858633 true 37 31516
2 111028891713715270858633 true 38 31417
2 111028891713715270858633 true 39 31237
2 111028891713715270858633 true 40 31577
2 111028891713715270858633 true 41 31527
2 111028891713715270858633 true 42 31336
2 111028891713715270858633 true 43 31316
2 111028891713715270858633 true 44 31476
2 111028891713715270858633 true 45 31196
2 111028891713715270858633 true 46 31657
2 111028891713715270858633 true 47 31256
2 111028891713715270858633 true 48 31256
2 111028891713715270858633 true 49 31406
2 111028891713715270858633 true 50 31167
2 111028891713715270858633 true 51 31417
2 111028891713715270858633 true 52 31517
2 111028891713715270858633 true 53 31416
2 111028891713715270858633 true 54 31386
2 111028891713715270858633 true 55 31346
2 111028891713715270858633 true 56 31106
2 111028891713715270858633 true 57 31496
2 111028891713715270858633 true 58 31517
2 111028891713715270858633 true 59 31106
2 111028891713715270858633 true 60 31366
2 111028891713715270858633 true 61 31426
2 111028891713715270858633 true 62 31326
2 111028891713715270858633 true 63 31336
2 239 false 0 85507
2 239 false 1 82573
2 239 false 2 82022
2 239 false 3 81120
2 239 false 4 80850
2 239 false 5 81040
2 239 false 6 81541
2 239 false 7 81391
2 239 false 8 81140
2 239 false 9 81501
2 239 false 10 80920
2 239 false 11 83533
2 239 false 12 80530
2 239 false 13 80549
2 239 false 14 81160
2 239 false 15 80700
2 239 false 16 80790
2 239 false 17 80911
2 239 false 18 80490
2 239 false 19 80760
2 239 false 20 81401
2 239 false 21 81060
2 239 false 22 81080
2 239 false 23 84435
2 239 false 24 80690
2 239 false 25 80840
2 239 false 26 80680
2 239 false 27 80880
2 239 false 28 81070
2 239 false 29 81210
2 239 false 30 81150
2 239 false 31 80660
2 239 false 32 80890
2 239 false 33 80449
2 239 false 34 80710
2 239 false 35 83013
2 239 false 36 80670
2 239 false 37 80630
2 239 false 38 81521
2 239 false 39 80910
2 239 false 40 81621
2 239 false 41 81050
2 239 false 42 81361
2 239 false 43 81040
2 239 false 44 81351
2 239 false 45 80539
2 239 false 46 80590
2 239 false 47 84675
2 239 false 48 81161
2 239 false 49 81170
2 239 false 50 81020
2 239 false 51 81170
2 239 false 52 81921
2 239 false 53 80870
2 239 false 54 81051
2 239 false 55 80660
2 239 false 56 80820
2 239 false 57 80760
2 239 false 58 80900
2 239 false 59 83964
2 239 false 60 81190
2 239 false 61 149462
2 239 false 62 81731
2 239 false 63 80940
2 239 true 0 32127
2 239 true 1 30746
2 239 true 2 29864
2 239 true 3 29915
2 239 true 4 29694
2 239 true 5 29483
2 239 true 6 29354
2 239 true 7 29704
2 239 true 8 29834
2 239 true 9 29223
2 239 true 10 29895
2 239 true 11 29634
2 239 true 12 29523
2 239 true 13 29614
2 239 true 14 33159
2 239 true 15 29664
2 239 true 16 30114
2 239 true 17 29493
2 239 true 18 29744
2 239 true 19 29654
2 239 true 20 29484
2 239 true 21 29524
2 239 true 22 29764
2 239 true 23 29974
2 239 true 24 29654
2 239 true 25 29514
2 239 true 26 29834
2 239 true 27 29874
2 239 true 28 29694
2 239 true 29 29534
2 239 true 30 29513
2 239 true 31 29394
2 239 true 32 29444
2 239 true 33 29544
2 239 true 34 29513
2 239 true 35 29684
2 239 true 36 29944
2 239 true 37 29634
2 239 true 38 29884
2 239 true 39 29914
2 239 true 40 29694
2 239 true 41 29654
2 239 true 42 29353
2 239 true 43 29574
2 239 true 44 29724
2 239 true 45 29974
2 239 true 46 29865
2 239 true 47 29955
2 239 true 48 29714
2 239 true 49 29824
2 239 true 50 29794
2 239 true 51 29664
2 239 true 52 29444
2 239 true 53 29364
2 239 true 54 29373
2 239 true 55 30155
2 239 true 56 29383
2 239 true 57 29584
2 239 true 58 29614
2 239 true 59 29684
2 239 true 60 29755
2 239 true 61 29664
2 239 true 62 29674
2 239 true 63 29494
2 631 false 0 76483
2 631 false 1 73919
2 631 false 2 72527
2 631 false 3 74761
2 631 false 4 72107
2 631 false 5 72367
2 631 false 6 71777
2 631 false 7 72297
2 631 false 8 72137
2 631 false 9 72548
2 631 false 10 71906
2 631 false 11 71696
2 631 false 12 71536
2 631 false 13 71837
2 631 false 14 71546
2 631 false 15 72477
2 631 false 16 74661
2 631 false 17 71926
2 631 false 18 71927
2 631 false 19 72307
2 631 false 20 72227
2 631 false 21 71726
2 631 false 22 71867
2 631 false 23 71927
2 631 false 24 71947
2 631 false 25 72037
2 631 false 26 71886
2 631 false 27 71827
2 631 false 28 71996
2 631 false 29 72318
2 631 false 30 73629
2 631 false 31 71736
2 631 false 32 71647
2 631 false 33 71466
2 631 false 34 72277
2 631 false 35 72447
2 631 false 36 71596
2 631 false 37 72678
2 631 false 38 72107
2 631 false 39 72598
2 631 false 40 72657
2 631 false 41 72138
2 631 false 42 72086
2 631 false 43 74932
2 631 false 44 72087
2 631 false 45 71576
2 631 false 46 71917
2 631 false 47 71716
2 631 false 48 71756
2 631 false 49 71826
2 631 false 50 72538
2 631 false 51 71877
2 631 false 52 72597
2 631 false 53 71426
2 631 false 54 72047
2 631 false 55 71576
2 631 false 56 75923
2 631 false 57 72227
2 631 false 58 71857
2 631 false 59 71987
2 631 false 60 72187
2 631 false 61 71927
2 631 false 62 71846
2 631 false 63 72137
2 631 true 0 31507
2 631 true 1 30626
2 631 true 2 30255
2 631 true 3 29844
2 631 true 4 29814
2 631 true 5 29894
2 631 true 6 29574
2 631 true 7 29684
2 631 true 8 30105
2 631 true 9 29765
2 631 true 10 29674
2 631 true 11 29835
2 631 true 12 32308
2 631 true 13 29964
2 631 true 14 29684
2 631 true 15 29584
2 631 true 16 29894
2 631 true 17 29614
2 631 true 18 29995
2 631 true 19 29844
2 631 true 20 29674
2 631 true 21 29644
2 631 true 22 29644
2 631 true 23 29634
2 631 true 24 29744
2 631 true 25 29534
2 631 true 26 29604
2 631 true 27 29624
2 631 true 28 29614
2 631 true 29 29734
2 631 true 30 29824
2 631 true 31 29944
2 631 true 32 29714
2 631 true 33 29534
2 631 true 34 29724
2 631 true 35 29754
2 631 true 36 29564
2 631 true 37 29594
2 631 true 38 29614
2 631 true 39 29343
2 631 true 40 29514
2 631 true 41 29914
2 631 true 42 29774
2 631 true 43 32859
2 631 true 44 30255
2 631 true 45 29663
2 631 true 46 29695
2 631 true 47 29563
2 631 true 48 29284
2 631 true 49 29764
2 631 true 50 29584
2 631 true 51 29554
2 631 true 52 29493
2 631 true 53 29855
2 631 true 54 29654
2 631 true 55 29633
2 631 true 56 29884
2 631 true 57 29584
2 631 true 58 29604
2 631 true 59 29864
2 631 true 60 29514
2 631 true 61 29934
2 631 true 62 29534
2 631 true 63 29775
2 223 false 0 77184
2 223 false 1 74320
2 223 false 2 76343
2 223 false 3 72978
2 223 false 4 72868
2 223 false 5 72938
2 223 false 6 72648
2 223 false 7 71896
2 223 false 8 72507
2 223 false 9 72858
2 223 false 10 72748
2 223 false 11 72557
2 223 false 12 72478
2 223 false 13 72668
2 223 false 14 72067
2 223 false 15 72728
2 223 false 16 75632
2 223 false 17 72607
2 223 false 18 72637
2 223 false 19 72037
2 223 false 20 72537
2 223 false 21 72027
2 223 false 22 72277
2 223 false 23 72468
2 223 false 24 72547
2 223 false 25 72297
2 223 false 26 72197
2 223 false 27 72598
2 223 false 28 72317
2 223 false 29 75352
2 223 false 30 72968
2 223 false 31 72888
2 223 false 32 72207
2 223 false 33 72588
2 223 false 34 72577
2 223 false 35 72637
2 223 false 36 72798
2 223 false 37 72537
2 223 false 38 72308
2 223 false 39 72067
2 223 false 40 72658
2 223 false 41 72277
2 223 false 42 74570
2 223 false 43 72798
2 223 false 44 72397
2 223 false 45 71786
2 223 false 46 72518
2 223 false 47 72909
2 223 false 48 72628
2 223 false 49 72368
2 223 false 50 72407
2 223 false 51 71957
2 223 false 52 72668
2 223 false 53 72447
2 223 false 54 72808
2 223 false 55 74982
2 223 false 56 72697
2 223 false 57 72317
2 223 false 58 71777
2 223 false 59 72527
2 223 false 60 72297
2 223 false 61 72278
2 223 false 62 72237
2 223 false 63 72567
2 223 true 0 31797
2 223 true 1 30595
2 223 true 2 29713
2 223 true 3 29654
2 223 true 4 29834
2 223 true 5 29534
2 223 true 6 29574
2 223 true 7 29804
2 223 true 8 29615
2 223 true 9 29664
2 223 true 10 32178
2 223 true 11 29514
2 223 true 12 29423
2 223 true 13 29544
2 223 true 14 29885
2 223 true 15 29473
2 223 true 16 29735
2 223 true 17 29544
2 223 true 18 29384
2 223 true 19 29774
2 223 true 20 29374
2 223 true 21 29724
2 223 true 22 29273
2 223 true 23 29804
2 223 true 24 29714
2 223 true 25 29684
2 223 true 26 29353
2 223 true 27 29784
2 223 true 28 29814
2 223 true 29 29584
2 223 true 30 29735
2 223 true 31 29454
2 223 true 32 29334
2 223 true 33 29594
2 223 true 34 29654
2 223 true 35 29534
2 223 true 36 29644
2 223 true 37 29714
2 223 true 38 29554
2 223 true 39 29314
2 223 true 40 31617
2 223 true 41 30015
2 223 true 42 30155
2 223 true 43 29654
2 223 true 44 29844
2 223 true 45 29954
2 223 true 46 29544
2 223 true 47 29834
2 223 true 48 29664
2 223 true 49 29234
2 223 true 50 29623
2 223 true 51 29393
2 223 true 52 29213
2 223 true 53 29613
2 223 true 54 29674
2 223 true 55 29934
2 223 true 56 29494
2 223 true 57 29383
2 223 true 58 29534
2 223 true 59 29424
2 223 true 60 29804
2 223 true 61 29344
2 223 true 62 29063
2 223 true 63 29423
2 1184777 false 0 76864
2 1184777 false 1 77385
2 1184777 false 2 71756
2 1184777 false 3 72227
2 1184777 false 4 71776
2 1184777 false 5 72037
2 1184777 false 6 71657
2 1184777 false 7 72127
2 1184777 false 8 71706
2 1184777 false 9 72047
2 1184777 false 10 71336
2 1184777 false 11 71326
2 1184777 false 12 71817
2 1184777 false 13 71696
2 1184777 false 14 71986
2 1184777 false 15 74671
2 1184777 false 16 72097
2 1184777 false 17 71847
2 1184777 false 18 71787
2 1184777 false 19 72368
2 1184777 false 20 71766
2 1184777 false 21 71686
2 1184777 false 22 71356
2 1184777 false 23 72107
2 1184777 false 24 71386
2 1184777 false 25 72417
2 1184777 false 26 71756
2 1184777 false 27 71946
2 1184777 false 28 73669
2 1184777 false 29 72247
2 1184777 false 30 71666
2 1184777 false 31 72187
2 1184777 false 32 71927
2 1184777 false 33 72127
2 1184777 false 34 71616
2 1184777 false 35 72077
2 1184777 false 36 71636
2 1184777 false 37 71596
2 1184777 false 38 71716
2 1184777 false 39 71636
2 1184777 false 40 71366
2 1184777 false 41 73909
2 1184777 false 42 72087
2 1184777 false 43 71726
2 1184777 false 44 71797
2 1184777 false 45 71726
2 1184777 false 46 71465
2 1184777 false 47 71476
2 1184777 false 48 72227
2 1184777 false 49 71546
2 1184777 false 50 71445
2 1184777 false 51 71486
2 1184777 false 52 72007
2 1184777 false 53 71646
2 1184777 false 54 71647
2 1184777 false 55 74360
2 1184777 false 56 71877
2 1184777 false 57 71986
2 1184777 false 58 71376
2 1184777 false 59 71807
2 1184777 false 60 71456
2 1184777 false 61 72147
2 1184777 false 62 71836
2 1184777 false 63 71305
2 1184777 true 0 31787
2 1184777 true 1 30495
2 1184777 true 2 30155
2 1184777 true 3 29634
2 1184777 true 4 29934
2 1184777 true 5 29594
2 1184777 true 6 29444
2 1184777 true 7 29584
2 1184777 true 8 29464
2 1184777 true 9 32017
2 1184777 true 10 29484
2 1184777 true 11 29273
2 1184777 true 12 29924
2 1184777 true 13 29764
2 1184777 true 14 29273
2 1184777 true 15 29403
2 1184777 true 16 29364
2 1184777 true 17 29604
2 1184777 true 18 29814
2 1184777 true 19 29544
2 1184777 true 20 29704
2 1184777 true 21 29474
2 1184777 true 22 29754
2 1184777 true 23 29744
2 1184777 true 24 29925
2 1184777 true 25 29433
2 1184777 true 26 29684
2 1184777 true 27 29454
2 1184777 true 28 29664
2 1184777 true 29 29324
2 1184777 true 30 29704
2 1184777 true 31 29554
2 1184777 true 32 29213
2 1184777 true 33 29543
2 1184777 true 34 29654
2 1184777 true 35 29774
2 1184777 true 36 29624
2 1184777 true 37 29554
2 1184777 true 38 29413
2 1184777 true 39 29534
2 1184777 true 40 29334
2 1184777 true 41 29353
2 1184777 true 42 29934
2 1184777 true 43 29824
2 1184777 true 44 29474
2 1184777 true 45 29584
2 1184777 true 46 29453
2 1184777 true 47 29694
2 1184777 true 48 29414
2 1184777 true 49 29353
2 1184777 true 50 29684
2 1184777 true 51 29654
2 1184777 true 52 29925
2 1184777 true 53 30024
2 1184777 true 54 29794
2 1184777 true 55 29434
2 1184777 true 56 29474
2 1184777 true 57 29904
2 1184777 true 58 29484
2 1184777 true 59 29664
2 1184777 true 60 29324
2 1184777 true 61 29504
2 1184777 true 62 29463
2 1184777 true 63 29633
2 284551513249666376365123 false 0 75903
2 284551513249666376365123 false 1 77375
2 284551513249666376365123 false 2 73889
2 284551513249666376365123 false 3 73038
2 284551513249666376365123 false 4 73228
2 284551513249666376365123 false 5 72998
2 284551513249666376365123 false 6 73018
2 284551513249666376365123 false 7 73138
2 284551513249666376365123 false 8 72568
2 284551513249666376365123 false 9 73068
2 284551513249666376365123 false 10 72608
2 284551513249666376365123 false 11 73178
2 284551513249666376365123 false 12 73309
2 284551513249666376365123 false 13 78196
2 284551513249666376365123 false 14 72768
2 284551513249666376365123 false 15 73178
2 284551513249666376365123 false 16 72808
2 284551513249666376365123 false 17 72888
2 284551513249666376365123 false 18 72898
2 284551513249666376365123 false 19 70915
2 284551513249666376365123 false 20 72718
2 284551513249666376365123 false 21 72777
2 284551513249666376365123 false 22 72478
2 284551513249666376365123 false 23 72558
2 284551513249666376365123 false 24 72568
2 284551513249666376365123 false 25 72387
2 284551513249666376365123 false 26 75392
2 284551513249666376365123 false 27 73109
2 284551513249666376365123 false 28 72177
2 284551513249666376365123 false 29 72257
2 284551513249666376365123 false 30 72828
2 284551513249666376365123 false 31 72478
2 284551513249666376365123 false 32 72748
2 284551513249666376365123 false 33 73219
2 284551513249666376365123 false 34 73159
2 284551513249666376365123 false 35 73409
2 284551513249666376365123 false 36 73078
2 284551513249666376365123 false 37 72979
2 284551513249666376365123 false 38 75692
2 284551513249666376365123 false 39 73309
2 284551513249666376365123 false 40 73389
2 284551513249666376365123 false 41 72848
2 284551513249666376365123 false 42 72317
2 284551513249666376365123 false 43 72478
2 284551513249666376365123 false 44 72828
2 284551513249666376365123 false 45 72778
2 284551513249666376365123 false 46 72498
2 284551513249666376365123 false 47 73208
2 284551513249666376365123 false 48 72788
2 284551513249666376365123 false 49 72989
2 284551513249666376365123 false 50 73349
2 284551513249666376365123 false 51 72839
2 284551513249666376365123 false 52 73439
2 284551513249666376365123 false 53 72788
2 284551513249666376365123 false 54 73088
2 284551513249666376365123 false 55 73219
2 284551513249666376365123 false 56 72828
2 284551513249666376365123 false 57 72968
2 284551513249666376365123 false 58 73078
2 284551513249666376365123 false 59 72888
2 284551513249666376365123 false 60 72918
2 284551513249666376365123 false 61 73018
2 284551513249666376365123 false 62 72818
2 284551513249666376365123 false 63 75863
2 284551513249666376365123 true 0 34471
2 284551513249666376365123 true 1 32739
2 284551513249666376365123 true 2 31817
2 284551513249666376365123 true 3 31808
2 284551513249666376365123 true 4 31767
2 284551513249666376365123 true 5 31397
2 284551513249666376365123 true 6 31577
2 284551513249666376365123 true 7 31738
2 284551513249666376365123 true 8 31647
2 284551513249666376365123 true 9 31867
2 284551513249666376365123 true 10 31626
2 284551513249666376365123 true 11 31267
2 284551513249666376365123 true 12 31577
2 284551513249666376365123 true 13 31657
2 284551513249666376365123 true 14 31587
2 284551513249666376365123 true 15 31587
2 284551513249666376365123 true 16 31867
2 284551513249666376365123 true 17 31376
2 284551513249666376365123 true 18 31536
2 284551513249666376365123 true 19 31647
2 284551513249666376365123 true 20 31747
2 284551513249666376365123 true 21 31727
2 284551513249666376365123 true 22 34892
2 284551513249666376365123 true 23 31677
2 284551513249666376365123 true 24 31777
2 284551513249666376365123 true 25 31747
2 284551513249666376365123 true 26 31356
2 284551513249666376365123 true 27 31967
2 284551513249666376365123 true 28 31436
2 284551513249666376365123 true 29 31627
2 284551513249666376365123 true 30 31497
2 284551513249666376365123 true 31 31567
2 284551513249666376365123 true 32 31967
2 284551513249666376365123 true 33 31677
2 284551513249666376365123 true 34 31327
2 284551513249666376365123 true 35 31527
2 284551513249666376365123 true 36 31506
2 284551513249666376365123 true 37 31547
2 284551513249666376365123 true 38 31707
2 284551513249666376365123 true 39 31546
2 284551513249666376365123 true 40 31727
2 284551513249666376365123 true 41 31456
2 284551513249666376365123 true 42 31626
2 284551513249666376365123 true 43 31747
2 284551513249666376365123 true 44 31697
2 284551513249666376365123 true 45 31687
2 284551513249666376365123 true 46 31557
2 284551513249666376365123 true 47 31787
2 284551513249666376365123 true 48 33860
2 284551513249666376365123 true 49 31346
2 284551513249666376365123 true 50 31587
2 284551513249666376365123 true 51 31337
2 284551513249666376365123 true 52 31466
2 284551513249666376365123 true 53 31677
2 284551513249666376365123 true 54 31607
2 284551513249666376365123 true 55 31627
2 284551513249666376365123 true 56 31547
2 284551513249666376365123 true 57 31366
2 284551513249666376365123 true 58 31637
2 284551513249666376365123 true 59 31617
2 284551513249666376365123 true 60 31516
2 284551513249666376365123 true 61 31547
2 284551513249666376365123 true 62 31747
2 284551513249666376365123 true 63 31306
2 23 false 0 68332
2 23 false 1 64796
2 23 false 2 64606
2 23 false 3 64085
2 23 false 4 66488
2 23 false 5 64105
2 23 false 6 64246
2 23 false 7 64025
2 23 false 8 63934
2 23 false 9 63655
2 23 false 10 63614
2 23 false 11 63544
2 23 false 12 63604
2 23 false 13 63914
2 23 false 14 63885
2 23 false 15 63745
2 23 false 16 63704
2 23 false 17 63695
2 23 false 18 63313
2 23 false 19 65518
2 23 false 20 63975
2 23 false 21 63504
2 23 false 22 63925
2 23 false 23 63995
2 23 false 24 63764
2 23 false 25 63344
2 23 false 26 63504
2 23 false 27 63574
2 23 false 28 63354
2 23 false 29 63374
2 23 false 30 63565
2 23 false 31 63344
2 23 false 32 63023
2 23 false 33 63444
2 23 false 34 65958
2 23 false 35 63124
2 23 false 36 63594
2 23 false 37 63024
2 23 false 38 63694
2 23 false 39 63524
2 23 false 40 63935
2 23 false 41 62813
2 23 false 42 63103
2 23 false 43 63474
2 23 false 44 63174
2 23 false 45 63104
2 23 false 46 63073
2 23 false 47 63244
2 23 false 48 63635
2 23 false 49 65847
2 23 false 50 63434
2 23 false 51 63575
2 23 false 52 63655
2 23 false 53 63113
2 23 false 54 63224
2 23 false 55 63564
2 23 false 56 63354
2 23 false 57 63403
2 23 false 58 63684
2 23 false 59 63184
2 23 false 60 63684
2 23 false 61 63674
2 23 false 62 63174
2 23 false 63 63444
2 23 true 0 31597
2 23 true 1 30606
2 23 true 2 30204
2 23 true 3 29523
2 23 true 4 29735
2 23 true 5 29574
2 23 true 6 30195
2 23 true 7 29534
2 23 true 8 29604
2 23 true 9 29493
2 23 true 10 29814
2 23 true 11 29754
2 23 true 12 29764
2 23 true 13 29503
2 23 true 14 29664
2 23 true 15 29885
2 23 true 16 29343
2 23 true 17 30035
2 23 true 18 29463
2 23 true 19 29544
2 23 true 20 29574
2 23 true 21 29905
2 23 true 22 29544
2 23 true 23 29774
2 23 true 24 29504
2 23 true 25 29404
2 23 true 26 29754
2 23 true 27 29574
2 23 true 28 29473
2 23 true 29 29634
2 23 true 30 31978
2 23 true 31 29564
2 23 true 32 29635
2 23 true 33 29755
2 23 true 34 29634
2 23 true 35 29894
2 23 true 36 29504
2 23 true 37 29544
2 23 true 38 29714
2 23 true 39 29834
2 23 true 40 29804
2 23 true 41 29354
2 23 true 42 29764
2 23 true 43 29444
2 23 true 44 29754
2 23 true 45 29784
2 23 true 46 29554
2 23 true 47 29874
2 23 true 48 29594
2 23 true 49 29463
2 23 true 50 29944
2 23 true 51 29593
2 23 true 52 29874
2 23 true 53 29414
2 23 true 54 29544
2 23 true 55 29805
2 23 true 56 29574
2 23 true 57 29524
2 23 true 58 30115
2 23 true 59 29744
2 23 true 60 29283
2 23 true 61 32559
2 23 true 62 29454
2 23 true 63 29824
2 1728651 false 0 76113
2 1728651 false 1 73209
2 1728651 false 2 72598
2 1728651 false 3 72417
2 1728651 false 4 72607
2 1728651 false 5 72216
2 1728651 false 6 72277
2 1728651 false 7 71907
2 1728651 false 8 72187
2 1728651 false 9 72207
2 1728651 false 10 74740
2 1728651 false 11 71856
2 1728651 false 12 72197
2 1728651 false 13 71656
2 1728651 false 14 72698
2 1728651 false 15 71456
2 1728651 false 16 71326
2 1728651 false 17 71857
2 1728651 false 18 71936
2 1728651 false 19 71986
2 1728651 false 20 71225
2 1728651 false 21 71806
2 1728651 false 22 71546
2 1728651 false 23 74341
2 1728651 false 24 71867
2 1728651 false 25 71546
2 1728651 false 26 71797
2 1728651 false 27 71856
2 1728651 false 28 71837
2 1728651 false 29 71656
2 1728651 false 30 72187
2 1728651 false 31 72026
2 1728651 false 32 71776
2 1728651 false 33 72047
2 1728651 false 34 71906
2 1728651 false 35 72026
2 1728651 false 36 72057
2 1728651 false 37 75212
2 1728651 false 38 71827
2 1728651 false 39 71937
2 1728651 false 40 71296
2 1728651 false 41 72057
2 1728651 false 42 72228
2 1728651 false 43 71717
2 1728651 false 44 71786
2 1728651 false 45 72036
2 1728651 false 46 71566
2 1728651 false 47 71636
2 1728651 false 48 71857
2 1728651 false 49 71537
2 1728651 false 50 74370
2 1728651 false 51 72017
2 1728651 false 52 71476
2 1728651 false 53 71696
2 1728651 false 54 72156
2 1728651 false 55 72287
2 1728651 false 56 71827
2 1728651 false 57 71356
2 1728651 false 58 71866
2 1728651 false 59 71456
2 1728651 false 60 72357
2 1728651 false 61 72027
2 1728651 false 62 71937
2 1728651 false 63 71716
2 1728651 true 0 31667
2 1728651 true 1 30595
2 1728651 true 2 30245
2 1728651 true 3 29845
2 1728651 true 4 29824
2 1728651 true 5 29734
2 1728651 true 6 29824
2 1728651 true 7 29663
2 1728651 true 8 29694
2 1728651 true 9 29854
2 1728651 true 10 29784
2 1728651 true 11 29384
2 1728651 true 12 29603
2 1728651 true 13 29674
2 1728651 true 14 29383
2 1728651 true 15 29634
2 1728651 true 16 29874
2 1728651 true 17 29693
2 1728651 true 18 29815
2 1728651 true 19 29574
2 1728651 true 20 29483
2 1728651 true 21 29453
2 1728651 true 22 29614
2 1728651 true 23 29504
2 1728651 true 24 29634
2 1728651 true 25 29334
2 1728651 true 26 29644
2 1728651 true 27 29984
2 1728651 true 28 29334
2 1728651 true 29 29945
2 1728651 true 30 29784
2 1728651 true 31 29804
2 1728651 true 32 29754
2 1728651 true 33 29744
2 1728651 true 34 29794
2 1728651 true 35 29764
2 1728651 true 36 29724
2 1728651 true 37 29444
2 1728651 true 38 30134
2 1728651 true 39 29564
2 1728651 true 40 29734
2 1728651 true 41 29684
2 1728651 true 42 29764
2 1728651 true 43 29554
2 1728651 true 44 29604
2 1728651 true 45 29734
2 1728651 true 46 29854
2 1728651 true 47 29323
2 1728651 true 48 29474
2 1728651 true 49 29513
2 1728651 true 50 29604
2 1728651 true 51 29393
2 1728651 true 52 29684
2 1728651 true 53 29974
2 1728651 true 54 29684
2 1728651 true 55 29915
2 1728651 true 56 29934
2 1728651 true 57 29414
2 1728651 true 58 29373
2 1728651 true 59 32569
2 1728651 true 60 29704
2 1728651 true 61 30084
2 1728651 true 62 29324
2 1728651 true 63 29784
2 5439 false 0 78036
2 5439 false 1 74520
2 5439 false 2 73829
2 5439 false 3 72878
2 5439 false 4 72678
2 5439 false 5 73399
2 5439 false 6 72868
2 5439 false 7 72969
2 5439 false 8 73208
2 5439 false 9 75371
2 5439 false 10 72929
2 5439 false 11 73068
2 5439 false 12 72928
2 5439 false 13 73178
2 5439 false 14 73049
2 5439 false 15 72788
2 5439 false 16 73018
2 5439 false 17 72568
2 5439 false 18 73228
2 5439 false 19 72899
2 5439 false 20 73008
2 5439 false 21 72988
2 5439 false 22 72687
2 5439 false 23 72838
2 5439 false 24 72647
2 5439 false 25 72768
2 5439 false 26 72658
2 5439 false 27 73119
2 5439 false 28 72427
2 5439 false 29 72858
2 5439 false 30 73029
2 5439 false 31 72788
2 5439 false 32 73018
2 5439 false 33 72708
2 5439 false 34 72267
2 5439 false 35 72768
2 5439 false 36 75442
2 5439 false 37 72908
2 5439 false 38 72768
2 5439 false 39 72808
2 5439 false 40 73268
2 5439 false 41 72878
2 5439 false 42 73148
2 5439 false 43 72668
2 5439 false 44 72948
2 5439 false 45 72728
2 5439 false 46 72538
2 5439 false 47 72507
2 5439 false 48 72658
2 5439 false 49 82923
2 5439 false 50 72848
2 5439 false 51 72708
2 5439 false 52 72458
2 5439 false 53 72708
2 5439 false 54 72077
2 5439 false 55 72958
2 5439 false 56 72518
2 5439 false 57 72447
2 5439 false 58 72588
2 5439 false 59 72257
2 5439 false 60 72999
2 5439 false 61 72978
2 5439 false 62 75882
2 5439 false 63 73269
2 5439 true 0 32418
2 5439 true 1 30405
2 5439 true 2 29935
2 5439 true 3 29774
2 5439 true 4 29584
2 5439 true 5 29694
2 5439 true 6 29594
2 5439 true 7 29654
2 5439 true 8 29564
2 5439 true 9 29624
2 5439 true 10 40920
2 5439 true 11 29794
2 5439 true 12 29774
2 5439 true 13 29584
2 5439 true 14 29664
2 5439 true 15 29634
2 5439 true 16 30035
2 5439 true 17 29574
2 5439 true 18 29554
2 5439 true 19 29844
2 5439 true 20 29634
2 5439 true 21 29543
2 5439 true 22 29614
2 5439 true 23 29653
2 5439 true 24 29534
2 5439 true 25 29744
2 5439 true 26 29835
2 5439 true 27 29533
2 5439 true 28 29554
2 5439 true 29 29784
2 5439 true 30 29283
2 5439 true 31 29704
2 5439 true 32 29494
2 5439 true 33 29904
2 5439 true 34 29824
2 5439 true 35 29704
2 5439 true 36 29724
2 5439 true 37 29784
2 5439 true 38 29363
2 5439 true 39 29474
2 5439 true 40 29844
2 5439 true 41 29443
2 5439 true 42 29604
2 5439 true 43 29724
2 5439 true 44 29564
2 5439 true 45 29564
2 5439 true 46 29704
2 5439 true 47 29594
2 5439 true 48 29794
2 5439 true 49 29695
2 5439 true 50 29965
2 5439 true 51 29804
2 5439 true 52 29614
2 5439 true 53 29644
2 5439 true 54 29974
2 5439 true 55 32519
2 5439 true 56 29835
2 5439 true 57 29623
2 5439 true 58 29815
2 5439 true 59 29324
2 5439 true 60 29874
2 5439 true 61 29654
2 5439 true 62 29815
2 5439 true 63 29573
2 523890102151522916311113076301980070234414163719 false 0 68511
2 523890102151522916311113076301980070234414163719 false 1 66638
2 523890102151522916311113076301980070234414163719 false 2 65718
2 523890102151522916311113076301980070234414163719 false 3 65106
2 523890102151522916311113076301980070234414163719 false 4 64806
2 523890102151522916311113076301980070234414163719 false 5 63934
2 523890102151522916311113076301980070234414163719 false 6 65086
2 523890102151522916311113076301980070234414163719 false 7 67710
2 523890102151522916311113076301980070234414163719 false 8 64295
2 523890102151522916311113076301980070234414163719 false 9 64916
2 523890102151522916311113076301980070234414163719 false 10 64426
2 523890102151522916311113076301980070234414163719 false 11 64616
2 523890102151522916311113076301980070234414163719 false 12 64536
2 523890102151522916311113076301980070234414163719 false 13 64606
2 523890102151522916311113076301980070234414163719 false 14 64846
2 523890102151522916311113076301980070234414163719 false 15 64226
2 523890102151522916311113076301980070234414163719 false 16 64356
2 523890102151522916311113076301980070234414163719 false 17 64004
2 523890102151522916311113076301980070234414163719 false 18 64917
2 523890102151522916311113076301980070234414163719 false 19 68331
2 523890102151522916311113076301980070234414163719 false 20 64826
2 523890102151522916311113076301980070234414163719 false 21 64906
2 523890102151522916311113076301980070234414163719 false 22 64706
2 523890102151522916311113076301980070234414163719 false 23 64265
2 523890102151522916311113076301980070234414163719 false 24 64235
2 523890102151522916311113076301980070234414163719 false 25 64826
2 523890102151522916311113076301980070234414163719 false 26 63935
2 523890102151522916311113076301980070234414163719 false 27 64606
2 523890102151522916311113076301980070234414163719 false 28 64536
2 523890102151522916311113076301980070234414163719 false 29 64175
2 523890102151522916311113076301980070234414163719 false 30 64766
2 523890102151522916311113076301980070234414163719 false 31 64286
2 523890102151522916311113076301980070234414163719 false 32 64957
2 523890102151522916311113076301980070234414163719 false 33 64686
2 523890102151522916311113076301980070234414163719 false 34 64406
2 523890102151522916311113076301980070234414163719 false 35 64205
2 523890102151522916311113076301980070234414163719 false 36 64196
2 523890102151522916311113076301980070234414163719 false 37 64606
2 523890102151522916311113076301980070234414163719 false 38 64395
2 523890102151522916311113076301980070234414163719 false 39 64345
2 523890102151522916311113076301980070234414163719 false 40 64085
2 523890102151522916311113076301980070234414163719 false 41 64836
2 523890102151522916311113076301980070234414163719 false 42 64285
2 523890102151522916311113076301980070234414163719 false 43 64265
2 523890102151522916311113076301980070234414163719 false 44 64766
2 523890102151522916311113076301980070234414163719 false 45 64316
2 523890102151522916311113076301980070234414163719 false 46 64536
2 523890102151522916311113076301980070234414163719 false 47 64425
2 523890102151522916311113076301980070234414163719 false 48 64075
2 523890102151522916311113076301980070234414163719 false 49 64386
2 523890102151522916311113076301980070234414163719 false 50 64386
2 523890102151522916311113076301980070234414163719 false 51 64226
2 523890102151522916311113076301980070234414163719 false 52 64295
2 523890102151522916311113076301980070234414163719 false 53 64325
2 523890102151522916311113076301980070234414163719 false 54 64876
2 523890102151522916311113076301980070234414163719 false 55 64045
2 523890102151522916311113076301980070234414163719 false 56 68181
2 523890102151522916311113076301980070234414163719 false 57 63884
2 523890102151522916311113076301980070234414163719 false 58 64435
2 523890102151522916311113076301980070234414163719 false 59 64115
2 523890102151522916311113076301980070234414163719 false 60 64025
2 523890102151522916311113076301980070234414163719 false 61 64105
2 523890102151522916311113076301980070234414163719 false 62 64115
2 523890102151522916311113076301980070234414163719 false 63 64345
2 523890102151522916311113076301980070234414163719 true 0 34562
2 523890102151522916311113076301980070234414163719 true 1 32288
2 523890102151522916311113076301980070234414163719 true 2 32167
2 523890102151522916311113076301980070234414163719 true 3 32038
2 523890102151522916311113076301980070234414163719 true 4 31637
2 523890102151522916311113076301980070234414163719 true 5 31687
2 523890102151522916311113076301980070234414163719 true 6 31917
2 523890102151522916311113076301980070234414163719 true 7 31457
2 523890102151522916311113076301980070234414163719 true 8 31677
2 523890102151522916311113076301980070234414163719 true 9 32048
2 523890102151522916311113076301980070234414163719 true 10 31727
2 523890102151522916311113076301980070234414163719 true 11 31667
2 523890102151522916311113076301980070234414163719 true 12 31537
2 523890102151522916311113076301980070234414163719 true 13 31787
2 523890102151522916311113076301980070234414163719 true 14 31427
2 523890102151522916311113076301980070234414163719 true 15 31557
2 523890102151522916311113076301980070234414163719 true 16 31157
2 523890102151522916311113076301980070234414163719 true 17 31426
2 523890102151522916311113076301980070234414163719 true 18 31457
2 523890102151522916311113076301980070234414163719 true 19 31456
2 523890102151522916311113076301980070234414163719 true 20 31617
2 523890102151522916311113076301980070234414163719 true 21 31577
2 523890102151522916311113076301980070234414163719 true 22 31447
2 523890102151522916311113076301980070234414163719 true 23 31707
2 523890102151522916311113076301980070234414163719 true 24 31376
2 523890102151522916311113076301980070234414163719 true 25 31466
2 523890102151522916311113076301980070234414163719 true 26 33730
2 523890102151522916311113076301980070234414163719 true 27 31267
2 523890102151522916311113076301980070234414163719 true 28 31196
2 523890102151522916311113076301980070234414163719 true 29 31627
2 523890102151522916311113076301980070234414163719 true 30 31817
2 523890102151522916311113076301980070234414163719 true 31 31517
2 523890102151522916311113076301980070234414163719 true 32 31356
2 523890102151522916311113076301980070234414163719 true 33 31657
2 523890102151522916311113076301980070234414163719 true 34 31677
2 523890102151522916311113076301980070234414163719 true 35 31267
2 523890102151522916311113076301980070234414163719 true 36 31496
2 523890102151522916311113076301980070234414163719 true 37 31476
2 523890102151522916311113076301980070234414163719 true 38 31317
2 523890102151522916311113076301980070234414163719 true 39 31497
2 523890102151522916311113076301980070234414163719 true 40 31657
2 523890102151522916311113076301980070234414163719 true 41 31206
2 523890102151522916311113076301980070234414163719 true 42 31417
2 523890102151522916311113076301980070234414163719 true 43 31667
2 523890102151522916311113076301980070234414163719 true 44 31597
2 523890102151522916311113076301980070234414163719 true 45 31738
2 523890102151522916311113076301980070234414163719 true 46 34181
2 523890102151522916311113076301980070234414163719 true 47 31767
2 523890102151522916311113076301980070234414163719 true 48 31277
2 523890102151522916311113076301980070234414163719 true 49 31477
2 523890102151522916311113076301980070234414163719 true 50 31937
2 523890102151522916311113076301980070234414163719 true 51 31867
2 523890102151522916311113076301980070234414163719 true 52 31657
2 523890102151522916311113076301980070234414163719 true 53 31977
2 523890102151522916311113076301980070234414163719 true 54 31457
2 523890102151522916311113076301980070234414163719 true 55 31497
2 523890102151522916311113076301980070234414163719 true 56 31457
2 523890102151522916311113076301980070234414163719 true 57 31437
2 523890102151522916311113076301980070234414163719 true 58 31487
2 523890102151522916311113076301980070234414163719 true 59 31596
2 523890102151522916311113076301980070234414163719 true 60 31316
2 523890102151522916311113076301980070234414163719 true 61 31427
2 523890102151522916311113076301980070234414163719 true 62 31346
2 523890102151522916311113076301980070234414163719 true 63 31597
2 5 false 0 71636
2 5 false 1 65357
2 5 false 2 64486
2 5 false 3 64505
2 5 false 4 64196
2 5 false 5 64365
2 5 false 6 63955
2 5 false 7 64586
2 5 false 8 63534
2 5 false 9 64505
2 5 false 10 63904
2 5 false 11 64075
2 5 false 12 63905
2 5 false 13 63995
2 5 false 14 63955
2 5 false 15 67350
2 5 false 16 63835
2 5 false 17 63955
2 5 false 18 64095
2 5 false 19 63885
2 5 false 20 63995
2 5 false 21 63704
2 5 false 22 63825
2 5 false 23 63895
2 5 false 24 63254
2 5 false 25 63975
2 5 false 26 63834
2 5 false 27 64195
2 5 false 28 64015
2 5 false 29 63765
2 5 false 30 68692
2 5 false 31 63895
2 5 false 32 63704
2 5 false 33 63504
2 5 false 34 63795
2 5 false 35 63384
2 5 false 36 63634
2 5 false 37 64086
2 5 false 38 63444
2 5 false 39 63364
2 5 false 40 61531
2 5 false 41 63765
2 5 false 42 63574
2 5 false 43 64225
2 5 false 44 63404
2 5 false 45 65797
2 5 false 46 64015
2 5 false 47 63414
2 5 false 48 63514
2 5 false 49 63274
2 5 false 50 63405
2 5 false 51 63444
2 5 false 52 62803
2 5 false 53 63364
2 5 false 54 63684
2 5 false 55 63644
2 5 false 56 63625
2 5 false 57 63704
2 5 false 58 63664
2 5 false 59 63294
2 5 false 60 66789
2 5 false 61 63565
2 5 false 62 63995
2 5 false 63 63404
2 5 true 0 32248
2 5 true 1 30725
2 5 true 2 30115
2 5 true 3 29824
2 5 true 4 29924
2 5 true 5 30004
2 5 true 6 29433
2 5 true 7 29734
2 5 true 8 29664
2 5 true 9 29855
2 5 true 10 29713
2 5 true 11 29604
2 5 true 12 29654
2 5 true 13 29694
2 5 true 14 29794
2 5 true 15 29504
2 5 true 16 29574
2 5 true 17 29604
2 5 true 18 29714
2 5 true 19 29514
2 5 true 20 29854
2 5 true 21 32488
2 5 true 22 29624
2 5 true 23 29654
2 5 true 24 29604
2 5 true 25 29674
2 5 true 26 29724
2 5 true 27 29824
2 5 true 28 29273
2 5 true 29 29604
2 5 true 30 29674
2 5 true 31 29403
2 5 true 32 29504
2 5 true 33 29504
2 5 true 34 29213
2 5 true 35 29864
2 5 true 36 29444
2 5 true 37 29724
2 5 true 38 29544
2 5 true 39 29483
2 5 true 40 29955
2 5 true 41 29824
2 5 true 42 29674
2 5 true 43 29443
2 5 true 44 29654
2 5 true 45 29754
2 5 true 46 29704
2 5 true 47 29674
2 5 true 48 29965
2 5 true 49 29734
2 5 true 50 29394
2 5 true 51 29573
2 5 true 52 31637
2 5 true 53 29764
2 5 true 54 29624
2 5 true 55 29694
2 5 true 56 29614
2 5 true 57 29454
2 5 true 58 29634
2 5 true 59 29653
2 5 true 60 29774
2 5 true 61 29785
2 5 true 62 29243
2 5 true 63 29824
2 306251 false 0 67841
2 306251 false 1 65036
2 306251 false 2 64085
2 306251 false 3 63754
2 306251 false 4 63674
2 306251 false 5 63444
2 306251 false 6 63764
2 306251 false 7 66148
2 306251 false 8 63604
2 306251 false 9 63645
2 306251 false 10 63664
2 306251 false 11 63274
2 306251 false 12 63544
2 306251 false 13 63474
2 306251 false 14 63705
2 306251 false 15 63774
2 306251 false 16 63153
2 306251 false 17 63314
2 306251 false 18 63474
2 306251 false 19 63444
2 306251 false 20 63414
2 306251 false 21 63934
2 306251 false 22 63635
2 306251 false 23 64265
2 306251 false 24 63314
2 306251 false 25 63234
2 306251 false 26 63634
2 306251 false 27 63385
2 306251 false 28 63253
2 306251 false 29 63625
2 306251 false 30 63885
2 306251 false 31 63975
2 306251 false 32 63164
2 306251 false 33 63324
2 306251 false 34 63404
2 306251 false 35 63444
2 306251 false 36 63274
2 306251 false 37 63565
2 306251 false 38 66659
2 306251 false 39 63674
2 306251 false 40 63384
2 306251 false 41 63495
2 306251 false 42 63323
2 306251 false 43 63384
2 306251 false 44 63865
2 306251 false 45 63334
2 306251 false 46 63365
2 306251 false 47 63464
2 306251 false 48 63854
2 306251 false 49 63404
2 306251 false 50 63183
2 306251 false 51 63805
2 306251 false 52 63634
2 306251 false 53 66279
2 306251 false 54 63705
2 306251 false 55 63284
2 306251 false 56 63544
2 306251 false 57 63824
2 306251 false 58 63444
2 306251 false 59 63354
2 306251 false 60 63564
2 306251 false 61 63474
2 306251 false 62 63484
2 306251 false 63 63254
2 306251 true 0 32177
2 306251 true 1 30605
2 306251 true 2 29985
2 306251 true 3 29754
2 306251 true 4 29774
2 306251 true 5 29714
2 306251 true 6 35152
2 306251 true 7 29955
2 306251 true 8 29864
2 306251 true 9 29814
2 306251 true 10 29885
2 306251 true 11 29704
2 306251 true 12 29974
2 306251 true 13 29504
2 306251 true 14 29604
2 306251 true 15 29704
2 306251 true 16 29884
2 306251 true 17 29504
2 306251 true 18 29844
2 306251 true 19 29814
2 306251 true 20 29654
2 306251 true 21 29735
2 306251 true 22 29764
2 306251 true 23 29814
2 306251 true 24 29644
2 306251 true 25 29624
2 306251 true 26 29714
2 306251 true 27 29734
2 306251 true 28 29624
2 306251 true 29 29694
2 306251 true 30 29554
2 306251 true 31 29414
2 306251 true 32 29794
2 306251 true 33 29483
2 306251 true 34 29635
2 306251 true 35 29693
2 306251 true 36 29454
2 306251 true 37 32238
2 306251 true 38 29744
2 306251 true 39 29844
2 306251 true 40 29474
2 306251 true 41 29494
2 306251 true 42 29934
2 306251 true 43 29444
2 306251 true 44 29974
2 306251 true 45 29454
2 306251 true 46 29794
2 306251 true 47 29885
2 306251 true 48 29553
2 306251 true 49 29744
2 306251 true 50 29824
2 306251 true 51 29844
2 306251 true 52 29434
2 306251 true 53 29533
2 306251 true 54 29615
2 306251 true 55 30075
2 306251 true 56 29584
2 306251 true 57 29994
2 306251 true 58 29274
2 306251 true 59 29804
2 306251 true 60 29714
2 306251 true 61 29724
2 306251 true 62 29794
2 306251 true 63 29674
3 17329 true 0 31326
3 17329 true 1 29975
3 17329 true 2 31697
3 17329 true 3 29604
3 17329 true 4 29984
3 17329 true 5 29794
3 17329 true 6 30075
3 17329 true 7 29674
3 17329 true 8 29664
3 17329 true 9 29684
3 17329 true 10 29434
3 17329 true 11 29774
3 17329 true 12 30024
3 17329 true 13 29865
3 17329 true 14 29624
3 17329 true 15 29493
3 17329 true 16 29734
3 17329 true 17 29584
3 17329 true 18 29934
3 17329 true 19 29544
3 17329 true 20 29404
3 17329 true 21 29774
3 17329 true 22 29473
3 17329 true 23 30034
3 17329 true 24 29834
3 17329 true 25 29304
3 17329 true 26 29834
3 17329 true 27 29364
3 17329 true 28 29564
3 17329 true 29 29164
3 17329 true 30 29854
3 17329 true 31 29513
3 17329 true 32 29374
3 17329 true 33 32358
3 17329 true 34 29674
3 17329 true 35 29474
3 17329 true 36 29483
3 17329 true 37 29885
3 17329 true 38 29574
3 17329 true 39 29875
3 17329 true 40 29603
3 17329 true 41 29884
3 17329 true 42 29594
3 17329 true 43 29724
3 17329 true 44 29634
3 17329 true 45 29594
3 17329 true 46 29874
3 17329 true 47 29824
3 17329 true 48 29554
3 17329 true 49 29384
3 17329 true 50 29463
3 17329 true 51 29694
3 17329 true 52 29774
3 17329 true 53 29434
3 17329 true 54 29774
3 17329 true 55 29764
3 17329 true 56 29614
3 17329 true 57 29594
3 17329 true 58 29794
3 17329 true 59 29443
3 17329 true 60 29213
3 17329 true 61 29694
3 17329 true 62 29674
3 17329 true 63 31958
3 17329 false 0 68171
3 17329 false 1 65487
3 17329 false 2 64375
3 17329 false 3 64005
3 17329 false 4 63334
3 17329 false 5 63404
3 17329 false 6 63815
3 17329 false 7 63423
3 17329 false 8 63594
3 17329 false 9 63755
3 17329 false 10 63223
3 17329 false 11 63875
3 17329 false 12 63314
3 17329 false 13 66859
3 17329 false 14 63544
3 17329 false 15 63755
3 17329 false 16 63354
3 17329 false 17 63854
3 17329 false 18 63434
3 17329 false 19 63133
3 17329 false 20 63044
3 17329 false 21 63694
3 17329 false 22 63524
3 17329 false 23 63224
3 17329 false 24 64035
3 17329 false 25 63815
3 17329 false 26 63404
3 17329 false 27 63824
3 17329 false 28 65528
3 17329 false 29 63834
3 17329 false 30 63434
3 17329 false 31 64035
3 17329 false 32 63334
3 17329 false 33 63484
3 17329 false 34 63324
3 17329 false 35 63794
3 17329 false 36 63253
3 17329 false 37 63244
3 17329 false 38 63885
3 17329 false 39 64115
3 17329 false 40 63444
3 17329 false 41 63414
3 17329 false 42 63695
3 17329 false 43 65677
3 17329 false 44 63754
3 17329 false 45 63675
3 17329 false 46 63574
3 17329 false 47 63634
3 17329 false 48 63364
3 17329 false 49 63715
3 17329 false 50 63143
3 17329 false 51 63084
3 17329 false 52 63494
3 17329 false 53 63945
3 17329 false 54 63724
3 17329 false 55 63043
3 17329 false 56 63815
3 17329 false 57 63214
3 17329 false 58 66549
3 17329 false 59 63795
3 17329 false 60 63074
3 17329 false 61 63434
3 17329 false 62 63444
3 17329 false 63 63585
3 69 true 0 31868
3 69 true 1 30586
3 69 true 2 30124
3 69 true 3 30175
3 69 true 4 29845
3 69 true 5 30044
3 69 true 6 29744
3 69 true 7 29784
3 69 true 8 29805
3 69 true 9 29714
3 69 true 10 29734
3 69 true 11 29934
3 69 true 12 29804
3 69 true 13 29834
3 69 true 14 29664
3 69 true 15 29774
3 69 true 16 29744
3 69 true 17 32849
3 69 true 18 29513
3 69 true 19 29534
3 69 true 20 29674
3 69 true 21 29764
3 69 true 22 29965
3 69 true 23 29674
3 69 true 24 29454
3 69 true 25 29714
3 69 true 26 29904
3 69 true 27 29494
3 69 true 28 29694
3 69 true 29 29964
3 69 true 30 29644
3 69 true 31 29895
3 69 true 32 29964
3 69 true 33 29804
3 69 true 34 29814
3 69 true 35 29384
3 69 true 36 29985
3 69 true 37 30015
3 69 true 38 29554
3 69 true 39 29864
3 69 true 40 29834
3 69 true 41 29744
3 69 true 42 29324
3 69 true 43 29724
3 69 true 44 29554
3 69 true 45 30225
3 69 true 46 29383
3 69 true 47 29794
3 69 true 48 32438
3 69 true 49 29603
3 69 true 50 29654
3 69 true 51 29905
3 69 true 52 29363
3 69 true 53 29554
3 69 true 54 29944
3 69 true 55 29554
3 69 true 56 29895
3 69 true 57 29664
3 69 true 58 29583
3 69 true 59 29854
3 69 true 60 29633
3 69 true 61 29705
3 69 true 62 29924
3 69 true 63 29744
3 69 false 0 77846
3 69 false 1 73769
3 69 false 2 74119
3 69 false 3 72707
3 69 false 4 72767
3 69 false 5 74931
3 69 false 6 72748
3 69 false 7 72938
3 69 false 8 72828
3 69 false 9 73099
3 69 false 10 72447
3 69 false 11 72428
3 69 false 12 72598
3 69 false 13 72488
3 69 false 14 72707
3 69 false 15 72057
3 69 false 16 72268
3 69 false 17 72096
3 69 false 18 75722
3 69 false 19 72537
3 69 false 20 72577
3 69 false 21 72647
3 69 false 22 72388
3 69 false 23 71896
3 69 false 24 72327
3 69 false 25 72388
3 69 false 26 72557
3 69 false 27 72548
3 69 false 28 72537
3 69 false 29 72056
3 69 false 30 72378
3 69 false 31 75322
3 69 false 32 72368
3 69 false 33 72758
3 69 false 34 72657
3 69 false 35 72198
3 69 false 36 72498
3 69 false 37 72167
3 69 false 38 72437
3 69 false 39 72748
3 69 false 40 72117
3 69 false 41 72147
3 69 false 42 72026
3 69 false 43 72267
3 69 false 44 74831
3 69 false 45 72438
3 69 false 46 72407
3 69 false 47 72488
3 69 false 48 72588
3 69 false 49 72146
3 69 false 50 72137
3 69 false 51 72817
3 69 false 52 72267
3 69 false 53 72377
3 69 false 54 72598
3 69 false 55 72708
3 69 false 56 72257
3 69 false 57 72147
3 69 false 58 75161
3 69 false 59 72227
3 69 false 60 72427
3 69 false 61 72087
3 69 false 62 72237
3 69 false 63 71997
3 301 true 0 32268
3 301 true 1 30686
3 301 true 2 30125
3 301 true 3 30155
3 301 true 4 29764
3 301 true 5 29694
3 301 true 6 29874
3 301 true 7 30145
3 301 true 8 29744
3 301 true 9 29924
3 301 true 10 29824
3 301 true 11 29383
3 301 true 12 29554
3 301 true 13 29784
3 301 true 14 29494
3 301 true 15 32819
3 301 true 16 29594
3 301 true 17 29754
3 301 true 18 29874
3 301 true 19 29584
3 301 true 20 29834
3 301 true 21 29885
3 301 true 22 29553
3 301 true 23 29524
3 301 true 24 29754
3 301 true 25 29804
3 301 true 26 29724
3 301 true 27 29414
3 301 true 28 29764
3 301 true 29 29574
3 301 true 30 29844
3 301 true 31 29824
3 301 true 32 29274
3 301 true 33 29674
3 301 true 34 29664
3 301 true 35 29634
3 301 true 36 29563
3 301 true 37 29614
3 301 true 38 29854
3 301 true 39 29624
3 301 true 40 29815
3 301 true 41 29644
3 301 true 42 29594
3 301 true 43 29684
3 301 true 44 29814
3 301 true 45 29714
3 301 true 46 29835
3 301 true 47 29734
3 301 true 48 29845
3 301 true 49 29564
3 301 true 50 29564
3 301 true 51 29914
3 301 true 52 29644
3 301 true 53 29484
3 301 true 54 29523
3 301 true 55 29463
3 301 true 56 29564
3 301 true 57 29834
3 301 true 58 29885
3 301 true 59 29735
3 301 true 60 29764
3 301 true 61 29774
3 301 true 62 29694
3 301 true 63 29484
3 301 false 0 77485
3 301 false 1 74050
3 301 false 2 73088
3 301 false 3 73069
3 301 false 4 75191
3 301 false 5 73549
3 301 false 6 72848
3 301 false 7 72707
3 301 false 8 72798
3 301 false 9 73188
3 301 false 10 72537
3 301 false 11 72788
3 301 false 12 72517
3 301 false 13 72578
3 301 false 14 73198
3 301 false 15 72678
3 301 false 16 72768
3 301 false 17 76003
3 301 false 18 72647
3 301 false 19 72407
3 301 false 20 72377
3 301 false 21 72668
3 301 false 22 73108
3 301 false 23 71837
3 301 false 24 72568
3 301 false 25 72377
3 301 false 26 73179
3 301 false 27 72498
3 301 false 28 71906
3 301 false 29 72016
3 301 false 30 75763
3 301 false 31 72007
3 301 false 32 72227
3 301 false 33 72277
3 301 false 34 72498
3 301 false 35 72147
3 301 false 36 72107
3 301 false 37 72538
3 301 false 38 72587
3 301 false 39 72958
3 301 false 40 71897
3 301 false 41 71937
3 301 false 42 71977
3 301 false 43 75071
3 301 false 44 72799
3 301 false 45 71856
3 301 false 46 72238
3 301 false 47 72527
3 301 false 48 72407
3 301 false 49 72557
3 301 false 50 72307
3 301 false 51 72527
3 301 false 52 72127
3 301 false 53 72858
3 301 false 54 72267
3 301 false 55 72488
3 301 false 56 72637
3 301 false 57 72878
3 301 false 58 72567
3 301 false 59 72778
3 301 false 60 72348
3 301 false 61 73449
3 301 false 62 72066
3 301 false 63 72698
3 71523 true 0 32037
3 71523 true 1 30425
3 71523 true 2 29654
3 71523 true 3 29544
3 71523 true 4 29664
3 71523 true 5 29424
3 71523 true 6 29574
3 71523 true 7 29213
3 71523 true 8 29384
3 71523 true 9 29504
3 71523 true 10 29633
3 71523 true 11 29704
3 71523 true 12 32308
3 71523 true 13 29544
3 71523 true 14 29624
3 71523 true 15 29724
3 71523 true 16 29834
3 71523 true 17 29604
3 71523 true 18 29454
3 71523 true 19 29494
3 71523 true 20 29624
3 71523 true 21 29524
3 71523 true 22 29543
3 71523 true 23 29544
3 71523 true 24 29594
3 71523 true 25 29724
3 71523 true 26 29734
3 71523 true 27 29834
3 71523 true 28 29654
3 71523 true 29 29504
3 71523 true 30 29664
3 71523 true 31 29715
3 71523 true 32 29453
3 71523 true 33 29774
3 71523 true 34 29604
3 71523 true 35 29613
3 71523 true 36 29674
3 71523 true 37 29754
3 71523 true 38 29474
3 71523 true 39 29373
3 71523 true 40 29964
3 71523 true 41 29324
3 71523 true 42 29604
3 71523 true 43 32399
3 71523 true 44 29323
3 71523 true 45 29654
3 71523 true 46 29995
3 71523 true 47 29373
3 71523 true 48 29454
3 71523 true 49 29594
3 71523 true 50 29805
3 71523 true 51 29925
3 71523 true 52 29504
3 71523 true 53 29544
3 71523 true 54 29353
3 71523 true 55 29905
3 71523 true 56 29574
3 71523 true 57 29724
3 71523 true 58 29293
3 71523 true 59 29434
3 71523 true 60 29664
3 71523 true 61 29534
3 71523 true 62 29243
3 71523 true 63 29844
3 71523 false 0 86028
3 71523 false 1 82572
3 71523 false 2 84606
3 71523 false 3 82072
3 71523 false 4 80409
3 71523 false 5 80980
3 71523 false 6 80940
3 71523 false 7 81511
3 71523 false 8 80289
3 71523 false 9 80159
3 71523 false 10 80099
3 71523 false 11 80880
3 71523 false 12 80339
3 71523 false 13 80610
3 71523 false 14 82762
3 71523 false 15 80870
3 71523 false 16 80640
3 71523 false 17 80719
3 71523 false 18 81280
3 71523 false 19 81441
3 71523 false 20 80810
3 71523 false 21 80770
3 71523 false 22 81490
3 71523 false 23 80309
3 71523 false 24 80840
3 71523 false 25 80119
3 71523 false 26 84085
3 71523 false 27 81010
3 71523 false 28 80669
3 71523 false 29 81340
3 71523 false 30 80980
3 71523 false 31 80710
3 71523 false 32 81211
3 71523 false 33 81050
3 71523 false 34 80760
3 71523 false 35 80950
3 71523 false 36 81440
3 71523 false 37 81181
3 71523 false 38 83083
3 71523 false 39 80449
3 71523 false 40 81210
3 71523 false 41 80490
3 71523 false 42 80650
3 71523 false 43 81261
3 71523 false 44 81070
3 71523 false 45 80940
3 71523 false 46 81321
3 71523 false 47 80950
3 71523 false 48 80669
3 71523 false 49 80770
3 71523 false 50 83274
3 71523 false 51 80399
3 71523 false 52 80830
3 71523 false 53 81471
3 71523 false 54 81040
3 71523 false 55 80489
3 71523 false 56 80249
3 71523 false 57 80890
3 71523 false 58 80740
3 71523 false 59 80210
3 71523 false 60 80018
3 71523 false 61 79558
3 71523 false 62 83284
3 71523 false 63 80670
3 111028891713715270858633 true 0 33570
3 111028891713715270858633 true 1 32028
3 111028891713715270858633 true 2 31818
3 111028891713715270858633 true 3 31497
3 111028891713715270858633 true 4 31147
3 111028891713715270858633 true 5 31466
3 111028891713715270858633 true 6 31226
3 111028891713715270858633 true 7 31507
3 111028891713715270858633 true 8 31657
3 111028891713715270858633 true 9 31086
3 111028891713715270858633 true 10 31216
3 111028891713715270858633 true 11 31336
3 111028891713715270858633 true 12 31246
3 111028891713715270858633 true 13 31237
3 111028891713715270858633 true 14 31587
3 111028891713715270858633 true 15 31587
3 111028891713715270858633 true 16 31517
3 111028891713715270858633 true 17 31367
3 111028891713715270858633 true 18 31477
3 111028891713715270858633 true 19 31396
3 111028891713715270858633 true 20 34571
3 111028891713715270858633 true 21 30966
3 111028891713715270858633 true 22 31687
3 111028891713715270858633 true 23 31456
3 111028891713715270858633 true 24 31446
3 111028891713715270858633 true 25 31427
3 111028891713715270858633 true 26 31376
3 111028891713715270858633 true 27 31817
3 111028891713715270858633 true 28 31457
3 111028891713715270858633 true 29 31858
3 111028891713715270858633 true 30 31447
3 111028891713715270858633 true 31 31406
3 111028891713715270858633 true 32 31446
3 111028891713715270858633 true 33 31547
3 111028891713715270858633 true 34 31276
3 111028891713715270858633 true 35 31537
3 111028891713715270858633 true 36 31407
3 111028891713715270858633 true 37 31436
3 111028891713715270858633 true 38 31396
3 111028891713715270858633 true 39 30986
3 111028891713715270858633 true 40 30946
3 111028891713715270858633 true 41 31316
3 111028891713715270858633 true 42 31316
3 111028891713715270858633 true 43 31346
3 111028891713715270858633 true 44 31817
3 111028891713715270858633 true 45 31296
3 111028891713715270858633 true 46 34220
3 111028891713715270858633 true 47 31317
3 111028891713715270858633 true 48 31467
3 111028891713715270858633 true 49 31867
3 111028891713715270858633 true 50 31256
3 111028891713715270858633 true 51 31357
3 111028891713715270858633 true 52 31497
3 111028891713715270858633 true 53 31516
3 111028891713715270858633 true 54 31417
3 111028891713715270858633 true 55 31457
3 111028891713715270858633 true 56 31597
3 111028891713715270858633 true 57 31096
3 111028891713715270858633 true 58 31416
3 111028891713715270858633 true 59 31066
3 111028891713715270858633 true 60 31387
3 111028891713715270858633 true 61 31166
3 111028891713715270858633 true 62 31167
3 111028891713715270858633 true 63 31647
3 111028891713715270858633 false 0 69223
3 111028891713715270858633 false 1 65267
3 111028891713715270858633 false 2 67410
3 111028891713715270858633 false 3 65217
3 111028891713715270858633 false 4 64416
3 111028891713715270858633 false 5 64456
3 111028891713715270858633 false 6 64105
3 111028891713715270858633 false 7 64286
3 111028891713715270858633 false 8 64476
3 111028891713715270858633 false 9 64205
3 111028891713715270858633 false 10 64425
3 111028891713715270858633 false 11 64606
3 111028891713715270858633 false 12 64375
3 111028891713715270858633 false 13 64035
3 111028891713715270858633 false 14 64245
3 111028891713715270858633 false 15 64416
3 111028891713715270858633 false 16 66869
3 111028891713715270858633 false 17 64316
3 111028891713715270858633 false 18 64075
3 111028891713715270858633 false 19 64165
3 111028891713715270858633 false 20 63805
3 111028891713715270858633 false 21 64386
3 111028891713715270858633 false 22 64026
3 111028891713715270858633 false 23 64075
3 111028891713715270858633 false 24 63845
3 111028891713715270858633 false 25 64165
3 111028891713715270858633 false 26 64105
3 111028891713715270858633 false 27 64346
3 111028891713715270858633 false 28 63925
3 111028891713715270858633 false 29 64075
3 111028891713715270858633 false 30 66779
3 111028891713715270858633 false 31 63855
3 111028891713715270858633 false 32 63995
3 111028891713715270858633 false 33 63785
3 111028891713715270858633 false 34 63905
3 111028891713715270858633 false 35 63915
3 111028891713715270858633 false 36 63965
3 111028891713715270858633 false 37 63825
3 111028891713715270858633 false 38 63935
3 111028891713715270858633 false 39 63735
3 111028891713715270858633 false 40 64305
3 111028891713715270858633 false 41 64115
3 111028891713715270858633 false 42 64164
3 111028891713715270858633 false 43 64195
3 111028891713715270858633 false 44 66018
3 111028891713715270858633 false 45 63804
3 111028891713715270858633 false 46 64045
3 111028891713715270858633 false 47 63824
3 111028891713715270858633 false 48 63735
3 111028891713715270858633 false 49 64246
3 111028891713715270858633 false 50 64095
3 111028891713715270858633 false 51 63594
3 111028891713715270858633 false 52 63644
3 111028891713715270858633 false 53 63855
3 111028891713715270858633 false 54 63965
3 111028891713715270858633 false 55 64276
3 111028891713715270858633 false 56 63815
3 111028891713715270858633 false 57 63705
3 111028891713715270858633 false 58 66769
3 111028891713715270858633 false 59 64196
3 111028891713715270858633 false 60 64045
3 111028891713715270858633 false 61 63785
3 111028891713715270858633 false 62 63885
3 111028891713715270858633 false 63 63775
3 239 true 0 32127
3 239 true 1 31427
3 239 true 2 30636
3 239 true 3 29904
3 239 true 4 30155
3 239 true 5 29524
3 239 true 6 29804
3 239 true 7 29644
3 239 true 8 29433
3 239 true 9 29835
3 239 true 10 30084
3 239 true 11 29794
3 239 true 12 29273
3 239 true 13 29594
3 239 true 14 29654
3 239 true 15 30025
3 239 true 16 29784
3 239 true 17 32578
3 239 true 18 29734
3 239 true 19 29554
3 239 true 20 29684
3 239 true 21 29704
3 239 true 22 29834
3 239 true 23 29613
3 239 true 24 29925
3 239 true 25 29624
3 239 true 26 29884
3 239 true 27 29804
3 239 true 28 29664
3 239 true 29 30065
3 239 true 30 29984
3 239 true 31 29404
3 239 true 32 29944
3 239 true 33 29624
3 239 true 34 29844
3 239 true 35 29824
3 239 true 36 29814
3 239 true 37 29674
3 239 true 38 30024
3 239 true 39 29704
3 239 true 40 29895
3 239 true 41 29624
3 239 true 42 29624
3 239 true 43 29664
3 239 true 44 29543
3 239 true 45 29673
3 239 true 46 29494
3 239 true 47 29474
3 239 true 48 29995
3 239 true 49 29834
3 239 true 50 29954
3 239 true 51 29804
3 239 true 52 29674
3 239 true 53 29653
3 239 true 54 29423
3 239 true 55 29815
3 239 true 56 29684
3 239 true 57 29704
3 239 true 58 29554
3 239 true 59 29734
3 239 true 60 29644
3 239 true 61 29814
3 239 true 62 30064
3 239 true 63 29694
3 239 false 0 85867
3 239 false 1 82983
3 239 false 2 81751
3 239 false 3 81611
3 239 false 4 100058
3 239 false 5 81991
3 239 false 6 81151
3 239 false 7 81411
3 239 false 8 81551
3 239 false 9 81632
3 239 false 10 81361
3 239 false 11 81761
3 239 false 12 81271
3 239 false 13 81500
3 239 false 14 80971
3 239 false 15 83674
3 239 false 16 81120
3 239 false 17 81531
3 239 false 18 81290
3 239 false 19 80960
3 239 false 20 80960
3 239 false 21 81090
3 239 false 22 81251
3 239 false 23 81952
3 239 false 24 81371
3 239 false 25 80960
3 239 false 26 80800
3 239 false 27 83333
3 239 false 28 81561
3 239 false 29 81150
3 239 false 30 81561
3 239 false 31 81230
3 239 false 32 81020
3 239 false 33 80880
3 239 false 34 81231
3 239 false 35 81030
3 239 false 36 81020
3 239 false 37 80740
3 239 false 38 81200
3 239 false 39 84465
3 239 false 40 81802
3 239 false 41 80950
3 239 false 42 81260
3 239 false 43 80910
3 239 false 44 81081
3 239 false 45 80720
3 239 false 46 81120
3 239 false 47 81301
3 239 false 48 80950
3 239 false 49 80980
3 239 false 50 81191
3 239 false 51 84064
3 239 false 52 80910
3 239 false 53 81221
3 239 false 54 80689
3 239 false 55 81190
3 239 false 56 80860
3 239 false 57 81220
3 239 false 58 81210
3 239 false 59 80819
3 239 false 60 80830
3 239 false 61 81121
3 239 false 62 81170
3 239 false 63 84656
3 631 true 0 31587
3 631 true 1 30525
3 631 true 2 30035
3 631 true 3 29864
3 631 true 4 29744
3 631 true 5 29554
3 631 true 6 29414
3 631 true 7 29674
3 631 true 8 29624
3 631 true 9 29904
3 631 true 10 29624
3 631 true 11 29444
3 631 true 12 29694
3 631 true 13 30084
3 631 true 14 29344
3 631 true 15 29684
3 631 true 16 29784
3 631 true 17 29524
3 631 true 18 29714
3 631 true 19 29904
3 631 true 20 29654
3 631 true 21 29714
3 631 true 22 29464
3 631 true 23 29985
3 631 true 24 29864
3 631 true 25 29484
3 631 true 26 29744
3 631 true 27 32498
3 631 true 28 29734
3 631 true 29 29334
3 631 true 30 29804
3 631 true 31 29794
3 631 true 32 30034
3 631 true 33 29534
3 631 true 34 29674
3 631 true 35 29814
3 631 true 36 29453
3 631 true 37 29704
3 631 true 38 29734
3 631 true 39 29574
3 631 true 40 29364
3 631 true 41 29844
3 631 true 42 29524
3 631 true 43 29874
3 631 true 44 29554
3 631 true 45 29744
3 631 true 46 29493
3 631 true 47 29964
3 631 true 48 29764
3 631 true 49 29934
3 631 true 50 29564
3 631 true 51 29454
3 631 true 52 29975
3 631 true 53 29614
3 631 true 54 29434
3 631 true 55 29764
3 631 true 56 30205
3 631 true 57 29834
3 631 true 58 33139
3 631 true 59 29824
3 631 true 60 29644
3 631 true 61 29644
3 631 true 62 29764
3 631 true 63 29874
3 631 false 0 75612
3 631 false 1 73840
3 631 false 2 72808
3 631 false 3 72908
3 631 false 4 72177
3 631 false 5 72357
3 631 false 6 71717
3 631 false 7 72127
3 631 false 8 71566
3 631 false 9 75061
3 631 false 10 71866
3 631 false 11 72197
3 631 false 12 72398
3 631 false 13 72127
3 631 false 14 72177
3 631 false 15 71967
3 631 false 16 71867
3 631 false 17 71726
3 631 false 18 71997
3 631 false 19 72017
3 631 false 20 71756
3 631 false 21 72287
3 631 false 22 74560
3 631 false 23 72387
3 631 false 24 71657
3 631 false 25 72067
3 631 false 26 71546
3 631 false 27 72158
3 631 false 28 71846
3 631 false 29 71967
3 631 false 30 71877
3 631 false 31 71626
3 631 false 32 71666
3 631 false 33 72087
3 631 false 34 71967
3 631 false 35 72097
3 631 false 36 71927
3 631 false 37 72197
3 631 false 38 71626
3 631 false 39 71817
3 631 false 40 71506
3 631 false 41 71366
3 631 false 42 71616
3 631 false 43 72027
3 631 false 44 71727
3 631 false 45 71947
3 631 false 46 72147
3 631 false 47 72037
3 631 false 48 71896
3 631 false 49 74350
3 631 false 50 72027
3 631 false 51 71616
3 631 false 52 72037
3 631 false 53 71737
3 631 false 54 71826
3 631 false 55 71967
3 631 false 56 71365
3 631 false 57 71806
3 631 false 58 72067
3 631 false 59 71987
3 631 false 60 72107
3 631 false 61 71576
3 631 false 62 74961
3 631 false 63 72017
3 223 true 0 31537
3 223 true 1 30605
3 223 true 2 30135
3 223 true 3 29804
3 223 true 4 29815
3 223 true 5 29884
3 223 true 6 29884
3 223 true 7 29674
3 223 true 8 29604
3 223 true 9 29834
3 223 true 10 29594
3 223 true 11 29484
3 223 true 12 30104
3 223 true 13 29464
3 223 true 14 30054
3 223 true 15 29744
3 223 true 16 29584
3 223 true 17 29734
3 223 true 18 29544
3 223 true 19 29583
3 223 true 20 29784
3 223 true 21 29443
3 223 true 22 29634
3 223 true 23 29644
3 223 true 24 29544
3 223 true 25 29554
3 223 true 26 29664
3 223 true 27 29614
3 223 true 28 29604
3 223 true 29 29734
3 223 true 30 29464
3 223 true 31 29734
3 223 true 32 29253
3 223 true 33 29844
3 223 true 34 29424
3 223 true 35 30024
3 223 true 36 29484
3 223 true 37 29634
3 223 true 38 29634
3 223 true 39 29644
3 223 true 40 29864
3 223 true 41 29654
3 223 true 42 29904
3 223 true 43 29514
3 223 true 44 29694
3 223 true 45 29624
3 223 true 46 29444
3 223 true 47 29233
3 223 true 48 29824
3 223 true 49 29604
3 223 true 50 29534
3 223 true 51 29855
3 223 true 52 29784
3 223 true 53 29444
3 223 true 54 29824
3 223 true 55 29914
3 223 true 56 32598
3 223 true 57 29824
3 223 true 58 29694
3 223 true 59 29664
3 223 true 60 29644
3 223 true 61 29553
3 223 true 62 29764
3 223 true 63 29574
3 223 false 0 77435
3 223 false 1 73589
3 223 false 2 73018
3 223 false 3 72398
3 223 false 4 72027
3 223 false 5 72899
3 223 false 6 72287
3 223 false 7 72247
3 223 false 8 75231
3 223 false 9 72408
3 223 false 10 72617
3 223 false 11 71967
3 223 false 12 72437
3 223 false 13 72408
3 223 false 14 72377
3 223 false 15 72748
3 223 false 16 72217
3 223 false 17 71887
3 223 false 18 72427
3 223 false 19 72468
3 223 false 20 72607
3 223 false 21 74871
3 223 false 22 72327
3 223 false 23 72387
3 223 false 24 72077
3 223 false 25 72437
3 223 false 26 72107
3 223 false 27 72087
3 223 false 28 72177
3 223 false 29 72027
3 223 false 30 72608
3 223 false 31 72507
3 223 false 32 72999
3 223 false 33 72377
3 223 false 34 71987
3 223 false 35 74791
3 223 false 36 72788
3 223 false 37 72237
3 223 false 38 71957
3 223 false 39 71927
3 223 false 40 72097
3 223 false 41 72487
3 223 false 42 71657
3 223 false 43 72448
3 223 false 44 71886
3 223 false 45 71956
3 223 false 46 72167
3 223 false 47 71627
3 223 false 48 74681
3 223 false 49 71887
3 223 false 50 72317
3 223 false 51 72748
3 223 false 52 72588
3 223 false 53 72647
3 223 false 54 71727
3 223 false 55 71947
3 223 false 56 72207
3 223 false 57 71987
3 223 false 58 72197
3 223 false 59 71916
3 223 false 60 71697
3 223 false 61 74841
3 223 false 62 72017
3 223 false 63 72317
3 1184777 true 0 31918
3 1184777 true 1 30475
3 1184777 true 2 30074
3 1184777 true 3 30055
3 1184777 true 4 30054
3 1184777 true 5 30115
3 1184777 true 6 29554
3 1184777 true 7 29554
3 1184777 true 8 29484
3 1184777 true 9 29554
3 1184777 true 10 29925
3 1184777 true 11 29493
3 1184777 true 12 29414
3 1184777 true 13 29664
3 1184777 true 14 29433
3 1184777 true 15 29704
3 1184777 true 16 29914
3 1184777 true 17 29504
3 1184777 true 18 29614
3 1184777 true 19 29814
3 1184777 true 20 29604
3 1184777 true 21 29484
3 1184777 true 22 29513
3 1184777 true 23 32669
3 1184777 true 24 29794
3 1184777 true 25 29624
3 1184777 true 26 29904
3 1184777 true 27 29744
3 1184777 true 28 29614
3 1184777 true 29 29493
3 1184777 true 30 29424
3 1184777 true 31 29534
3 1184777 true 32 29764
3 1184777 true 33 29594
3 1184777 true 34 29324
3 1184777 true 35 29874
3 1184777 true 36 29744
3 1184777 true 37 29814
3 1184777 true 38 29764
3 1184777 true 39 29714
3 1184777 true 40 30015
3 1184777 true 41 29584
3 1184777 true 42 29884
3 1184777 true 43 29574
3 1184777 true 44 29263
3 1184777 true 45 29704
3 1184777 true 46 29644
3 1184777 true 47 29905
3 1184777 true 48 29514
3 1184777 true 49 29524
3 1184777 true 50 29894
3 1184777 true 51 29604
3 1184777 true 52 29394
3 1184777 true 53 29514
3 1184777 true 54 32228
3 1184777 true 55 29674
3 1184777 true 56 29785
3 1184777 true 57 29434
3 1184777 true 58 29374
3 1184777 true 59 29574
3 1184777 true 60 29765
3 1184777 true 61 29805
3 1184777 true 62 29604
3 1184777 true 63 29453
3 1184777 false 0 77034
3 1184777 false 1 74090
3 1184777 false 2 72498
3 1184777 false 3 71836
3 1184777 false 4 71846
3 1184777 false 5 72196
3 1184777 false 6 71846
3 1184777 false 7 75352
3 1184777 false 8 71986
3 1184777 false 9 71637
3 1184777 false 10 72898
3 1184777 false 11 71626
3 1184777 false 12 71636
3 1184777 false 13 71325
3 1184777 false 14 72107
3 1184777 false 15 71746
3 1184777 false 16 71596
3 1184777 false 17 71526
3 1184777 false 18 71606
3 1184777 false 19 71736
3 1184777 false 20 71586
3 1184777 false 21 74029
3 1184777 false 22 71637
3 1184777 false 23 71896
3 1184777 false 24 71186
3 1184777 false 25 71896
3 1184777 false 26 71546
3 1184777 false 27 71716
3 1184777 false 28 71716
3 1184777 false 29 71375
3 1184777 false 30 71757
3 1184777 false 31 71526
3 1184777 false 32 71916
3 1184777 false 33 71206
3 1184777 false 34 74360
3 1184777 false 35 71516
3 1184777 false 36 71636
3 1184777 false 37 71996
3 1184777 false 38 71646
3 1184777 false 39 71716
3 1184777 false 40 71716
3 1184777 false 41 72367
3 1184777 false 42 71616
3 1184777 false 43 72026
3 1184777 false 44 71577
3 1184777 false 45 71355
3 1184777 false 46 71526
3 1184777 false 47 74770
3 1184777 false 48 71176
3 1184777 false 49 71947
3 1184777 false 50 72167
3 1184777 false 51 71876
3 1184777 false 52 71987
3 1184777 false 53 71857
3 1184777 false 54 71556
3 1184777 false 55 72527
3 1184777 false 56 72096
3 1184777 false 57 71977
3 1184777 false 58 72107
3 1184777 false 59 72117
3 1184777 false 60 72327
3 1184777 false 61 74901
3 1184777 false 62 71777
3 1184777 false 63 72006
3 284551513249666376365123 true 0 34190
3 284551513249666376365123 true 1 32969
3 284551513249666376365123 true 2 31927
3 284551513249666376365123 true 3 31707
3 284551513249666376365123 true 4 31787
3 284551513249666376365123 true 5 31807
3 284551513249666376365123 true 6 31877
3 284551513249666376365123 true 7 31638
3 284551513249666376365123 true 8 31807
3 284551513249666376365123 true 9 31697
3 284551513249666376365123 true 10 31607
3 284551513249666376365123 true 11 31617
3 284551513249666376365123 true 12 31727
3 284551513249666376365123 true 13 31507
3 284551513249666376365123 true 14 31907
3 284551513249666376365123 true 15 31817
3 284551513249666376365123 true 16 31717
3 284551513249666376365123 true 17 31797
3 284551513249666376365123 true 18 34581
3 284551513249666376365123 true 19 31546
3 284551513249666376365123 true 20 31757
3 284551513249666376365123 true 21 31466
3 284551513249666376365123 true 22 31757
3 284551513249666376365123 true 23 31858
3 284551513249666376365123 true 24 31727
3 284551513249666376365123 true 25 31857
3 284551513249666376365123 true 26 31878
3 284551513249666376365123 true 27 31677
3 284551513249666376365123 true 28 31667
3 284551513249666376365123 true 29 31927
3 284551513249666376365123 true 30 31376
3 284551513249666376365123 true 31 32047
3 284551513249666376365123 true 32 31437
3 284551513249666376365123 true 33 31677
3 284551513249666376365123 true 34 31797
3 284551513249666376365123 true 35 31316
3 284551513249666376365123 true 36 31647
3 284551513249666376365123 true 37 31567
3 284551513249666376365123 true 38 31367
3 284551513249666376365123 true 39 31677
3 284551513249666376365123 true 40 31957
3 284551513249666376365123 true 41 31677
3 284551513249666376365123 true 42 31737
3 284551513249666376365123 true 43 31607
3 284551513249666376365123 true 44 33730
3 284551513249666376365123 true 45 31106
3 284551513249666376365123 true 46 31807
3 284551513249666376365123 true 47 31557
3 284551513249666376365123 true 48 31707
3 284551513249666376365123 true 49 31807
3 284551513249666376365123 true 50 31317
3 284551513249666376365123 true 51 31477
3 284551513249666376365123 true 52 31808
3 284551513249666376365123 true 53 31527
3 284551513249666376365123 true 54 31727
3 284551513249666376365123 true 55 31436
3 284551513249666376365123 true 56 31637
3 284551513249666376365123 true 57 31797
3 284551513249666376365123 true 58 31667
3 284551513249666376365123 true 59 31997
3 284551513249666376365123 true 60 31597
3 284551513249666376365123 true 61 31647
3 284551513249666376365123 true 62 31657
3 284551513249666376365123 true 63 31477
3 284551513249666376365123 false 0 77354
3 284551513249666376365123 false 1 77104
3 284551513249666376365123 false 2 74000
3 284551513249666376365123 false 3 72979
3 284551513249666376365123 false 4 72918
3 284551513249666376365123 false 5 72367
3 284551513249666376365123 false 6 73139
3 284551513249666376365123 false 7 72948
3 284551513249666376365123 false 8 72898
3 284551513249666376365123 false 9 72538
3 284551513249666376365123 false 10 72948
3 284551513249666376365123 false 11 72537
3 284551513249666376365123 false 12 72858
3 284551513249666376365123 false 13 73088
3 284551513249666376365123 false 14 76543
3 284551513249666376365123 false 15 72758
3 284551513249666376365123 false 16 73399
3 284551513249666376365123 false 17 73028
3 284551513249666376365123 false 18 72838
3 284551513249666376365123 false 19 73268
3 284551513249666376365123 false 20 72798
3 284551513249666376365123 false 21 72828
3 284551513249666376365123 false 22 72758
3 284551513249666376365123 false 23 72859
3 284551513249666376365123 false 24 72828
3 284551513249666376365123 false 25 72828
3 284551513249666376365123 false 26 75602
3 284551513249666376365123 false 27 73199
3 284551513249666376365123 false 28 73199
3 284551513249666376365123 false 29 73139
3 284551513249666376365123 false 30 73059
3 284551513249666376365123 false 31 72938
3 284551513249666376365123 false 32 72868
3 284551513249666376365123 false 33 72707
3 284551513249666376365123 false 34 72928
3 284551513249666376365123 false 35 72647
3 284551513249666376365123 false 36 73259
3 284551513249666376365123 false 37 72568
3 284551513249666376365123 false 38 75663
3 284551513249666376365123 false 39 73158
3 284551513249666376365123 false 40 72988
3 284551513249666376365123 false 41 73148
3 284551513249666376365123 false 42 72788
3 284551513249666376365123 false 43 72448
3 284551513249666376365123 false 44 73219
3 284551513249666376365123 false 45 72547
3 284551513249666376365123 false 46 72107
3 284551513249666376365123 false 47 72918
3 284551513249666376365123 false 48 72838
3 284551513249666376365123 false 49 72878
3 284551513249666376365123 false 50 72718
3 284551513249666376365123 false 51 75803
3 284551513249666376365123 false 52 73169
3 284551513249666376365123 false 53 72788
3 284551513249666376365123 false 54 72698
3 284551513249666376365123 false 55 72528
3 284551513249666376365123 false 56 72548
3 284551513249666376365123 false 57 72938
3 284551513249666376365123 false 58 72968
3 284551513249666376365123 false 59 72607
3 284551513249666376365123 false 60 73028
3 284551513249666376365123 false 61 72667
3 284551513249666376365123 false 62 72718
3 284551513249666376365123 false 63 75823
3 23 true 0 32258
3 23 true 1 30956
3 23 true 2 29995
3 23 true 3 29644
3 23 true 4 30025
3 23 true 5 29755
3 23 true 6 29714
3 23 true 7 29694
3 23 true 8 29744
3 23 true 9 29844
3 23 true 10 29874
3 23 true 11 29865
3 23 true 12 29764
3 23 true 13 29854
3 23 true 14 30055
3 23 true 15 29824
3 23 true 16 29984
3 23 true 17 29895
3 23 true 18 29453
3 23 true 19 29584
3 23 true 20 29534
3 23 true 21 29734
3 23 true 22 30004
3 23 true 23 29624
3 23 true 24 29634
3 23 true 25 29924
3 23 true 26 29534
3 23 true 27 29944
3 23 true 28 33079
3 23 true 29 29885
3 23 true 30 29805
3 23 true 31 29795
3 23 true 32 29644
3 23 true 33 29944
3 23 true 34 29444
3 23 true 35 29454
3 23 true 36 29734
3 23 true 37 29714
3 23 true 38 29584
3 23 true 39 29644
3 23 true 40 29944
3 23 true 41 29674
3 23 true 42 29554
3 23 true 43 29503
3 23 true 44 29985
3 23 true 45 29904
3 23 true 46 29784
3 23 true 47 29364
3 23 true 48 29604
3 23 true 49 29604
3 23 true 50 29554
3 23 true 51 29584
3 23 true 52 29463
3 23 true 53 29955
3 23 true 54 29333
3 23 true 55 29564
3 23 true 56 29563
3 23 true 57 29524
3 23 true 58 29424
3 23 true 59 32007
3 23 true 60 29774
3 23 true 61 29965
3 23 true 62 29523
3 23 true 63 29594
3 23 false 0 68822
3 23 false 1 65227
3 23 false 2 64606
3 23 false 3 63725
3 23 false 4 64375
3 23 false 5 63565
3 23 false 6 63564
3 23 false 7 63705
3 23 false 8 63575
3 23 false 9 62993
3 23 false 10 63475
3 23 false 11 66628
3 23 false 12 64176
3 23 false 13 63093
3 23 false 14 63795
3 23 false 15 63264
3 23 false 16 63664
3 23 false 17 63915
3 23 false 18 63263
3 23 false 19 64025
3 23 false 20 63715
3 23 false 21 63384
3 23 false 22 63654
3 23 false 23 63594
3 23 false 24 63614
3 23 false 25 63574
3 23 false 26 66309
3 23 false 27 63835
3 23 false 28 63354
3 23 false 29 63294
3 23 false 30 63625
3 23 false 31 63163
3 23 false 32 63535
3 23 false 33 63363
3 23 false 34 72658
3 23 false 35 63825
3 23 false 36 63134
3 23 false 37 63474
3 23 false 38 63664
3 23 false 39 63915
3 23 false 40 63524
3 23 false 41 63885
3 23 false 42 63514
3 23 false 43 64326
3 23 false 44 63504
3 23 false 45 63283
3 23 false 46 63584
3 23 false 47 63504
3 23 false 48 63004
3 23 false 49 63534
3 23 false 50 63174
3 23 false 51 63624
3 23 false 52 63463
3 23 false 53 63745
3 23 false 54 63444
3 23 false 55 63535
3 23 false 56 63163
3 23 false 57 63895
3 23 false 58 63704
3 23 false 59 63544
3 23 false 60 63013
3 23 false 61 63705
3 23 false 62 63274
3 23 false 63 63304
3 1728651 true 0 32198
3 1728651 true 1 31066
3 1728651 true 2 29814
3 1728651 true 3 29964
3 1728651 true 4 29904
3 1728651 true 5 30075
3 1728651 true 6 29854
3 1728651 true 7 29924
3 1728651 true 8 29824
3 1728651 true 9 29524
3 1728651 true 10 29514
3 1728651 true 11 29644
3 1728651 true 12 32038
3 1728651 true 13 29844
3 1728651 true 14 29834
3 1728651 true 15 29674
3 1728651 true 16 29744
3 1728651 true 17 29824
3 1728651 true 18 29724
3 1728651 true 19 29573
3 1728651 true 20 29804
3 1728651 true 21 29774
3 1728651 true 22 29434
3 1728651 true 23 29905
3 1728651 true 24 29464
3 1728651 true 25 29674
3 1728651 true 26 29754
3 1728651 true 27 29804
3 1728651 true 28 29564
3 1728651 true 29 29804
3 1728651 true 30 29464
3 1728651 true 31 29483
3 1728651 true 32 29855
3 1728651 true 33 29744
3 1728651 true 34 29514
3 1728651 true 35 29745
3 1728651 true 36 29895
3 1728651 true 37 29564
3 1728651 true 38 29633
3 1728651 true 39 29533
3 1728651 true 40 29764
3 1728651 true 41 29934
3 1728651 true 42 29764
3 1728651 true 43 32078
3 1728651 true 44 29844
3 1728651 true 45 29524
3 1728651 true 46 29895
3 1728651 true 47 29464
3 1728651 true 48 29653
3 1728651 true 49 29914
3 1728651 true 50 29784
3 1728651 true 51 29554
3 1728651 true 52 29544
3 1728651 true 53 29864
3 1728651 true 54 29824
3 1728651 true 55 29774
3 1728651 true 56 29895
3 1728651 true 57 29474
3 1728651 true 58 29994
3 1728651 true 59 29744
3 1728651 true 60 29984
3 1728651 true 61 29764
3 1728651 true 62 29684
3 1728651 true 63 29875
3 1728651 false 0 76233
3 1728651 false 1 74070
3 1728651 false 2 75401
3 1728651 false 3 72187
3 1728651 false 4 72187
3 1728651 false 5 71976
3 1728651 false 6 72688
3 1728651 false 7 71927
3 1728651 false 8 72247
3 1728651 false 9 72297
3 1728651 false 10 72107
3 1728651 false 11 72477
3 1728651 false 12 71987
3 1728651 false 13 71736
3 1728651 false 14 71687
3 1728651 false 15 72208
3 1728651 false 16 74951
3 1728651 false 17 71746
3 1728651 false 18 72227
3 1728651 false 19 72347
3 1728651 false 20 71987
3 1728651 false 21 72097
3 1728651 false 22 71847
3 1728651 false 23 71917
3 1728651 false 24 71847
3 1728651 false 25 72117
3 1728651 false 26 71746
3 1728651 false 27 71847
3 1728651 false 28 72267
3 1728651 false 29 75021
3 1728651 false 30 72157
3 1728651 false 31 72047
3 1728651 false 32 72107
3 1728651 false 33 71896
3 1728651 false 34 71757
3 1728651 false 35 71766
3 1728651 false 36 72087
3 1728651 false 37 71627
3 1728651 false 38 72278
3 1728651 false 39 71666
3 1728651 false 40 72007
3 1728651 false 41 72107
3 1728651 false 42 74170
3 1728651 false 43 71947
3 1728651 false 44 72467
3 1728651 false 45 71667
3 1728651 false 46 72197
3 1728651 false 47 71656
3 1728651 false 48 72507
3 1728651 false 49 71937
3 1728651 false 50 71566
3 1728651 false 51 71676
3 1728651 false 52 71495
3 1728651 false 53 71616
3 1728651 false 54 71987
3 1728651 false 55 71967
3 1728651 false 56 74791
3 1728651 false 57 72097
3 1728651 false 58 71756
3 1728651 false 59 71717
3 1728651 false 60 72176
3 1728651 false 61 72327
3 1728651 false 62 72187
3 1728651 false 63 71556
3 5439 true 0 32178
3 5439 true 1 30826
3 5439 true 2 29944
3 5439 true 3 29814
3 5439 true 4 29855
3 5439 true 5 29724
3 5439 true 6 29914
3 5439 true 7 29584
3 5439 true 8 29664
3 5439 true 9 29554
3 5439 true 10 29714
3 5439 true 11 29855
3 5439 true 12 30175
3 5439 true 13 29604
3 5439 true 14 29493
3 5439 true 15 30025
3 5439 true 16 29914
3 5439 true 17 29544
3 5439 true 18 29514
3 5439 true 19 29804
3 5439 true 20 29534
3 5439 true 21 29433
3 5439 true 22 29614
3 5439 true 23 29885
3 5439 true 24 29574
3 5439 true 25 29484
3 5439 true 26 29524
3 5439 true 27 29624
3 5439 true 28 29694
3 5439 true 29 29854
3 5439 true 30 29724
3 5439 true 31 29925
3 5439 true 32 29615
3 5439 true 33 30135
3 5439 true 34 29804
3 5439 true 35 29714
3 5439 true 36 29464
3 5439 true 37 29684
3 5439 true 38 30045
3 5439 true 39 29774
3 5439 true 40 29844
3 5439 true 41 32598
3 5439 true 42 29704
3 5439 true 43 29785
3 5439 true 44 29693
3 5439 true 45 29714
3 5439 true 46 29884
3 5439 true 47 29444
3 5439 true 48 29864
3 5439 true 49 29844
3 5439 true 50 30015
3 5439 true 51 29604
3 5439 true 52 29824
3 5439 true 53 30044
3 5439 true 54 29414
3 5439 true 55 29784
3 5439 true 56 30154
3 5439 true 57 29594
3 5439 true 58 29614
3 5439 true 59 29534
3 5439 true 60 29774
3 5439 true 61 29784
3 5439 true 62 29584
3 5439 true 63 29764
3 5439 false 0 77946
3 5439 false 1 74571
3 5439 false 2 75963
3 5439 false 3 73269
3 5439 false 4 72918
3 5439 false 5 72758
3 5439 false 6 73038
3 5439 false 7 72878
3 5439 false 8 73018
3 5439 false 9 72237
3 5439 false 10 72658
3 5439 false 11 72577
3 5439 false 12 72637
3 5439 false 13 72458
3 5439 false 14 73048
3 5439 false 15 78216
3 5439 false 16 72828
3 5439 false 17 72948
3 5439 false 18 72658
3 5439 false 19 73178
3 5439 false 20 72348
3 5439 false 21 72337
3 5439 false 22 73499
3 5439 false 23 73098
3 5439 false 24 72648
3 5439 false 25 72788
3 5439 false 26 73279
3 5439 false 27 73128
3 5439 false 28 75142
3 5439 false 29 73669
3 5439 false 30 73048
3 5439 false 31 73129
3 5439 false 32 72978
3 5439 false 33 72738
3 5439 false 34 72978
3 5439 false 35 72738
3 5439 false 36 72708
3 5439 false 37 72397
3 5439 false 38 72588
3 5439 false 39 73268
3 5439 false 40 73169
3 5439 false 41 75572
3 5439 false 42 72968
3 5439 false 43 72808
3 5439 false 44 72678
3 5439 false 45 72888
3 5439 false 46 73299
3 5439 false 47 73098
3 5439 false 48 72187
3 5439 false 49 72617
3 5439 false 50 72949
3 5439 false 51 72657
3 5439 false 52 72768
3 5439 false 53 72898
3 5439 false 54 75451
3 5439 false 55 72458
3 5439 false 56 72878
3 5439 false 57 73058
3 5439 false 58 72538
3 5439 false 59 72818
3 5439 false 60 72898
3 5439 false 61 72557
3 5439 false 62 72588
3 5439 false 63 72688
3 523890102151522916311113076301980070234414163719 true 0 33930
3 523890102151522916311113076301980070234414163719 true 1 32478
3 523890102151522916311113076301980070234414163719 true 2 32298
3 523890102151522916311113076301980070234414163719 true 3 31296
3 523890102151522916311113076301980070234414163719 true 4 31747
3 523890102151522916311113076301980070234414163719 true 5 31937
3 523890102151522916311113076301980070234414163719 true 6 32188
3 523890102151522916311113076301980070234414163719 true 7 31727
3 523890102151522916311113076301980070234414163719 true 8 31637
3 523890102151522916311113076301980070234414163719 true 9 31847
3 523890102151522916311113076301980070234414163719 true 10 31386
3 523890102151522916311113076301980070234414163719 true 11 31507
3 523890102151522916311113076301980070234414163719 true 12 31897
3 523890102151522916311113076301980070234414163719 true 13 31737
3 523890102151522916311113076301980070234414163719 true 14 31587
3 523890102151522916311113076301980070234414163719 true 15 31387
3 523890102151522916311113076301980070234414163719 true 16 31797
3 523890102151522916311113076301980070234414163719 true 17 31477
3 523890102151522916311113076301980070234414163719 true 18 31607
3 523890102151522916311113076301980070234414163719 true 19 31336
3 523890102151522916311113076301980070234414163719 true 20 31747
3 523890102151522916311113076301980070234414163719 true 21 31627
3 523890102151522916311113076301980070234414163719 true 22 31496
3 523890102151522916311113076301980070234414163719 true 23 31988
3 523890102151522916311113076301980070234414163719 true 24 31587
3 523890102151522916311113076301980070234414163719 true 25 34201
3 523890102151522916311113076301980070234414163719 true 26 31517
3 523890102151522916311113076301980070234414163719 true 27 31567
3 523890102151522916311113076301980070234414163719 true 28 31647
3 523890102151522916311113076301980070234414163719 true 29 31617
3 523890102151522916311113076301980070234414163719 true 30 31787
3 523890102151522916311113076301980070234414163719 true 31 31546
3 523890102151522916311113076301980070234414163719 true 32 31486
3 523890102151522916311113076301980070234414163719 true 33 31607
3 523890102151522916311113076301980070234414163719 true 34 31577
3 523890102151522916311113076301980070234414163719 true 35 31557
3 523890102151522916311113076301980070234414163719 true 36 31497
3 523890102151522916311113076301980070234414163719 true 37 31607
3 523890102151522916311113076301980070234414163719 true 38 31436
3 523890102151522916311113076301980070234414163719 true 39 31527
3 523890102151522916311113076301980070234414163719 true 40 31467
3 523890102151522916311113076301980070234414163719 true 41 31567
3 523890102151522916311113076301980070234414163719 true 42 31707
3 523890102151522916311113076301980070234414163719 true 43 31747
3 523890102151522916311113076301980070234414163719 true 44 31797
3 523890102151522916311113076301980070234414163719 true 45 34401
3 523890102151522916311113076301980070234414163719 true 46 31246
3 523890102151522916311113076301980070234414163719 true 47 31407
3 523890102151522916311113076301980070234414163719 true 48 31436
3 523890102151522916311113076301980070234414163719 true 49 31216
3 523890102151522916311113076301980070234414163719 true 50 31807
3 523890102151522916311113076301980070234414163719 true 51 31296
3 523890102151522916311113076301980070234414163719 true 52 31878
3 523890102151522916311113076301980070234414163719 true 53 31397
3 523890102151522916311113076301980070234414163719 true 54 31486
3 523890102151522916311113076301980070234414163719 true 55 31517
3 523890102151522916311113076301980070234414163719 true 56 31848
3 523890102151522916311113076301980070234414163719 true 57 31377
3 523890102151522916311113076301980070234414163719 true 58 31466
3 523890102151522916311113076301980070234414163719 true 59 31386
3 523890102151522916311113076301980070234414163719 true 60 31186
3 523890102151522916311113076301980070234414163719 true 61 31416
3 523890102151522916311113076301980070234414163719 true 62 31457
3 523890102151522916311113076301980070234414163719 true 63 31297
3 523890102151522916311113076301980070234414163719 false 0 70225
3 523890102151522916311113076301980070234414163719 false 1 66949
3 523890102151522916311113076301980070234414163719 false 2 65187
3 523890102151522916311113076301980070234414163719 false 3 65337
3 523890102151522916311113076301980070234414163719 false 4 64675
3 523890102151522916311113076301980070234414163719 false 5 64476
3 523890102151522916311113076301980070234414163719 false 6 63925
3 523890102151522916311113076301980070234414163719 false 7 64445
3 523890102151522916311113076301980070234414163719 false 8 64326
3 523890102151522916311113076301980070234414163719 false 9 63585
3 523890102151522916311113076301980070234414163719 false 10 64496
3 523890102151522916311113076301980070234414163719 false 11 64355
3 523890102151522916311113076301980070234414163719 false 12 64516
3 523890102151522916311113076301980070234414163719 false 13 64075
3 523890102151522916311113076301980070234414163719 false 14 64565
3 523890102151522916311113076301980070234414163719 false 15 64325
3 523890102151522916311113076301980070234414163719 false 16 63604
3 523890102151522916311113076301980070234414163719 false 17 64195
3 523890102151522916311113076301980070234414163719 false 18 63714
3 523890102151522916311113076301980070234414163719 false 19 64316
3 523890102151522916311113076301980070234414163719 false 20 64475
3 523890102151522916311113076301980070234414163719 false 21 64065
3 523890102151522916311113076301980070234414163719 false 22 64515
3 523890102151522916311113076301980070234414163719 false 23 64565
3 523890102151522916311113076301980070234414163719 false 24 67470
3 523890102151522916311113076301980070234414163719 false 25 64415
3 523890102151522916311113076301980070234414163719 false 26 63875
3 523890102151522916311113076301980070234414163719 false 27 63965
3 523890102151522916311113076301980070234414163719 false 28 64045
3 523890102151522916311113076301980070234414163719 false 29 64145
3 523890102151522916311113076301980070234414163719 false 30 64316
3 523890102151522916311113076301980070234414163719 false 31 63804
3 523890102151522916311113076301980070234414163719 false 32 64296
3 523890102151522916311113076301980070234414163719 false 33 64145
3 523890102151522916311113076301980070234414163719 false 34 64246
3 523890102151522916311113076301980070234414163719 false 35 64436
3 523890102151522916311113076301980070234414163719 false 36 67940
3 523890102151522916311113076301980070234414163719 false 37 64064
3 523890102151522916311113076301980070234414163719 false 38 63835
3 523890102151522916311113076301980070234414163719 false 39 63915
3 523890102151522916311113076301980070234414163719 false 40 64095
3 523890102151522916311113076301980070234414163719 false 41 64445
3 523890102151522916311113076301980070234414163719 false 42 64085
3 523890102151522916311113076301980070234414163719 false 43 63834
3 523890102151522916311113076301980070234414163719 false 44 64195
3 523890102151522916311113076301980070234414163719 false 45 63634
3 523890102151522916311113076301980070234414163719 false 46 64375
3 523890102151522916311113076301980070234414163719 false 47 63735
3 523890102151522916311113076301980070234414163719 false 48 66929
3 523890102151522916311113076301980070234414163719 false 49 64065
3 523890102151522916311113076301980070234414163719 false 50 64165
3 523890102151522916311113076301980070234414163719 false 51 64065
3 523890102151522916311113076301980070234414163719 false 52 63794
3 523890102151522916311113076301980070234414163719 false 53 63885
3 523890102151522916311113076301980070234414163719 false 54 64236
3 523890102151522916311113076301980070234414163719 false 55 63914
3 523890102151522916311113076301980070234414163719 false 56 64265
3 523890102151522916311113076301980070234414163719 false 57 64295
3 523890102151522916311113076301980070234414163719 false 58 64476
3 523890102151522916311113076301980070234414163719 false 59 64104
3 523890102151522916311113076301980070234414163719 false 60 67070
3 523890102151522916311113076301980070234414163719 false 61 64095
3 523890102151522916311113076301980070234414163719 false 62 63904
3 523890102151522916311113076301980070234414163719 false 63 63725
3 5 true 0 32107
3 5 true 1 30456
3 5 true 2 29884
3 5 true 3 29764
3 5 true 4 29634
3 5 true 5 29704
3 5 true 6 29513
3 5 true 7 29564
3 5 true 8 29674
3 5 true 9 29564
3 5 true 10 29875
3 5 true 11 29454
3 5 true 12 29504
3 5 true 13 29784
3 5 true 14 29294
3 5 true 15 29664
3 5 true 16 29785
3 5 true 17 29745
3 5 true 18 29684
3 5 true 19 29684
3 5 true 20 223130
3 5 true 21 30926
3 5 true 22 29924
3 5 true 23 29784
3 5 true 24 29484
3 5 true 25 29794
3 5 true 26 29554
3 5 true 27 29564
3 5 true 28 29554
3 5 true 29 29193
3 5 true 30 29664
3 5 true 31 29614
3 5 true 32 29854
3 5 true 33 29324
3 5 true 34 29754
3 5 true 35 30034
3 5 true 36 29633
3 5 true 37 29805
3 5 true 38 30155
3 5 true 39 29784
3 5 true 40 29754
3 5 true 41 29624
3 5 true 42 29925
3 5 true 43 29524
3 5 true 44 29544
3 5 true 45 32268
3 5 true 46 29774
3 5 true 47 29765
3 5 true 48 29744
3 5 true 49 29654
3 5 true 50 29484
3 5 true 51 29964
3 5 true 52 29724
3 5 true 53 29784
3 5 true 54 29724
3 5 true 55 29794
3 5 true 56 29413
3 5 true 57 29534
3 5 true 58 29954
3 5 true 59 29624
3 5 true 60 29534
3 5 true 61 29724
3 5 true 62 29574
3 5 true 63 29654
3 5 false 0 68632
3 5 false 1 65537
3 5 false 2 64476
3 5 false 3 64315
3 5 false 4 66678
3 5 false 5 64385
3 5 false 6 64185
3 5 false 7 64045
3 5 false 8 63735
3 5 false 9 64025
3 5 false 10 63484
3 5 false 11 63785
3 5 false 12 63784
3 5 false 13 64014
3 5 false 14 63494
3 5 false 15 63755
3 5 false 16 63825
3 5 false 17 63664
3 5 false 18 63494
3 5 false 19 66509
3 5 false 20 63814
3 5 false 21 63303
3 5 false 22 63704
3 5 false 23 63454
3 5 false 24 63695
3 5 false 25 63714
3 5 false 26 63515
3 5 false 27 63754
3 5 false 28 63134
3 5 false 29 63854
3 5 false 30 63965
3 5 false 31 63764
3 5 false 32 63564
3 5 false 33 63655
3 5 false 34 121911
3 5 false 35 64366
3 5 false 36 63594
3 5 false 37 63474
3 5 false 38 63585
3 5 false 39 63634
3 5 false 40 63725
3 5 false 41 64235
3 5 false 42 63895
3 5 false 43 63735
3 5 false 44 64055
3 5 false 45 63634
3 5 false 46 64205
3 5 false 47 64055
3 5 false 48 66338
3 5 false 49 64245
3 5 false 50 63765
3 5 false 51 63644
3 5 false 52 63475
3 5 false 53 63784
3 5 false 54 63835
3 5 false 55 63554
3 5 false 56 63715
3 5 false 57 63584
3 5 false 58 63374
3 5 false 59 64165
3 5 false 60 63544
3 5 false 61 63123
3 5 false 62 61391
3 5 false 63 66579
3 306251 true 0 31958
3 306251 true 1 30345
3 306251 true 2 30274
3 306251 true 3 29674
3 306251 true 4 29804
3 306251 true 5 29855
3 306251 true 6 29694
3 306251 true 7 29433
3 306251 true 8 29824
3 306251 true 9 29784
3 306251 true 10 29484
3 306251 true 11 29564
3 306251 true 12 29524
3 306251 true 13 29744
3 306251 true 14 29213
3 306251 true 15 29924
3 306251 true 16 29504
3 306251 true 17 29664
3 306251 true 18 29504
3 306251 true 19 29533
3 306251 true 20 29624
3 306251 true 21 29453
3 306251 true 22 29844
3 306251 true 23 29664
3 306251 true 24 29794
3 306251 true 25 29865
3 306251 true 26 29604
3 306251 true 27 32669
3 306251 true 28 29544
3 306251 true 29 29694
3 306251 true 30 30065
3 306251 true 31 29704
3 306251 true 32 29734
3 306251 true 33 29734
3 306251 true 34 29434
3 306251 true 35 29644
3 306251 true 36 29744
3 306251 true 37 29684
3 306251 true 38 29875
3 306251 true 39 29534
3 306251 true 40 29975
3 306251 true 41 29904
3 306251 true 42 29434
3 306251 true 43 29314
3 306251 true 44 29894
3 306251 true 45 29905
3 306251 true 46 29694
3 306251 true 47 29403
3 306251 true 48 29865
3 306251 true 49 29894
3 306251 true 50 29864
3 306251 true 51 29814
3 306251 true 52 29554
3 306251 true 53 29824
3 306251 true 54 29633
3 306251 true 55 29724
3 306251 true 56 29583
3 306251 true 57 29333
3 306251 true 58 33139
3 306251 true 59 29684
3 306251 true 60 29724
3 306251 true 61 29533
3 306251 true 62 29684
3 306251 true 63 29684
3 306251 false 0 67850
3 306251 false 1 65266
3 306251 false 2 64846
3 306251 false 3 63865
3 306251 false 4 63334
3 306251 false 5 64135
3 306251 false 6 63885
3 306251 false 7 63895
3 306251 false 8 63474
3 306251 false 9 64045
3 306251 false 10 66218
3 306251 false 11 63754
3 306251 false 12 63595
3 306251 false 13 63875
3 306251 false 14 64515
3 306251 false 15 63324
3 306251 false 16 64115
3 306251 false 17 62923
3 306251 false 18 63784
3 306251 false 19 63555
3 306251 false 20 63374
3 306251 false 21 63104
3 306251 false 22 63755
3 306251 false 23 63894
3 306251 false 24 63485
3 306251 false 25 66348
3 306251 false 26 63845
3 306251 false 27 63524
3 306251 false 28 63344
3 306251 false 29 63384
3 306251 false 30 63334
3 306251 false 31 63595
3 306251 false 32 63464
3 306251 false 33 63604
3 306251 false 34 63805
3 306251 false 35 63174
3 306251 false 36 63654
3 306251 false 37 63194
3 306251 false 38 63434
3 306251 false 39 63614
3 306251 false 40 66899
3 306251 false 41 63695
3 306251 false 42 63314
3 306251 false 43 63454
3 306251 false 44 63424
3 306251 false 45 64065
3 306251 false 46 63614
3 306251 false 47 63775
3 306251 false 48 63734
3 306251 false 49 63615
3 306251 false 50 63464
3 306251 false 51 63705
3 306251 false 52 63714
3 306251 false 53 63985
3 306251 false 54 63294
3 306251 false 55 66138
3 306251 false 56 63765
3 306251 false 57 63824
3 306251 false 58 63233
3 306251 false 59 63434
3 306251 false 60 63455
3 306251 false 61 63764
3 306251 false 62 63404
3 306251 false 63 63444
module
import Lean
import PrimeCert.Pocklington3
meta import Lean
open Lean
set_option maxRecDepth 10000
run_cmd do
let ready ← IO.mkRef (← getEnv).toKernelEnv
let env := Environment.ofKernelEnv (← ready.get)
let some path ← IO.getEnv "INTERVAL_SAMPLES" | throwError "set INTERVAL_SAMPLES"
let file ← IO.FS.Handle.mk path .write
let cases : List (Nat × Nat × Nat × Nat) :=
[(17329, 1, 17328, 3),
(69, 9, 68, 7),
(301, 134, 299, 7),
(71523, 20763, 71521, 11),
(111028891713715270858633, 2169430279732, 111028891713715270858632, 3),
(239, 14, 238, 11),
(631, 3, 630, 5),
(223, 3, 222, 7),
(1184777, 1337, 1184776, 5),
(284551513249666376365123, 275754422668509854114502, 284551513249666376365119, 5),
(23, 61, 6, 3),
(1728651, 4232391, 1728641, 5),
(5439, 2319, 5437, 7),
(523890102151522916311113076301980070234414163719, 3637867751654793328228610486390601899590, 523890102151522916311113076301980070234414163718, 3),
(5, 1, 4, 3),
(306251, 139, 306250, 3)]
for block in [:4] do
for (r, s, w, prime) in cases do
let arms := if block % 2 == 0 then [false, true] else [true, false]
for interval in arms do
let mode := if interval then
mkApp (mkConst ``PrimeCert.Pocklington3CertMode.interval) (mkRawNatLit w)
else mkApp2 (mkConst ``PrimeCert.Pocklington3CertMode.prime) (mkRawNatLit prime)
(mkConst (if prime == 3 then ``Nat.prime_three else if prime == 5 then ``Nat.prime_five else if prime == 7 then ``Nat.prime_seven else ``Nat.prime_eleven))
let lhs := mkApp3 (mkConst ``PrimeCert.Pocklington3CertMode.calculate)
mode (mkRawNatLit r) (mkRawNatLit s)
let mkProof (b : Bool) :=
let rhs := mkConst (if b then ``Bool.true else ``Bool.false)
let type := mkApp3 (mkConst ``Eq [.succ .zero]) (mkConst ``Bool) lhs rhs
mkApp (mkLambda `h .default type (mkBVar 0))
(mkApp2 (mkConst ``Eq.refl [.succ .zero]) (mkConst ``Bool) rhs)
let bad ← IO.mkRef (Kernel.check env {} (mkProof false))
if (← bad.get).isOk then throwError "accepted wrong result"
for i in [:64] do
let input ← IO.mkRef (env, mkProof true)
let (env, term) ← input.get
let start ← IO.monoNanosNow
let result ← IO.mkRef (Kernel.check env {} term)
let result ← result.get
let stop ← IO.monoNanosNow
let _ ← ofExceptKernelException result
file.putStrLn s!"{block},{r},{interval},{i},{stop-start}"
file.flush
-- Retain fresh kernel checks under CPU affinity.
/-
Copyright (c) 2025 Kenny Lau, Bhavik Mehta. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Kenny Lau, Bhavik Mehta
-/
module
import PrimeCert
/-! # Example primality certificates
Demonstrates `pock3` and `prime_cert%` on primes up to 100+ digits, including the Ed25519
base point order and the Goldilocks prime `2^448 - 2^224 - 1`.
Helpful links:
* https://www.alpertron.com.ar/ECM.HTM (integer factorisation calculator using elliptic curves)
-/
set_option linter.style.longLine false
example : Nat.Prime 16290860017 := prime_cert%
[small {3; 29},
pock3 (339392917, 2, interval 17328, 2 ^ 2 * 3 ^ 4 * 29),
pock3 (16290860017, 5, 0, 2 ^ 4 * 3 * 339392917)]
-- randomly generated 60-digit prime
example : Nat.Prime 236684654874665389773181956283167565443541280517430278333971 := prime_cert%
[small {2; 3; 7; 11; 29; 31},
pock3 (73471, 3, interval 68, 2 * 31),
pock3 (32560621, 2, interval 299, 2 ^ 2 * 3 * 29),
pock3 (3586530508831189, 2, interval 71521, 2 ^ 2 * 73471),
pock3 (236684654874665389773181956283167565443541280517430278333971, 2, interval 111028891713715270858632, 2 * 32560621 * 3586530508831189)]
-- randomly generated 100-digit prime
set_option maxRecDepth 4000 in
example : Nat.Prime
33706834100337092016588185336355794213783999136111596309066868786749483370039300586702754215489223467 := prime_cert%
[small {5; 11},
pock3 (1809751, 6, interval 238, 2 * 5 ^ 3),
pock3 (1983088950781, 2, 0, 2 ^ 2 * 1809751),
pock3 (47118193470556561, 7, 0, 2 ^ 4 * 1983088950781),
pock3 (88792633576685840281427, 2, 0, 2 * 47118193470556561),
pock3 (3933488715053265001346321205182867326957, 2, 0, 2 ^ 2 * 88792633576685840281427),
pock3 (120470424957394687948621467206018925349715512075395521, 3, 0, 2 ^ 6 * 3933488715053265001346321205182867326957),
pock3 (7333936561985354484046645851447308970826407201647529829078664035434709924691, 2, 0, 2 * 120470424957394687948621467206018925349715512075395521),
pock3 (33706834100337092016588185336355794213783999136111596309066868786749483370039300586702754215489223467, 2, 0, 2 * 7333936561985354484046645851447308970826407201647529829078664035434709924691)]
set_option maxRecDepth 1000 in
example : Nat.Prime (2 ^ 255 - 19) := prime_cert%
[small {3; 5; 7; 43},
pock3 (1923133, 2, interval 630, 2 ^ 2 * 3 * 43),
pock3 (430751, 17, interval 222, 2 * 5 ^ 3),
pock3 (31757755568855353, 5, interval 1184776, 2 ^ 3 * 430751),
pock3 (74058212732561358302231226437062788676166966415465897661863160754340907, 2, interval 284551513249666376365119, 2 * 3 * 1923133 * 31757755568855353),
pock3 (57896044618658097711785492504343953926634992332820282019728792003956564819949, 2, 0, 2 ^ 2 * 74058212732561358302231226437062788676166966415465897661863160754340907)]
set_option exponentiation.threshold 448 in
example : Nat.Prime (2 ^ 448 - 2 ^ 224 - 1) := prime_cert%
[small {3; 5; 7; 29; 67; 271; 641},
pock3 (411743, 5, interval 6, 2 * 29),
pock3 (1469495262398780123809, 17, interval 1728641, 2 ^ 5 * 411743),
pock3 (97859369123353, 5, interval 5437, 2 ^ 3 * 67 * 271),
pock3 (167773885276849215533569, 17, 0, 2 ^ 9 * 97859369123353),
pock3 (726838724295606890549323807888004534353641360687318060281490199180612328166730772686396383698676545930088884461843637361053498018365439, 7, interval 523890102151522916311113076301980070234414163718, 2 * 641 * 1469495262398780123809 * 167773885276849215533569)]
-- 1178-digit prime 3 * 2 ^ 3912 + 1 (Proth form), certified with pock3
set_option maxRecDepth 2048 in
set_option exponentiation.threshold 3912 in
example : Nat.Prime (3 * 2 ^ 3912 + 1) := prime_cert%
[small {3},
pock3 (127780414391497973212171930170926986757577048484820926201064729783485263494817422495127775983679039078116803697168137524940219819335799478153348592755198599590903607242050230924443865709697486743641039970666450337071378658828331722728467720393963808366917988956767802913905167890490075236068196363700359481304279948916896583006686025357237170212018946813663108217900835975808683160984117514866915965161953626338070145596982334808959718966160701183250747572515090867613655044807172211728519357721287835503689517292364425608325467094686443862517374850243698013720305871319056887431952190952721719757200172695537054790570648290887720009455171821568413052107356003828041937567129362866696549587422369864562815134637684140271767482353107080370450890024342225936273158281477009232714640818424893445193089479459814572594522258577931514012256573162006292678354475638319009668319255772179069845291474717503333030909793536116894869761453687330048252587304656806182949368202671739705463406846852567720022377005763291104588535681445561286808586673846016527511475331939430139687698419185010117348285933672139833826832898565919546377321517928825162277951756632134321102813522053716838646284289, 11, 0, 2 ^ 3912 * 3)]
example : Nat.Prime 3999999999999999791 := prime_cert%
[small {3; 5; 23; 211},
pock3 (239851, 3, 0, 2 * 3 ^ 2 * 5 ^ 2),
pock3 (399999999999999979, 2, 0, 2 * 3 ^ 3 * 23 * 211 * 239851),
pock3 (3999999999999999791, 11, 0, 2 * 5 * 399999999999999979)]
example : Nat.Prime 3999999999999999691 := prime_cert%
[small {3; 5; 11; 29; 41; 389},
pock3 (18913, 7, interval 4, 2 ^ 5 * 3),
pock3 (37379684141669, 2, 0, 2 ^ 2 * 11 * 389 * 18913),
pock3 (3999999999999999691, 3, 0, 2 * 3 ^ 2 * 5 * 29 * 41 * 37379684141669)]
-- Ed25519 base point order ℓ = 2^252 + 27742317777372353535851937790883648493
set_option maxRecDepth 4000 in
example : Nat.Prime (2 ^ 252 + 27742317777372353535851937790883648493) := prime_cert%
[small {3; 73},
pock3 (3797, 2, 0, 2 ^ 2 * 73),
pock3 (531581, 2, 0, 2 ^ 2 * 3797),
pock3 (1257559732178653, 2, interval 306250, 2 ^ 2 * 531581),
pock3 (4434155615661930479, 17, 0, 2 * 1257559732178653),
pock3 (172054593956031949258510691, 2, 0, 2 * 4434155615661930479),
pock3 (19757330305831588566944191468367130476339, 2, 0, 2 * 172054593956031949258510691),
pock3 (276602624281642239937218680557139826668747, 2, 0, 2 * 19757330305831588566944191468367130476339),
pock3 (7237005577332262213973186563042994240857116359379907606001950938285454250989, 2, 0, 2 ^ 2 * 276602624281642239937218680557139826668747)]
0 69 false 0 78666
0 69 false 1 64616
0 69 false 2 53098
0 69 false 3 54952
0 69 false 4 48301
0 69 false 5 47080
0 69 false 6 45357
0 69 false 7 46108
0 69 false 8 45468
0 69 false 9 45908
0 69 false 10 45457
0 69 false 11 45908
0 69 false 12 45507
0 69 false 13 45347
0 69 false 14 44957
0 69 false 15 45077
0 69 false 16 45157
0 69 false 17 45017
0 69 false 18 45087
0 69 false 19 45938
0 69 false 20 47661
0 69 false 21 46288
0 69 false 22 45177
0 69 false 23 45517
0 69 false 24 47701
0 69 false 25 45497
0 69 false 26 45307
0 69 false 27 45477
0 69 false 28 44826
0 69 false 29 45517
0 69 false 30 45167
0 69 false 31 45327
0 69 false 32 45157
0 69 false 33 45438
0 69 false 34 45407
0 69 false 35 44786
0 69 false 36 45327
0 69 false 37 45537
0 69 false 38 44866
0 69 false 39 44857
0 69 false 40 44486
0 69 false 41 44877
0 69 false 42 44997
0 69 false 43 44866
0 69 false 44 45037
0 69 false 45 49584
0 69 false 46 45268
0 69 false 47 45047
0 69 false 48 45197
0 69 false 49 45237
0 69 false 50 44756
0 69 false 51 44486
0 69 false 52 45267
0 69 false 53 44997
0 69 false 54 45097
0 69 false 55 45127
0 69 false 56 44986
0 69 false 57 45177
0 69 false 58 45317
0 69 false 59 44987
0 69 false 60 45037
0 69 false 61 45127
0 69 false 62 44526
0 69 false 63 44897
0 69 true 0 23675
0 69 true 1 20330
0 69 true 2 77334
0 69 true 3 21451
0 69 true 4 19739
0 69 true 5 18558
0 69 true 6 18518
0 69 true 7 18458
0 69 true 8 18518
0 69 true 9 18448
0 69 true 10 18447
0 69 true 11 18688
0 69 true 12 18438
0 69 true 13 18708
0 69 true 14 18297
0 69 true 15 18417
0 69 true 16 18367
0 69 true 17 18187
0 69 true 18 18417
0 69 true 19 18427
0 69 true 20 18347
0 69 true 21 18227
0 69 true 22 18207
0 69 true 23 18267
0 69 true 24 18277
0 69 true 25 18267
0 69 true 26 18248
0 69 true 27 18468
0 69 true 28 18287
0 69 true 29 18167
0 69 true 30 18388
0 69 true 31 18377
0 69 true 32 18097
0 69 true 33 18157
0 69 true 34 18047
0 69 true 35 18217
0 69 true 36 18277
0 69 true 37 18017
0 69 true 38 18227
0 69 true 39 18247
0 69 true 40 18487
0 69 true 41 18017
0 69 true 42 18217
0 69 true 43 18147
0 69 true 44 18207
0 69 true 45 18147
0 69 true 46 18077
0 69 true 47 18026
0 69 true 48 18187
0 69 true 49 22222
0 69 true 50 18297
0 69 true 51 18217
0 69 true 52 18207
0 69 true 53 18097
0 69 true 54 18177
0 69 true 55 18107
0 69 true 56 18096
0 69 true 57 18427
0 69 true 58 18137
0 69 true 59 18116
0 69 true 60 18177
0 69 true 61 18508
0 69 true 62 18388
0 69 true 63 18137
0 4028945 false 0 45837
0 4028945 false 1 41812
0 4028945 false 2 41041
0 4028945 false 3 39959
0 4028945 false 4 39489
0 4028945 false 5 39449
0 4028945 false 6 39278
0 4028945 false 7 39198
0 4028945 false 8 39318
0 4028945 false 9 39248
0 4028945 false 10 39338
0 4028945 false 11 39147
0 4028945 false 12 39409
0 4028945 false 13 39248
0 4028945 false 14 41201
0 4028945 false 15 40269
0 4028945 false 16 38918
0 4028945 false 17 38898
0 4028945 false 18 39528
0 4028945 false 19 39659
0 4028945 false 20 39309
0 4028945 false 21 39128
0 4028945 false 22 39178
0 4028945 false 23 39298
0 4028945 false 24 39389
0 4028945 false 25 39028
0 4028945 false 26 39088
0 4028945 false 27 39209
0 4028945 false 28 39118
0 4028945 false 29 39028
0 4028945 false 30 39138
0 4028945 false 31 39198
0 4028945 false 32 39158
0 4028945 false 33 39309
0 4028945 false 34 39269
0 4028945 false 35 39278
0 4028945 false 36 39188
0 4028945 false 37 38958
0 4028945 false 38 39589
0 4028945 false 39 41482
0 4028945 false 40 39028
0 4028945 false 41 39398
0 4028945 false 42 38877
0 4028945 false 43 38968
0 4028945 false 44 39258
0 4028945 false 45 39418
0 4028945 false 46 39669
0 4028945 false 47 38857
0 4028945 false 48 39208
0 4028945 false 49 39178
0 4028945 false 50 38948
0 4028945 false 51 39067
0 4028945 false 52 39068
0 4028945 false 53 39118
0 4028945 false 54 39178
0 4028945 false 55 38777
0 4028945 false 56 39158
0 4028945 false 57 39428
0 4028945 false 58 39568
0 4028945 false 59 39168
0 4028945 false 60 39118
0 4028945 false 61 39539
0 4028945 false 62 39239
0 4028945 false 63 41852
0 4028945 true 0 21462
0 4028945 true 1 19509
0 4028945 true 2 18949
0 4028945 true 3 18668
0 4028945 true 4 18447
0 4028945 true 5 18387
0 4028945 true 6 18328
0 4028945 true 7 18447
0 4028945 true 8 18217
0 4028945 true 9 18428
0 4028945 true 10 18398
0 4028945 true 11 18367
0 4028945 true 12 18367
0 4028945 true 13 18487
0 4028945 true 14 18477
0 4028945 true 15 18377
0 4028945 true 16 18497
0 4028945 true 17 18408
0 4028945 true 18 18397
0 4028945 true 19 18057
0 4028945 true 20 18237
0 4028945 true 21 18117
0 4028945 true 22 18107
0 4028945 true 23 18257
0 4028945 true 24 18207
0 4028945 true 25 18307
0 4028945 true 26 18407
0 4028945 true 27 18147
0 4028945 true 28 18247
0 4028945 true 29 18258
0 4028945 true 30 18217
0 4028945 true 31 18307
0 4028945 true 32 18007
0 4028945 true 33 18227
0 4028945 true 34 18187
0 4028945 true 35 18438
0 4028945 true 36 18378
0 4028945 true 37 18247
0 4028945 true 38 18307
0 4028945 true 39 17967
0 4028945 true 40 18257
0 4028945 true 41 18428
0 4028945 true 42 18428
0 4028945 true 43 18558
0 4028945 true 44 18508
0 4028945 true 45 18227
0 4028945 true 46 20741
0 4028945 true 47 18728
0 4028945 true 48 18397
0 4028945 true 49 18357
0 4028945 true 50 18648
0 4028945 true 51 18597
0 4028945 true 52 18738
0 4028945 true 53 18207
0 4028945 true 54 18447
0 4028945 true 55 18597
0 4028945 true 56 18297
0 4028945 true 57 18547
0 4028945 true 58 18538
0 4028945 true 59 18538
0 4028945 true 60 18537
0 4028945 true 61 18217
0 4028945 true 62 18458
0 4028945 true 63 18287
0 2028478494862525422475607 false 0 45327
0 2028478494862525422475607 false 1 41722
0 2028478494862525422475607 false 2 40840
0 2028478494862525422475607 false 3 40340
0 2028478494862525422475607 false 4 40029
0 2028478494862525422475607 false 5 40049
0 2028478494862525422475607 false 6 40249
0 2028478494862525422475607 false 7 40450
0 2028478494862525422475607 false 8 40060
0 2028478494862525422475607 false 9 39779
0 2028478494862525422475607 false 10 39639
0 2028478494862525422475607 false 11 39939
0 2028478494862525422475607 false 12 42954
0 2028478494862525422475607 false 13 39759
0 2028478494862525422475607 false 14 39459
0 2028478494862525422475607 false 15 40050
0 2028478494862525422475607 false 16 39549
0 2028478494862525422475607 false 17 39789
0 2028478494862525422475607 false 18 39759
0 2028478494862525422475607 false 19 39518
0 2028478494862525422475607 false 20 39659
0 2028478494862525422475607 false 21 39930
0 2028478494862525422475607 false 22 39449
0 2028478494862525422475607 false 23 40300
0 2028478494862525422475607 false 24 39789
0 2028478494862525422475607 false 25 39388
0 2028478494862525422475607 false 26 39419
0 2028478494862525422475607 false 27 39549
0 2028478494862525422475607 false 28 39599
0 2028478494862525422475607 false 29 39759
0 2028478494862525422475607 false 30 39859
0 2028478494862525422475607 false 31 39959
0 2028478494862525422475607 false 32 39749
0 2028478494862525422475607 false 33 39688
0 2028478494862525422475607 false 34 39418
0 2028478494862525422475607 false 35 42193
0 2028478494862525422475607 false 36 39959
0 2028478494862525422475607 false 37 39799
0 2028478494862525422475607 false 38 39529
0 2028478494862525422475607 false 39 39308
0 2028478494862525422475607 false 40 39238
0 2028478494862525422475607 false 41 39719
0 2028478494862525422475607 false 42 39709
0 2028478494862525422475607 false 43 40049
0 2028478494862525422475607 false 44 39458
0 2028478494862525422475607 false 45 39769
0 2028478494862525422475607 false 46 40140
0 2028478494862525422475607 false 47 39779
0 2028478494862525422475607 false 48 39799
0 2028478494862525422475607 false 49 39528
0 2028478494862525422475607 false 50 39609
0 2028478494862525422475607 false 51 39449
0 2028478494862525422475607 false 52 39599
0 2028478494862525422475607 false 53 39779
0 2028478494862525422475607 false 54 39919
0 2028478494862525422475607 false 55 39389
0 2028478494862525422475607 false 56 39459
0 2028478494862525422475607 false 57 44126
0 2028478494862525422475607 false 58 39409
0 2028478494862525422475607 false 59 39288
0 2028478494862525422475607 false 60 39609
0 2028478494862525422475607 false 61 39298
0 2028478494862525422475607 false 62 39428
0 2028478494862525422475607 false 63 39919
0 2028478494862525422475607 true 0 23475
0 2028478494862525422475607 true 1 21381
0 2028478494862525422475607 true 2 20310
0 2028478494862525422475607 true 3 19970
0 2028478494862525422475607 true 4 19869
0 2028478494862525422475607 true 5 19689
0 2028478494862525422475607 true 6 19358
0 2028478494862525422475607 true 7 19749
0 2028478494862525422475607 true 8 19580
0 2028478494862525422475607 true 9 19509
0 2028478494862525422475607 true 10 19840
0 2028478494862525422475607 true 11 19579
0 2028478494862525422475607 true 12 19769
0 2028478494862525422475607 true 13 19639
0 2028478494862525422475607 true 14 19469
0 2028478494862525422475607 true 15 19579
0 2028478494862525422475607 true 16 19569
0 2028478494862525422475607 true 17 19489
0 2028478494862525422475607 true 18 19669
0 2028478494862525422475607 true 19 19679
0 2028478494862525422475607 true 20 19730
0 2028478494862525422475607 true 21 19639
0 2028478494862525422475607 true 22 19819
0 2028478494862525422475607 true 23 19498
0 2028478494862525422475607 true 24 19419
0 2028478494862525422475607 true 25 19509
0 2028478494862525422475607 true 26 19349
0 2028478494862525422475607 true 27 19539
0 2028478494862525422475607 true 28 22793
0 2028478494862525422475607 true 29 19629
0 2028478494862525422475607 true 30 19659
0 2028478494862525422475607 true 31 19499
0 2028478494862525422475607 true 32 19619
0 2028478494862525422475607 true 33 19539
0 2028478494862525422475607 true 34 19700
0 2028478494862525422475607 true 35 19349
0 2028478494862525422475607 true 36 19749
0 2028478494862525422475607 true 37 19529
0 2028478494862525422475607 true 38 19428
0 2028478494862525422475607 true 39 19609
0 2028478494862525422475607 true 40 19930
0 2028478494862525422475607 true 41 19650
0 2028478494862525422475607 true 42 19449
0 2028478494862525422475607 true 43 19399
0 2028478494862525422475607 true 44 19298
0 2028478494862525422475607 true 45 19389
0 2028478494862525422475607 true 46 19749
0 2028478494862525422475607 true 47 19459
0 2028478494862525422475607 true 48 19429
0 2028478494862525422475607 true 49 19489
0 2028478494862525422475607 true 50 19739
0 2028478494862525422475607 true 51 19709
0 2028478494862525422475607 true 52 19780
0 2028478494862525422475607 true 53 19439
0 2028478494862525422475607 true 54 19629
0 2028478494862525422475607 true 55 19349
0 2028478494862525422475607 true 56 19479
0 2028478494862525422475607 true 57 19669
0 2028478494862525422475607 true 58 19680
0 2028478494862525422475607 true 59 19279
0 2028478494862525422475607 true 60 19799
0 2028478494862525422475607 true 61 19749
0 2028478494862525422475607 true 62 19619
0 2028478494862525422475607 true 63 19820
1 69 true 0 19969
1 69 true 1 19109
1 69 true 2 18617
1 69 true 3 18257
1 69 true 4 21522
1 69 true 5 18447
1 69 true 6 18557
1 69 true 7 18517
1 69 true 8 18457
1 69 true 9 18216
1 69 true 10 18057
1 69 true 11 18218
1 69 true 12 18327
1 69 true 13 18167
1 69 true 14 18267
1 69 true 15 18297
1 69 true 16 18377
1 69 true 17 18207
1 69 true 18 17997
1 69 true 19 18437
1 69 true 20 18287
1 69 true 21 18407
1 69 true 22 17966
1 69 true 23 18217
1 69 true 24 18237
1 69 true 25 18227
1 69 true 26 18176
1 69 true 27 18027
1 69 true 28 17987
1 69 true 29 18338
1 69 true 30 18177
1 69 true 31 18487
1 69 true 32 18166
1 69 true 33 17957
1 69 true 34 18077
1 69 true 35 18457
1 69 true 36 18157
1 69 true 37 18237
1 69 true 38 18207
1 69 true 39 18147
1 69 true 40 18257
1 69 true 41 18207
1 69 true 42 18167
1 69 true 43 18087
1 69 true 44 18216
1 69 true 45 18167
1 69 true 46 18196
1 69 true 47 18357
1 69 true 48 18217
1 69 true 49 18127
1 69 true 50 18627
1 69 true 51 18087
1 69 true 52 18297
1 69 true 53 18217
1 69 true 54 21572
1 69 true 55 18487
1 69 true 56 18337
1 69 true 57 18417
1 69 true 58 18348
1 69 true 59 18698
1 69 true 60 18667
1 69 true 61 18237
1 69 true 62 18558
1 69 true 63 18398
1 69 false 0 52678
1 69 false 1 48672
1 69 false 2 45778
1 69 false 3 45498
1 69 false 4 45317
1 69 false 5 45007
1 69 false 6 44957
1 69 false 7 45357
1 69 false 8 45217
1 69 false 9 45408
1 69 false 10 44956
1 69 false 11 45327
1 69 false 12 45187
1 69 false 13 45327
1 69 false 14 45318
1 69 false 15 47540
1 69 false 16 44907
1 69 false 17 45507
1 69 false 18 44546
1 69 false 19 45218
1 69 false 20 44426
1 69 false 21 44716
1 69 false 22 45127
1 69 false 23 45237
1 69 false 24 45257
1 69 false 25 44836
1 69 false 26 45407
1 69 false 27 45037
1 69 false 28 44776
1 69 false 29 44847
1 69 false 30 45307
1 69 false 31 45217
1 69 false 32 45177
1 69 false 33 45638
1 69 false 34 44997
1 69 false 35 45647
1 69 false 36 48011
1 69 false 37 44916
1 69 false 38 45207
1 69 false 39 45036
1 69 false 40 44656
1 69 false 41 45027
1 69 false 42 44937
1 69 false 43 45117
1 69 false 44 44536
1 69 false 45 44636
1 69 false 46 45047
1 69 false 47 45147
1 69 false 48 44836
1 69 false 49 44877
1 69 false 50 44867
1 69 false 51 45187
1 69 false 52 44817
1 69 false 53 45007
1 69 false 54 44546
1 69 false 55 44486
1 69 false 56 44837
1 69 false 57 45167
1 69 false 58 47400
1 69 false 59 44666
1 69 false 60 44947
1 69 false 61 44916
1 69 false 62 44746
1 69 false 63 45067
1 4028945 true 0 20630
1 4028945 true 1 19338
1 4028945 true 2 18628
1 4028945 true 3 18608
1 4028945 true 4 18677
1 4028945 true 5 18167
1 4028945 true 6 18267
1 4028945 true 7 18297
1 4028945 true 8 18348
1 4028945 true 9 18197
1 4028945 true 10 18427
1 4028945 true 11 18187
1 4028945 true 12 18257
1 4028945 true 13 18487
1 4028945 true 14 18357
1 4028945 true 15 18478
1 4028945 true 16 18477
1 4028945 true 17 18307
1 4028945 true 18 18417
1 4028945 true 19 18297
1 4028945 true 20 18287
1 4028945 true 21 18488
1 4028945 true 22 18428
1 4028945 true 23 18407
1 4028945 true 24 18658
1 4028945 true 25 18077
1 4028945 true 26 18268
1 4028945 true 27 18317
1 4028945 true 28 18297
1 4028945 true 29 18207
1 4028945 true 30 18508
1 4028945 true 31 18267
1 4028945 true 32 18117
1 4028945 true 33 21602
1 4028945 true 34 18598
1 4028945 true 35 18216
1 4028945 true 36 18287
1 4028945 true 37 18537
1 4028945 true 38 18387
1 4028945 true 39 18166
1 4028945 true 40 18227
1 4028945 true 41 18458
1 4028945 true 42 18458
1 4028945 true 43 18588
1 4028945 true 44 18197
1 4028945 true 45 18187
1 4028945 true 46 18357
1 4028945 true 47 18307
1 4028945 true 48 18678
1 4028945 true 49 18357
1 4028945 true 50 18237
1 4028945 true 51 18287
1 4028945 true 52 18477
1 4028945 true 53 18327
1 4028945 true 54 18587
1 4028945 true 55 18277
1 4028945 true 56 18508
1 4028945 true 57 18448
1 4028945 true 58 18317
1 4028945 true 59 18457
1 4028945 true 60 18197
1 4028945 true 61 18187
1 4028945 true 62 18427
1 4028945 true 63 18307
1 4028945 false 0 43595
1 4028945 false 1 40880
1 4028945 false 2 39669
1 4028945 false 3 39750
1 4028945 false 4 39679
1 4028945 false 5 39648
1 4028945 false 6 39459
1 4028945 false 7 42914
1 4028945 false 8 39669
1 4028945 false 9 39318
1 4028945 false 10 39258
1 4028945 false 11 39208
1 4028945 false 12 39489
1 4028945 false 13 39038
1 4028945 false 14 39669
1 4028945 false 15 39408
1 4028945 false 16 39419
1 4028945 false 17 39268
1 4028945 false 18 39469
1 4028945 false 19 39258
1 4028945 false 20 39509
1 4028945 false 21 39599
1 4028945 false 22 39549
1 4028945 false 23 39408
1 4028945 false 24 39459
1 4028945 false 25 39328
1 4028945 false 26 39259
1 4028945 false 27 39689
1 4028945 false 28 39228
1 4028945 false 29 39468
1 4028945 false 30 39288
1 4028945 false 31 42303
1 4028945 false 32 39428
1 4028945 false 33 39168
1 4028945 false 34 38978
1 4028945 false 35 39598
1 4028945 false 36 39218
1 4028945 false 37 39158
1 4028945 false 38 39339
1 4028945 false 39 38788
1 4028945 false 40 39459
1 4028945 false 41 38988
1 4028945 false 42 39348
1 4028945 false 43 39088
1 4028945 false 44 39449
1 4028945 false 45 39198
1 4028945 false 46 39158
1 4028945 false 47 39488
1 4028945 false 48 39258
1 4028945 false 49 39698
1 4028945 false 50 39128
1 4028945 false 51 39018
1 4028945 false 52 39108
1 4028945 false 53 39138
1 4028945 false 54 39118
1 4028945 false 55 39118
1 4028945 false 56 42433
1 4028945 false 57 39328
1 4028945 false 58 39218
1 4028945 false 59 38998
1 4028945 false 60 39208
1 4028945 false 61 39008
1 4028945 false 62 39058
1 4028945 false 63 39268
1 2028478494862525422475607 true 0 22043
1 2028478494862525422475607 true 1 20760
1 2028478494862525422475607 true 2 20100
1 2028478494862525422475607 true 3 19659
1 2028478494862525422475607 true 4 20030
1 2028478494862525422475607 true 5 19609
1 2028478494862525422475607 true 6 19459
1 2028478494862525422475607 true 7 19749
1 2028478494862525422475607 true 8 19589
1 2028478494862525422475607 true 9 19479
1 2028478494862525422475607 true 10 19780
1 2028478494862525422475607 true 11 19679
1 2028478494862525422475607 true 12 19709
1 2028478494862525422475607 true 13 19789
1 2028478494862525422475607 true 14 19478
1 2028478494862525422475607 true 15 19820
1 2028478494862525422475607 true 16 19609
1 2028478494862525422475607 true 17 19469
1 2028478494862525422475607 true 18 19649
1 2028478494862525422475607 true 19 19298
1 2028478494862525422475607 true 20 19409
1 2028478494862525422475607 true 21 19719
1 2028478494862525422475607 true 22 19629
1 2028478494862525422475607 true 23 19790
1 2028478494862525422475607 true 24 19760
1 2028478494862525422475607 true 25 19729
1 2028478494862525422475607 true 26 22093
1 2028478494862525422475607 true 27 20050
1 2028478494862525422475607 true 28 19860
1 2028478494862525422475607 true 29 19850
1 2028478494862525422475607 true 30 19870
1 2028478494862525422475607 true 31 19759
1 2028478494862525422475607 true 32 19669
1 2028478494862525422475607 true 33 19308
1 2028478494862525422475607 true 34 19659
1 2028478494862525422475607 true 35 19499
1 2028478494862525422475607 true 36 19849
1 2028478494862525422475607 true 37 19760
1 2028478494862525422475607 true 38 19489
1 2028478494862525422475607 true 39 19569
1 2028478494862525422475607 true 40 19629
1 2028478494862525422475607 true 41 19529
1 2028478494862525422475607 true 42 19409
1 2028478494862525422475607 true 43 19518
1 2028478494862525422475607 true 44 19809
1 2028478494862525422475607 true 45 19379
1 2028478494862525422475607 true 46 19719
1 2028478494862525422475607 true 47 19389
1 2028478494862525422475607 true 48 19449
1 2028478494862525422475607 true 49 19399
1 2028478494862525422475607 true 50 19459
1 2028478494862525422475607 true 51 19609
1 2028478494862525422475607 true 52 19499
1 2028478494862525422475607 true 53 19489
1 2028478494862525422475607 true 54 19879
1 2028478494862525422475607 true 55 19569
1 2028478494862525422475607 true 56 19849
1 2028478494862525422475607 true 57 19569
1 2028478494862525422475607 true 58 19349
1 2028478494862525422475607 true 59 19329
1 2028478494862525422475607 true 60 19348
1 2028478494862525422475607 true 61 19719
1 2028478494862525422475607 true 62 19659
1 2028478494862525422475607 true 63 19709
1 2028478494862525422475607 false 0 45236
1 2028478494862525422475607 false 1 41231
1 2028478494862525422475607 false 2 40531
1 2028478494862525422475607 false 3 40390
1 2028478494862525422475607 false 4 40159
1 2028478494862525422475607 false 5 39358
1 2028478494862525422475607 false 6 40259
1 2028478494862525422475607 false 7 39709
1 2028478494862525422475607 false 8 39569
1 2028478494862525422475607 false 9 39648
1 2028478494862525422475607 false 10 39749
1 2028478494862525422475607 false 11 39929
1 2028478494862525422475607 false 12 39909
1 2028478494862525422475607 false 13 39659
1 2028478494862525422475607 false 14 39709
1 2028478494862525422475607 false 15 39518
1 2028478494862525422475607 false 16 40049
1 2028478494862525422475607 false 17 39759
1 2028478494862525422475607 false 18 39659
1 2028478494862525422475607 false 19 39148
1 2028478494862525422475607 false 20 39759
1 2028478494862525422475607 false 21 39579
1 2028478494862525422475607 false 22 39429
1 2028478494862525422475607 false 23 42113
1 2028478494862525422475607 false 24 39428
1 2028478494862525422475607 false 25 39889
1 2028478494862525422475607 false 26 39398
1 2028478494862525422475607 false 27 39628
1 2028478494862525422475607 false 28 39929
1 2028478494862525422475607 false 29 39939
1 2028478494862525422475607 false 30 40270
1 2028478494862525422475607 false 31 39689
1 2028478494862525422475607 false 32 39678
1 2028478494862525422475607 false 33 39629
1 2028478494862525422475607 false 34 39970
1 2028478494862525422475607 false 35 39859
1 2028478494862525422475607 false 36 39709
1 2028478494862525422475607 false 37 39880
1 2028478494862525422475607 false 38 39739
1 2028478494862525422475607 false 39 39609
1 2028478494862525422475607 false 40 39829
1 2028478494862525422475607 false 41 39719
1 2028478494862525422475607 false 42 39979
1 2028478494862525422475607 false 43 39989
1 2028478494862525422475607 false 44 39969
1 2028478494862525422475607 false 45 42123
1 2028478494862525422475607 false 46 39749
1 2028478494862525422475607 false 47 39989
1 2028478494862525422475607 false 48 39749
1 2028478494862525422475607 false 49 39599
1 2028478494862525422475607 false 50 39759
1 2028478494862525422475607 false 51 39799
1 2028478494862525422475607 false 52 39959
1 2028478494862525422475607 false 53 40000
1 2028478494862525422475607 false 54 40010
1 2028478494862525422475607 false 55 39799
1 2028478494862525422475607 false 56 39849
1 2028478494862525422475607 false 57 39789
1 2028478494862525422475607 false 58 39879
1 2028478494862525422475607 false 59 40480
1 2028478494862525422475607 false 60 39499
1 2028478494862525422475607 false 61 40119
1 2028478494862525422475607 false 62 39628
1 2028478494862525422475607 false 63 39629
2 69 false 0 48342
2 69 false 1 46669
2 69 false 2 47831
2 69 false 3 45678
2 69 false 4 45428
2 69 false 5 44927
2 69 false 6 44846
2 69 false 7 45107
2 69 false 8 44737
2 69 false 9 45197
2 69 false 10 44786
2 69 false 11 44776
2 69 false 12 44857
2 69 false 13 44786
2 69 false 14 44726
2 69 false 15 45097
2 69 false 16 45047
2 69 false 17 44956
2 69 false 18 44786
2 69 false 19 45297
2 69 false 20 44876
2 69 false 21 45167
2 69 false 22 45508
2 69 false 23 47581
2 69 false 24 44526
2 69 false 25 44776
2 69 false 26 44746
2 69 false 27 44816
2 69 false 28 44796
2 69 false 29 44616
2 69 false 30 45147
2 69 false 31 45017
2 69 false 32 45057
2 69 false 33 44806
2 69 false 34 45157
2 69 false 35 44737
2 69 false 36 45017
2 69 false 37 44506
2 69 false 38 44887
2 69 false 39 44776
2 69 false 40 45137
2 69 false 41 44957
2 69 false 42 45237
2 69 false 43 45017
2 69 false 44 45077
2 69 false 45 48091
2 69 false 46 45157
2 69 false 47 45167
2 69 false 48 44866
2 69 false 49 44396
2 69 false 50 45067
2 69 false 51 45187
2 69 false 52 44736
2 69 false 53 44686
2 69 false 54 44837
2 69 false 55 44596
2 69 false 56 44946
2 69 false 57 45197
2 69 false 58 45007
2 69 false 59 44987
2 69 false 60 44797
2 69 false 61 45117
2 69 false 62 45287
2 69 false 63 44747
2 69 true 0 20760
2 69 true 1 19479
2 69 true 2 18718
2 69 true 3 21051
2 69 true 4 18738
2 69 true 5 18518
2 69 true 6 18348
2 69 true 7 18688
2 69 true 8 18067
2 69 true 9 18387
2 69 true 10 18408
2 69 true 11 18467
2 69 true 12 18518
2 69 true 13 18458
2 69 true 14 18207
2 69 true 15 18567
2 69 true 16 18447
2 69 true 17 18297
2 69 true 18 18647
2 69 true 19 18197
2 69 true 20 18117
2 69 true 21 18167
2 69 true 22 18418
2 69 true 23 18418
2 69 true 24 18437
2 69 true 25 18107
2 69 true 26 18177
2 69 true 27 18177
2 69 true 28 18197
2 69 true 29 18337
2 69 true 30 18256
2 69 true 31 18227
2 69 true 32 18147
2 69 true 33 18277
2 69 true 34 18357
2 69 true 35 18448
2 69 true 36 18258
2 69 true 37 18387
2 69 true 38 18257
2 69 true 39 18257
2 69 true 40 18307
2 69 true 41 18237
2 69 true 42 18427
2 69 true 43 18298
2 69 true 44 18267
2 69 true 45 18477
2 69 true 46 18096
2 69 true 47 18327
2 69 true 48 18417
2 69 true 49 18547
2 69 true 50 18417
2 69 true 51 18357
2 69 true 52 18458
2 69 true 53 21853
2 69 true 54 18497
2 69 true 55 18447
2 69 true 56 18327
2 69 true 57 18568
2 69 true 58 18337
2 69 true 59 18258
2 69 true 60 18237
2 69 true 61 18327
2 69 true 62 18378
2 69 true 63 18518
2 4028945 false 0 43274
2 4028945 false 1 40770
2 4028945 false 2 40089
2 4028945 false 3 39398
2 4028945 false 4 39708
2 4028945 false 5 38878
2 4028945 false 6 39419
2 4028945 false 7 39439
2 4028945 false 8 39088
2 4028945 false 9 39298
2 4028945 false 10 39298
2 4028945 false 11 39189
2 4028945 false 12 38928
2 4028945 false 13 39178
2 4028945 false 14 39198
2 4028945 false 15 38667
2 4028945 false 16 38988
2 4028945 false 17 41411
2 4028945 false 18 38928
2 4028945 false 19 39118
2 4028945 false 20 39008
2 4028945 false 21 39068
2 4028945 false 22 38847
2 4028945 false 23 39218
2 4028945 false 24 38897
2 4028945 false 25 39218
2 4028945 false 26 38807
2 4028945 false 27 38697
2 4028945 false 28 39438
2 4028945 false 29 38537
2 4028945 false 30 39169
2 4028945 false 31 38607
2 4028945 false 32 39038
2 4028945 false 33 38698
2 4028945 false 34 38987
2 4028945 false 35 39418
2 4028945 false 36 39058
2 4028945 false 37 38958
2 4028945 false 38 38917
2 4028945 false 39 39168
2 4028945 false 40 39228
2 4028945 false 41 38988
2 4028945 false 42 41732
2 4028945 false 43 38807
2 4028945 false 44 39008
2 4028945 false 45 39299
2 4028945 false 46 39008
2 4028945 false 47 38847
2 4028945 false 48 39058
2 4028945 false 49 38728
2 4028945 false 50 38988
2 4028945 false 51 38968
2 4028945 false 52 39148
2 4028945 false 53 39168
2 4028945 false 54 39238
2 4028945 false 55 39259
2 4028945 false 56 38828
2 4028945 false 57 38928
2 4028945 false 58 39179
2 4028945 false 59 39319
2 4028945 false 60 39368
2 4028945 false 61 38888
2 4028945 false 62 39308
2 4028945 false 63 38858
2 4028945 true 0 20620
2 4028945 true 1 19259
2 4028945 true 2 19029
2 4028945 true 3 25778
2 4028945 true 4 18708
2 4028945 true 5 18418
2 4028945 true 6 18197
2 4028945 true 7 18227
2 4028945 true 8 18367
2 4028945 true 9 18207
2 4028945 true 10 18087
2 4028945 true 11 18417
2 4028945 true 12 18467
2 4028945 true 13 18357
2 4028945 true 14 18308
2 4028945 true 15 18077
2 4028945 true 16 18427
2 4028945 true 17 18247
2 4028945 true 18 18207
2 4028945 true 19 18137
2 4028945 true 20 18337
2 4028945 true 21 18368
2 4028945 true 22 18327
2 4028945 true 23 18197
2 4028945 true 24 18207
2 4028945 true 25 18367
2 4028945 true 26 18407
2 4028945 true 27 18328
2 4028945 true 28 18017
2 4028945 true 29 18378
2 4028945 true 30 18408
2 4028945 true 31 18277
2 4028945 true 32 18227
2 4028945 true 33 18227
2 4028945 true 34 18137
2 4028945 true 35 18297
2 4028945 true 36 18297
2 4028945 true 37 18247
2 4028945 true 38 18137
2 4028945 true 39 18197
2 4028945 true 40 18117
2 4028945 true 41 18448
2 4028945 true 42 18437
2 4028945 true 43 18568
2 4028945 true 44 18347
2 4028945 true 45 18517
2 4028945 true 46 18307
2 4028945 true 47 18428
2 4028945 true 48 18207
2 4028945 true 49 18287
2 4028945 true 50 18156
2 4028945 true 51 18337
2 4028945 true 52 20881
2 4028945 true 53 18537
2 4028945 true 54 18237
2 4028945 true 55 18176
2 4028945 true 56 18297
2 4028945 true 57 18197
2 4028945 true 58 18227
2 4028945 true 59 18327
2 4028945 true 60 18348
2 4028945 true 61 18447
2 4028945 true 62 18377
2 4028945 true 63 18137
2 2028478494862525422475607 false 0 43195
2 2028478494862525422475607 false 1 41482
2 2028478494862525422475607 false 2 40691
2 2028478494862525422475607 false 3 40190
2 2028478494862525422475607 false 4 39688
2 2028478494862525422475607 false 5 99628
2 2028478494862525422475607 false 6 40259
2 2028478494862525422475607 false 7 39959
2 2028478494862525422475607 false 8 40680
2 2028478494862525422475607 false 9 39869
2 2028478494862525422475607 false 10 39999
2 2028478494862525422475607 false 11 40009
2 2028478494862525422475607 false 12 39739
2 2028478494862525422475607 false 13 40119
2 2028478494862525422475607 false 14 42282
2 2028478494862525422475607 false 15 40029
2 2028478494862525422475607 false 16 39879
2 2028478494862525422475607 false 17 39568
2 2028478494862525422475607 false 18 39709
2 2028478494862525422475607 false 19 39950
2 2028478494862525422475607 false 20 39669
2 2028478494862525422475607 false 21 40049
2 2028478494862525422475607 false 22 40149
2 2028478494862525422475607 false 23 40079
2 2028478494862525422475607 false 24 40270
2 2028478494862525422475607 false 25 39900
2 2028478494862525422475607 false 26 39679
2 2028478494862525422475607 false 27 40179
2 2028478494862525422475607 false 28 39639
2 2028478494862525422475607 false 29 40129
2 2028478494862525422475607 false 30 40450
2 2028478494862525422475607 false 31 39578
2 2028478494862525422475607 false 32 39499
2 2028478494862525422475607 false 33 39519
2 2028478494862525422475607 false 34 39479
2 2028478494862525422475607 false 35 39950
2 2028478494862525422475607 false 36 39559
2 2028478494862525422475607 false 37 40490
2 2028478494862525422475607 false 38 40270
2 2028478494862525422475607 false 39 40119
2 2028478494862525422475607 false 40 39759
2 2028478494862525422475607 false 41 40190
2 2028478494862525422475607 false 42 39889
2 2028478494862525422475607 false 43 39879
2 2028478494862525422475607 false 44 39799
2 2028478494862525422475607 false 45 39739
2 2028478494862525422475607 false 46 39889
2 2028478494862525422475607 false 47 39328
2 2028478494862525422475607 false 48 39559
2 2028478494862525422475607 false 49 39689
2 2028478494862525422475607 false 50 39859
2 2028478494862525422475607 false 51 39599
2 2028478494862525422475607 false 52 39819
2 2028478494862525422475607 false 53 39929
2 2028478494862525422475607 false 54 39508
2 2028478494862525422475607 false 55 39899
2 2028478494862525422475607 false 56 39949
2 2028478494862525422475607 false 57 39810
2 2028478494862525422475607 false 58 39709
2 2028478494862525422475607 false 59 43155
2 2028478494862525422475607 false 60 39779
2 2028478494862525422475607 false 61 40129
2 2028478494862525422475607 false 62 39748
2 2028478494862525422475607 false 63 39909
2 2028478494862525422475607 true 0 22564
2 2028478494862525422475607 true 1 21011
2 2028478494862525422475607 true 2 20070
2 2028478494862525422475607 true 3 19679
2 2028478494862525422475607 true 4 19499
2 2028478494862525422475607 true 5 19609
2 2028478494862525422475607 true 6 19599
2 2028478494862525422475607 true 7 19619
2 2028478494862525422475607 true 8 19539
2 2028478494862525422475607 true 9 19549
2 2028478494862525422475607 true 10 19780
2 2028478494862525422475607 true 11 19599
2 2028478494862525422475607 true 12 19859
2 2028478494862525422475607 true 13 19709
2 2028478494862525422475607 true 14 19549
2 2028478494862525422475607 true 15 19579
2 2028478494862525422475607 true 16 19600
2 2028478494862525422475607 true 17 19629
2 2028478494862525422475607 true 18 19509
2 2028478494862525422475607 true 19 19549
2 2028478494862525422475607 true 20 19259
2 2028478494862525422475607 true 21 19399
2 2028478494862525422475607 true 22 19809
2 2028478494862525422475607 true 23 19869
2 2028478494862525422475607 true 24 19468
2 2028478494862525422475607 true 25 19699
2 2028478494862525422475607 true 26 19639
2 2028478494862525422475607 true 27 19840
2 2028478494862525422475607 true 28 19559
2 2028478494862525422475607 true 29 19619
2 2028478494862525422475607 true 30 19629
2 2028478494862525422475607 true 31 23384
2 2028478494862525422475607 true 32 19699
2 2028478494862525422475607 true 33 19699
2 2028478494862525422475607 true 34 19549
2 2028478494862525422475607 true 35 19769
2 2028478494862525422475607 true 36 19889
2 2028478494862525422475607 true 37 19849
2 2028478494862525422475607 true 38 19919
2 2028478494862525422475607 true 39 19879
2 2028478494862525422475607 true 40 19779
2 2028478494862525422475607 true 41 19539
2 2028478494862525422475607 true 42 19779
2 2028478494862525422475607 true 43 19759
2 2028478494862525422475607 true 44 19759
2 2028478494862525422475607 true 45 19949
2 2028478494862525422475607 true 46 19669
2 2028478494862525422475607 true 47 19760
2 2028478494862525422475607 true 48 19559
2 2028478494862525422475607 true 49 19739
2 2028478494862525422475607 true 50 19539
2 2028478494862525422475607 true 51 19679
2 2028478494862525422475607 true 52 19620
2 2028478494862525422475607 true 53 19970
2 2028478494862525422475607 true 54 19389
2 2028478494862525422475607 true 55 19839
2 2028478494862525422475607 true 56 20009
2 2028478494862525422475607 true 57 19639
2 2028478494862525422475607 true 58 19700
2 2028478494862525422475607 true 59 19479
2 2028478494862525422475607 true 60 19540
2 2028478494862525422475607 true 61 19779
2 2028478494862525422475607 true 62 19449
2 2028478494862525422475607 true 63 19399
3 69 true 0 19419
3 69 true 1 19078
3 69 true 2 18587
3 69 true 3 18718
3 69 true 4 18317
3 69 true 5 18297
3 69 true 6 18287
3 69 true 7 18558
3 69 true 8 21773
3 69 true 9 18517
3 69 true 10 18397
3 69 true 11 18347
3 69 true 12 18278
3 69 true 13 18548
3 69 true 14 18257
3 69 true 15 18277
3 69 true 16 18278
3 69 true 17 18307
3 69 true 18 18227
3 69 true 19 18207
3 69 true 20 18468
3 69 true 21 18377
3 69 true 22 18257
3 69 true 23 18317
3 69 true 24 18137
3 69 true 25 18087
3 69 true 26 18247
3 69 true 27 18097
3 69 true 28 18387
3 69 true 29 18287
3 69 true 30 18077
3 69 true 31 18147
3 69 true 32 18247
3 69 true 33 18478
3 69 true 34 18488
3 69 true 35 18688
3 69 true 36 18267
3 69 true 37 18277
3 69 true 38 18257
3 69 true 39 18077
3 69 true 40 18087
3 69 true 41 18117
3 69 true 42 18127
3 69 true 43 18227
3 69 true 44 18077
3 69 true 45 18287
3 69 true 46 18087
3 69 true 47 18047
3 69 true 48 18167
3 69 true 49 18137
3 69 true 50 18107
3 69 true 51 18087
3 69 true 52 18227
3 69 true 53 18367
3 69 true 54 18357
3 69 true 55 18478
3 69 true 56 18348
3 69 true 57 18057
3 69 true 58 20881
3 69 true 59 18397
3 69 true 60 18107
3 69 true 61 18107
3 69 true 62 18106
3 69 true 63 18147
3 69 false 0 49193
3 69 false 1 46779
3 69 false 2 45838
3 69 false 3 45507
3 69 false 4 45217
3 69 false 5 45207
3 69 false 6 45217
3 69 false 7 45427
3 69 false 8 45357
3 69 false 9 45037
3 69 false 10 45317
3 69 false 11 44757
3 69 false 12 44496
3 69 false 13 45137
3 69 false 14 44896
3 69 false 15 44726
3 69 false 16 44686
3 69 false 17 47500
3 69 false 18 45357
3 69 false 19 44976
3 69 false 20 45087
3 69 false 21 44786
3 69 false 22 44786
3 69 false 23 44986
3 69 false 24 45297
3 69 false 25 45027
3 69 false 26 44987
3 69 false 27 44806
3 69 false 28 45147
3 69 false 29 44516
3 69 false 30 45047
3 69 false 31 44627
3 69 false 32 44847
3 69 false 33 44597
3 69 false 34 44967
3 69 false 35 45228
3 69 false 36 45007
3 69 false 37 44757
3 69 false 38 47601
3 69 false 39 45558
3 69 false 40 45537
3 69 false 41 44736
3 69 false 42 45507
3 69 false 43 44436
3 69 false 44 44636
3 69 false 45 45137
3 69 false 46 45017
3 69 false 47 44707
3 69 false 48 45087
3 69 false 49 45027
3 69 false 50 44917
3 69 false 51 44907
3 69 false 52 44546
3 69 false 53 45027
3 69 false 54 44726
3 69 false 55 44916
3 69 false 56 44776
3 69 false 57 45137
3 69 false 58 44606
3 69 false 59 44696
3 69 false 60 44807
3 69 false 61 44977
3 69 false 62 45097
3 69 false 63 45147
3 4028945 true 0 20611
3 4028945 true 1 19759
3 4028945 true 2 18538
3 4028945 true 3 18598
3 4028945 true 4 18458
3 4028945 true 5 18338
3 4028945 true 6 18407
3 4028945 true 7 18337
3 4028945 true 8 18287
3 4028945 true 9 18528
3 4028945 true 10 18638
3 4028945 true 11 18297
3 4028945 true 12 18137
3 4028945 true 13 18237
3 4028945 true 14 18448
3 4028945 true 15 18638
3 4028945 true 16 18528
3 4028945 true 17 18327
3 4028945 true 18 18508
3 4028945 true 19 18377
3 4028945 true 20 18457
3 4028945 true 21 18337
3 4028945 true 22 18327
3 4028945 true 23 18297
3 4028945 true 24 18427
3 4028945 true 25 18257
3 4028945 true 26 18127
3 4028945 true 27 18297
3 4028945 true 28 18658
3 4028945 true 29 18587
3 4028945 true 30 18547
3 4028945 true 31 18337
3 4028945 true 32 18227
3 4028945 true 33 18277
3 4028945 true 34 18417
3 4028945 true 35 18428
3 4028945 true 36 18388
3 4028945 true 37 18547
3 4028945 true 38 20560
3 4028945 true 39 18187
3 4028945 true 40 18237
3 4028945 true 41 18307
3 4028945 true 42 18267
3 4028945 true 43 18287
3 4028945 true 44 18507
3 4028945 true 45 18207
3 4028945 true 46 18438
3 4028945 true 47 18147
3 4028945 true 48 18187
3 4028945 true 49 18427
3 4028945 true 50 18167
3 4028945 true 51 18197
3 4028945 true 52 18327
3 4028945 true 53 18417
3 4028945 true 54 18448
3 4028945 true 55 18538
3 4028945 true 56 18247
3 4028945 true 57 18588
3 4028945 true 58 18397
3 4028945 true 59 18578
3 4028945 true 60 18588
3 4028945 true 61 18237
3 4028945 true 62 18417
3 4028945 true 63 18347
3 4028945 false 0 42834
3 4028945 false 1 40520
3 4028945 false 2 40090
3 4028945 false 3 39219
3 4028945 false 4 38848
3 4028945 false 5 39508
3 4028945 false 6 39228
3 4028945 false 7 39129
3 4028945 false 8 39178
3 4028945 false 9 38807
3 4028945 false 10 50705
3 4028945 false 11 56284
3 4028945 false 12 56304
3 4028945 false 13 62632
3 4028945 false 14 54000
3 4028945 false 15 39368
3 4028945 false 16 39198
3 4028945 false 17 39538
3 4028945 false 18 38797
3 4028945 false 19 39198
3 4028945 false 20 39528
3 4028945 false 21 39348
3 4028945 false 22 39068
3 4028945 false 23 39068
3 4028945 false 24 38938
3 4028945 false 25 38908
3 4028945 false 26 38777
3 4028945 false 27 38977
3 4028945 false 28 39028
3 4028945 false 29 39589
3 4028945 false 30 39899
3 4028945 false 31 39158
3 4028945 false 32 41922
3 4028945 false 33 39108
3 4028945 false 34 39037
3 4028945 false 35 39048
3 4028945 false 36 39209
3 4028945 false 37 39359
3 4028945 false 38 38988
3 4028945 false 39 39208
3 4028945 false 40 39178
3 4028945 false 41 39439
3 4028945 false 42 39048
3 4028945 false 43 38737
3 4028945 false 44 38998
3 4028945 false 45 39078
3 4028945 false 46 39178
3 4028945 false 47 39259
3 4028945 false 48 39008
3 4028945 false 49 38817
3 4028945 false 50 38828
3 4028945 false 51 38948
3 4028945 false 52 38808
3 4028945 false 53 38897
3 4028945 false 54 39058
3 4028945 false 55 39048
3 4028945 false 56 41842
3 4028945 false 57 39098
3 4028945 false 58 39088
3 4028945 false 59 38968
3 4028945 false 60 39408
3 4028945 false 61 39278
3 4028945 false 62 39578
3 4028945 false 63 39068
3 2028478494862525422475607 true 0 22613
3 2028478494862525422475607 true 1 20890
3 2028478494862525422475607 true 2 19940
3 2028478494862525422475607 true 3 20179
3 2028478494862525422475607 true 4 19138
3 2028478494862525422475607 true 5 19419
3 2028478494862525422475607 true 6 19439
3 2028478494862525422475607 true 7 19278
3 2028478494862525422475607 true 8 19419
3 2028478494862525422475607 true 9 19449
3 2028478494862525422475607 true 10 19209
3 2028478494862525422475607 true 11 19189
3 2028478494862525422475607 true 12 19419
3 2028478494862525422475607 true 13 19398
3 2028478494862525422475607 true 14 19329
3 2028478494862525422475607 true 15 19569
3 2028478494862525422475607 true 16 19389
3 2028478494862525422475607 true 17 19589
3 2028478494862525422475607 true 18 19839
3 2028478494862525422475607 true 19 19669
3 2028478494862525422475607 true 20 19539
3 2028478494862525422475607 true 21 19849
3 2028478494862525422475607 true 22 19579
3 2028478494862525422475607 true 23 19560
3 2028478494862525422475607 true 24 19509
3 2028478494862525422475607 true 25 19618
3 2028478494862525422475607 true 26 19729
3 2028478494862525422475607 true 27 22093
3 2028478494862525422475607 true 28 19669
3 2028478494862525422475607 true 29 19479
3 2028478494862525422475607 true 30 19900
3 2028478494862525422475607 true 31 19609
3 2028478494862525422475607 true 32 19479
3 2028478494862525422475607 true 33 19489
3 2028478494862525422475607 true 34 19539
3 2028478494862525422475607 true 35 19629
3 2028478494862525422475607 true 36 19609
3 2028478494862525422475607 true 37 19489
3 2028478494862525422475607 true 38 19419
3 2028478494862525422475607 true 39 19649
3 2028478494862525422475607 true 40 19649
3 2028478494862525422475607 true 41 19509
3 2028478494862525422475607 true 42 19649
3 2028478494862525422475607 true 43 19509
3 2028478494862525422475607 true 44 19549
3 2028478494862525422475607 true 45 19839
3 2028478494862525422475607 true 46 19719
3 2028478494862525422475607 true 47 19639
3 2028478494862525422475607 true 48 19639
3 2028478494862525422475607 true 49 19559
3 2028478494862525422475607 true 50 19439
3 2028478494862525422475607 true 51 20079
3 2028478494862525422475607 true 52 19529
3 2028478494862525422475607 true 53 19600
3 2028478494862525422475607 true 54 19599
3 2028478494862525422475607 true 55 19509
3 2028478494862525422475607 true 56 19599
3 2028478494862525422475607 true 57 19629
3 2028478494862525422475607 true 58 19329
3 2028478494862525422475607 true 59 19289
3 2028478494862525422475607 true 60 19529
3 2028478494862525422475607 true 61 19369
3 2028478494862525422475607 true 62 19389
3 2028478494862525422475607 true 63 19509
3 2028478494862525422475607 false 0 43654
3 2028478494862525422475607 false 1 45317
3 2028478494862525422475607 false 2 40800
3 2028478494862525422475607 false 3 40430
3 2028478494862525422475607 false 4 40389
3 2028478494862525422475607 false 5 39929
3 2028478494862525422475607 false 6 39889
3 2028478494862525422475607 false 7 39388
3 2028478494862525422475607 false 8 39799
3 2028478494862525422475607 false 9 39499
3 2028478494862525422475607 false 10 39698
3 2028478494862525422475607 false 11 39909
3 2028478494862525422475607 false 12 39799
3 2028478494862525422475607 false 13 39668
3 2028478494862525422475607 false 14 39649
3 2028478494862525422475607 false 15 39969
3 2028478494862525422475607 false 16 40339
3 2028478494862525422475607 false 17 39939
3 2028478494862525422475607 false 18 39679
3 2028478494862525422475607 false 19 39900
3 2028478494862525422475607 false 20 39729
3 2028478494862525422475607 false 21 39769
3 2028478494862525422475607 false 22 39769
3 2028478494862525422475607 false 23 42112
3 2028478494862525422475607 false 24 39969
3 2028478494862525422475607 false 25 39949
3 2028478494862525422475607 false 26 39318
3 2028478494862525422475607 false 27 39638
3 2028478494862525422475607 false 28 39779
3 2028478494862525422475607 false 29 39559
3 2028478494862525422475607 false 30 39689
3 2028478494862525422475607 false 31 39940
3 2028478494862525422475607 false 32 39699
3 2028478494862525422475607 false 33 39438
3 2028478494862525422475607 false 34 39659
3 2028478494862525422475607 false 35 39619
3 2028478494862525422475607 false 36 39528
3 2028478494862525422475607 false 37 39669
3 2028478494862525422475607 false 38 39820
3 2028478494862525422475607 false 39 39939
3 2028478494862525422475607 false 40 39749
3 2028478494862525422475607 false 41 39668
3 2028478494862525422475607 false 42 39769
3 2028478494862525422475607 false 43 39949
3 2028478494862525422475607 false 44 40080
3 2028478494862525422475607 false 45 39339
3 2028478494862525422475607 false 46 42123
3 2028478494862525422475607 false 47 39859
3 2028478494862525422475607 false 48 39539
3 2028478494862525422475607 false 49 40220
3 2028478494862525422475607 false 50 39969
3 2028478494862525422475607 false 51 39969
3 2028478494862525422475607 false 52 39890
3 2028478494862525422475607 false 53 39699
3 2028478494862525422475607 false 54 39969
3 2028478494862525422475607 false 55 40309
3 2028478494862525422475607 false 56 39769
3 2028478494862525422475607 false 57 39669
3 2028478494862525422475607 false 58 39609
3 2028478494862525422475607 false 59 39448
3 2028478494862525422475607 false 60 39829
3 2028478494862525422475607 false 61 39909
3 2028478494862525422475607 false 62 39959
3 2028478494862525422475607 false 63 40220
[
{
"n": 37,
"e": 2,
"F": 4,
"r": 1,
"s": 1,
"m": 1,
"root": 2,
"mode": ".lt",
"bits": 6
},
{
"n": 197,
"e": 2,
"F": 4,
"r": 1,
"s": 6,
"m": 2,
"root": 2,
"mode": ".lt",
"bits": 8
},
{
"n": 9223372036904058881,
"e": 20,
"F": 1048576,
"r": 47,
"s": 4194304,
"m": 4,
"root": 3,
"mode": ".lt",
"bits": 64
},
{
"n": 10633823966279326983230477372963684353,
"e": 40,
"F": 1099511627776,
"r": 19,
"s": 4398046511104,
"m": 4,
"root": 5,
"mode": ".lt",
"bits": 124
},
{
"n": 14134776518227074636666380005943348126619871175013414145710152014563901441,
"e": 80,
"F": 1208925819614629174706176,
"r": 7,
"s": 4835703278458516698824704,
"m": 4,
"root": 13,
"mode": ".lt",
"bits": 244
},
{
"n": 24973988402527937851052777838345330445988785141319769206873255677002973910558124960962448824508223685101169636846139109075628913189178501161287681,
"e": 160,
"F": 1461501637330902918203684832716283019655932542976,
"r": 197,
"s": 5846006549323611672814739330865132078623730171904,
"m": 4,
"root": 3,
"mode": ".lt",
"bits": 484
}
]
import math,json
from pathlib import Path
def probable(n):
d=n-1;s=0
while d%2==0:d//=2;s+=1
for a in (2,3,5,7,11,13,17,19,23,29,31,37):
x=pow(a,d,n)
if x in (1,n-1):continue
for _ in range(s-1):
x=x*x%n
if x==n-1:break
else:return False
return True
def case(n,e):
F=2**e;R=(n-1)//F;r=R%(2*F);s=R//(2*F)
for m in range(1,65):
if 2*s+m*m<(2*F+r)*m+2:break
else:return None
if any(n%(l*F+1)==0 for l in range(1,m)):return None
d=r*r-8*s;w=math.isqrt(max(d,0))
if s: mode='.lt' if d<0 else f'(.interval {w})' if w*w<d else None
else:mode='.zero'
if mode is None:return None
for a in range(2,100):
if pow(a,n-1,n)==1 and math.gcd(pow(a,(n-1)//2,n)-1,n)==1:break
else:return None
return dict(n=n,e=e,F=F,r=r,s=s,m=m,root=a,mode=mode,bits=n.bit_length())
cases=[case(37,2),case(197,2)]
for e in [20,40,80,160]:
for k in range(1,10001,2):
n=2**(3*e+3)+k*2**e+1
if probable(n):
c=case(n,e)
if c:cases.append(c);break
print(json.dumps(cases,indent=2));Path('/tmp/pock3-investigation/cases.json').write_text(json.dumps(cases,indent=2))
s='module\nimport PrimeCert.Pocklington3\nset_option maxRecDepth 10000\n'
for c in cases:
s+=f'\nexample : Nat.Prime {c["n"]} :=\n PrimeCert.pocklington3_certK {c["n"]} {c["root"]} {c["m"]} {c["e"]} [] {c["mode"]} (by decide +kernel)\n'
# Show m=1 fails for the same witnesses and F.
if c['m']>1:s+=f'\nexample : PrimeCert.pocklington3_calculate {c["n"]} {c["e"]} {c["root"]} 1 [] {c["mode"]} = false := by decide +kernel\n'
Path('/tmp/pock3-investigation/Examples.lean').write_text(s)
p=Path('/home/kim/worktrees/PrimeCert/primecert-interval/PrimeCertTest/Investigation.lean');assert not p.exists();p.write_text(s)
import HexPrimality.Cert
example : Hex.Nat.Prime 37 :=
Hex.Nat.prime_of_checkPrimeAt
(c := .pock3 37 1 1 0 [(2, 1, .small 2)]) (by decide +kernel)
example : Hex.Nat.checkPrime (.pock3 197 1 6 0 [(2, 1, .small 2)]) = false := by
decide +kernel

Pocklington sieve-bound and pure-power investigation

Findings

PrimeCert at 7d015f6 accepts an empty odd-factor list in pocklington3_certK; only its pock3 syntax and #171 construction filter exclude this. The existing theorem proves 37 with F=4, root=2, m=1, negative discriminant. Hex's current checker accepts the corresponding literal (see HexExamples.lean).

The m=1 restriction is substantive in both search implementations. PrimeCert already proves the general theorem, while Hex Cert3.lean and checkPock3Arith specialize it to m=1. For n=197 and F=4, m=2 succeeds by additionally excluding the divisor 5. Both PrimeCert's m=1 arithmetic and Hex's existing checker reject that same factor product.

Examples.lean kernel-checks six direct proofs with F a power of two. Four constructed examples of 64, 124, 244 and 484 bits use m=4 and therefore just three extra divisibility tests. The same file checks that m=1 fails on those inputs. These are constructed examples, not standard cryptographic primes. cases.json records all parameters. find.py uses an untrusted probable-prime screen to find candidates; only the successful Lean builds establish primality.

Existing example certificates

Allowing m up to 64 in a diagnostic subset sweep finds smaller factor sets for five nodes in PrimeCertTest/PrimeListTest.lean (subsets.json). Two changes were validated in full kernel-checked ladders and timed:

Existing example Change Original m=1 ladder Modified ladder Reduction
Curve25519 Remove factor 3 from the 236-bit child, m=14 18.109 ms 15.812 ms 12.7%
Curve448 Remove factor 641 from the root, m=3 34.161 ms 27.925 ms 18.3%

These are full proof-term kernel checks of the existing example ladders on the interval PR, without #172's windowed powMod, not the different minimized ladder emitted by #171 and not Hex's optimized certificates. Every sample uses a fresh Kernel.check after imports, proof elaboration and term construction. Four adjacent alternating AB/BA blocks, eight samples per arm per block, pinned CPU 0 on the shared host; all completed samples retained. Each block favored the modified ladder. No native construction timings were collected. Failed build records are retained separately; these produced no timing samples.

Reproduce by copying Bench.lean to PrimeCertTest/InvestigationBench.lean at PrimeCert commit 7d015f68161bed3d07c3baea236f137ae39b531b, then running POCK3_SAMPLES=/tmp/pock3-samples.csv lake build PrimeCertTest.InvestigationBench. Examples.lean and HexExamples.lean can likewise be placed as temporary modules in the corresponding libraries and checked with lake build.

Recommendation

Fix the PrimeCert syntax to accept a lone power of two and remove the corresponding construction exclusion. Allow construction to use a bounded, explicitly budgeted m, sharing the existing minimum-m calculation and checking the added divisibility obligations. Include the cost of m-1 divisions in subset selection; fewer factors alone is not a replay-cost model.

For Hex, no power-of-two fix is needed. Supporting m>1 requires a Mathlib-free generalization of the theorem, checker and certificate representation, with existing m=1 literals retained. This should be a separate checker change.

Both construction routes currently call their factor provider before subset selection. Supporting m>1 alone can reduce recursive certificate and replay work, but will not automatically skip work already spent factoring. A further optimization is to try certificates from cheaply available partial factors before spending the remaining factor budget.

No PRs or tracked source files were changed during this investigation.

{
"cpu": 0,
"load_before": [
3.39013671875,
5.1552734375,
5.43798828125
],
"stdout": "\u26a0 [1308/1308] Built PrimeCertTest.InvestigationBench (4.0s)\nwarning: PrimeCertTest/InvestigationBench.lean:1:0: The current module only contains private declarations.\n\nConsider adding `@[expose] public section` at the beginning of the module, or selectively marking declarations as `public`.\n\nNote: This linter can be disabled with `set_option linter.privateModule false`\nBuild completed successfully (1308 jobs).\n",
"stderr": "",
"returncode": 0,
"load_after": [
3.439453125,
5.1357421875,
5.43017578125
]
}
0 255 false 0 19912630
0 255 false 1 18314700
0 255 false 2 18103848
0 255 false 3 18268793
0 255 false 4 18228373
0 255 false 5 18303955
0 255 false 6 18230036
0 255 false 7 18284145
0 255 true 0 15927692
0 255 true 1 16027200
0 255 true 2 15916276
0 255 true 3 15991717
0 255 true 4 16016003
0 255 true 5 15953310
0 255 true 6 15963365
0 255 true 7 15688177
0 448 false 0 34662196
0 448 false 1 34235793
0 448 false 2 34184177
0 448 false 3 35082338
0 448 false 4 33977911
0 448 false 5 34356122
0 448 false 6 34471032
0 448 false 7 34484823
0 448 true 0 27969834
0 448 true 1 28059487
0 448 true 2 28110293
0 448 true 3 27857337
0 448 true 4 33583195
0 448 true 5 28963027
0 448 true 6 28127989
0 448 true 7 28098535
1 255 true 0 16315477
1 255 true 1 15841795
1 255 true 2 15782026
1 255 true 3 15890978
1 255 true 4 15870157
1 255 true 5 15859021
1 255 true 6 15914503
1 255 true 7 15955043
1 255 false 0 18594967
1 255 false 1 18305367
1 255 false 2 18321761
1 255 false 3 18244827
1 255 false 4 18442921
1 255 false 5 18294070
1 255 false 6 18341520
1 255 false 7 18280470
1 448 true 0 28621440
1 448 true 1 28261287
1 448 true 2 27879510
1 448 true 3 28229960
1 448 true 4 28091405
1 448 true 5 28024815
1 448 true 6 28191854
1 448 true 7 27647396
1 448 false 0 33953205
1 448 false 1 34143947
1 448 false 2 34121975
1 448 false 3 34529709
1 448 false 4 34177427
1 448 false 5 34010559
1 448 false 6 34032992
1 448 false 7 34082235
2 255 false 0 18113963
2 255 false 1 17987646
2 255 false 2 17982858
2 255 false 3 17997621
2 255 false 4 17989419
2 255 false 5 17970411
2 255 false 6 17971412
2 255 false 7 17982128
2 255 true 0 15727776
2 255 true 1 15739503
2 255 true 2 15723169
2 255 true 3 16198354
2 255 true 4 15750670
2 255 true 5 15682980
2 255 true 6 15663691
2 255 true 7 15773214
2 448 false 0 34524922
2 448 false 1 34143466
2 448 false 2 34066673
2 448 false 3 34124819
2 448 false 4 34193480
2 448 false 5 34174792
2 448 false 6 34147182
2 448 false 7 34147763
2 448 true 0 27710420
2 448 true 1 27716168
2 448 true 2 27665062
2 448 true 3 27729538
2 448 true 4 27742897
2 448 true 5 27685382
2 448 true 6 28802198
2 448 true 7 28024585
3 255 true 0 15881094
3 255 true 1 15727746
3 255 true 2 15742988
3 255 true 3 15719804
3 255 true 4 15755317
3 255 true 5 15740705
3 255 true 6 15748486
3 255 true 7 15732123
3 255 false 0 18014465
3 255 false 1 18016429
3 255 false 2 18044761
3 255 false 3 18045632
3 255 false 4 17983690
3 255 false 5 18019984
3 255 false 6 18011071
3 255 false 7 18068426
3 448 true 0 27836657
3 448 true 1 27723228
3 448 true 2 27714756
3 448 true 3 27702588
3 448 true 4 27821163
3 448 true 5 27736848
3 448 true 6 27721876
3 448 true 7 28406412
3 448 false 0 34443011
3 448 false 1 34096256
3 448 false 2 34189675
3 448 false 3 34059221
3 448 false 4 34019082
3 448 false 5 34097939
3 448 false 6 34203185
3 448 false 7 34231547
[
{
"n": 339392917,
"bits": 29,
"old": [
3,
[
[
2,
2
],
[
3,
4
],
[
29,
1
]
],
9396,
1,
1
],
"new": [
2,
[
[
2,
2
],
[
3,
4
]
],
324,
null,
4
]
},
{
"n": 32560621,
"bits": 25,
"old": [
3,
[
[
2,
2
],
[
3,
1
],
[
29,
1
]
],
348,
1,
1
],
"new": [
2,
[
[
2,
2
],
[
29,
1
]
],
116,
null,
6
]
},
{
"n": 74058212732561358302231226437062788676166966415465897661863160754340907,
"bits": 236,
"old": [
4,
[
[
2,
1
],
[
3,
1
],
[
1923133,
1
],
[
31757755568855353,
1
]
],
366446326442397009485694,
1,
1
],
"new": [
3,
[
[
2,
1
],
[
1923133,
1
],
[
31757755568855353,
1
]
],
122148775480799003161898,
null,
14
]
},
{
"n": 726838724295606890549323807888004534353641360687318060281490199180612328166730772686396383698676545930088884461843637361053498018365439,
"bits": 448,
"old": [
4,
[
[
2,
1
],
[
641,
1
],
[
1469495262398780123809,
1
],
[
167773885276849215533569,
1
]
],
316068035706902087952262865703057298267656019522,
1,
1
],
"new": [
3,
[
[
2,
1
],
[
1469495262398780123809,
1
],
[
167773885276849215533569,
1
]
],
493085859137132742515230679723958343631288642,
null,
3
]
},
{
"n": 399999999999999979,
"bits": 59,
"old": [
3,
[
[
2,
1
],
[
3,
3
],
[
239851,
1
]
],
12951954,
1,
1
],
"new": [
2,
[
[
2,
1
],
[
239851,
1
]
],
479702,
null,
2
]
}
]
module
import Lean
import PrimeCert
meta import Lean
open Lean
set_option linter.style.longLine false
set_option maxRecDepth 10000
set_option exponentiation.threshold 448
theorem before255 : Nat.Prime (2 ^ 255 - 19) := prime_cert%
[small {3; 5; 43},
pock3 (1923133, 2, interval, 2 ^ 2 * 3 * 43),
pock3 (430751, 17, interval, 2 * 5 ^ 3),
pock3 (31757755568855353, 5, interval, 2 ^ 3 * 430751),
pock3 (74058212732561358302231226437062788676166966415465897661863160754340907, 2, interval, 2 * 3 * 1923133 * 31757755568855353),
pock3 (57896044618658097711785492504343953926634992332820282019728792003956564819949, 2, 0, 2 ^ 2 * 74058212732561358302231226437062788676166966415465897661863160754340907)]
theorem after255 : Nat.Prime (2 ^ 255 - 19) := prime_cert%
[small {3; 5; 43},
pock3 (1923133, 2, interval, 2 ^ 2 * 3 * 43),
pock3 (430751, 17, interval, 2 * 5 ^ 3),
pock3 (31757755568855353, 5, interval, 2 ^ 3 * 430751),
pock3 (74058212732561358302231226437062788676166966415465897661863160754340907, 2, 14, interval, 2 * 1923133 * 31757755568855353),
pock3 (57896044618658097711785492504343953926634992332820282019728792003956564819949, 2, 0, 2 ^ 2 * 74058212732561358302231226437062788676166966415465897661863160754340907)]
theorem before448 : Nat.Prime (2 ^ 448 - 2 ^ 224 - 1) := prime_cert%
[small {29; 67; 271; 641},
pock3 (411743, 5, interval, 2 * 29),
pock3 (1469495262398780123809, 17, interval, 2 ^ 5 * 411743),
pock3 (97859369123353, 5, interval, 2 ^ 3 * 67 * 271),
pock3 (167773885276849215533569, 17, 0, 2 ^ 9 * 97859369123353),
pock3 (726838724295606890549323807888004534353641360687318060281490199180612328166730772686396383698676545930088884461843637361053498018365439, 7, interval, 2 * 641 * 1469495262398780123809 * 167773885276849215533569)]
theorem after448 : Nat.Prime (2 ^ 448 - 2 ^ 224 - 1) := prime_cert%
[small {29; 67; 271},
pock3 (411743, 5, interval, 2 * 29),
pock3 (1469495262398780123809, 17, interval, 2 ^ 5 * 411743),
pock3 (97859369123353, 5, interval, 2 ^ 3 * 67 * 271),
pock3 (167773885276849215533569, 17, 0, 2 ^ 9 * 97859369123353),
pock3 (726838724295606890549323807888004534353641360687318060281490199180612328166730772686396383698676545930088884461843637361053498018365439, 7, 3, interval, 2 * 1469495262398780123809 * 167773885276849215533569)]
run_cmd do
let ready ← IO.mkRef (← getEnv).toKernelEnv
let env := Environment.ofKernelEnv (← ready.get)
let some path ← IO.getEnv "POCK3_SAMPLES" | throwError "set POCK3_SAMPLES"
let file ← IO.FS.Handle.mk path .write
for block in [:4] do
for (bits, before, after) in [(255, ``before255, ``after255), (448, ``before448, ``after448)] do
for optimized in (if block % 2 == 0 then [false, true] else [true, false]) do
let decl ← getConstInfo (if optimized then after else before)
let some proof := decl.value? (allowOpaque := true) | throwError "missing proof"
let term := mkApp (mkLambda `h .default decl.type (mkBVar 0)) proof
for i in [:8] do
let input ← IO.mkRef (env, term)
let (env, term) ← input.get
let start ← IO.monoNanosNow
let result ← IO.mkRef (Kernel.check env {} term)
let result ← result.get
let stop ← IO.monoNanosNow
let _ ← ofExceptKernelException result
file.putStrLn s!"{block},{bits},{optimized},{i},{stop-start}"
file.flush
module
import PrimeCert.Pocklington3
set_option maxRecDepth 10000
example : Nat.Prime 37 :=
PrimeCert.pocklington3_certK 37 2 1 2 [] .lt (by decide +kernel)
example : Nat.Prime 197 :=
PrimeCert.pocklington3_certK 197 2 2 2 [] .lt (by decide +kernel)
example : PrimeCert.pocklington3_calculate 197 2 2 1 [] .lt = false := by decide +kernel
example : Nat.Prime 9223372036904058881 :=
PrimeCert.pocklington3_certK 9223372036904058881 3 4 20 [] .lt (by decide +kernel)
example : PrimeCert.pocklington3_calculate 9223372036904058881 20 3 1 [] .lt = false := by decide +kernel
example : Nat.Prime 10633823966279326983230477372963684353 :=
PrimeCert.pocklington3_certK 10633823966279326983230477372963684353 5 4 40 [] .lt (by decide +kernel)
example : PrimeCert.pocklington3_calculate 10633823966279326983230477372963684353 40 5 1 [] .lt = false := by decide +kernel
example : Nat.Prime 14134776518227074636666380005943348126619871175013414145710152014563901441 :=
PrimeCert.pocklington3_certK 14134776518227074636666380005943348126619871175013414145710152014563901441 13 4 80 [] .lt (by decide +kernel)
example : PrimeCert.pocklington3_calculate 14134776518227074636666380005943348126619871175013414145710152014563901441 80 13 1 [] .lt = false := by decide +kernel
example : Nat.Prime 24973988402527937851052777838345330445988785141319769206873255677002973910558124960962448824508223685101169636846139109075628913189178501161287681 :=
PrimeCert.pocklington3_certK 24973988402527937851052777838345330445988785141319769206873255677002973910558124960962448824508223685101169636846139109075628913189178501161287681 3 4 160 [] .lt (by decide +kernel)
example : PrimeCert.pocklington3_calculate 24973988402527937851052777838345330445988785141319769206873255677002973910558124960962448824508223685101169636846139109075628913189178501161287681 160 3 1 [] .lt = false := by decide +kernel
0 69 false 0 80599
0 69 false 1 77164
0 69 false 2 59889
0 69 false 3 47641
0 69 false 4 46529
0 69 false 5 46158
0 69 false 6 45998
0 69 false 7 48201
0 69 false 8 46569
0 69 false 9 46609
0 69 false 10 45637
0 69 false 11 45648
0 69 false 12 44866
0 69 false 13 44907
0 69 false 14 45247
0 69 false 15 44627
0 69 false 16 44697
0 69 false 17 45057
0 69 false 18 45137
0 69 false 19 45808
0 69 false 20 44987
0 69 false 21 49033
0 69 false 22 44706
0 69 false 23 44656
0 69 false 24 44946
0 69 false 25 45217
0 69 false 26 44736
0 69 false 27 44986
0 69 false 28 45227
0 69 false 29 45567
0 69 false 30 44536
0 69 false 31 44696
0 69 false 32 44847
0 69 false 33 44686
0 69 false 34 45158
0 69 false 35 44847
0 69 false 36 44767
0 69 false 37 44777
0 69 false 38 44736
0 69 false 39 44757
0 69 false 40 44947
0 69 false 41 45027
0 69 false 42 49854
0 69 false 43 45176
0 69 false 44 44737
0 69 false 45 44717
0 69 false 46 44496
0 69 false 47 44546
0 69 false 48 45277
0 69 false 49 53308
0 69 false 50 44996
0 69 false 51 44606
0 69 false 52 44746
0 69 false 53 44486
0 69 false 54 44576
0 69 false 55 44687
0 69 false 56 44787
0 69 false 57 44917
0 69 false 58 44416
0 69 false 59 45017
0 69 false 60 44816
0 69 false 61 44846
0 69 false 62 44285
0 69 false 63 48172
0 69 true 0 23284
0 69 true 1 20100
0 69 true 2 18888
0 69 true 3 18477
0 69 true 4 18337
0 69 true 5 18507
0 69 true 6 18267
0 69 true 7 18107
0 69 true 8 18197
0 69 true 9 18067
0 69 true 10 18327
0 69 true 11 18187
0 69 true 12 18277
0 69 true 13 18337
0 69 true 14 18137
0 69 true 15 18156
0 69 true 16 18357
0 69 true 17 18187
0 69 true 18 18458
0 69 true 19 18487
0 69 true 20 18237
0 69 true 21 18317
0 69 true 22 18087
0 69 true 23 18087
0 69 true 24 18227
0 69 true 25 18418
0 69 true 26 18267
0 69 true 27 18216
0 69 true 28 18247
0 69 true 29 18217
0 69 true 30 18197
0 69 true 31 18377
0 69 true 32 18317
0 69 true 33 18067
0 69 true 34 18156
0 69 true 35 18167
0 69 true 36 18258
0 69 true 37 18127
0 69 true 38 18066
0 69 true 39 18117
0 69 true 40 18067
0 69 true 41 18077
0 69 true 42 18097
0 69 true 43 18247
0 69 true 44 18157
0 69 true 45 18447
0 69 true 46 18037
0 69 true 47 18327
0 69 true 48 18467
0 69 true 49 18417
0 69 true 50 18237
0 69 true 51 18308
0 69 true 52 18397
0 69 true 53 18107
0 69 true 54 18277
0 69 true 55 18247
0 69 true 56 18397
0 69 true 57 18076
0 69 true 58 18137
0 69 true 59 18067
0 69 true 60 18228
0 69 true 61 18197
0 69 true 62 18157
0 69 true 63 18247
0 4028945 false 0 45338
0 4028945 false 1 41712
0 4028945 false 2 39749
0 4028945 false 3 39498
0 4028945 false 4 39178
0 4028945 false 5 39189
0 4028945 false 6 39188
0 4028945 false 7 39328
0 4028945 false 8 38938
0 4028945 false 9 39369
0 4028945 false 10 39178
0 4028945 false 11 39469
0 4028945 false 12 42373
0 4028945 false 13 39518
0 4028945 false 14 39298
0 4028945 false 15 39328
0 4028945 false 16 39048
0 4028945 false 17 38898
0 4028945 false 18 39358
0 4028945 false 19 39278
0 4028945 false 20 38948
0 4028945 false 21 38928
0 4028945 false 22 39198
0 4028945 false 23 38848
0 4028945 false 24 38948
0 4028945 false 25 39298
0 4028945 false 26 39138
0 4028945 false 27 39128
0 4028945 false 28 39548
0 4028945 false 29 39378
0 4028945 false 30 38988
0 4028945 false 31 39218
0 4028945 false 32 38947
0 4028945 false 33 38908
0 4028945 false 34 39038
0 4028945 false 35 38697
0 4028945 false 36 39158
0 4028945 false 37 42473
0 4028945 false 38 39218
0 4028945 false 39 39008
0 4028945 false 40 38947
0 4028945 false 41 38818
0 4028945 false 42 38968
0 4028945 false 43 38867
0 4028945 false 44 39158
0 4028945 false 45 38908
0 4028945 false 46 39058
0 4028945 false 47 39218
0 4028945 false 48 39198
0 4028945 false 49 38978
0 4028945 false 50 39218
0 4028945 false 51 39329
0 4028945 false 52 39068
0 4028945 false 53 38707
0 4028945 false 54 39508
0 4028945 false 55 38938
0 4028945 false 56 39199
0 4028945 false 57 38928
0 4028945 false 58 39449
0 4028945 false 59 38888
0 4028945 false 60 38797
0 4028945 false 61 42072
0 4028945 false 62 38817
0 4028945 false 63 39688
0 4028945 true 0 21171
0 4028945 true 1 19238
0 4028945 true 2 18678
0 4028945 true 3 18447
0 4028945 true 4 18417
0 4028945 true 5 18387
0 4028945 true 6 18077
0 4028945 true 7 18127
0 4028945 true 8 18408
0 4028945 true 9 18327
0 4028945 true 10 18197
0 4028945 true 11 18558
0 4028945 true 12 18267
0 4028945 true 13 18107
0 4028945 true 14 18337
0 4028945 true 15 18427
0 4028945 true 16 18157
0 4028945 true 17 18167
0 4028945 true 18 18268
0 4028945 true 19 18187
0 4028945 true 20 18127
0 4028945 true 21 18047
0 4028945 true 22 18037
0 4028945 true 23 18187
0 4028945 true 24 18107
0 4028945 true 25 18117
0 4028945 true 26 18137
0 4028945 true 27 18177
0 4028945 true 28 18047
0 4028945 true 29 18117
0 4028945 true 30 18187
0 4028945 true 31 18147
0 4028945 true 32 18237
0 4028945 true 33 18217
0 4028945 true 34 17957
0 4028945 true 35 18197
0 4028945 true 36 17987
0 4028945 true 37 18077
0 4028945 true 38 18337
0 4028945 true 39 18367
0 4028945 true 40 18107
0 4028945 true 41 18217
0 4028945 true 42 20730
0 4028945 true 43 18537
0 4028945 true 44 18347
0 4028945 true 45 18207
0 4028945 true 46 18117
0 4028945 true 47 18328
0 4028945 true 48 18067
0 4028945 true 49 18097
0 4028945 true 50 18117
0 4028945 true 51 18137
0 4028945 true 52 18207
0 4028945 true 53 18087
0 4028945 true 54 18117
0 4028945 true 55 18057
0 4028945 true 56 17987
0 4028945 true 57 18036
0 4028945 true 58 18007
0 4028945 true 59 18327
0 4028945 true 60 18137
0 4028945 true 61 18117
0 4028945 true 62 18006
0 4028945 true 63 17946
0 2028478494862525422475607 false 0 44496
0 2028478494862525422475607 false 1 41361
0 2028478494862525422475607 false 2 40430
0 2028478494862525422475607 false 3 40129
0 2028478494862525422475607 false 4 39939
0 2028478494862525422475607 false 5 39759
0 2028478494862525422475607 false 6 39599
0 2028478494862525422475607 false 7 39739
0 2028478494862525422475607 false 8 39749
0 2028478494862525422475607 false 9 39499
0 2028478494862525422475607 false 10 39809
0 2028478494862525422475607 false 11 44216
0 2028478494862525422475607 false 12 39659
0 2028478494862525422475607 false 13 40000
0 2028478494862525422475607 false 14 39569
0 2028478494862525422475607 false 15 39438
0 2028478494862525422475607 false 16 39809
0 2028478494862525422475607 false 17 39779
0 2028478494862525422475607 false 18 39629
0 2028478494862525422475607 false 19 39668
0 2028478494862525422475607 false 20 39969
0 2028478494862525422475607 false 21 39779
0 2028478494862525422475607 false 22 39529
0 2028478494862525422475607 false 23 40230
0 2028478494862525422475607 false 24 39939
0 2028478494862525422475607 false 25 39870
0 2028478494862525422475607 false 26 39828
0 2028478494862525422475607 false 27 39859
0 2028478494862525422475607 false 28 39418
0 2028478494862525422475607 false 29 39599
0 2028478494862525422475607 false 30 40300
0 2028478494862525422475607 false 31 40010
0 2028478494862525422475607 false 32 39679
0 2028478494862525422475607 false 33 43194
0 2028478494862525422475607 false 34 39699
0 2028478494862525422475607 false 35 39819
0 2028478494862525422475607 false 36 39969
0 2028478494862525422475607 false 37 39659
0 2028478494862525422475607 false 38 40030
0 2028478494862525422475607 false 39 39899
0 2028478494862525422475607 false 40 39779
0 2028478494862525422475607 false 41 39999
0 2028478494862525422475607 false 42 40140
0 2028478494862525422475607 false 43 40179
0 2028478494862525422475607 false 44 39669
0 2028478494862525422475607 false 45 39869
0 2028478494862525422475607 false 46 39569
0 2028478494862525422475607 false 47 40170
0 2028478494862525422475607 false 48 39719
0 2028478494862525422475607 false 49 39739
0 2028478494862525422475607 false 50 40000
0 2028478494862525422475607 false 51 39839
0 2028478494862525422475607 false 52 39579
0 2028478494862525422475607 false 53 39579
0 2028478494862525422475607 false 54 39648
0 2028478494862525422475607 false 55 40069
0 2028478494862525422475607 false 56 43635
0 2028478494862525422475607 false 57 39679
0 2028478494862525422475607 false 58 39678
0 2028478494862525422475607 false 59 39669
0 2028478494862525422475607 false 60 39339
0 2028478494862525422475607 false 61 39689
0 2028478494862525422475607 false 62 39568
0 2028478494862525422475607 false 63 39789
0 2028478494862525422475607 true 0 23125
0 2028478494862525422475607 true 1 20961
0 2028478494862525422475607 true 2 20350
0 2028478494862525422475607 true 3 19910
0 2028478494862525422475607 true 4 19819
0 2028478494862525422475607 true 5 19750
0 2028478494862525422475607 true 6 19339
0 2028478494862525422475607 true 7 19820
0 2028478494862525422475607 true 8 19820
0 2028478494862525422475607 true 9 19299
0 2028478494862525422475607 true 10 19609
0 2028478494862525422475607 true 11 19429
0 2028478494862525422475607 true 12 19259
0 2028478494862525422475607 true 13 19589
0 2028478494862525422475607 true 14 19499
0 2028478494862525422475607 true 15 19339
0 2028478494862525422475607 true 16 19549
0 2028478494862525422475607 true 17 19939
0 2028478494862525422475607 true 18 19288
0 2028478494862525422475607 true 19 19499
0 2028478494862525422475607 true 20 19479
0 2028478494862525422475607 true 21 19488
0 2028478494862525422475607 true 22 19359
0 2028478494862525422475607 true 23 19349
0 2028478494862525422475607 true 24 19409
0 2028478494862525422475607 true 25 23895
0 2028478494862525422475607 true 26 19900
0 2028478494862525422475607 true 27 19529
0 2028478494862525422475607 true 28 19519
0 2028478494862525422475607 true 29 19680
0 2028478494862525422475607 true 30 19419
0 2028478494862525422475607 true 31 19549
0 2028478494862525422475607 true 32 19659
0 2028478494862525422475607 true 33 19328
0 2028478494862525422475607 true 34 19379
0 2028478494862525422475607 true 35 19209
0 2028478494862525422475607 true 36 19409
0 2028478494862525422475607 true 37 19630
0 2028478494862525422475607 true 38 19699
0 2028478494862525422475607 true 39 19398
0 2028478494862525422475607 true 40 19369
0 2028478494862525422475607 true 41 19499
0 2028478494862525422475607 true 42 19298
0 2028478494862525422475607 true 43 19409
0 2028478494862525422475607 true 44 19639
0 2028478494862525422475607 true 45 19419
0 2028478494862525422475607 true 46 19249
0 2028478494862525422475607 true 47 19459
0 2028478494862525422475607 true 48 19429
0 2028478494862525422475607 true 49 19299
0 2028478494862525422475607 true 50 19339
0 2028478494862525422475607 true 51 19199
0 2028478494862525422475607 true 52 19579
0 2028478494862525422475607 true 53 19358
0 2028478494862525422475607 true 54 19128
0 2028478494862525422475607 true 55 19258
0 2028478494862525422475607 true 56 19439
0 2028478494862525422475607 true 57 19439
0 2028478494862525422475607 true 58 19649
0 2028478494862525422475607 true 59 19439
0 2028478494862525422475607 true 60 19599
0 2028478494862525422475607 true 61 19539
0 2028478494862525422475607 true 62 19379
0 2028478494862525422475607 true 63 19248
1 69 true 0 19519
1 69 true 1 21782
1 69 true 2 18858
1 69 true 3 18298
1 69 true 4 18327
1 69 true 5 18377
1 69 true 6 18097
1 69 true 7 18067
1 69 true 8 18238
1 69 true 9 18037
1 69 true 10 18127
1 69 true 11 18107
1 69 true 12 18097
1 69 true 13 18087
1 69 true 14 18177
1 69 true 15 18157
1 69 true 16 18177
1 69 true 17 18157
1 69 true 18 18036
1 69 true 19 18307
1 69 true 20 18087
1 69 true 21 18027
1 69 true 22 18388
1 69 true 23 18177
1 69 true 24 18077
1 69 true 25 18007
1 69 true 26 18137
1 69 true 27 17986
1 69 true 28 18297
1 69 true 29 18006
1 69 true 30 17926
1 69 true 31 18257
1 69 true 32 18247
1 69 true 33 18077
1 69 true 34 18207
1 69 true 35 18087
1 69 true 36 18177
1 69 true 37 18137
1 69 true 38 18097
1 69 true 39 18107
1 69 true 40 18267
1 69 true 41 18298
1 69 true 42 18077
1 69 true 43 17967
1 69 true 44 18227
1 69 true 45 18247
1 69 true 46 18117
1 69 true 47 18337
1 69 true 48 18227
1 69 true 49 18187
1 69 true 50 18077
1 69 true 51 23185
1 69 true 52 18547
1 69 true 53 18077
1 69 true 54 18007
1 69 true 55 18328
1 69 true 56 17977
1 69 true 57 17797
1 69 true 58 18027
1 69 true 59 18328
1 69 true 60 18167
1 69 true 61 18358
1 69 true 62 18147
1 69 true 63 18087
1 69 false 0 51166
1 69 false 1 47130
1 69 false 2 45838
1 69 false 3 45457
1 69 false 4 45418
1 69 false 5 44827
1 69 false 6 44887
1 69 false 7 44446
1 69 false 8 44926
1 69 false 9 44516
1 69 false 10 44887
1 69 false 11 44366
1 69 false 12 44216
1 69 false 13 44727
1 69 false 14 47531
1 69 false 15 45477
1 69 false 16 44887
1 69 false 17 44506
1 69 false 18 44646
1 69 false 19 44647
1 69 false 20 44336
1 69 false 21 44787
1 69 false 22 44576
1 69 false 23 44857
1 69 false 24 45247
1 69 false 25 44857
1 69 false 26 44516
1 69 false 27 44606
1 69 false 28 44887
1 69 false 29 44707
1 69 false 30 44476
1 69 false 31 44846
1 69 false 32 44867
1 69 false 33 45027
1 69 false 34 44727
1 69 false 35 47431
1 69 false 36 45187
1 69 false 37 45057
1 69 false 38 45317
1 69 false 39 44666
1 69 false 40 44426
1 69 false 41 44285
1 69 false 42 44796
1 69 false 43 44606
1 69 false 44 44506
1 69 false 45 45127
1 69 false 46 44616
1 69 false 47 45017
1 69 false 48 44566
1 69 false 49 44726
1 69 false 50 44536
1 69 false 51 44857
1 69 false 52 44906
1 69 false 53 45106
1 69 false 54 45007
1 69 false 55 44376
1 69 false 56 45267
1 69 false 57 47461
1 69 false 58 44997
1 69 false 59 44837
1 69 false 60 44976
1 69 false 61 44906
1 69 false 62 44756
1 69 false 63 44676
1 4028945 true 0 20281
1 4028945 true 1 19239
1 4028945 true 2 18818
1 4028945 true 3 18287
1 4028945 true 4 18136
1 4028945 true 5 18077
1 4028945 true 6 18087
1 4028945 true 7 18198
1 4028945 true 8 18287
1 4028945 true 9 18006
1 4028945 true 10 18167
1 4028945 true 11 18157
1 4028945 true 12 18307
1 4028945 true 13 18358
1 4028945 true 14 18007
1 4028945 true 15 18156
1 4028945 true 16 18067
1 4028945 true 17 18297
1 4028945 true 18 18257
1 4028945 true 19 18238
1 4028945 true 20 18127
1 4028945 true 21 18227
1 4028945 true 22 18147
1 4028945 true 23 18037
1 4028945 true 24 18297
1 4028945 true 25 18167
1 4028945 true 26 18007
1 4028945 true 27 18147
1 4028945 true 28 18116
1 4028945 true 29 18267
1 4028945 true 30 18256
1 4028945 true 31 18257
1 4028945 true 32 20830
1 4028945 true 33 18327
1 4028945 true 34 18007
1 4028945 true 35 18056
1 4028945 true 36 18207
1 4028945 true 37 18096
1 4028945 true 38 18087
1 4028945 true 39 18267
1 4028945 true 40 18397
1 4028945 true 41 18127
1 4028945 true 42 17977
1 4028945 true 43 18207
1 4028945 true 44 18177
1 4028945 true 45 18007
1 4028945 true 46 18207
1 4028945 true 47 18347
1 4028945 true 48 18268
1 4028945 true 49 18307
1 4028945 true 50 18317
1 4028945 true 51 18308
1 4028945 true 52 18137
1 4028945 true 53 18066
1 4028945 true 54 18297
1 4028945 true 55 18388
1 4028945 true 56 18077
1 4028945 true 57 18137
1 4028945 true 58 18097
1 4028945 true 59 17917
1 4028945 true 60 18328
1 4028945 true 61 18117
1 4028945 true 62 18207
1 4028945 true 63 18087
1 4028945 false 0 42864
1 4028945 false 1 40770
1 4028945 false 2 39709
1 4028945 false 3 39649
1 4028945 false 4 39679
1 4028945 false 5 39469
1 4028945 false 6 39138
1 4028945 false 7 44306
1 4028945 false 8 39028
1 4028945 false 9 39409
1 4028945 false 10 39399
1 4028945 false 11 39008
1 4028945 false 12 39148
1 4028945 false 13 38918
1 4028945 false 14 39109
1 4028945 false 15 39088
1 4028945 false 16 38898
1 4028945 false 17 39218
1 4028945 false 18 39158
1 4028945 false 19 39018
1 4028945 false 20 39278
1 4028945 false 21 39108
1 4028945 false 22 38717
1 4028945 false 23 39148
1 4028945 false 24 39208
1 4028945 false 25 38988
1 4028945 false 26 39208
1 4028945 false 27 39258
1 4028945 false 28 39358
1 4028945 false 29 39028
1 4028945 false 30 38928
1 4028945 false 31 42924
1 4028945 false 32 39198
1 4028945 false 33 39228
1 4028945 false 34 39057
1 4028945 false 35 39338
1 4028945 false 36 38787
1 4028945 false 37 38898
1 4028945 false 38 39419
1 4028945 false 39 38928
1 4028945 false 40 39169
1 4028945 false 41 39008
1 4028945 false 42 38808
1 4028945 false 43 39248
1 4028945 false 44 39549
1 4028945 false 45 39209
1 4028945 false 46 39118
1 4028945 false 47 39148
1 4028945 false 48 39077
1 4028945 false 49 38818
1 4028945 false 50 38948
1 4028945 false 51 38938
1 4028945 false 52 38947
1 4028945 false 53 38857
1 4028945 false 54 38798
1 4028945 false 55 38858
1 4028945 false 56 39348
1 4028945 false 57 39148
1 4028945 false 58 39239
1 4028945 false 59 38928
1 4028945 false 60 39069
1 4028945 false 61 38677
1 4028945 false 62 39218
1 4028945 false 63 39148
1 2028478494862525422475607 true 0 21712
1 2028478494862525422475607 true 1 20541
1 2028478494862525422475607 true 2 20080
1 2028478494862525422475607 true 3 19849
1 2028478494862525422475607 true 4 19529
1 2028478494862525422475607 true 5 19399
1 2028478494862525422475607 true 6 19539
1 2028478494862525422475607 true 7 19239
1 2028478494862525422475607 true 8 19359
1 2028478494862525422475607 true 9 19469
1 2028478494862525422475607 true 10 19379
1 2028478494862525422475607 true 11 19319
1 2028478494862525422475607 true 12 19459
1 2028478494862525422475607 true 13 19499
1 2028478494862525422475607 true 14 19499
1 2028478494862525422475607 true 15 19879
1 2028478494862525422475607 true 16 19148
1 2028478494862525422475607 true 17 19540
1 2028478494862525422475607 true 18 39979
1 2028478494862525422475607 true 19 19449
1 2028478494862525422475607 true 20 19149
1 2028478494862525422475607 true 21 19520
1 2028478494862525422475607 true 22 19489
1 2028478494862525422475607 true 23 19499
1 2028478494862525422475607 true 24 19619
1 2028478494862525422475607 true 25 22363
1 2028478494862525422475607 true 26 19629
1 2028478494862525422475607 true 27 19629
1 2028478494862525422475607 true 28 19329
1 2028478494862525422475607 true 29 19379
1 2028478494862525422475607 true 30 19619
1 2028478494862525422475607 true 31 19489
1 2028478494862525422475607 true 32 19439
1 2028478494862525422475607 true 33 19409
1 2028478494862525422475607 true 34 19458
1 2028478494862525422475607 true 35 19379
1 2028478494862525422475607 true 36 19630
1 2028478494862525422475607 true 37 19339
1 2028478494862525422475607 true 38 19509
1 2028478494862525422475607 true 39 19408
1 2028478494862525422475607 true 40 19519
1 2028478494862525422475607 true 41 19590
1 2028478494862525422475607 true 42 19679
1 2028478494862525422475607 true 43 19519
1 2028478494862525422475607 true 44 19289
1 2028478494862525422475607 true 45 19299
1 2028478494862525422475607 true 46 19418
1 2028478494862525422475607 true 47 19349
1 2028478494862525422475607 true 48 19359
1 2028478494862525422475607 true 49 19269
1 2028478494862525422475607 true 50 19089
1 2028478494862525422475607 true 51 19309
1 2028478494862525422475607 true 52 19208
1 2028478494862525422475607 true 53 19309
1 2028478494862525422475607 true 54 19378
1 2028478494862525422475607 true 55 19379
1 2028478494862525422475607 true 56 19309
1 2028478494862525422475607 true 57 19649
1 2028478494862525422475607 true 58 19318
1 2028478494862525422475607 true 59 19359
1 2028478494862525422475607 true 60 19459
1 2028478494862525422475607 true 61 19709
1 2028478494862525422475607 true 62 19529
1 2028478494862525422475607 true 63 19619
1 2028478494862525422475607 false 0 46209
1 2028478494862525422475607 false 1 41412
1 2028478494862525422475607 false 2 40580
1 2028478494862525422475607 false 3 40219
1 2028478494862525422475607 false 4 40260
1 2028478494862525422475607 false 5 40300
1 2028478494862525422475607 false 6 39738
1 2028478494862525422475607 false 7 39749
1 2028478494862525422475607 false 8 39769
1 2028478494862525422475607 false 9 40090
1 2028478494862525422475607 false 10 39769
1 2028478494862525422475607 false 11 40530
1 2028478494862525422475607 false 12 39568
1 2028478494862525422475607 false 13 39669
1 2028478494862525422475607 false 14 40000
1 2028478494862525422475607 false 15 39919
1 2028478494862525422475607 false 16 39819
1 2028478494862525422475607 false 17 40030
1 2028478494862525422475607 false 18 39329
1 2028478494862525422475607 false 19 39819
1 2028478494862525422475607 false 20 40009
1 2028478494862525422475607 false 21 39728
1 2028478494862525422475607 false 22 43945
1 2028478494862525422475607 false 23 39870
1 2028478494862525422475607 false 24 39779
1 2028478494862525422475607 false 25 40009
1 2028478494862525422475607 false 26 39979
1 2028478494862525422475607 false 27 39869
1 2028478494862525422475607 false 28 39559
1 2028478494862525422475607 false 29 39879
1 2028478494862525422475607 false 30 39569
1 2028478494862525422475607 false 31 39739
1 2028478494862525422475607 false 32 39788
1 2028478494862525422475607 false 33 39699
1 2028478494862525422475607 false 34 39668
1 2028478494862525422475607 false 35 39819
1 2028478494862525422475607 false 36 39499
1 2028478494862525422475607 false 37 39538
1 2028478494862525422475607 false 38 39819
1 2028478494862525422475607 false 39 40100
1 2028478494862525422475607 false 40 40110
1 2028478494862525422475607 false 41 39538
1 2028478494862525422475607 false 42 39839
1 2028478494862525422475607 false 43 39599
1 2028478494862525422475607 false 44 39889
1 2028478494862525422475607 false 45 43435
1 2028478494862525422475607 false 46 39659
1 2028478494862525422475607 false 47 39658
1 2028478494862525422475607 false 48 39488
1 2028478494862525422475607 false 49 39629
1 2028478494862525422475607 false 50 39679
1 2028478494862525422475607 false 51 39989
1 2028478494862525422475607 false 52 39609
1 2028478494862525422475607 false 53 39909
1 2028478494862525422475607 false 54 39368
1 2028478494862525422475607 false 55 39959
1 2028478494862525422475607 false 56 39618
1 2028478494862525422475607 false 57 39528
1 2028478494862525422475607 false 58 39879
1 2028478494862525422475607 false 59 39528
1 2028478494862525422475607 false 60 39989
1 2028478494862525422475607 false 61 39669
1 2028478494862525422475607 false 62 39829
1 2028478494862525422475607 false 63 39789
2 69 false 0 48292
2 69 false 1 49183
2 69 false 2 45447
2 69 false 3 45537
2 69 false 4 45157
2 69 false 5 45077
2 69 false 6 44796
2 69 false 7 44836
2 69 false 8 44987
2 69 false 9 44806
2 69 false 10 45047
2 69 false 11 45218
2 69 false 12 45117
2 69 false 13 45087
2 69 false 14 45167
2 69 false 15 44847
2 69 false 16 44437
2 69 false 17 45287
2 69 false 18 44876
2 69 false 19 44846
2 69 false 20 44766
2 69 false 21 44947
2 69 false 22 44446
2 69 false 23 48703
2 69 false 24 44737
2 69 false 25 45037
2 69 false 26 44977
2 69 false 27 44807
2 69 false 28 44737
2 69 false 29 44576
2 69 false 30 44746
2 69 false 31 44786
2 69 false 32 44636
2 69 false 33 44766
2 69 false 34 44906
2 69 false 35 44676
2 69 false 36 44546
2 69 false 37 44967
2 69 false 38 44656
2 69 false 39 44446
2 69 false 40 44416
2 69 false 41 44797
2 69 false 42 45237
2 69 false 43 44556
2 69 false 44 49162
2 69 false 45 44796
2 69 false 46 44716
2 69 false 47 44726
2 69 false 48 44677
2 69 false 49 44647
2 69 false 50 44967
2 69 false 51 45036
2 69 false 52 44456
2 69 false 53 44446
2 69 false 54 44586
2 69 false 55 44867
2 69 false 56 44786
2 69 false 57 44966
2 69 false 58 44896
2 69 false 59 44696
2 69 false 60 44866
2 69 false 61 44756
2 69 false 62 44666
2 69 false 63 45547
2 69 true 0 20521
2 69 true 1 19289
2 69 true 2 21972
2 69 true 3 18647
2 69 true 4 18197
2 69 true 5 18056
2 69 true 6 18227
2 69 true 7 18047
2 69 true 8 18137
2 69 true 9 18177
2 69 true 10 18287
2 69 true 11 18027
2 69 true 12 18147
2 69 true 13 18207
2 69 true 14 18137
2 69 true 15 18227
2 69 true 16 18037
2 69 true 17 18187
2 69 true 18 18297
2 69 true 19 18257
2 69 true 20 18127
2 69 true 21 18147
2 69 true 22 18157
2 69 true 23 18147
2 69 true 24 18167
2 69 true 25 17947
2 69 true 26 18077
2 69 true 27 18477
2 69 true 28 18307
2 69 true 29 18026
2 69 true 30 18287
2 69 true 31 18207
2 69 true 32 18257
2 69 true 33 18037
2 69 true 34 18147
2 69 true 35 18157
2 69 true 36 18117
2 69 true 37 17987
2 69 true 38 18046
2 69 true 39 18207
2 69 true 40 17987
2 69 true 41 18236
2 69 true 42 18107
2 69 true 43 17997
2 69 true 44 18217
2 69 true 45 18147
2 69 true 46 18107
2 69 true 47 18147
2 69 true 48 17957
2 69 true 49 17887
2 69 true 50 18166
2 69 true 51 18057
2 69 true 52 21933
2 69 true 53 18177
2 69 true 54 18178
2 69 true 55 18517
2 69 true 56 18057
2 69 true 57 18187
2 69 true 58 18007
2 69 true 59 18057
2 69 true 60 18106
2 69 true 61 18157
2 69 true 62 17927
2 69 true 63 18106
2 4028945 false 0 43264
2 4028945 false 1 40861
2 4028945 false 2 40210
2 4028945 false 3 39379
2 4028945 false 4 39568
2 4028945 false 5 38898
2 4028945 false 6 39208
2 4028945 false 7 39829
2 4028945 false 8 39408
2 4028945 false 9 39078
2 4028945 false 10 39189
2 4028945 false 11 39098
2 4028945 false 12 39038
2 4028945 false 13 38918
2 4028945 false 14 39107
2 4028945 false 15 38898
2 4028945 false 16 39489
2 4028945 false 17 41962
2 4028945 false 18 39499
2 4028945 false 19 39108
2 4028945 false 20 38817
2 4028945 false 21 38888
2 4028945 false 22 38858
2 4028945 false 23 39098
2 4028945 false 24 38677
2 4028945 false 25 39108
2 4028945 false 26 38947
2 4028945 false 27 38978
2 4028945 false 28 39289
2 4028945 false 29 39369
2 4028945 false 30 39068
2 4028945 false 31 39067
2 4028945 false 32 38918
2 4028945 false 33 39108
2 4028945 false 34 39018
2 4028945 false 35 39419
2 4028945 false 36 38988
2 4028945 false 37 39398
2 4028945 false 38 38767
2 4028945 false 39 38777
2 4028945 false 40 39168
2 4028945 false 41 42663
2 4028945 false 42 39148
2 4028945 false 43 39869
2 4028945 false 44 39439
2 4028945 false 45 39258
2 4028945 false 46 39008
2 4028945 false 47 38877
2 4028945 false 48 39238
2 4028945 false 49 39268
2 4028945 false 50 39048
2 4028945 false 51 39008
2 4028945 false 52 39208
2 4028945 false 53 38958
2 4028945 false 54 39038
2 4028945 false 55 38817
2 4028945 false 56 39568
2 4028945 false 57 38988
2 4028945 false 58 38908
2 4028945 false 59 38917
2 4028945 false 60 38898
2 4028945 false 61 38988
2 4028945 false 62 39129
2 4028945 false 63 38778
2 4028945 true 0 20371
2 4028945 true 1 19118
2 4028945 true 2 27060
2 4028945 true 3 18528
2 4028945 true 4 18208
2 4028945 true 5 18117
2 4028945 true 6 18338
2 4028945 true 7 18117
2 4028945 true 8 18207
2 4028945 true 9 17987
2 4028945 true 10 18318
2 4028945 true 11 18217
2 4028945 true 12 18317
2 4028945 true 13 18247
2 4028945 true 14 18157
2 4028945 true 15 18468
2 4028945 true 16 18127
2 4028945 true 17 18247
2 4028945 true 18 18097
2 4028945 true 19 18127
2 4028945 true 20 18167
2 4028945 true 21 18086
2 4028945 true 22 18107
2 4028945 true 23 18247
2 4028945 true 24 18107
2 4028945 true 25 18157
2 4028945 true 26 18086
2 4028945 true 27 18027
2 4028945 true 28 17957
2 4028945 true 29 18298
2 4028945 true 30 18317
2 4028945 true 31 18177
2 4028945 true 32 18227
2 4028945 true 33 18407
2 4028945 true 34 18178
2 4028945 true 35 18287
2 4028945 true 36 18036
2 4028945 true 37 17917
2 4028945 true 38 18057
2 4028945 true 39 18137
2 4028945 true 40 18056
2 4028945 true 41 18157
2 4028945 true 42 18047
2 4028945 true 43 18367
2 4028945 true 44 18237
2 4028945 true 45 18237
2 4028945 true 46 18127
2 4028945 true 47 18427
2 4028945 true 48 18106
2 4028945 true 49 18187
2 4028945 true 50 18216
2 4028945 true 51 18117
2 4028945 true 52 21432
2 4028945 true 53 18287
2 4028945 true 54 18127
2 4028945 true 55 18027
2 4028945 true 56 18357
2 4028945 true 57 18238
2 4028945 true 58 18187
2 4028945 true 59 18176
2 4028945 true 60 18197
2 4028945 true 61 17956
2 4028945 true 62 18227
2 4028945 true 63 18377
2 2028478494862525422475607 false 0 42723
2 2028478494862525422475607 false 1 40831
2 2028478494862525422475607 false 2 40751
2 2028478494862525422475607 false 3 40410
2 2028478494862525422475607 false 4 40029
2 2028478494862525422475607 false 5 39889
2 2028478494862525422475607 false 6 39810
2 2028478494862525422475607 false 7 39959
2 2028478494862525422475607 false 8 40290
2 2028478494862525422475607 false 9 40030
2 2028478494862525422475607 false 10 39969
2 2028478494862525422475607 false 11 39719
2 2028478494862525422475607 false 12 39789
2 2028478494862525422475607 false 13 39819
2 2028478494862525422475607 false 14 39819
2 2028478494862525422475607 false 15 43595
2 2028478494862525422475607 false 16 40370
2 2028478494862525422475607 false 17 40109
2 2028478494862525422475607 false 18 39819
2 2028478494862525422475607 false 19 40230
2 2028478494862525422475607 false 20 39799
2 2028478494862525422475607 false 21 40020
2 2028478494862525422475607 false 22 39789
2 2028478494862525422475607 false 23 39719
2 2028478494862525422475607 false 24 39919
2 2028478494862525422475607 false 25 39768
2 2028478494862525422475607 false 26 39999
2 2028478494862525422475607 false 27 39549
2 2028478494862525422475607 false 28 39909
2 2028478494862525422475607 false 29 39649
2 2028478494862525422475607 false 30 39749
2 2028478494862525422475607 false 31 39499
2 2028478494862525422475607 false 32 39409
2 2028478494862525422475607 false 33 39619
2 2028478494862525422475607 false 34 39939
2 2028478494862525422475607 false 35 39639
2 2028478494862525422475607 false 36 40330
2 2028478494862525422475607 false 37 39669
2 2028478494862525422475607 false 38 41973
2 2028478494862525422475607 false 39 39829
2 2028478494862525422475607 false 40 39599
2 2028478494862525422475607 false 41 39729
2 2028478494862525422475607 false 42 39899
2 2028478494862525422475607 false 43 39639
2 2028478494862525422475607 false 44 39799
2 2028478494862525422475607 false 45 39549
2 2028478494862525422475607 false 46 39608
2 2028478494862525422475607 false 47 39879
2 2028478494862525422475607 false 48 39850
2 2028478494862525422475607 false 49 39719
2 2028478494862525422475607 false 50 39398
2 2028478494862525422475607 false 51 39949
2 2028478494862525422475607 false 52 39709
2 2028478494862525422475607 false 53 39889
2 2028478494862525422475607 false 54 39769
2 2028478494862525422475607 false 55 39579
2 2028478494862525422475607 false 56 39689
2 2028478494862525422475607 false 57 39779
2 2028478494862525422475607 false 58 39879
2 2028478494862525422475607 false 59 39769
2 2028478494862525422475607 false 60 42774
2 2028478494862525422475607 false 61 39649
2 2028478494862525422475607 false 62 39849
2 2028478494862525422475607 false 63 39519
2 2028478494862525422475607 true 0 22123
2 2028478494862525422475607 true 1 20560
2 2028478494862525422475607 true 2 20070
2 2028478494862525422475607 true 3 19710
2 2028478494862525422475607 true 4 19739
2 2028478494862525422475607 true 5 19729
2 2028478494862525422475607 true 6 19278
2 2028478494862525422475607 true 7 19429
2 2028478494862525422475607 true 8 19379
2 2028478494862525422475607 true 9 19238
2 2028478494862525422475607 true 10 19378
2 2028478494862525422475607 true 11 19479
2 2028478494862525422475607 true 12 19469
2 2028478494862525422475607 true 13 19519
2 2028478494862525422475607 true 14 19399
2 2028478494862525422475607 true 15 19248
2 2028478494862525422475607 true 16 19549
2 2028478494862525422475607 true 17 19740
2 2028478494862525422475607 true 18 19459
2 2028478494862525422475607 true 19 19399
2 2028478494862525422475607 true 20 19328
2 2028478494862525422475607 true 21 19489
2 2028478494862525422475607 true 22 19670
2 2028478494862525422475607 true 23 19539
2 2028478494862525422475607 true 24 19368
2 2028478494862525422475607 true 25 19449
2 2028478494862525422475607 true 26 19379
2 2028478494862525422475607 true 27 19479
2 2028478494862525422475607 true 28 19409
2 2028478494862525422475607 true 29 19399
2 2028478494862525422475607 true 30 19339
2 2028478494862525422475607 true 31 19408
2 2028478494862525422475607 true 32 19509
2 2028478494862525422475607 true 33 19659
2 2028478494862525422475607 true 34 19459
2 2028478494862525422475607 true 35 19449
2 2028478494862525422475607 true 36 19478
2 2028478494862525422475607 true 37 19489
2 2028478494862525422475607 true 38 19598
2 2028478494862525422475607 true 39 19439
2 2028478494862525422475607 true 40 19529
2 2028478494862525422475607 true 41 19659
2 2028478494862525422475607 true 42 19549
2 2028478494862525422475607 true 43 19319
2 2028478494862525422475607 true 44 19599
2 2028478494862525422475607 true 45 19188
2 2028478494862525422475607 true 46 19559
2 2028478494862525422475607 true 47 19369
2 2028478494862525422475607 true 48 19178
2 2028478494862525422475607 true 49 19469
2 2028478494862525422475607 true 50 19329
2 2028478494862525422475607 true 51 19199
2 2028478494862525422475607 true 52 19409
2 2028478494862525422475607 true 53 19478
2 2028478494862525422475607 true 54 19499
2 2028478494862525422475607 true 55 19408
2 2028478494862525422475607 true 56 19559
2 2028478494862525422475607 true 57 19369
2 2028478494862525422475607 true 58 19519
2 2028478494862525422475607 true 59 19448
2 2028478494862525422475607 true 60 19469
2 2028478494862525422475607 true 61 19519
2 2028478494862525422475607 true 62 19348
2 2028478494862525422475607 true 63 19229
3 69 true 0 19438
3 69 true 1 18858
3 69 true 2 18558
3 69 true 3 18237
3 69 true 4 18127
3 69 true 5 18207
3 69 true 6 18147
3 69 true 7 18097
3 69 true 8 18116
3 69 true 9 18367
3 69 true 10 18066
3 69 true 11 18077
3 69 true 12 22854
3 69 true 13 18437
3 69 true 14 18347
3 69 true 15 18237
3 69 true 16 18096
3 69 true 17 18087
3 69 true 18 18197
3 69 true 19 17906
3 69 true 20 18097
3 69 true 21 18187
3 69 true 22 18137
3 69 true 23 18307
3 69 true 24 18116
3 69 true 25 17967
3 69 true 26 18117
3 69 true 27 18267
3 69 true 28 18047
3 69 true 29 18287
3 69 true 30 18157
3 69 true 31 18238
3 69 true 32 18187
3 69 true 33 17987
3 69 true 34 18037
3 69 true 35 18197
3 69 true 36 17977
3 69 true 37 18197
3 69 true 38 18077
3 69 true 39 18007
3 69 true 40 18026
3 69 true 41 18097
3 69 true 42 18037
3 69 true 43 18207
3 69 true 44 18097
3 69 true 45 18027
3 69 true 46 18047
3 69 true 47 18137
3 69 true 48 17827
3 69 true 49 18067
3 69 true 50 18076
3 69 true 51 18327
3 69 true 52 17986
3 69 true 53 18277
3 69 true 54 18167
3 69 true 55 18057
3 69 true 56 18127
3 69 true 57 17846
3 69 true 58 18167
3 69 true 59 17927
3 69 true 60 18237
3 69 true 61 17896
3 69 true 62 21732
3 69 true 63 18297
3 69 false 0 50034
3 69 false 1 46779
3 69 false 2 45928
3 69 false 3 45086
3 69 false 4 44787
3 69 false 5 45177
3 69 false 6 45407
3 69 false 7 44797
3 69 false 8 45538
3 69 false 9 44916
3 69 false 10 44345
3 69 false 11 44626
3 69 false 12 44786
3 69 false 13 44726
3 69 false 14 44676
3 69 false 15 44766
3 69 false 16 45036
3 69 false 17 44526
3 69 false 18 44557
3 69 false 19 44606
3 69 false 20 44446
3 69 false 21 45107
3 69 false 22 44697
3 69 false 23 44456
3 69 false 24 44646
3 69 false 25 44517
3 69 false 26 44596
3 69 false 27 44806
3 69 false 28 44786
3 69 false 29 44756
3 69 false 30 44425
3 69 false 31 45067
3 69 false 32 45006
3 69 false 33 45107
3 69 false 34 44967
3 69 false 35 44686
3 69 false 36 44876
3 69 false 37 44636
3 69 false 38 44475
3 69 false 39 44776
3 69 false 40 49333
3 69 false 41 44537
3 69 false 42 44726
3 69 false 43 45057
3 69 false 44 44657
3 69 false 45 44847
3 69 false 46 44917
3 69 false 47 44797
3 69 false 48 44507
3 69 false 49 45007
3 69 false 50 44967
3 69 false 51 44576
3 69 false 52 44737
3 69 false 53 44496
3 69 false 54 44706
3 69 false 55 44606
3 69 false 56 44697
3 69 false 57 44937
3 69 false 58 44757
3 69 false 59 44657
3 69 false 60 44897
3 69 false 61 48672
3 69 false 62 44906
3 69 false 63 45588
3 4028945 true 0 20210
3 4028945 true 1 19088
3 4028945 true 2 18508
3 4028945 true 3 18397
3 4028945 true 4 18548
3 4028945 true 5 18397
3 4028945 true 6 18297
3 4028945 true 7 18388
3 4028945 true 8 18347
3 4028945 true 9 18277
3 4028945 true 10 18227
3 4028945 true 11 18287
3 4028945 true 12 18267
3 4028945 true 13 18508
3 4028945 true 14 18437
3 4028945 true 15 18096
3 4028945 true 16 18307
3 4028945 true 17 18257
3 4028945 true 18 18227
3 4028945 true 19 18237
3 4028945 true 20 18357
3 4028945 true 21 18528
3 4028945 true 22 18327
3 4028945 true 23 18327
3 4028945 true 24 18258
3 4028945 true 25 18137
3 4028945 true 26 18257
3 4028945 true 27 18127
3 4028945 true 28 18146
3 4028945 true 29 18367
3 4028945 true 30 18357
3 4028945 true 31 18287
3 4028945 true 32 18408
3 4028945 true 33 18367
3 4028945 true 34 18417
3 4028945 true 35 18517
3 4028945 true 36 18237
3 4028945 true 37 18117
3 4028945 true 38 18247
3 4028945 true 39 18177
3 4028945 true 40 18287
3 4028945 true 41 18066
3 4028945 true 42 21772
3 4028945 true 43 18368
3 4028945 true 44 18377
3 4028945 true 45 18187
3 4028945 true 46 18478
3 4028945 true 47 18338
3 4028945 true 48 18297
3 4028945 true 49 18397
3 4028945 true 50 18057
3 4028945 true 51 18337
3 4028945 true 52 18567
3 4028945 true 53 18557
3 4028945 true 54 18077
3 4028945 true 55 18428
3 4028945 true 56 18317
3 4028945 true 57 18147
3 4028945 true 58 18398
3 4028945 true 59 18458
3 4028945 true 60 18247
3 4028945 true 61 18187
3 4028945 true 62 18367
3 4028945 true 63 18497
3 4028945 false 0 42683
3 4028945 false 1 40510
3 4028945 false 2 39709
3 4028945 false 3 39158
3 4028945 false 4 39028
3 4028945 false 5 39509
3 4028945 false 6 39089
3 4028945 false 7 38527
3 4028945 false 8 39028
3 4028945 false 9 38998
3 4028945 false 10 39018
3 4028945 false 11 39188
3 4028945 false 12 42733
3 4028945 false 13 39398
3 4028945 false 14 39348
3 4028945 false 15 39218
3 4028945 false 16 39319
3 4028945 false 17 39198
3 4028945 false 18 39258
3 4028945 false 19 39058
3 4028945 false 20 39078
3 4028945 false 21 39108
3 4028945 false 22 39098
3 4028945 false 23 39208
3 4028945 false 24 38988
3 4028945 false 25 39148
3 4028945 false 26 39238
3 4028945 false 27 38937
3 4028945 false 28 39328
3 4028945 false 29 39268
3 4028945 false 30 38947
3 4028945 false 31 38988
3 4028945 false 32 39048
3 4028945 false 33 39018
3 4028945 false 34 39108
3 4028945 false 35 39298
3 4028945 false 36 41882
3 4028945 false 37 39369
3 4028945 false 38 39188
3 4028945 false 39 39179
3 4028945 false 40 39008
3 4028945 false 41 39268
3 4028945 false 42 39078
3 4028945 false 43 39248
3 4028945 false 44 39138
3 4028945 false 45 39068
3 4028945 false 46 39048
3 4028945 false 47 38678
3 4028945 false 48 38888
3 4028945 false 49 39238
3 4028945 false 50 39238
3 4028945 false 51 38858
3 4028945 false 52 38948
3 4028945 false 53 39027
3 4028945 false 54 38908
3 4028945 false 55 39278
3 4028945 false 56 38778
3 4028945 false 57 38818
3 4028945 false 58 39138
3 4028945 false 59 38898
3 4028945 false 60 38587
3 4028945 false 61 41381
3 4028945 false 62 38848
3 4028945 false 63 39308
3 2028478494862525422475607 true 0 21592
3 2028478494862525422475607 true 1 20580
3 2028478494862525422475607 true 2 20100
3 2028478494862525422475607 true 3 19910
3 2028478494862525422475607 true 4 19459
3 2028478494862525422475607 true 5 19399
3 2028478494862525422475607 true 6 19399
3 2028478494862525422475607 true 7 19358
3 2028478494862525422475607 true 8 19308
3 2028478494862525422475607 true 9 19819
3 2028478494862525422475607 true 10 19689
3 2028478494862525422475607 true 11 19519
3 2028478494862525422475607 true 12 19659
3 2028478494862525422475607 true 13 19419
3 2028478494862525422475607 true 14 19539
3 2028478494862525422475607 true 15 19438
3 2028478494862525422475607 true 16 19299
3 2028478494862525422475607 true 17 19629
3 2028478494862525422475607 true 18 19829
3 2028478494862525422475607 true 19 19639
3 2028478494862525422475607 true 20 19389
3 2028478494862525422475607 true 21 19709
3 2028478494862525422475607 true 22 19670
3 2028478494862525422475607 true 23 19529
3 2028478494862525422475607 true 24 19509
3 2028478494862525422475607 true 25 19499
3 2028478494862525422475607 true 26 19429
3 2028478494862525422475607 true 27 19529
3 2028478494862525422475607 true 28 19448
3 2028478494862525422475607 true 29 19258
3 2028478494862525422475607 true 30 19539
3 2028478494862525422475607 true 31 19480
3 2028478494862525422475607 true 32 19779
3 2028478494862525422475607 true 33 19839
3 2028478494862525422475607 true 34 19298
3 2028478494862525422475607 true 35 19499
3 2028478494862525422475607 true 36 19699
3 2028478494862525422475607 true 37 19399
3 2028478494862525422475607 true 38 19229
3 2028478494862525422475607 true 39 19529
3 2028478494862525422475607 true 40 19539
3 2028478494862525422475607 true 41 19369
3 2028478494862525422475607 true 42 19468
3 2028478494862525422475607 true 43 19399
3 2028478494862525422475607 true 44 19439
3 2028478494862525422475607 true 45 19519
3 2028478494862525422475607 true 46 19379
3 2028478494862525422475607 true 47 19449
3 2028478494862525422475607 true 48 19729
3 2028478494862525422475607 true 49 19478
3 2028478494862525422475607 true 50 19529
3 2028478494862525422475607 true 51 19559
3 2028478494862525422475607 true 52 19499
3 2028478494862525422475607 true 53 19580
3 2028478494862525422475607 true 54 19529
3 2028478494862525422475607 true 55 19328
3 2028478494862525422475607 true 56 19339
3 2028478494862525422475607 true 57 19619
3 2028478494862525422475607 true 58 19439
3 2028478494862525422475607 true 59 19278
3 2028478494862525422475607 true 60 19388
3 2028478494862525422475607 true 61 19349
3 2028478494862525422475607 true 62 19459
3 2028478494862525422475607 true 63 19528
3 2028478494862525422475607 false 0 42694
3 2028478494862525422475607 false 1 41662
3 2028478494862525422475607 false 2 40751
3 2028478494862525422475607 false 3 39969
3 2028478494862525422475607 false 4 40240
3 2028478494862525422475607 false 5 42403
3 2028478494862525422475607 false 6 39629
3 2028478494862525422475607 false 7 39719
3 2028478494862525422475607 false 8 39859
3 2028478494862525422475607 false 9 39719
3 2028478494862525422475607 false 10 39609
3 2028478494862525422475607 false 11 39769
3 2028478494862525422475607 false 12 39769
3 2028478494862525422475607 false 13 39588
3 2028478494862525422475607 false 14 39499
3 2028478494862525422475607 false 15 39579
3 2028478494862525422475607 false 16 39409
3 2028478494862525422475607 false 17 40020
3 2028478494862525422475607 false 18 40080
3 2028478494862525422475607 false 19 39770
3 2028478494862525422475607 false 20 39799
3 2028478494862525422475607 false 21 39508
3 2028478494862525422475607 false 22 39558
3 2028478494862525422475607 false 23 39699
3 2028478494862525422475607 false 24 39449
3 2028478494862525422475607 false 25 39639
3 2028478494862525422475607 false 26 39829
3 2028478494862525422475607 false 27 39749
3 2028478494862525422475607 false 28 40040
3 2028478494862525422475607 false 29 40019
3 2028478494862525422475607 false 30 39769
3 2028478494862525422475607 false 31 39799
3 2028478494862525422475607 false 32 39860
3 2028478494862525422475607 false 33 39428
3 2028478494862525422475607 false 34 39919
3 2028478494862525422475607 false 35 40059
3 2028478494862525422475607 false 36 39809
3 2028478494862525422475607 false 37 39788
3 2028478494862525422475607 false 38 39459
3 2028478494862525422475607 false 39 39809
3 2028478494862525422475607 false 40 39378
3 2028478494862525422475607 false 41 39638
3 2028478494862525422475607 false 42 39829
3 2028478494862525422475607 false 43 39829
3 2028478494862525422475607 false 44 39809
3 2028478494862525422475607 false 45 39539
3 2028478494862525422475607 false 46 40069
3 2028478494862525422475607 false 47 39929
3 2028478494862525422475607 false 48 39548
3 2028478494862525422475607 false 49 39539
3 2028478494862525422475607 false 50 42323
3 2028478494862525422475607 false 51 39529
3 2028478494862525422475607 false 52 39508
3 2028478494862525422475607 false 53 39649
3 2028478494862525422475607 false 54 39879
3 2028478494862525422475607 false 55 39589
3 2028478494862525422475607 false 56 39439
3 2028478494862525422475607 false 57 39809
3 2028478494862525422475607 false 58 39679
3 2028478494862525422475607 false 59 39749
3 2028478494862525422475607 false 60 39779
3 2028478494862525422475607 false 61 39499
3 2028478494862525422475607 false 62 39458
3 2028478494862525422475607 false 63 39859
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment