pic_random_dist.f90 Source File

Integer-valued random distributions, reproducible across compilers.


This file depends on

sourcefile~~pic_random_dist.f90~~EfferentGraph sourcefile~pic_random_dist.f90 pic_random_dist.f90 sourcefile~pic_error.f90 pic_error.F90 sourcefile~pic_random_dist.f90->sourcefile~pic_error.f90 sourcefile~pic_rng.f90 pic_rng.f90 sourcefile~pic_random_dist.f90->sourcefile~pic_rng.f90 sourcefile~pic_types.f90 pic_types.F90 sourcefile~pic_random_dist.f90->sourcefile~pic_types.f90 sourcefile~pic_uint64.f90 pic_uint64.f90 sourcefile~pic_random_dist.f90->sourcefile~pic_uint64.f90 sourcefile~pic_error.f90->sourcefile~pic_types.f90 sourcefile~pic_global_definitions.f90 pic_global_definitions.f90 sourcefile~pic_error.f90->sourcefile~pic_global_definitions.f90 sourcefile~pic_rng.f90->sourcefile~pic_error.f90 sourcefile~pic_rng.f90->sourcefile~pic_types.f90 sourcefile~pic_rng.f90->sourcefile~pic_uint64.f90 sourcefile~pic_uint64.f90->sourcefile~pic_types.f90 sourcefile~pic_global_definitions.f90->sourcefile~pic_types.f90

Source Code

! SPDX-License-Identifier: MIT
! Copyright (c) 2025 Jorge Luis Galvez Vallejo
!! Integer-valued random distributions, reproducible across compilers.
module pic_random_dist
   !! Distributions whose output is an integer or a logical, and which are
   !! therefore bit-identical on every supported compiler.
   !!
   !! ### Why a separate module from the real-valued one
   !!
   !! A textbook exponential deviate is `-mean * log(u)`. That calls libm,
   !! and libm is not the same function on every platform: GNU, Intel and
   !! NVIDIA do not agree to the last bit, and they are not obliged to. Any
   !! value derived that way is unusable in state that has to be compared
   !! across runs or across compilers.
   !!
   !! Everything in this module is computed with integer arithmetic only --
   !! no real type appears in any expression that reaches a result -- so a
   !! given generator and seed produce the same sequence everywhere. The
   !! tests pin the first outputs of every routine for a fixed seed, and
   !! those pins are the contract.
   !!
   !! The real-valued distributions live in `pic_random_dist_real`. Keeping
   !! them in a different module means a translation unit that only uses this
   !! one cannot reach a non-reproducible deviate by accident.
   !!
   !! ### Quick start
   !!
   !! ```fortran
   !! use pic_rng, only: splitmix64_t
   !! use pic_random_dist, only: next_range, next_bernoulli_ppm, &
   !!                            next_exponential_int
   !!
   !! type(splitmix64_t) :: gen
   !! call gen%seed(20250914_int64)
   !!
   !! die = next_range(gen, 1, 6)                  ! inclusive
   !! stolen = next_bernoulli_ppm(gen, 2500)       ! 0.25% chance
   !! gap_ms = next_exponential_int(gen, 4000_int64)   ! mean 4 seconds
   !! ```
   use pic_types, only: default_int, int32, int64
   use pic_error, only: error_t, ERROR_VALIDATION
   use pic_rng, only: splitmix64_t, pcg32_t
   use pic_uint64, only: u64_add, u64_shr, u64_less
   implicit none
   private

   public :: next_range
   public :: next_bernoulli_ppm
   public :: next_exponential_int
   public :: next_poisson_int

   integer(default_int), parameter, public :: PPM_ONE = 1000000_default_int
      !! Parts per million corresponding to certainty, for
      !! `next_bernoulli_ppm`.

   integer(int64), parameter, public :: EXPONENTIAL_MAX_MEAN = 2147483647_int64
      !! Largest `mean` `next_exponential_int` accepts, `huge(int32)` as an
      !! `int64`. The bound is what makes the final fixed-point multiply
      !! provably free of signed overflow; see `scale_by_mean`.

   integer(default_int), parameter, public :: POISSON_MAX_MEAN_MILLI = 1000000_default_int
      !! Largest `mean_milli` `next_poisson_int` accepts, that is a mean of
      !! 1000 events. The sampler is O(mean), so this is a guard against
      !! silently getting slow rather than an arithmetic limit.

   integer(default_int), parameter :: EXP_CELL_BITS = 12_default_int
      !! Number of random bits that select a table cell; 2**12 == 4096.
   integer(default_int), parameter :: EXP_CELLS = 4096_default_int
      !! Number of cells in `EXP_TABLE`, and so 2**EXP_CELL_BITS.
   integer(default_int), parameter :: EXP_TOP_CELL = EXP_CELLS - 1_default_int
      !! Index of the cell that runs off to infinity; handled by recursion.
   integer(default_int), parameter :: EXP_MAX_TAIL = 8_default_int
      !! Most times the tail loop may go round. Each turn needs the 12-bit
      !! draw to hit exactly one value, so reaching the cap has probability
      !! 4096**-8, about 3e-29, and bounds the result at 9*ln(4096) means.
! Generated by tools/autogen/gen_exp_table.py -- do not edit.
!
! T(k) = -ln(1 - k/4096) in Q32.32 fixed point, k = 0 .. 4095.
! The bound is spelled EXP_TOP_CELL, which the including module declares
! just above; a bare 4095 here is a magic number the linter rejects.

   integer(int64), parameter :: EXP_TABLE(0:EXP_TOP_CELL) = [ &
                                0_int64, 1048704_int64, 2097664_int64, 3146881_int64, &
                                4196353_int64, 5246083_int64, 6296069_int64, 7346311_int64, &
                                8396811_int64, 9447567_int64, 10498581_int64, 11549852_int64, &
                                12601380_int64, 13653166_int64, 14705209_int64, 15757511_int64, &
                                16810070_int64, 17862887_int64, 18915962_int64, 19969295_int64, &
                                21022887_int64, 22076738_int64, 23130847_int64, 24185215_int64, &
                                25239841_int64, 26294727_int64, 27349872_int64, 28405276_int64, &
                                29460940_int64, 30516863_int64, 31573046_int64, 32629488_int64, &
                                33686191_int64, 34743153_int64, 35800376_int64, 36857859_int64, &
                                37915602_int64, 38973606_int64, 40031871_int64, 41090397_int64, &
                                42149183_int64, 43208231_int64, 44267539_int64, 45327110_int64, &
                                46386941_int64, 47447034_int64, 48507389_int64, 49568006_int64, &
                                50628884_int64, 51690025_int64, 52751428_int64, 53813094_int64, &
                                54875022_int64, 55937212_int64, 56999665_int64, 58062381_int64, &
                                59125361_int64, 60188603_int64, 61252108_int64, 62315877_int64, &
                                63379910_int64, 64444206_int64, 65508766_int64, 66573590_int64, &
                                67638678_int64, 68704030_int64, 69769647_int64, 70835528_int64, &
                                71901673_int64, 72968084_int64, 74034759_int64, 75101699_int64, &
                                76168904_int64, 77236374_int64, 78304110_int64, 79372112_int64, &
                                80440379_int64, 81508911_int64, 82577710_int64, 83646775_int64, &
                                84716105_int64, 85785703_int64, 86855566_int64, 87925696_int64, &
                                88996093_int64, 90066757_int64, 91137687_int64, 92208885_int64, &
                                93280350_int64, 94352082_int64, 95424082_int64, 96496350_int64, &
                                97568885_int64, 98641688_int64, 99714759_int64, 100788099_int64, &
                                101861706_int64, 102935582_int64, 104009727_int64, 105084140_int64, &
                                106158822_int64, 107233774_int64, 108308994_int64, 109384483_int64, &
                                110460242_int64, 111536271_int64, 112612569_int64, 113689136_int64, &
                                114765974_int64, 115843082_int64, 116920460_int64, 117998108_int64, &
                                119076027_int64, 120154216_int64, 121232676_int64, 122311407_int64, &
                                123390409_int64, 124469683_int64, 125549227_int64, 126629043_int64, &
                                127709130_int64, 128789489_int64, 129870120_int64, 130951023_int64, &
                                132032198_int64, 133113645_int64, 134195364_int64, 135277356_int64, &
                                136359621_int64, 137442158_int64, 138524969_int64, 139608052_int64, &
                                140691409_int64, 141775039_int64, 142858942_int64, 143943119_int64, &
                                145027570_int64, 146112295_int64, 147197293_int64, 148282566_int64, &
                                149368113_int64, 150453935_int64, 151540031_int64, 152626402_int64, &
                                153713048_int64, 154799969_int64, 155887164_int64, 156974636_int64, &
                                158062382_int64, 159150404_int64, 160238702_int64, 161327276_int64, &
                                162416125_int64, 163505251_int64, 164594653_int64, 165684331_int64, &
                                166774286_int64, 167864518_int64, 168955026_int64, 170045812_int64, &
                                171136874_int64, 172228214_int64, 173319831_int64, 174411725_int64, &
                                175503898_int64, 176596348_int64, 177689076_int64, 178782082_int64, &
                                179875366_int64, 180968929_int64, 182062770_int64, 183156890_int64, &
                                184251288_int64, 185345966_int64, 186440922_int64, 187536158_int64, &
                                188631673_int64, 189727468_int64, 190823542_int64, 191919897_int64, &
                                193016531_int64, 194113445_int64, 195210639_int64, 196308114_int64, &
                                197405869_int64, 198503905_int64, 199602222_int64, 200700819_int64, &
                                201799698_int64, 202898858_int64, 203998299_int64, 205098022_int64, &
                                206198026_int64, 207298313_int64, 208398881_int64, 209499731_int64, &
                                210600863_int64, 211702278_int64, 212803976_int64, 213905956_int64, &
                                215008219_int64, 216110765_int64, 217213594_int64, 218316706_int64, &
                                219420101_int64, 220523780_int64, 221627743_int64, 222731990_int64, &
                                223836520_int64, 224941335_int64, 226046434_int64, 227151818_int64, &
                                228257486_int64, 229363438_int64, 230469676_int64, 231576198_int64, &
                                232683006_int64, 233790099_int64, 234897478_int64, 236005142_int64, &
                                237113091_int64, 238221327_int64, 239329849_int64, 240438657_int64, &
                                241547751_int64, 242657132_int64, 243766799_int64, 244876753_int64, &
                                245986994_int64, 247097522_int64, 248208337_int64, 249319440_int64, &
                                250430830_int64, 251542508_int64, 252654474_int64, 253766727_int64, &
                                254879269_int64, 255992099_int64, 257105217_int64, 258218624_int64, &
                                259332320_int64, 260446305_int64, 261560578_int64, 262675141_int64, &
                                263789993_int64, 264905134_int64, 266020565_int64, 267136286_int64, &
                                268252297_int64, 269368598_int64, 270485189_int64, 271602070_int64, &
                                272719242_int64, 273836704_int64, 274954458_int64, 276072502_int64, &
                                277190838_int64, 278309464_int64, 279428382_int64, 280547592_int64, &
                                281667094_int64, 282786887_int64, 283906972_int64, 285027350_int64, &
                                286148020_int64, 287268982_int64, 288390237_int64, 289511785_int64, &
                                290633626_int64, 291755760_int64, 292878187_int64, 294000907_int64, &
                                295123921_int64, 296247229_int64, 297370831_int64, 298494726_int64, &
                                299618916_int64, 300743400_int64, 301868179_int64, 302993252_int64, &
                                304118620_int64, 305244284_int64, 306370242_int64, 307496495_int64, &
                                308623044_int64, 309749888_int64, 310877028_int64, 312004464_int64, &
                                313132196_int64, 314260224_int64, 315388549_int64, 316517170_int64, &
                                317646088_int64, 318775302_int64, 319904814_int64, 321034622_int64, &
                                322164728_int64, 323295131_int64, 324425832_int64, 325556831_int64, &
                                326688127_int64, 327819722_int64, 328951615_int64, 330083806_int64, &
                                331216296_int64, 332349084_int64, 333482172_int64, 334615558_int64, &
                                335749243_int64, 336883228_int64, 338017512_int64, 339152096_int64, &
                                340286980_int64, 341422164_int64, 342557647_int64, 343693431_int64, &
                                344829516_int64, 345965901_int64, 347102587_int64, 348239573_int64, &
                                349376861_int64, 350514450_int64, 351652341_int64, 352790532_int64, &
                                353929026_int64, 355067822_int64, 356206919_int64, 357346319_int64, &
                                358486021_int64, 359626026_int64, 360766333_int64, 361906943_int64, &
                                363047856_int64, 364189072_int64, 365330592_int64, 366472415_int64, &
                                367614542_int64, 368756972_int64, 369899706_int64, 371042745_int64, &
                                372186088_int64, 373329735_int64, 374473687_int64, 375617944_int64, &
                                376762505_int64, 377907372_int64, 379052544_int64, 380198021_int64, &
                                381343804_int64, 382489893_int64, 383636287_int64, 384782988_int64, &
                                385929995_int64, 387077308_int64, 388224928_int64, 389372855_int64, &
                                390521088_int64, 391669629_int64, 392818476_int64, 393967632_int64, &
                                395117094_int64, 396266865_int64, 397416943_int64, 398567329_int64, &
                                399718024_int64, 400869027_int64, 402020338_int64, 403171958_int64, &
                                404323887_int64, 405476125_int64, 406628673_int64, 407781529_int64, &
                                408934695_int64, 410088171_int64, 411241957_int64, 412396053_int64, &
                                413550459_int64, 414705175_int64, 415860202_int64, 417015539_int64, &
                                418171188_int64, 419327147_int64, 420483418_int64, 421640000_int64, &
                                422796893_int64, 423954099_int64, 425111616_int64, 426269445_int64, &
                                427427586_int64, 428586040_int64, 429744806_int64, 430903885_int64, &
                                432063277_int64, 433222982_int64, 434383000_int64, 435543332_int64, &
                                436703977_int64, 437864936_int64, 439026209_int64, 440187796_int64, &
                                441349697_int64, 442511912_int64, 443674442_int64, 444837287_int64, &
                                446000447_int64, 447163922_int64, 448327712_int64, 449491817_int64, &
                                450656238_int64, 451820975_int64, 452986028_int64, 454151397_int64, &
                                455317082_int64, 456483084_int64, 457649402_int64, 458816038_int64, &
                                459982990_int64, 461150259_int64, 462317846_int64, 463485750_int64, &
                                464653971_int64, 465822511_int64, 466991369_int64, 468160544_int64, &
                                469330039_int64, 470499851_int64, 471669983_int64, 472840433_int64, &
                                474011202_int64, 475182291_int64, 476353699_int64, 477525426_int64, &
                                478697474_int64, 479869841_int64, 481042528_int64, 482215536_int64, &
                                483388864_int64, 484562513_int64, 485736482_int64, 486910773_int64, &
                                488085384_int64, 489260317_int64, 490435571_int64, 491611148_int64, &
                                492787046_int64, 493963266_int64, 495139808_int64, 496316672_int64, &
                                497493860_int64, 498671369_int64, 499849202_int64, 501027358_int64, &
                                502205837_int64, 503384640_int64, 504563766_int64, 505743216_int64, &
                                506922990_int64, 508103088_int64, 509283511_int64, 510464258_int64, &
                                511645330_int64, 512826726_int64, 514008448_int64, 515190495_int64, &
                                516372867_int64, 517555565_int64, 518738589_int64, 519921938_int64, &
                                521105614_int64, 522289616_int64, 523473944_int64, 524658600_int64, &
                                525843582_int64, 527028891_int64, 528214527_int64, 529400490_int64, &
                                530586782_int64, 531773401_int64, 532960348_int64, 534147623_int64, &
                                535335226_int64, 536523158_int64, 537711418_int64, 538900007_int64, &
                                540088926_int64, 541278173_int64, 542467750_int64, 543657656_int64, &
                                544847893_int64, 546038459_int64, 547229355_int64, 548420582_int64, &
                                549612139_int64, 550804026_int64, 551996245_int64, 553188794_int64, &
                                554381675_int64, 555574887_int64, 556768431_int64, 557962307_int64, &
                                559156514_int64, 560351054_int64, 561545926_int64, 562741130_int64, &
                                563936668_int64, 565132538_int64, 566328741_int64, 567525277_int64, &
                                568722147_int64, 569919350_int64, 571116888_int64, 572314759_int64, &
                                573512964_int64, 574711504_int64, 575910378_int64, 577109588_int64, &
                                578309132_int64, 579509011_int64, 580709225_int64, 581909775_int64, &
                                583110661_int64, 584311882_int64, 585513440_int64, 586715333_int64, &
                                587917563_int64, 589120130_int64, 590323034_int64, 591526274_int64, &
                                592729852_int64, 593933767_int64, 595138020_int64, 596342611_int64, &
                                597547539_int64, 598752806_int64, 599958410_int64, 601164354_int64, &
                                602370636_int64, 603577257_int64, 604784217_int64, 605991516_int64, &
                                607199155_int64, 608407133_int64, 609615452_int64, 610824110_int64, &
                                612033109_int64, 613242448_int64, 614452127_int64, 615662147_int64, &
                                616872509_int64, 618083211_int64, 619294255_int64, 620505641_int64, &
                                621717368_int64, 622929437_int64, 624141849_int64, 625354602_int64, &
                                626567699_int64, 627781138_int64, 628994920_int64, 630209045_int64, &
                                631423513_int64, 632638325_int64, 633853480_int64, 635068980_int64, &
                                636284823_int64, 637501011_int64, 638717544_int64, 639934421_int64, &
                                641151642_int64, 642369209_int64, 643587122_int64, 644805379_int64, &
                                646023983_int64, 647242932_int64, 648462227_int64, 649681868_int64, &
                                650901856_int64, 652122191_int64, 653342872_int64, 654563900_int64, &
                                655785276_int64, 657006999_int64, 658229070_int64, 659451488_int64, &
                                660674255_int64, 661897369_int64, 663120833_int64, 664344644_int64, &
                                665568805_int64, 666793314_int64, 668018173_int64, 669243381_int64, &
                                670468939_int64, 671694847_int64, 672921104_int64, 674147712_int64, &
                                675374671_int64, 676601979_int64, 677829639_int64, 679057650_int64, &
                                680286012_int64, 681514725_int64, 682743790_int64, 683973207_int64, &
                                685202975_int64, 686433096_int64, 687663570_int64, 688894396_int64, &
                                690125574_int64, 691357106_int64, 692588991_int64, 693821230_int64, &
                                695053822_int64, 696286768_int64, 697520068_int64, 698753722_int64, &
                                699987731_int64, 701222094_int64, 702456813_int64, 703691886_int64, &
                                704927314_int64, 706163098_int64, 707399238_int64, 708635734_int64, &
                                709872585_int64, 711109793_int64, 712347358_int64, 713585279_int64, &
                                714823557_int64, 716062192_int64, 717301184_int64, 718540534_int64, &
                                719780242_int64, 721020308_int64, 722260731_int64, 723501514_int64, &
                                724742654_int64, 725984154_int64, 727226012_int64, 728468230_int64, &
                                729710807_int64, 730953743_int64, 732197040_int64, 733440696_int64, &
                                734684713_int64, 735929090_int64, 737173827_int64, 738418926_int64, &
                                739664385_int64, 740910206_int64, 742156389_int64, 743402933_int64, &
                                744649838_int64, 745897106_int64, 747144737_int64, 748392730_int64, &
                                749641085_int64, 750889804_int64, 752138885_int64, 753388330_int64, &
                                754638139_int64, 755888311_int64, 757138848_int64, 758389748_int64, &
                                759641013_int64, 760892643_int64, 762144638_int64, 763396997_int64, &
                                764649722_int64, 765902813_int64, 767156269_int64, 768410091_int64, &
                                769664279_int64, 770918833_int64, 772173754_int64, 773429042_int64, &
                                774684697_int64, 775940719_int64, 777197109_int64, 778453866_int64, &
                                779710991_int64, 780968484_int64, 782226345_int64, 783484575_int64, &
                                784743173_int64, 786002141_int64, 787261477_int64, 788521183_int64, &
                                789781259_int64, 791041704_int64, 792302519_int64, 793563705_int64, &
                                794825261_int64, 796087187_int64, 797349485_int64, 798612153_int64, &
                                799875193_int64, 801138605_int64, 802402388_int64, 803666543_int64, &
                                804931071_int64, 806195971_int64, 807461243_int64, 808726888_int64, &
                                809992907_int64, 811259298_int64, 812526063_int64, 813793202_int64, &
                                815060715_int64, 816328602_int64, 817596864_int64, 818865500_int64, &
                                820134511_int64, 821403897_int64, 822673658_int64, 823943795_int64, &
                                825214307_int64, 826485195_int64, 827756460_int64, 829028101_int64, &
                                830300118_int64, 831572513_int64, 832845284_int64, 834118433_int64, &
                                835391959_int64, 836665863_int64, 837940145_int64, 839214805_int64, &
                                840489844_int64, 841765261_int64, 843041057_int64, 844317232_int64, &
                                845593787_int64, 846870721_int64, 848148034_int64, 849425728_int64, &
                                850703802_int64, 851982256_int64, 853261091_int64, 854540307_int64, &
                                855819904_int64, 857099882_int64, 858380242_int64, 859660984_int64, &
                                860942108_int64, 862223614_int64, 863505502_int64, 864787773_int64, &
                                866070428_int64, 867353465_int64, 868636886_int64, 869920690_int64, &
                                871204878_int64, 872489450_int64, 873774407_int64, 875059748_int64, &
                                876345474_int64, 877631585_int64, 878918081_int64, 880204963_int64, &
                                881492230_int64, 882779883_int64, 884067922_int64, 885356348_int64, &
                                886645161_int64, 887934360_int64, 889223946_int64, 890513920_int64, &
                                891804281_int64, 893095030_int64, 894386167_int64, 895677692_int64, &
                                896969606_int64, 898261909_int64, 899554600_int64, 900847681_int64, &
                                902141151_int64, 903435011_int64, 904729260_int64, 906023900_int64, &
                                907318930_int64, 908614351_int64, 909910162_int64, 911206365_int64, &
                                912502959_int64, 913799944_int64, 915097321_int64, 916395091_int64, &
                                917693252_int64, 918991806_int64, 920290753_int64, 921590093_int64, &
                                922889825_int64, 924189952_int64, 925490472_int64, 926791386_int64, &
                                928092694_int64, 929394396_int64, 930696493_int64, 931998985_int64, &
                                933301872_int64, 934605155_int64, 935908833_int64, 937212907_int64, &
                                938517377_int64, 939822243_int64, 941127506_int64, 942433166_int64, &
                                943739222_int64, 945045676_int64, 946352528_int64, 947659777_int64, &
                                948967424_int64, 950275470_int64, 951583913_int64, 952892756_int64, &
                                954201998_int64, 955511639_int64, 956821679_int64, 958132119_int64, &
                                959442959_int64, 960754199_int64, 962065840_int64, 963377881_int64, &
                                964690324_int64, 966003167_int64, 967316412_int64, 968630059_int64, &
                                969944107_int64, 971258558_int64, 972573411_int64, 973888666_int64, &
                                975204325_int64, 976520386_int64, 977836852_int64, 979153720_int64, &
                                980470993_int64, 981788670_int64, 983106751_int64, 984425236_int64, &
                                985744127_int64, 987063423_int64, 988383124_int64, 989703231_int64, &
                                991023743_int64, 992344662_int64, 993665987_int64, 994987719_int64, &
                                996309858_int64, 997632403_int64, 998955357_int64, 1000278717_int64, &
                                1001602486_int64, 1002926663_int64, 1004251248_int64, 1005576242_int64, &
                                1006901644_int64, 1008227456_int64, 1009553677_int64, 1010880308_int64, &
                                1012207349_int64, 1013534800_int64, 1014862661_int64, 1016190933_int64, &
                                1017519616_int64, 1018848710_int64, 1020178215_int64, 1021508132_int64, &
                                1022838461_int64, 1024169203_int64, 1025500356_int64, 1026831923_int64, &
                                1028163902_int64, 1029496295_int64, 1030829101_int64, 1032162320_int64, &
                                1033495954_int64, 1034830002_int64, 1036164464_int64, 1037499342_int64, &
                                1038834634_int64, 1040170341_int64, 1041506464_int64, 1042843003_int64, &
                                1044179958_int64, 1045517329_int64, 1046855117_int64, 1048193321_int64, &
                                1049531943_int64, 1050870982_int64, 1052210438_int64, 1053550312_int64, &
                                1054890605_int64, 1056231316_int64, 1057572445_int64, 1058913994_int64, &
                                1060255961_int64, 1061598348_int64, 1062941155_int64, 1064284382_int64, &
                                1065628029_int64, 1066972096_int64, 1068316584_int64, 1069661493_int64, &
                                1071006824_int64, 1072352576_int64, 1073698750_int64, 1075045345_int64, &
                                1076392363_int64, 1077739804_int64, 1079087668_int64, 1080435955_int64, &
                                1081784665_int64, 1083133798_int64, 1084483356_int64, 1085833338_int64, &
                                1087183744_int64, 1088534575_int64, 1089885831_int64, 1091237513_int64, &
                                1092589619_int64, 1093942152_int64, 1095295111_int64, 1096648496_int64, &
                                1098002307_int64, 1099356546_int64, 1100711211_int64, 1102066305_int64, &
                                1103421825_int64, 1104777774_int64, 1106134151_int64, 1107490956_int64, &
                                1108848190_int64, 1110205853_int64, 1111563946_int64, 1112922468_int64, &
                                1114281420_int64, 1115640802_int64, 1117000614_int64, 1118360857_int64, &
                                1119721531_int64, 1121082636_int64, 1122444173_int64, 1123806141_int64, &
                                1125168542_int64, 1126531374_int64, 1127894640_int64, 1129258338_int64, &
                                1130622469_int64, 1131987034_int64, 1133352032_int64, 1134717464_int64, &
                                1136083331_int64, 1137449632_int64, 1138816368_int64, 1140183539_int64, &
                                1141551145_int64, 1142919187_int64, 1144287664_int64, 1145656578_int64, &
                                1147025929_int64, 1148395716_int64, 1149765940_int64, 1151136601_int64, &
                                1152507700_int64, 1153879237_int64, 1155251212_int64, 1156623625_int64, &
                                1157996477_int64, 1159369768_int64, 1160743498_int64, 1162117668_int64, &
                                1163492277_int64, 1164867327_int64, 1166242817_int64, 1167618747_int64, &
                                1168995119_int64, 1170371931_int64, 1171749186_int64, 1173126882_int64, &
                                1174505020_int64, 1175883600_int64, 1177262623_int64, 1178642089_int64, &
                                1180021998_int64, 1181402351_int64, 1182783148_int64, 1184164388_int64, &
                                1185546073_int64, 1186928202_int64, 1188310777_int64, 1189693796_int64, &
                                1191077261_int64, 1192461172_int64, 1193845529_int64, 1195230332_int64, &
                                1196615582_int64, 1198001279_int64, 1199387423_int64, 1200774015_int64, &
                                1202161054_int64, 1203548542_int64, 1204936477_int64, 1206324862_int64, &
                                1207713695_int64, 1209102978_int64, 1210492710_int64, 1211882892_int64, &
                                1213273524_int64, 1214664607_int64, 1216056140_int64, 1217448124_int64, &
                                1218840560_int64, 1220233447_int64, 1221626786_int64, 1223020577_int64, &
                                1224414820_int64, 1225809517_int64, 1227204666_int64, 1228600269_int64, &
                                1229996325_int64, 1231392835_int64, 1232789800_int64, 1234187219_int64, &
                                1235585093_int64, 1236983422_int64, 1238382206_int64, 1239781446_int64, &
                                1241181142_int64, 1242581295_int64, 1243981904_int64, 1245382969_int64, &
                                1246784492_int64, 1248186473_int64, 1249588911_int64, 1250991808_int64, &
                                1252395162_int64, 1253798976_int64, 1255203248_int64, 1256607980_int64, &
                                1258013171_int64, 1259418823_int64, 1260824934_int64, 1262231506_int64, &
                                1263638539_int64, 1265046033_int64, 1266453988_int64, 1267862405_int64, &
                                1269271284_int64, 1270680625_int64, 1272090429_int64, 1273500695_int64, &
                                1274911425_int64, 1276322619_int64, 1277734276_int64, 1279146397_int64, &
                                1280558983_int64, 1281972034_int64, 1283385550_int64, 1284799531_int64, &
                                1286213977_int64, 1287628890_int64, 1289044269_int64, 1290460114_int64, &
                                1291876427_int64, 1293293206_int64, 1294710453_int64, 1296128168_int64, &
                                1297546351_int64, 1298965003_int64, 1300384123_int64, 1301803712_int64, &
                                1303223771_int64, 1304644299_int64, 1306065298_int64, 1307486766_int64, &
                                1308908705_int64, 1310331115_int64, 1311753997_int64, 1313177350_int64, &
                                1314601174_int64, 1316025471_int64, 1317450241_int64, 1318875483_int64, &
                                1320301198_int64, 1321727387_int64, 1323154049_int64, 1324581186_int64, &
                                1326008797_int64, 1327436882_int64, 1328865443_int64, 1330294479_int64, &
                                1331723990_int64, 1333153978_int64, 1334584442_int64, 1336015382_int64, &
                                1337446799_int64, 1338878693_int64, 1340311065_int64, 1341743915_int64, &
                                1343177243_int64, 1344611050_int64, 1346045335_int64, 1347480099_int64, &
                                1348915343_int64, 1350351067_int64, 1351787271_int64, 1353223955_int64, &
                                1354661120_int64, 1356098766_int64, 1357536893_int64, 1358975502_int64, &
                                1360414593_int64, 1361854167_int64, 1363294223_int64, 1364734762_int64, &
                                1366175784_int64, 1367617290_int64, 1369059280_int64, 1370501755_int64, &
                                1371944714_int64, 1373388158_int64, 1374832087_int64, 1376276502_int64, &
                                1377721402_int64, 1379166789_int64, 1380612663_int64, 1382059023_int64, &
                                1383505871_int64, 1384953206_int64, 1386401029_int64, 1387849341_int64, &
                                1389298141_int64, 1390747429_int64, 1392197207_int64, 1393647475_int64, &
                                1395098232_int64, 1396549480_int64, 1398001218_int64, 1399453447_int64, &
                                1400906167_int64, 1402359379_int64, 1403813083_int64, 1405267279_int64, &
                                1406721967_int64, 1408177148_int64, 1409632823_int64, 1411088990_int64, &
                                1412545652_int64, 1414002808_int64, 1415460459_int64, 1416918604_int64, &
                                1418377245_int64, 1419836381_int64, 1421296013_int64, 1422756141_int64, &
                                1424216766_int64, 1425677888_int64, 1427139507_int64, 1428601623_int64, &
                                1430064238_int64, 1431527351_int64, 1432990962_int64, 1434455072_int64, &
                                1435919682_int64, 1437384791_int64, 1438850400_int64, 1440316509_int64, &
                                1441783119_int64, 1443250230_int64, 1444717842_int64, 1446185956_int64, &
                                1447654572_int64, 1449123691_int64, 1450593312_int64, 1452063436_int64, &
                                1453534063_int64, 1455005194_int64, 1456476829_int64, 1457948969_int64, &
                                1459421613_int64, 1460894763_int64, 1462368418_int64, 1463842578_int64, &
                                1465317245_int64, 1466792419_int64, 1468268099_int64, 1469744286_int64, &
                                1471220981_int64, 1472698184_int64, 1474175895_int64, 1475654115_int64, &
                                1477132844_int64, 1478612082_int64, 1480091829_int64, 1481572087_int64, &
                                1483052855_int64, 1484534133_int64, 1486015923_int64, 1487498224_int64, &
                                1488981037_int64, 1490464362_int64, 1491948199_int64, 1493432549_int64, &
                                1494917413_int64, 1496402790_int64, 1497888681_int64, 1499375086_int64, &
                                1500862005_int64, 1502349440_int64, 1503837390_int64, 1505325855_int64, &
                                1506814837_int64, 1508304335_int64, 1509794349_int64, 1511284881_int64, &
                                1512775930_int64, 1514267498_int64, 1515759583_int64, 1517252186_int64, &
                                1518745309_int64, 1520238951_int64, 1521733113_int64, 1523227794_int64, &
                                1524722996_int64, 1526218719_int64, 1527714962_int64, 1529211727_int64, &
                                1530709014_int64, 1532206823_int64, 1533705155_int64, 1535204009_int64, &
                                1536703387_int64, 1538203288_int64, 1539703713_int64, 1541204663_int64, &
                                1542706137_int64, 1544208137_int64, 1545710662_int64, 1547213712_int64, &
                                1548717289_int64, 1550221393_int64, 1551726023_int64, 1553231181_int64, &
                                1554736866_int64, 1556243079_int64, 1557749821_int64, 1559257091_int64, &
                                1560764891_int64, 1562273220_int64, 1563782079_int64, 1565291469_int64, &
                                1566801389_int64, 1568311840_int64, 1569822822_int64, 1571334336_int64, &
                                1572846382_int64, 1574358961_int64, 1575872073_int64, 1577385718_int64, &
                                1578899896_int64, 1580414609_int64, 1581929855_int64, 1583445637_int64, &
                                1584961954_int64, 1586478806_int64, 1587996194_int64, 1589514119_int64, &
                                1591032580_int64, 1592551578_int64, 1594071114_int64, 1595591187_int64, &
                                1597111799_int64, 1598632949_int64, 1600154638_int64, 1601676866_int64, &
                                1603199634_int64, 1604722943_int64, 1606246791_int64, 1607771181_int64, &
                                1609296111_int64, 1610821584_int64, 1612347598_int64, 1613874155_int64, &
                                1615401254_int64, 1616928897_int64, 1618457083_int64, 1619985813_int64, &
                                1621515088_int64, 1623044907_int64, 1624575271_int64, 1626106181_int64, &
                                1627637637_int64, 1629169639_int64, 1630702187_int64, 1632235283_int64, &
                                1633768926_int64, 1635303117_int64, 1636837856_int64, 1638373143_int64, &
                                1639908980_int64, 1641445366_int64, 1642982302_int64, 1644519788_int64, &
                                1646057825_int64, 1647596412_int64, 1649135551_int64, 1650675242_int64, &
                                1652215485_int64, 1653756281_int64, 1655297629_int64, 1656839531_int64, &
                                1658381986_int64, 1659924996_int64, 1661468560_int64, 1663012679_int64, &
                                1664557354_int64, 1666102584_int64, 1667648370_int64, 1669194713_int64, &
                                1670741613_int64, 1672289070_int64, 1673837085_int64, 1675385658_int64, &
                                1676934790_int64, 1678484480_int64, 1680034730_int64, 1681585540_int64, &
                                1683136909_int64, 1684688840_int64, 1686241331_int64, 1687794384_int64, &
                                1689347998_int64, 1690902175_int64, 1692456914_int64, 1694012217_int64, &
                                1695568083_int64, 1697124512_int64, 1698681506_int64, 1700239064_int64, &
                                1701797188_int64, 1703355877_int64, 1704915131_int64, 1706474953_int64, &
                                1708035340_int64, 1709596295_int64, 1711157818_int64, 1712719908_int64, &
                                1714282567_int64, 1715845794_int64, 1717409591_int64, 1718973957_int64, &
                                1720538893_int64, 1722104400_int64, 1723670477_int64, 1725237126_int64, &
                                1726804346_int64, 1728372138_int64, 1729940503_int64, 1731509441_int64, &
                                1733078952_int64, 1734649037_int64, 1736219696_int64, 1737790930_int64, &
                                1739362739_int64, 1740935123_int64, 1742508083_int64, 1744081619_int64, &
                                1745655732_int64, 1747230422_int64, 1748805690_int64, 1750381536_int64, &
                                1751957960_int64, 1753534963_int64, 1755112545_int64, 1756690707_int64, &
                                1758269449_int64, 1759848771_int64, 1761428674_int64, 1763009159_int64, &
                                1764590226_int64, 1766171875_int64, 1767754106_int64, 1769336921_int64, &
                                1770920319_int64, 1772504301_int64, 1774088867_int64, 1775674018_int64, &
                                1777259755_int64, 1778846077_int64, 1780432985_int64, 1782020480_int64, &
                                1783608562_int64, 1785197231_int64, 1786786489_int64, 1788376334_int64, &
                                1789966768_int64, 1791557791_int64, 1793149404_int64, 1794741607_int64, &
                                1796334401_int64, 1797927785_int64, 1799521760_int64, 1801116328_int64, &
                                1802711487_int64, 1804307240_int64, 1805903585_int64, 1807500524_int64, &
                                1809098057_int64, 1810696185_int64, 1812294907_int64, 1813894224_int64, &
                                1815494138_int64, 1817094647_int64, 1818695753_int64, 1820297457_int64, &
                                1821899758_int64, 1823502656_int64, 1825106154_int64, 1826710250_int64, &
                                1828314945_int64, 1829920240_int64, 1831526136_int64, 1833132632_int64, &
                                1834739729_int64, 1836347428_int64, 1837955729_int64, 1839564632_int64, &
                                1841174138_int64, 1842784248_int64, 1844394961_int64, 1846006279_int64, &
                                1847618201_int64, 1849230729_int64, 1850843862_int64, 1852457602_int64, &
                                1854071948_int64, 1855686901_int64, 1857302461_int64, 1858918629_int64, &
                                1860535406_int64, 1862152792_int64, 1863770786_int64, 1865389391_int64, &
                                1867008606_int64, 1868628431_int64, 1870248868_int64, 1871869916_int64, &
                                1873491577_int64, 1875113849_int64, 1876736735_int64, 1878360235_int64, &
                                1879984348_int64, 1881609075_int64, 1883234418_int64, 1884860375_int64, &
                                1886486949_int64, 1888114139_int64, 1889741945_int64, 1891370369_int64, &
                                1892999410_int64, 1894629070_int64, 1896259348_int64, 1897890245_int64, &
                                1899521761_int64, 1901153898_int64, 1902786655_int64, 1904420033_int64, &
                                1906054032_int64, 1907688653_int64, 1909323897_int64, 1910959763_int64, &
                                1912596253_int64, 1914233367_int64, 1915871104_int64, 1917509467_int64, &
                                1919148455_int64, 1920788068_int64, 1922428308_int64, 1924069174_int64, &
                                1925710667_int64, 1927352788_int64, 1928995537_int64, 1930638915_int64, &
                                1932282921_int64, 1933927558_int64, 1935572824_int64, 1937218720_int64, &
                                1938865248_int64, 1940512407_int64, 1942160198_int64, 1943808622_int64, &
                                1945457678_int64, 1947107368_int64, 1948757692_int64, 1950408650_int64, &
                                1952060242_int64, 1953712471_int64, 1955365335_int64, 1957018835_int64, &
                                1958672973_int64, 1960327747_int64, 1961983159_int64, 1963639210_int64, &
                                1965295899_int64, 1966953228_int64, 1968611197_int64, 1970269805_int64, &
                                1971929055_int64, 1973588946_int64, 1975249478_int64, 1976910653_int64, &
                                1978572470_int64, 1980234931_int64, 1981898036_int64, 1983561784_int64, &
                                1985226178_int64, 1986891217_int64, 1988556901_int64, 1990223232_int64, &
                                1991890209_int64, 1993557834_int64, 1995226106_int64, 1996895027_int64, &
                                1998564596_int64, 2000234815_int64, 2001905684_int64, 2003577202_int64, &
                                2005249372_int64, 2006922193_int64, 2008595665_int64, 2010269790_int64, &
                                2011944568_int64, 2013619999_int64, 2015296083_int64, 2016972823_int64, &
                                2018650217_int64, 2020328266_int64, 2022006971_int64, 2023686333_int64, &
                                2025366351_int64, 2027047027_int64, 2028728361_int64, 2030410353_int64, &
                                2032093005_int64, 2033776315_int64, 2035460286_int64, 2037144917_int64, &
                                2038830210_int64, 2040516164_int64, 2042202779_int64, 2043890058_int64, &
                                2045577999_int64, 2047266605_int64, 2048955874_int64, 2050645808_int64, &
                                2052336407_int64, 2054027672_int64, 2055719603_int64, 2057412201_int64, &
                                2059105467_int64, 2060799400_int64, 2062494001_int64, 2064189272_int64, &
                                2065885211_int64, 2067581821_int64, 2069279101_int64, 2070977052_int64, &
                                2072675675_int64, 2074374970_int64, 2076074937_int64, 2077775577_int64, &
                                2079476891_int64, 2081178880_int64, 2082881542_int64, 2084584881_int64, &
                                2086288895_int64, 2087993585_int64, 2089698952_int64, 2091404997_int64, &
                                2093111720_int64, 2094819121_int64, 2096527201_int64, 2098235960_int64, &
                                2099945400_int64, 2101655520_int64, 2103366322_int64, 2105077805_int64, &
                                2106789971_int64, 2108502819_int64, 2110216351_int64, 2111930567_int64, &
                                2113645467_int64, 2115361052_int64, 2117077323_int64, 2118794279_int64, &
                                2120511923_int64, 2122230253_int64, 2123949272_int64, 2125668978_int64, &
                                2127389374_int64, 2129110459_int64, 2130832234_int64, 2132554699_int64, &
                                2134277855_int64, 2136001703_int64, 2137726244_int64, 2139451477_int64, &
                                2141177403_int64, 2142904023_int64, 2144631337_int64, 2146359347_int64, &
                                2148088052_int64, 2149817453_int64, 2151547550_int64, 2153278345_int64, &
                                2155009838_int64, 2156742028_int64, 2158474918_int64, 2160208508_int64, &
                                2161942797_int64, 2163677787_int64, 2165413478_int64, 2167149870_int64, &
                                2168886965_int64, 2170624763_int64, 2172363264_int64, 2174102470_int64, &
                                2175842379_int64, 2177582994_int64, 2179324315_int64, 2181066342_int64, &
                                2182809076_int64, 2184552517_int64, 2186296666_int64, 2188041524_int64, &
                                2189787091_int64, 2191533367_int64, 2193280354_int64, 2195028052_int64, &
                                2196776461_int64, 2198525583_int64, 2200275417_int64, 2202025964_int64, &
                                2203777225_int64, 2205529200_int64, 2207281890_int64, 2209035296_int64, &
                                2210789418_int64, 2212544256_int64, 2214299812_int64, 2216056086_int64, &
                                2217813078_int64, 2219570789_int64, 2221329220_int64, 2223088371_int64, &
                                2224848243_int64, 2226608836_int64, 2228370152_int64, 2230132189_int64, &
                                2231894950_int64, 2233658435_int64, 2235422645_int64, 2237187579_int64, &
                                2238953239_int64, 2240719624_int64, 2242486737_int64, 2244254577_int64, &
                                2246023145_int64, 2247792442_int64, 2249562467_int64, 2251333223_int64, &
                                2253104709_int64, 2254876925_int64, 2256649874_int64, 2258423554_int64, &
                                2260197968_int64, 2261973114_int64, 2263748995_int64, 2265525610_int64, &
                                2267302961_int64, 2269081047_int64, 2270859869_int64, 2272639429_int64, &
                                2274419727_int64, 2276200762_int64, 2277982537_int64, 2279765051_int64, &
                                2281548305_int64, 2283332299_int64, 2285117035_int64, 2286902513_int64, &
                                2288688734_int64, 2290475698_int64, 2292263405_int64, 2294051857_int64, &
                                2295841054_int64, 2297630997_int64, 2299421686_int64, 2301213122_int64, &
                                2303005305_int64, 2304798236_int64, 2306591917_int64, 2308386346_int64, &
                                2310181526_int64, 2311977456_int64, 2313774138_int64, 2315571571_int64, &
                                2317369757_int64, 2319168697_int64, 2320968390_int64, 2322768837_int64, &
                                2324570040_int64, 2326371998_int64, 2328174712_int64, 2329978184_int64, &
                                2331782413_int64, 2333587400_int64, 2335393146_int64, 2337199652_int64, &
                                2339006918_int64, 2340814945_int64, 2342623733_int64, 2344433283_int64, &
                                2346243596_int64, 2348054672_int64, 2349866512_int64, 2351679117_int64, &
                                2353492488_int64, 2355306624_int64, 2357121526_int64, 2358937196_int64, &
                                2360753634_int64, 2362570841_int64, 2364388816_int64, 2366207562_int64, &
                                2368027078_int64, 2369847365_int64, 2371668424_int64, 2373490255_int64, &
                                2375312859_int64, 2377136238_int64, 2378960390_int64, 2380785318_int64, &
                                2382611021_int64, 2384437501_int64, 2386264758_int64, 2388092793_int64, &
                                2389921606_int64, 2391751198_int64, 2393581570_int64, 2395412722_int64, &
                                2397244655_int64, 2399077370_int64, 2400910867_int64, 2402745147_int64, &
                                2404580212_int64, 2406416060_int64, 2408252693_int64, 2410090113_int64, &
                                2411928318_int64, 2413767311_int64, 2415607091_int64, 2417447660_int64, &
                                2419289018_int64, 2421131166_int64, 2422974104_int64, 2424817833_int64, &
                                2426662354_int64, 2428507668_int64, 2430353775_int64, 2432200675_int64, &
                                2434048370_int64, 2435896861_int64, 2437746147_int64, 2439596230_int64, &
                                2441447110_int64, 2443298788_int64, 2445151265_int64, 2447004541_int64, &
                                2448858617_int64, 2450713494_int64, 2452569172_int64, 2454425653_int64, &
                                2456282936_int64, 2458141022_int64, 2459999913_int64, 2461859609_int64, &
                                2463720110_int64, 2465581418_int64, 2467443533_int64, 2469306455_int64, &
                                2471170186_int64, 2473034725_int64, 2474900075_int64, 2476766235_int64, &
                                2478633206_int64, 2480500989_int64, 2482369585_int64, 2484238994_int64, &
                                2486109217_int64, 2487980255_int64, 2489852109_int64, 2491724778_int64, &
                                2493598264_int64, 2495472568_int64, 2497347690_int64, 2499223632_int64, &
                                2501100392_int64, 2502977974_int64, 2504856376_int64, 2506735601_int64, &
                                2508615648_int64, 2510496518_int64, 2512378212_int64, 2514260732_int64, &
                                2516144076_int64, 2518028247_int64, 2519913245_int64, 2521799070_int64, &
                                2523685724_int64, 2525573207_int64, 2527461520_int64, 2529350663_int64, &
                                2531240638_int64, 2533131444_int64, 2535023084_int64, 2536915557_int64, &
                                2538808864_int64, 2540703006_int64, 2542597984_int64, 2544493798_int64, &
                                2546390450_int64, 2548287939_int64, 2550186267_int64, 2552085435_int64, &
                                2553985442_int64, 2555886291_int64, 2557787981_int64, 2559690514_int64, &
                                2561593890_int64, 2563498109_int64, 2565403174_int64, 2567309083_int64, &
                                2569215839_int64, 2571123442_int64, 2573031892_int64, 2574941191_int64, &
                                2576851338_int64, 2578762336_int64, 2580674184_int64, 2582586884_int64, &
                                2584500436_int64, 2586414841_int64, 2588330100_int64, 2590246213_int64, &
                                2592163181_int64, 2594081005_int64, 2595999686_int64, 2597919225_int64, &
                                2599839621_int64, 2601760877_int64, 2603682993_int64, 2605605969_int64, &
                                2607529807_int64, 2609454506_int64, 2611380069_int64, 2613306495_int64, &
                                2615233786_int64, 2617161942_int64, 2619090964_int64, 2621020853_int64, &
                                2622951609_int64, 2624883233_int64, 2626815727_int64, 2628749091_int64, &
                                2630683325_int64, 2632618431_int64, 2634554409_int64, 2636491260_int64, &
                                2638428985_int64, 2640367585_int64, 2642307060_int64, 2644247411_int64, &
                                2646188639_int64, 2648130745_int64, 2650073730_int64, 2652017594_int64, &
                                2653962338_int64, 2655907963_int64, 2657854470_int64, 2659801859_int64, &
                                2661750132_int64, 2663699289_int64, 2665649331_int64, 2667600258_int64, &
                                2669552073_int64, 2671504774_int64, 2673458364_int64, 2675412843_int64, &
                                2677368212_int64, 2679324471_int64, 2681281622_int64, 2683239665_int64, &
                                2685198601_int64, 2687158431_int64, 2689119156_int64, 2691080776_int64, &
                                2693043292_int64, 2695006706_int64, 2696971018_int64, 2698936228_int64, &
                                2700902338_int64, 2702869349_int64, 2704837260_int64, 2706806074_int64, &
                                2708775791_int64, 2710746412_int64, 2712717937_int64, 2714690367_int64, &
                                2716663704_int64, 2718637948_int64, 2720613099_int64, 2722589160_int64, &
                                2724566130_int64, 2726544010_int64, 2728522802_int64, 2730502506_int64, &
                                2732483122_int64, 2734464653_int64, 2736447098_int64, 2738430459_int64, &
                                2740414736_int64, 2742399930_int64, 2744386042_int64, 2746373073_int64, &
                                2748361023_int64, 2750349894_int64, 2752339687_int64, 2754330402_int64, &
                                2756322040_int64, 2758314602_int64, 2760308089_int64, 2762302501_int64, &
                                2764297840_int64, 2766294107_int64, 2768291302_int64, 2770289426_int64, &
                                2772288480_int64, 2774288464_int64, 2776289381_int64, 2778291230_int64, &
                                2780294013_int64, 2782297730_int64, 2784302382_int64, 2786307970_int64, &
                                2788314496_int64, 2790321959_int64, 2792330361_int64, 2794339702_int64, &
                                2796349984_int64, 2798361207_int64, 2800373373_int64, 2802386481_int64, &
                                2804400534_int64, 2806415532_int64, 2808431475_int64, 2810448365_int64, &
                                2812466203_int64, 2814484989_int64, 2816504724_int64, 2818525410_int64, &
                                2820547047_int64, 2822569636_int64, 2824593177_int64, 2826617673_int64, &
                                2828643123_int64, 2830669529_int64, 2832696892_int64, 2834725212_int64, &
                                2836754490_int64, 2838784727_int64, 2840815925_int64, 2842848084_int64, &
                                2844881204_int64, 2846915288_int64, 2848950335_int64, 2850986347_int64, &
                                2853023325_int64, 2855061269_int64, 2857100181_int64, 2859140061_int64, &
                                2861180910_int64, 2863222729_int64, 2865265520_int64, 2867309283_int64, &
                                2869354019_int64, 2871399728_int64, 2873446413_int64, 2875494073_int64, &
                                2877542710_int64, 2879592324_int64, 2881642918_int64, 2883694490_int64, &
                                2885747043_int64, 2887800578_int64, 2889855095_int64, 2891910595_int64, &
                                2893967079_int64, 2896024548_int64, 2898083004_int64, 2900142446_int64, &
                                2902202877_int64, 2904264296_int64, 2906326706_int64, 2908390106_int64, &
                                2910454498_int64, 2912519882_int64, 2914586261_int64, 2916653634_int64, &
                                2918722002_int64, 2920791367_int64, 2922861730_int64, 2924933091_int64, &
                                2927005452_int64, 2929078813_int64, 2931153175_int64, 2933228540_int64, &
                                2935304908_int64, 2937382281_int64, 2939460658_int64, 2941540042_int64, &
                                2943620433_int64, 2945701832_int64, 2947784241_int64, 2949867659_int64, &
                                2951952089_int64, 2954037531_int64, 2956123986_int64, 2958211455_int64, &
                                2960299939_int64, 2962389439_int64, 2964479956_int64, 2966571491_int64, &
                                2968664045_int64, 2970757619_int64, 2972852214_int64, 2974947832_int64, &
                                2977044472_int64, 2979142136_int64, 2981240825_int64, 2983340540_int64, &
                                2985441283_int64, 2987543053_int64, 2989645852_int64, 2991749681_int64, &
                                2993854541_int64, 2995960434_int64, 2998067359_int64, 3000175319_int64, &
                                3002284313_int64, 3004394344_int64, 3006505412_int64, 3008617517_int64, &
                                3010730663_int64, 3012844848_int64, 3014960074_int64, 3017076343_int64, &
                                3019193655_int64, 3021312011_int64, 3023431413_int64, 3025551861_int64, &
                                3027673356_int64, 3029795900_int64, 3031919493_int64, 3034044137_int64, &
                                3036169832_int64, 3038296580_int64, 3040424382_int64, 3042553238_int64, &
                                3044683150_int64, 3046814119_int64, 3048946145_int64, 3051079231_int64, &
                                3053213376_int64, 3055348582_int64, 3057484850_int64, 3059622182_int64, &
                                3061760577_int64, 3063900038_int64, 3066040565_int64, 3068182159_int64, &
                                3070324822_int64, 3072468554_int64, 3074613357_int64, 3076759231_int64, &
                                3078906178_int64, 3081054199_int64, 3083203294_int64, 3085353466_int64, &
                                3087504714_int64, 3089657040_int64, 3091810446_int64, 3093964932_int64, &
                                3096120499_int64, 3098277148_int64, 3100434881_int64, 3102593699_int64, &
                                3104753602_int64, 3106914592_int64, 3109076669_int64, 3111239836_int64, &
                                3113404093_int64, 3115569441_int64, 3117735881_int64, 3119903414_int64, &
                                3122072042_int64, 3124241765_int64, 3126412585_int64, 3128584503_int64, &
                                3130757520_int64, 3132931636_int64, 3135106854_int64, 3137283174_int64, &
                                3139460597_int64, 3141639125_int64, 3143818758_int64, 3145999498_int64, &
                                3148181346_int64, 3150364303_int64, 3152548369_int64, 3154733547_int64, &
                                3156919838_int64, 3159107242_int64, 3161295760_int64, 3163485394_int64, &
                                3165676145_int64, 3167868014_int64, 3170061002_int64, 3172255111_int64, &
                                3174450341_int64, 3176646693_int64, 3178844170_int64, 3181042771_int64, &
                                3183242498_int64, 3185443353_int64, 3187645335_int64, 3189848448_int64, &
                                3192052691_int64, 3194258065_int64, 3196464573_int64, 3198672215_int64, &
                                3200880992_int64, 3203090906_int64, 3205301957_int64, 3207514148_int64, &
                                3209727478_int64, 3211941949_int64, 3214157563_int64, 3216374321_int64, &
                                3218592223_int64, 3220811271_int64, 3223031466_int64, 3225252809_int64, &
                                3227475302_int64, 3229698946_int64, 3231923741_int64, 3234149689_int64, &
                                3236376792_int64, 3238605050_int64, 3240834465_int64, 3243065037_int64, &
                                3245296769_int64, 3247529660_int64, 3249763714_int64, 3251998930_int64, &
                                3254235309_int64, 3256472854_int64, 3258711565_int64, 3260951444_int64, &
                                3263192492_int64, 3265434709_int64, 3267678098_int64, 3269922659_int64, &
                                3272168393_int64, 3274415303_int64, 3276663388_int64, 3278912651_int64, &
                                3281163092_int64, 3283414713_int64, 3285667516_int64, 3287921500_int64, &
                                3290176668_int64, 3292433021_int64, 3294690560_int64, 3296949285_int64, &
                                3299209200_int64, 3301470304_int64, 3303732599_int64, 3305996087_int64, &
                                3308260768_int64, 3310526643_int64, 3312793715_int64, 3315061984_int64, &
                                3317331452_int64, 3319602119_int64, 3321873988_int64, 3324147058_int64, &
                                3326421333_int64, 3328696812_int64, 3330973498_int64, 3333251391_int64, &
                                3335530493_int64, 3337810805_int64, 3340092328_int64, 3342375064_int64, &
                                3344659013_int64, 3346944178_int64, 3349230560_int64, 3351518159_int64, &
                                3353806977_int64, 3356097016_int64, 3358388276_int64, 3360680759_int64, &
                                3362974467_int64, 3365269400_int64, 3367565560_int64, 3369862948_int64, &
                                3372161566_int64, 3374461415_int64, 3376762496_int64, 3379064810_int64, &
                                3381368359_int64, 3383673144_int64, 3385979167_int64, 3388286429_int64, &
                                3390594930_int64, 3392904674_int64, 3395215660_int64, 3397527890_int64, &
                                3399841365_int64, 3402156088_int64, 3404472058_int64, 3406789278_int64, &
                                3409107749_int64, 3411427472_int64, 3413748449_int64, 3416070681_int64, &
                                3418394169_int64, 3420718914_int64, 3423044919_int64, 3425372184_int64, &
                                3427700710_int64, 3430030500_int64, 3432361554_int64, 3434693874_int64, &
                                3437027461_int64, 3439362317_int64, 3441698443_int64, 3444035840_int64, &
                                3446374510_int64, 3448714455_int64, 3451055674_int64, 3453398171_int64, &
                                3455741946_int64, 3458087000_int64, 3460433336_int64, 3462780954_int64, &
                                3465129856_int64, 3467480043_int64, 3469831517_int64, 3472184280_int64, &
                                3474538331_int64, 3476893674_int64, 3479250309_int64, 3481608238_int64, &
                                3483967462_int64, 3486327983_int64, 3488689801_int64, 3491052920_int64, &
                                3493417339_int64, 3495783060_int64, 3498150086_int64, 3500518416_int64, &
                                3502888053_int64, 3505258999_int64, 3507631254_int64, 3510004819_int64, &
                                3512379698_int64, 3514755890_int64, 3517133397_int64, 3519512222_int64, &
                                3521892364_int64, 3524273827_int64, 3526656610_int64, 3529040717_int64, &
                                3531426147_int64, 3533812903_int64, 3536200986_int64, 3538590398_int64, &
                                3540981139_int64, 3543373213_int64, 3545766619_int64, 3548161359_int64, &
                                3550557436_int64, 3552954850_int64, 3555353603_int64, 3557753697_int64, &
                                3560155132_int64, 3562557911_int64, 3564962035_int64, 3567367506_int64, &
                                3569774324_int64, 3572182492_int64, 3574592011_int64, 3577002882_int64, &
                                3579415108_int64, 3581828689_int64, 3584243627_int64, 3586659924_int64, &
                                3589077580_int64, 3591496599_int64, 3593916981_int64, 3596338727_int64, &
                                3598761840_int64, 3601186321_int64, 3603612171_int64, 3606039391_int64, &
                                3608467985_int64, 3610897952_int64, 3613329295_int64, 3615762015_int64, &
                                3618196114_int64, 3620631593_int64, 3623068454_int64, 3625506699_int64, &
                                3627946328_int64, 3630387344_int64, 3632829748_int64, 3635273542_int64, &
                                3637718727_int64, 3640165304_int64, 3642613277_int64, 3645062645_int64, &
                                3647513411_int64, 3649965576_int64, 3652419142_int64, 3654874111_int64, &
                                3657330483_int64, 3659788262_int64, 3662247447_int64, 3664708041_int64, &
                                3667170046_int64, 3669633463_int64, 3672098294_int64, 3674564540_int64, &
                                3677032203_int64, 3679501284_int64, 3681971786_int64, 3684443710_int64, &
                                3686917057_int64, 3689391829_int64, 3691868029_int64, 3694345656_int64, &
                                3696824714_int64, 3699305203_int64, 3701787126_int64, 3704270484_int64, &
                                3706755278_int64, 3709241511_int64, 3711729184_int64, 3714218299_int64, &
                                3716708857_int64, 3719200860_int64, 3721694310_int64, 3724189209_int64, &
                                3726685557_int64, 3729183357_int64, 3731682611_int64, 3734183320_int64, &
                                3736685485_int64, 3739189110_int64, 3741694194_int64, 3744200741_int64, &
                                3746708751_int64, 3749218226_int64, 3751729169_int64, 3754241580_int64, &
                                3756755462_int64, 3759270817_int64, 3761787645_int64, 3764305949_int64, &
                                3766825730_int64, 3769346991_int64, 3771869732_int64, 3774393957_int64, &
                                3776919665_int64, 3779446860_int64, 3781975543_int64, 3784505715_int64, &
                                3787037378_int64, 3789570535_int64, 3792105187_int64, 3794641336_int64, &
                                3797178982_int64, 3799718130_int64, 3802258779_int64, 3804800932_int64, &
                                3807344590_int64, 3809889756_int64, 3812436431_int64, 3814984617_int64, &
                                3817534316_int64, 3820085529_int64, 3822638259_int64, 3825192506_int64, &
                                3827748274_int64, 3830305563_int64, 3832864376_int64, 3835424714_int64, &
                                3837986580_int64, 3840549974_int64, 3843114899_int64, 3845681357_int64, &
                                3848249350_int64, 3850818879_int64, 3853389946_int64, 3855962553_int64, &
                                3858536702_int64, 3861112394_int64, 3863689632_int64, 3866268418_int64, &
                                3868848753_int64, 3871430639_int64, 3874014078_int64, 3876599072_int64, &
                                3879185623_int64, 3881773732_int64, 3884363402_int64, 3886954634_int64, &
                                3889547431_int64, 3892141793_int64, 3894737724_int64, 3897335225_int64, &
                                3899934297_int64, 3902534944_int64, 3905137166_int64, 3907740965_int64, &
                                3910346344_int64, 3912953305_int64, 3915561849_int64, 3918171978_int64, &
                                3920783694_int64, 3923396999_int64, 3926011896_int64, 3928628385_int64, &
                                3931246470_int64, 3933866151_int64, 3936487431_int64, 3939110312_int64, &
                                3941734796_int64, 3944360884_int64, 3946988579_int64, 3949617882_int64, &
                                3952248797_int64, 3954881323_int64, 3957515465_int64, 3960151223_int64, &
                                3962788599_int64, 3965427596_int64, 3968068215_int64, 3970710459_int64, &
                                3973354329_int64, 3975999828_int64, 3978646958_int64, 3981295720_int64, &
                                3983946116_int64, 3986598149_int64, 3989251821_int64, 3991907133_int64, &
                                3994564088_int64, 3997222687_int64, 3999882933_int64, 4002544828_int64, &
                                4005208374_int64, 4007873572_int64, 4010540426_int64, 4013208936_int64, &
                                4015879106_int64, 4018550936_int64, 4021224430_int64, 4023899588_int64, &
                                4026576414_int64, 4029254910_int64, 4031935077_int64, 4034616917_int64, &
                                4037300433_int64, 4039985627_int64, 4042672501_int64, 4045361056_int64, &
                                4048051296_int64, 4050743221_int64, 4053436835_int64, 4056132140_int64, &
                                4058829136_int64, 4061527828_int64, 4064228216_int64, 4066930303_int64, &
                                4069634091_int64, 4072339583_int64, 4075046779_int64, 4077755683_int64, &
                                4080466297_int64, 4083178623_int64, 4085892662_int64, 4088608418_int64, &
                                4091325891_int64, 4094045086_int64, 4096766003_int64, 4099488645_int64, &
                                4102213013_int64, 4104939111_int64, 4107666941_int64, 4110396504_int64, &
                                4113127803_int64, 4115860840_int64, 4118595617_int64, 4121332136_int64, &
                                4124070400_int64, 4126810412_int64, 4129552172_int64, 4132295683_int64, &
                                4135040949_int64, 4137787970_int64, 4140536749_int64, 4143287288_int64, &
                                4146039591_int64, 4148793657_int64, 4151549492_int64, 4154307095_int64, &
                                4157066470_int64, 4159827619_int64, 4162590545_int64, 4165355249_int64, &
                                4168121733_int64, 4170890001_int64, 4173660054_int64, 4176431895_int64, &
                                4179205526_int64, 4181980949_int64, 4184758167_int64, 4187537182_int64, &
                                4190317996_int64, 4193100612_int64, 4195885032_int64, 4198671258_int64, &
                                4201459292_int64, 4204249138_int64, 4207040797_int64, 4209834272_int64, &
                                4212629565_int64, 4215426678_int64, 4218225614_int64, 4221026375_int64, &
                                4223828964_int64, 4226633383_int64, 4229439634_int64, 4232247720_int64, &
                                4235057643_int64, 4237869406_int64, 4240683011_int64, 4243498460_int64, &
                                4246315755_int64, 4249134900_int64, 4251955897_int64, 4254778748_int64, &
                                4257603455_int64, 4260430021_int64, 4263258449_int64, 4266088741_int64, &
                                4268920899_int64, 4271754925_int64, 4274590823_int64, 4277428595_int64, &
                                4280268243_int64, 4283109769_int64, 4285953177_int64, 4288798469_int64, &
                                4291645646_int64, 4294494713_int64, 4297345670_int64, 4300198521_int64, &
                                4303053269_int64, 4305909915_int64, 4308768462_int64, 4311628913_int64, &
                                4314491271_int64, 4317355537_int64, 4320221715_int64, 4323089807_int64, &
                                4325959815_int64, 4328831743_int64, 4331705592_int64, 4334581365_int64, &
                                4337459065_int64, 4340338695_int64, 4343220256_int64, 4346103752_int64, &
                                4348989186_int64, 4351876559_int64, 4354765874_int64, 4357657135_int64, &
                                4360550343_int64, 4363445501_int64, 4366342612_int64, 4369241679_int64, &
                                4372142704_int64, 4375045690_int64, 4377950639_int64, 4380857555_int64, &
                                4383766439_int64, 4386677294_int64, 4389590124_int64, 4392504931_int64, &
                                4395421717_int64, 4398340485_int64, 4401261238_int64, 4404183979_int64, &
                                4407108710_int64, 4410035434_int64, 4412964153_int64, 4415894872_int64, &
                                4418827591_int64, 4421762314_int64, 4424699044_int64, 4427637783_int64, &
                                4430578535_int64, 4433521301_int64, 4436466085_int64, 4439412890_int64, &
                                4442361717_int64, 4445312571_int64, 4448265453_int64, 4451220367_int64, &
                                4454177316_int64, 4457136301_int64, 4460097327_int64, 4463060395_int64, &
                                4466025509_int64, 4468992671_int64, 4471961885_int64, 4474933152_int64, &
                                4477906477_int64, 4480881861_int64, 4483859309_int64, 4486838821_int64, &
                                4489820402_int64, 4492804055_int64, 4495789781_int64, 4498777584_int64, &
                                4501767468_int64, 4504759434_int64, 4507753486_int64, 4510749626_int64, &
                                4513747859_int64, 4516748185_int64, 4519750609_int64, 4522755133_int64, &
                                4525761761_int64, 4528770495_int64, 4531781338_int64, 4534794293_int64, &
                                4537809363_int64, 4540826551_int64, 4543845860_int64, 4546867294_int64, &
                                4549890854_int64, 4552916545_int64, 4555944368_int64, 4558974327_int64, &
                                4562006426_int64, 4565040666_int64, 4568077052_int64, 4571115586_int64, &
                                4574156271_int64, 4577199110_int64, 4580244106_int64, 4583291263_int64, &
                                4586340583_int64, 4589392070_int64, 4592445726_int64, 4595501555_int64, &
                                4598559560_int64, 4601619743_int64, 4604682108_int64, 4607746659_int64, &
                                4610813398_int64, 4613882327_int64, 4616953452_int64, 4620026774_int64, &
                                4623102297_int64, 4626180023_int64, 4629259957_int64, 4632342101_int64, &
                                4635426458_int64, 4638513032_int64, 4641601825_int64, 4644692842_int64, &
                                4647786085_int64, 4650881557_int64, 4653979261_int64, 4657079202_int64, &
                                4660181381_int64, 4663285803_int64, 4666392470_int64, 4669501386_int64, &
                                4672612554_int64, 4675725978_int64, 4678841660_int64, 4681959603_int64, &
                                4685079812_int64, 4688202289_int64, 4691327038_int64, 4694454062_int64, &
                                4697583365_int64, 4700714949_int64, 4703848818_int64, 4706984975_int64, &
                                4710123424_int64, 4713264168_int64, 4716407211_int64, 4719552555_int64, &
                                4722700204_int64, 4725850162_int64, 4729002432_int64, 4732157017_int64, &
                                4735313920_int64, 4738473146_int64, 4741634698_int64, 4744798578_int64, &
                                4747964791_int64, 4751133339_int64, 4754304227_int64, 4757477457_int64, &
                                4760653034_int64, 4763830960_int64, 4767011240_int64, 4770193876_int64, &
                                4773378872_int64, 4776566232_int64, 4779755959_int64, 4782948057_int64, &
                                4786142529_int64, 4789339379_int64, 4792538610_int64, 4795740225_int64, &
                                4798944229_int64, 4802150625_int64, 4805359417_int64, 4808570608_int64, &
                                4811784201_int64, 4815000201_int64, 4818218610_int64, 4821439433_int64, &
                                4824662673_int64, 4827888334_int64, 4831116419_int64, 4834346933_int64, &
                                4837579878_int64, 4840815258_int64, 4844053078_int64, 4847293340_int64, &
                                4850536048_int64, 4853781207_int64, 4857028820_int64, 4860278890_int64, &
                                4863531421_int64, 4866786417_int64, 4870043882_int64, 4873303819_int64, &
                                4876566233_int64, 4879831127_int64, 4883098504_int64, 4886368369_int64, &
                                4889640725_int64, 4892915576_int64, 4896192926_int64, 4899472779_int64, &
                                4902755139_int64, 4906040009_int64, 4909327393_int64, 4912617296_int64, &
                                4915909720_int64, 4919204670_int64, 4922502150_int64, 4925802163_int64, &
                                4929104714_int64, 4932409807_int64, 4935717444_int64, 4939027631_int64, &
                                4942340371_int64, 4945655668_int64, 4948973527_int64, 4952293950_int64, &
                                4955616942_int64, 4958942508_int64, 4962270650_int64, 4965601373_int64, &
                                4968934681_int64, 4972270578_int64, 4975609068_int64, 4978950155_int64, &
                                4982293844_int64, 4985640137_int64, 4988989039_int64, 4992340555_int64, &
                                4995694688_int64, 4999051443_int64, 5002410823_int64, 5005772833_int64, &
                                5009137477_int64, 5012504758_int64, 5015874682_int64, 5019247251_int64, &
                                5022622471_int64, 5026000346_int64, 5029380879_int64, 5032764075_int64, &
                                5036149939_int64, 5039538473_int64, 5042929683_int64, 5046323573_int64, &
                                5049720147_int64, 5053119409_int64, 5056521363_int64, 5059926014_int64, &
                                5063333367_int64, 5066743424_int64, 5070156191_int64, 5073571672_int64, &
                                5076989872_int64, 5080410794_int64, 5083834443_int64, 5087260823_int64, &
                                5090689939_int64, 5094121794_int64, 5097556395_int64, 5100993744_int64, &
                                5104433846_int64, 5107876705_int64, 5111322327_int64, 5114770715_int64, &
                                5118221875_int64, 5121675809_int64, 5125132523_int64, 5128592022_int64, &
                                5132054309_int64, 5135519390_int64, 5138987269_int64, 5142457949_int64, &
                                5145931437_int64, 5149407736_int64, 5152886851_int64, 5156368787_int64, &
                                5159853548_int64, 5163341138_int64, 5166831563_int64, 5170324826_int64, &
                                5173820933_int64, 5177319888_int64, 5180821696_int64, 5184326362_int64, &
                                5187833889_int64, 5191344284_int64, 5194857550_int64, 5198373692_int64, &
                                5201892715_int64, 5205414623_int64, 5208939422_int64, 5212467116_int64, &
                                5215997710_int64, 5219531209_int64, 5223067617_int64, 5226606939_int64, &
                                5230149180_int64, 5233694346_int64, 5237242439_int64, 5240793467_int64, &
                                5244347432_int64, 5247904341_int64, 5251464198_int64, 5255027008_int64, &
                                5258592776_int64, 5262161507_int64, 5265733206_int64, 5269307877_int64, &
                                5272885526_int64, 5276466158_int64, 5280049777_int64, 5283636388_int64, &
                                5287225998_int64, 5290818610_int64, 5294414229_int64, 5298012861_int64, &
                                5301614511_int64, 5305219184_int64, 5308826885_int64, 5312437618_int64, &
                                5316051390_int64, 5319668205_int64, 5323288068_int64, 5326910984_int64, &
                                5330536959_int64, 5334165998_int64, 5337798106_int64, 5341433288_int64, &
                                5345071550_int64, 5348712896_int64, 5352357331_int64, 5356004862_int64, &
                                5359655493_int64, 5363309230_int64, 5366966078_int64, 5370626041_int64, &
                                5374289127_int64, 5377955339_int64, 5381624683_int64, 5385297165_int64, &
                                5388972790_int64, 5392651563_int64, 5396333490_int64, 5400018576_int64, &
                                5403706826_int64, 5407398246_int64, 5411092842_int64, 5414790619_int64, &
                                5418491582_int64, 5422195737_int64, 5425903089_int64, 5429613644_int64, &
                                5433327408_int64, 5437044385_int64, 5440764582_int64, 5444488004_int64, &
                                5448214657_int64, 5451944547_int64, 5455677678_int64, 5459414057_int64, &
                                5463153689_int64, 5466896580_int64, 5470642736_int64, 5474392162_int64, &
                                5478144864_int64, 5481900848_int64, 5485660120_int64, 5489422684_int64, &
                                5493188548_int64, 5496957717_int64, 5500730196_int64, 5504505991_int64, &
                                5508285109_int64, 5512067555_int64, 5515853336_int64, 5519642456_int64, &
                                5523434922_int64, 5527230739_int64, 5531029914_int64, 5534832453_int64, &
                                5538638361_int64, 5542447645_int64, 5546260311_int64, 5550076364_int64, &
                                5553895810_int64, 5557718656_int64, 5561544908_int64, 5565374571_int64, &
                                5569207653_int64, 5573044158_int64, 5576884093_int64, 5580727465_int64, &
                                5584574278_int64, 5588424541_int64, 5592278258_int64, 5596135436_int64, &
                                5599996081_int64, 5603860199_int64, 5607727797_int64, 5611598881_int64, &
                                5615473457_int64, 5619351532_int64, 5623233111_int64, 5627118201_int64, &
                                5631006810_int64, 5634898941_int64, 5638794604_int64, 5642693803_int64, &
                                5646596545_int64, 5650502836_int64, 5654412684_int64, 5658326094_int64, &
                                5662243073_int64, 5666163628_int64, 5670087764_int64, 5674015490_int64, &
                                5677946810_int64, 5681881732_int64, 5685820263_int64, 5689762408_int64, &
                                5693708176_int64, 5697657571_int64, 5701610602_int64, 5705567274_int64, &
                                5709527594_int64, 5713491570_int64, 5717459207_int64, 5721430514_int64, &
                                5725405495_int64, 5729384159_int64, 5733366512_int64, 5737352561_int64, &
                                5741342312_int64, 5745335774_int64, 5749332951_int64, 5753333853_int64, &
                                5757338485_int64, 5761346854_int64, 5765358967_int64, 5769374832_int64, &
                                5773394456_int64, 5777417845_int64, 5781445006_int64, 5785475947_int64, &
                                5789510675_int64, 5793549196_int64, 5797591519_int64, 5801637649_int64, &
                                5805687595_int64, 5809741363_int64, 5813798962_int64, 5817860397_int64, &
                                5821925676_int64, 5825994807_int64, 5830067797_int64, 5834144652_int64, &
                                5838225382_int64, 5842309992_int64, 5846398490_int64, 5850490884_int64, &
                                5854587182_int64, 5858687389_int64, 5862791515_int64, 5866899566_int64, &
                                5871011551_int64, 5875127476_int64, 5879247349_int64, 5883371177_int64, &
                                5887498970_int64, 5891630733_int64, 5895766474_int64, 5899906202_int64, &
                                5904049924_int64, 5908197647_int64, 5912349380_int64, 5916505130_int64, &
                                5920664905_int64, 5924828713_int64, 5928996561_int64, 5933168458_int64, &
                                5937344411_int64, 5941524428_int64, 5945708517_int64, 5949896686_int64, &
                                5954088944_int64, 5958285297_int64, 5962485754_int64, 5966690324_int64, &
                                5970899013_int64, 5975111831_int64, 5979328785_int64, 5983549883_int64, &
                                5987775134_int64, 5992004546_int64, 5996238127_int64, 6000475885_int64, &
                                6004717828_int64, 6008963965_int64, 6013214304_int64, 6017468854_int64, &
                                6021727622_int64, 6025990617_int64, 6030257848_int64, 6034529322_int64, &
                                6038805049_int64, 6043085037_int64, 6047369294_int64, 6051657829_int64, &
                                6055950650_int64, 6060247766_int64, 6064549186_int64, 6068854918_int64, &
                                6073164971_int64, 6077479353_int64, 6081798074_int64, 6086121141_int64, &
                                6090448565_int64, 6094780352_int64, 6099116514_int64, 6103457057_int64, &
                                6107801991_int64, 6112151326_int64, 6116505069_int64, 6120863230_int64, &
                                6125225818_int64, 6129592841_int64, 6133964310_int64, 6138340232_int64, &
                                6142720617_int64, 6147105474_int64, 6151494813_int64, 6155888642_int64, &
                                6160286970_int64, 6164689807_int64, 6169097162_int64, 6173509045_int64, &
                                6177925464_int64, 6182346429_int64, 6186771950_int64, 6191202035_int64, &
                                6195636695_int64, 6200075938_int64, 6204519774_int64, 6208968213_int64, &
                                6213421264_int64, 6217878936_int64, 6222341240_int64, 6226808186_int64, &
                                6231279781_int64, 6235756037_int64, 6240236963_int64, 6244722569_int64, &
                                6249212865_int64, 6253707860_int64, 6258207564_int64, 6262711987_int64, &
                                6267221140_int64, 6271735031_int64, 6276253672_int64, 6280777071_int64, &
                                6285305239_int64, 6289838187_int64, 6294375923_int64, 6298918459_int64, &
                                6303465805_int64, 6308017970_int64, 6312574965_int64, 6317136800_int64, &
                                6321703485_int64, 6326275031_int64, 6330851449_int64, 6335432748_int64, &
                                6340018939_int64, 6344610032_int64, 6349206038_int64, 6353806967_int64, &
                                6358412831_int64, 6363023639_int64, 6367639402_int64, 6372260131_int64, &
                                6376885837_int64, 6381516530_int64, 6386152221_int64, 6390792921_int64, &
                                6395438640_int64, 6400089390_int64, 6404745182_int64, 6409406026_int64, &
                                6414071933_int64, 6418742915_int64, 6423418982_int64, 6428100146_int64, &
                                6432786417_int64, 6437477808_int64, 6442174328_int64, 6446875989_int64, &
                                6451582803_int64, 6456294781_int64, 6461011934_int64, 6465734273_int64, &
                                6470461811_int64, 6475194557_int64, 6479932525_int64, 6484675725_int64, &
                                6489424169_int64, 6494177869_int64, 6498936836_int64, 6503701082_int64, &
                                6508470619_int64, 6513245458_int64, 6518025611_int64, 6522811091_int64, &
                                6527601908_int64, 6532398075_int64, 6537199604_int64, 6542006507_int64, &
                                6546818796_int64, 6551636483_int64, 6556459580_int64, 6561288099_int64, &
                                6566122052_int64, 6570961452_int64, 6575806312_int64, 6580656642_int64, &
                                6585512457_int64, 6590373767_int64, 6595240586_int64, 6600112926_int64, &
                                6604990800_int64, 6609874220_int64, 6614763198_int64, 6619657748_int64, &
                                6624557883_int64, 6629463614_int64, 6634374955_int64, 6639291919_int64, &
                                6644214518_int64, 6649142766_int64, 6654076675_int64, 6659016258_int64, &
                                6663961529_int64, 6668912500_int64, 6673869186_int64, 6678831598_int64, &
                                6683799750_int64, 6688773656_int64, 6693753329_int64, 6698738782_int64, &
                                6703730029_int64, 6708727083_int64, 6713729957_int64, 6718738666_int64, &
                                6723753223_int64, 6728773641_int64, 6733799934_int64, 6738832117_int64, &
                                6743870202_int64, 6748914204_int64, 6753964137_int64, 6759020014_int64, &
                                6764081850_int64, 6769149659_int64, 6774223454_int64, 6779303251_int64, &
                                6784389062_int64, 6789480903_int64, 6794578788_int64, 6799682730_int64, &
                                6804792746_int64, 6809908848_int64, 6815031051_int64, 6820159371_int64, &
                                6825293822_int64, 6830434418_int64, 6835581173_int64, 6840734104_int64, &
                                6845893225_int64, 6851058550_int64, 6856230094_int64, 6861407874_int64, &
                                6866591902_int64, 6871782196_int64, 6876978769_int64, 6882181637_int64, &
                                6887390816_int64, 6892606320_int64, 6897828166_int64, 6903056368_int64, &
                                6908290942_int64, 6913531903_int64, 6918779267_int64, 6924033051_int64, &
                                6929293268_int64, 6934559937_int64, 6939833071_int64, 6945112687_int64, &
                                6950398801_int64, 6955691430_int64, 6960990588_int64, 6966296292_int64, &
                                6971608559_int64, 6976927405_int64, 6982252846_int64, 6987584898_int64, &
                                6992923577_int64, 6998268901_int64, 7003620886_int64, 7008979549_int64, &
                                7014344905_int64, 7019716972_int64, 7025095767_int64, 7030481307_int64, &
                                7035873608_int64, 7041272688_int64, 7046678563_int64, 7052091251_int64, &
                                7057510769_int64, 7062937134_int64, 7068370363_int64, 7073810475_int64, &
                                7079257485_int64, 7084711413_int64, 7090172275_int64, 7095640088_int64, &
                                7101114872_int64, 7106596644_int64, 7112085420_int64, 7117581221_int64, &
                                7123084062_int64, 7128593963_int64, 7134110942_int64, 7139635017_int64, &
                                7145166205_int64, 7150704526_int64, 7156249998_int64, 7161802639_int64, &
                                7167362468_int64, 7172929503_int64, 7178503764_int64, 7184085269_int64, &
                                7189674036_int64, 7195270086_int64, 7200873436_int64, 7206484106_int64, &
                                7212102115_int64, 7217727482_int64, 7223360227_int64, 7229000369_int64, &
                                7234647927_int64, 7240302921_int64, 7245965370_int64, 7251635295_int64, &
                                7257312715_int64, 7262997649_int64, 7268690118_int64, 7274390142_int64, &
                                7280097740_int64, 7285812934_int64, 7291535743_int64, 7297266187_int64, &
                                7303004287_int64, 7308750063_int64, 7314503537_int64, 7320264728_int64, &
                                7326033657_int64, 7331810346_int64, 7337594815_int64, 7343387084_int64, &
                                7349187176_int64, 7354995111_int64, 7360810911_int64, 7366634596_int64, &
                                7372466189_int64, 7378305710_int64, 7384153182_int64, 7390008625_int64, &
                                7395872063_int64, 7401743516_int64, 7407623007_int64, 7413510557_int64, &
                                7419406189_int64, 7425309925_int64, 7431221787_int64, 7437141798_int64, &
                                7443069981_int64, 7449006356_int64, 7454950949_int64, 7460903780_int64, &
                                7466864874_int64, 7472834253_int64, 7478811940_int64, 7484797958_int64, &
                                7490792330_int64, 7496795081_int64, 7502806233_int64, 7508825809_int64, &
                                7514853835_int64, 7520890332_int64, 7526935326_int64, 7532988840_int64, &
                                7539050898_int64, 7545121524_int64, 7551200742_int64, 7557288578_int64, &
                                7563385055_int64, 7569490198_int64, 7575604031_int64, 7581726580_int64, &
                                7587857869_int64, 7593997924_int64, 7600146768_int64, 7606304429_int64, &
                                7612470930_int64, 7618646297_int64, 7624830556_int64, 7631023733_int64, &
                                7637225853_int64, 7643436942_int64, 7649657026_int64, 7655886131_int64, &
                                7662124284_int64, 7668371510_int64, 7674627837_int64, 7680893290_int64, &
                                7687167896_int64, 7693451682_int64, 7699744676_int64, 7706046904_int64, &
                                7712358392_int64, 7718679169_int64, 7725009262_int64, 7731348699_int64, &
                                7737697506_int64, 7744055712_int64, 7750423344_int64, 7756800431_int64, &
                                7763187001_int64, 7769583081_int64, 7775988701_int64, 7782403889_int64, &
                                7788828673_int64, 7795263082_int64, 7801707145_int64, 7808160891_int64, &
                                7814624350_int64, 7821097550_int64, 7827580520_int64, 7834073291_int64, &
                                7840575893_int64, 7847088354_int64, 7853610705_int64, 7860142976_int64, &
                                7866685197_int64, 7873237398_int64, 7879799611_int64, 7886371865_int64, &
                                7892954192_int64, 7899546622_int64, 7906149186_int64, 7912761916_int64, &
                                7919384843_int64, 7926017999_int64, 7932661414_int64, 7939315122_int64, &
                                7945979153_int64, 7952653540_int64, 7959338315_int64, 7966033511_int64, &
                                7972739160_int64, 7979455295_int64, 7986181948_int64, 7992919153_int64, &
                                7999666943_int64, 8006425351_int64, 8013194410_int64, 8019974155_int64, &
                                8026764618_int64, 8033565835_int64, 8040377838_int64, 8047200663_int64, &
                                8054034344_int64, 8060878915_int64, 8067734410_int64, 8074600866_int64, &
                                8081478318_int64, 8088366799_int64, 8095266346_int64, 8102176995_int64, &
                                8109098781_int64, 8116031740_int64, 8122975909_int64, 8129931323_int64, &
                                8136898019_int64, 8143876034_int64, 8150865405_int64, 8157866168_int64, &
                                8164878361_int64, 8171902022_int64, 8178937187_int64, 8185983894_int64, &
                                8193042182_int64, 8200112089_int64, 8207193652_int64, 8214286911_int64, &
                                8221391904_int64, 8228508670_int64, 8235637248_int64, 8242777678_int64, &
                                8249929998_int64, 8257094249_int64, 8264270470_int64, 8271458701_int64, &
                                8278658983_int64, 8285871357_int64, 8293095862_int64, 8300332540_int64, &
                                8307581431_int64, 8314842578_int64, 8322116021_int64, 8329401803_int64, &
                                8336699965_int64, 8344010549_int64, 8351333599_int64, 8358669155_int64, &
                                8366017262_int64, 8373377962_int64, 8380751298_int64, 8388137314_int64, &
                                8395536054_int64, 8402947561_int64, 8410371879_int64, 8417809054_int64, &
                                8425259129_int64, 8432722150_int64, 8440198161_int64, 8447687208_int64, &
                                8455189336_int64, 8462704591_int64, 8470233020_int64, 8477774668_int64, &
                                8485329581_int64, 8492897807_int64, 8500479393_int64, 8508074386_int64, &
                                8515682833_int64, 8523304783_int64, 8530940282_int64, 8538589380_int64, &
                                8546252125_int64, 8553928565_int64, 8561618750_int64, 8569322730_int64, &
                                8577040552_int64, 8584772269_int64, 8592517929_int64, 8600277583_int64, &
                                8608051281_int64, 8615839075_int64, 8623641016_int64, 8631457156_int64, &
                                8639287545_int64, 8647132236_int64, 8654991282_int64, 8662864735_int64, &
                                8670752647_int64, 8678655073_int64, 8686572066_int64, 8694503679_int64, &
                                8702449967_int64, 8710410984_int64, 8718386784_int64, 8726377423_int64, &
                                8734382956_int64, 8742403439_int64, 8750438928_int64, 8758489478_int64, &
                                8766555146_int64, 8774635990_int64, 8782732067_int64, 8790843433_int64, &
                                8798970148_int64, 8807112268_int64, 8815269854_int64, 8823442962_int64, &
                                8831631654_int64, 8839835987_int64, 8848056023_int64, 8856291821_int64, &
                                8864543441_int64, 8872810946_int64, 8881094396_int64, 8889393852_int64, &
                                8897709377_int64, 8906041033_int64, 8914388882_int64, 8922752989_int64, &
                                8931133415_int64, 8939530226_int64, 8947943485_int64, 8956373257_int64, &
                                8964819606_int64, 8973282599_int64, 8981762300_int64, 8990258776_int64, &
                                8998772094_int64, 9007302319_int64, 9015849521_int64, 9024413766_int64, &
                                9032995122_int64, 9041593658_int64, 9050209442_int64, 9058842545_int64, &
                                9067493036_int64, 9076160985_int64, 9084846463_int64, 9093549541_int64, &
                                9102270290_int64, 9111008781_int64, 9119765089_int64, 9128539285_int64, &
                                9137331442_int64, 9146141634_int64, 9154969936_int64, 9163816422_int64, &
                                9172681166_int64, 9181564246_int64, 9190465735_int64, 9199385712_int64, &
                                9208324253_int64, 9217281435_int64, 9226257337_int64, 9235252036_int64, &
                                9244265612_int64, 9253298144_int64, 9262349711_int64, 9271420395_int64, &
                                9280510277_int64, 9289619437_int64, 9298747957_int64, 9307895921_int64, &
                                9317063410_int64, 9326250510_int64, 9335457303_int64, 9344683874_int64, &
                                9353930309_int64, 9363196693_int64, 9372483112_int64, 9381789654_int64, &
                                9391116405_int64, 9400463454_int64, 9409830889_int64, 9419218800_int64, &
                                9428627275_int64, 9438056406_int64, 9447506282_int64, 9456976997_int64, &
                                9466468641_int64, 9475981308_int64, 9485515091_int64, 9495070083_int64, &
                                9504646380_int64, 9514244076_int64, 9523863268_int64, 9533504051_int64, &
                                9543166524_int64, 9552850784_int64, 9562556929_int64, 9572285058_int64, &
                                9582035272_int64, 9591807670_int64, 9601602355_int64, 9611419427_int64, &
                                9621258990_int64, 9631121146_int64, 9641006001_int64, 9650913657_int64, &
                                9660844222_int64, 9670797801_int64, 9680774501_int64, 9690774429_int64, &
                                9700797694_int64, 9710844406_int64, 9720914674_int64, 9731008609_int64, &
                                9741126322_int64, 9751267926_int64, 9761433534_int64, 9771623259_int64, &
                                9781837217_int64, 9792075523_int64, 9802338294_int64, 9812625645_int64, &
                                9822937697_int64, 9833274566_int64, 9843636374_int64, 9854023241_int64, &
                                9864435288_int64, 9874872638_int64, 9885335413_int64, 9895823739_int64, &
                                9906337740_int64, 9916877543_int64, 9927443273_int64, 9938035060_int64, &
                                9948653031_int64, 9959297317_int64, 9969968049_int64, 9980665358_int64, &
                                9991389377_int64, 10002140239_int64, 10012918080_int64, 10023723035_int64, &
                                10034555241_int64, 10045414835_int64, 10056301957_int64, 10067216746_int64, &
                                10078159344_int64, 10089129892_int64, 10100128534_int64, 10111155414_int64, &
                                10122210677_int64, 10133294470_int64, 10144406940_int64, 10155548236_int64, &
                                10166718508_int64, 10177917908_int64, 10189146587_int64, 10200404699_int64, &
                                10211692399_int64, 10223009842_int64, 10234357186_int64, 10245734590_int64, &
                                10257142212_int64, 10268580214_int64, 10280048759_int64, 10291548009_int64, &
                                10303078129_int64, 10314639286_int64, 10326231648_int64, 10337855382_int64, &
                                10349510660_int64, 10361197653_int64, 10372916535_int64, 10384667478_int64, &
                                10396450661_int64, 10408266259_int64, 10420114452_int64, 10431995421_int64, &
                                10443909346_int64, 10455856411_int64, 10467836802_int64, 10479850705_int64, &
                                10491898307_int64, 10503979798_int64, 10516095369_int64, 10528245214_int64, &
                                10540429527_int64, 10552648503_int64, 10564902341_int64, 10577191240_int64, &
                                10589515402_int64, 10601875028_int64, 10614270325_int64, 10626701498_int64, &
                                10639168756_int64, 10651672308_int64, 10664212368_int64, 10676789148_int64, &
                                10689402864_int64, 10702053734_int64, 10714741978_int64, 10727467816_int64, &
                                10740231473_int64, 10753033173_int64, 10765873145_int64, 10778751617_int64, &
                                10791668821_int64, 10804624992_int64, 10817620364_int64, 10830655177_int64, &
                                10843729669_int64, 10856844083_int64, 10869998664_int64, 10883193658_int64, &
                                10896429315_int64, 10909705886_int64, 10923023625_int64, 10936382787_int64, &
                                10949783632_int64, 10963226420_int64, 10976711415_int64, 10990238882_int64, &
                                11003809090_int64, 11017422310_int64, 11031078816_int64, 11044778882_int64, &
                                11058522789_int64, 11072310818_int64, 11086143253_int64, 11100020381_int64, &
                                11113942491_int64, 11127909877_int64, 11141922833_int64, 11155981658_int64, &
                                11170086654_int64, 11184238124_int64, 11198436376_int64, 11212681720_int64, &
                                11226974470_int64, 11241314941_int64, 11255703455_int64, 11270140333_int64, &
                                11284625903_int64, 11299160493_int64, 11313744437_int64, 11328378070_int64, &
                                11343061734_int64, 11357795770_int64, 11372580525_int64, 11387416351_int64, &
                                11402303601_int64, 11417242633_int64, 11432233808_int64, 11447277492_int64, &
                                11462374053_int64, 11477523865_int64, 11492727305_int64, 11507984754_int64, &
                                11523296596_int64, 11538663222_int64, 11554085024_int64, 11569562401_int64, &
                                11585095753_int64, 11600685488_int64, 11616332017_int64, 11632035754_int64, &
                                11647797119_int64, 11663616538_int64, 11679494439_int64, 11695431256_int64, &
                                11711427428_int64, 11727483399_int64, 11743599618_int64, 11759776539_int64, &
                                11776014620_int64, 11792314325_int64, 11808676125_int64, 11825100494_int64, &
                                11841587913_int64, 11858138867_int64, 11874753849_int64, 11891433354_int64, &
                                11908177887_int64, 11924987957_int64, 11941864078_int64, 11958806772_int64, &
                                11975816565_int64, 11992893993_int64, 12010039593_int64, 12027253914_int64, &
                                12044537508_int64, 12061890935_int64, 12079314761_int64, 12096809561_int64, &
                                12114375914_int64, 12132014408_int64, 12149725638_int64, 12167510207_int64, &
                                12185368725_int64, 12203301809_int64, 12221310084_int64, 12239394183_int64, &
                                12257554748_int64, 12275792429_int64, 12294107882_int64, 12312501775_int64, &
                                12330974781_int64, 12349527584_int64, 12368160877_int64, 12386875361_int64, &
                                12405671747_int64, 12424550754_int64, 12443513113_int64, 12462559563_int64, &
                                12481690852_int64, 12500907740_int64, 12520210996_int64, 12539601400_int64, &
                                12559079743_int64, 12578646826_int64, 12598303462_int64, 12618050473_int64, &
                                12637888694_int64, 12657818972_int64, 12677842166_int64, 12697959146_int64, &
                                12718170794_int64, 12738478006_int64, 12758881689_int64, 12779382765_int64, &
                                12799982168_int64, 12820680846_int64, 12841479760_int64, 12862379885_int64, &
                                12883382212_int64, 12904487745_int64, 12925697503_int64, 12947012521_int64, &
                                12968433849_int64, 12989962552_int64, 13011599712_int64, 13033346429_int64, &
                                13055203816_int64, 13077173006_int64, 13099255149_int64, 13121451412_int64, &
                                13143762980_int64, 13166191059_int64, 13188736871_int64, 13211401658_int64, &
                                13234186684_int64, 13257093231_int64, 13280122601_int64, 13303276120_int64, &
                                13326555132_int64, 13349961006_int64, 13373495133_int64, 13397158924_int64, &
                                13420953818_int64, 13444881274_int64, 13468942778_int64, 13493139841_int64, &
                                13517473999_int64, 13541946813_int64, 13566559873_int64, 13591314797_int64, &
                                13616213228_int64, 13641256840_int64, 13666447336_int64, 13691786449_int64, &
                                13717275944_int64, 13742917616_int64, 13768713293_int64, 13794664836_int64, &
                                13820774140_int64, 13847043135_int64, 13873473787_int64, 13900068096_int64, &
                                13926828104_int64, 13953755887_int64, 13980853562_int64, 14008123287_int64, &
                                14035567261_int64, 14063187725_int64, 14090986963_int64, 14118967305_int64, &
                                14147131126_int64, 14175480848_int64, 14204018942_int64, 14232747927_int64, &
                                14261670375_int64, 14290788909_int64, 14320106205_int64, 14349624997_int64, &
                                14379348073_int64, 14409278280_int64, 14439418525_int64, 14469771777_int64, &
                                14500341068_int64, 14531129496_int64, 14562140225_int64, 14593376488_int64, &
                                14624841591_int64, 14656538911_int64, 14688471900_int64, 14720644090_int64, &
                                14753059091_int64, 14785720597_int64, 14818632385_int64, 14851798320_int64, &
                                14885222359_int64, 14918908550_int64, 14952861037_int64, 14987084065_int64, &
                                15021581980_int64, 15056359233_int64, 15091420385_int64, 15126770110_int64, &
                                15162413197_int64, 15198354555_int64, 15234599220_int64, 15271152354_int64, &
                                15308019252_int64, 15345205349_int64, 15382716219_int64, 15420557585_int64, &
                                15458735323_int64, 15497255468_int64, 15536124215_int64, 15575347934_int64, &
                                15614933166_int64, 15654886638_int64, 15695215266_int64, 15735926161_int64, &
                                15777026640_int64, 15818524232_int64, 15860426684_int64, 15902741975_int64, &
                                15945478321_int64, 15988644184_int64, 16032248288_int64, 16076299621_int64, &
                                16120807452_int64, 16165781342_int64, 16211231156_int64, 16257167073_int64, &
                                16303599604_int64, 16350539604_int64, 16397998290_int64, 16445987250_int64, &
                                16494518470_int64, 16543604345_int64, 16593257699_int64, 16643491808_int64, &
                                16694320416_int64, 16745757765_int64, 16797818612_int64, 16850518259_int64, &
                                16903872576_int64, 16957898034_int64, 17012611733_int64, 17068031435_int64, &
                                17124175598_int64, 17181063413_int64, 17238714847_int64, 17297150677_int64, &
                                17356392545_int64, 17416462997_int64, 17477385540_int64, 17539184697_int64, &
                                17601886063_int64, 17665516372_int64, 17730103563_int64, 17795676857_int64, &
                                17862266831_int64, 17929905509_int64, 17998626452_int64, 18068464857_int64, &
                                18139457669_int64, 18211643692_int64, 18285063724_int64, 18359760690_int64, &
                                18435779795_int64, 18513168687_int64, 18591977638_int64, 18672259738_int64, &
                                18754071112_int64, 18837471156_int64, 18922522792_int64, 19009292760_int64, &
                                19097851924_int64, 19188275628_int64, 19280644076_int64, 19375042761_int64, &
                                19471562942_int64, 19570302171_int64, 19671364888_int64, 19774863084_int64, &
                                19880917048_int64, 19989656205_int64, 20101220069_int64, 20215759318_int64, &
                                20333437017_int64, 20454430012_int64, 20578930535_int64, 20707148035_int64, &
                                20839311303_int64, 20975670924_int64, 21116502140_int64, 21262108196_int64, &
                                21412824267_int64, 21569022109_int64, 21731115584_int64, 21899567264_int64, &
                                22074896396_int64, 22257688548_int64, 22448607414_int64, 22648409360_int64, &
                                22857961519_int64, 23078264541_int64, 23310481488_int64, 23555975007_int64, &
                                23816355775_int64, 24093546612_int64, 24389868739_int64, 24708160056_int64, &
                                25051940867_int64, 25425651886_int64, 25835005991_int64, 26287525960_int64, &
                                26793400246_int64, 27366913211_int64, 28028985339_int64, 28812050463_int64, &
                                29770444718_int64, 31006029811_int64, 32747489190_int64, 35724533662_int64]

   integer(int64), parameter :: EXP_LN_CELLS = EXP_TABLE(EXP_TOP_CELL)
      !! ln(4096) in Q32.32. Taken from the table rather than written out
      !! again, because `-ln(1 - 4095/4096)` is exactly `ln(4096)` and a second
      !! copy of it could drift. Added once per turn around the tail loop.
   integer(default_int), parameter :: FRAC_BITS = 31_default_int
      !! Bits used to interpolate within a cell. Thirty-one and not thirty-two
      !! so that `gap * frac` fits a signed `int64` in a single multiply: the
      !! widest gap is below 2**32 (asserted by the table generator), and
      !! (2**32 - 1) * (2**31 - 1) is below huge(int64).
   integer(int64), parameter :: Q32_MASK = 4294967295_int64
      !! 2**32 - 1, to take the fractional part of a Q32.32 value.
   integer(int64), parameter :: Q32_HALF = 2147483648_int64
      !! 2**31, the Q32.32 representation of 0.5, added before the final shift
      !! so that the fraction rounds to nearest instead of truncating.

   integer(int64), parameter :: POISSON_WINDOW = 2097152_int64
      !! 2**21 ticks. The count is the number of exponential inter-arrivals
      !! that fit in this window. Chosen as the largest power of two with
      !! `POISSON_WINDOW * 1000` still inside `EXPONENTIAL_MAX_MEAN`, so that
      !! a mean of one thousandth of an event is still expressible.

   interface next_range
      !! Draw a uniform integer in the inclusive range `[lo, hi]`.
      !!
      !! The span is computed in unsigned 64-bit arithmetic, so the full range
      !! of `default_int` works: `next_range(gen, -huge(1)-1, huge(1))` spans
      !! every `int32` value and is still exactly uniform. Rejection sampling
      !! gives every value in range exactly one preimage per draw, so there is
      !! no modulo bias.
      !!
      !! `hi < lo` is a usage error: it returns `lo` and, if `err` is present,
      !! sets `ERROR_VALIDATION`. `lo == hi` returns `lo` without consuming a
      !! draw.
      module procedure splitmix64_next_range
      module procedure pcg32_next_range
   end interface next_range

   interface next_bernoulli_ppm
      !! Return true with probability `ppm` in a million.
      !!
      !! `ppm` is clamped to `[0, PPM_ONE]`, so 0 never fires and 1000000
      !! always does, and no value in between can be mistyped into an error.
      !! Parts per million rather than a real probability because this reaches
      !! simulation state: an incident either happened or it did not, and two
      !! runs must agree on which.
      module procedure splitmix64_next_bernoulli_ppm
      module procedure pcg32_next_bernoulli_ppm
   end interface next_bernoulli_ppm

   interface next_exponential_int
      !! Draw an exponentially distributed integer with the given mean, in
      !! whatever unit `mean` is expressed in.
      !!
      !! Sampling is a table lookup and two integer multiplies. `EXP_TABLE`
      !! holds the inverse CDF `-ln(1 - k/4096)` in Q32.32 fixed point,
      !! generated once by `tools/autogen/gen_exp_table.py` with 60-digit
      !! decimal arithmetic. Twelve random bits choose a cell, thirty-one more
      !! interpolate linearly inside it, and the result is scaled by `mean`.
      !!
      !! ### The tail
      !!
      !! The top cell runs to infinity and cannot be interpolated into. It is
      !! handled with the memorylessness of the exponential instead: if `U` is
      !! uniform on the top cell then `-ln(1 - U)` is distributed as
      !! `ln(4096)` plus a fresh exponential, so the sampler adds `ln(4096)`
      !! and draws again. That is exact, and it costs an extra draw with
      !! probability 1/4096.
      !!
      !! Capping the top entry at a finite value and interpolating into it --
      !! the obvious alternative -- biases the mean by 0.147%. This scheme
      !! leaves 0.002%, and all of that residue is linear interpolation inside
      !! the body cells, not the tail.
      !!
      !! `mean` must be in `[0, EXPONENTIAL_MAX_MEAN]`. A mean of zero always
      !! returns zero without consuming a draw. Out of range returns zero and,
      !! if `err` is present, sets `ERROR_VALIDATION`.
      module procedure splitmix64_next_exponential_int
      module procedure pcg32_next_exponential_int
   end interface next_exponential_int

   interface next_poisson_int
      !! Draw a Poisson-distributed count with mean `mean_milli/1000`.
      !!
      !! The mean is given a thousand times over so that fractional means are
      !! expressible without a real type: `mean_milli = 2500` means 2.5 events.
      !!
      !! Counts the exponential inter-arrivals that fit inside a fixed window,
      !! which is the defining construction of a Poisson process rather than
      !! an approximation of one. Cost is O(mean).
      !!
      !! `mean_milli` must be in `[0, POISSON_MAX_MEAN_MILLI]`. Zero returns
      !! zero without consuming a draw. Out of range returns zero and, if `err`
      !! is present, sets `ERROR_VALIDATION`.
      module procedure splitmix64_next_poisson_int
      module procedure pcg32_next_poisson_int
   end interface next_poisson_int

contains

   pure function rejection_mask(span_minus_1) result(mask)
      !! Smallest `2**k - 1` that covers `span_minus_1` read as unsigned.
      !!
      !! Smears the highest set bit down over every bit below it. A
      !! `span_minus_1` of -1, which as unsigned is 2**64 - 1, gives a mask of
      !! -1, under which every draw is accepted -- which is right, because
      !! that span is the whole word.
      integer(int64), intent(in) :: span_minus_1
         !! One less than the number of distinct values wanted, unsigned.
      integer(int64) :: mask

      integer(default_int) :: shift

      mask = span_minus_1
      shift = 1_default_int
      do while (shift < 64_default_int)
         mask = ior(mask, u64_shr(mask, shift))
         shift = shift*2_default_int
      end do
   end function rejection_mask

   pure function scale_by_mean(x_q32, mean) result(r)
      !! Multiply a Q32.32 value by an integer mean and drop the fraction.
      !!
      !! Done in two halves so that nothing overflows. The integer part of
      !! `x_q32` is at most 9*ln(4096), under 75, so the first product cannot
      !! exceed 75 * huge(int32). The fractional part is below 2**32 and
      !! `mean` is at most huge(int32), so the second product is at most
      !! (2**32 - 1) * (2**31 - 1); adding the rounding term below still
      !! leaves it under huge(int64), with about 4e9 to spare.
      !!
      !! The fraction is rounded to nearest rather than truncated. Truncating
      !! would lose on average half a unit per draw, which is invisible at a
      !! mean of 4000 ticks and a 23% error at a mean of 2.
      !!
      !! Rounding shrinks that but does not remove it. Discretising an
      !! exponential to integers leaves `E[round(mean*X)]` at
      !! `exp(-1/(2*mean)) / (1 - exp(-1/mean))`, which is 4.0% low at a mean
      !! of 1, 1.0% at 2, 0.46% at 3 and 0.04% at 10. Above about 100 it is
      !! gone. That is inherent to an integer result, not a defect in the
      !! scaling, but a caller working in units that small should know the
      !! mean it gets is not quite the mean it asked for.
      integer(int64), intent(in) :: x_q32
         !! Deviate in Q32.32 fixed point.
      integer(int64), intent(in) :: mean
         !! Mean, in `[0, EXPONENTIAL_MAX_MEAN]`.
      integer(int64) :: r

      r = u64_shr(x_q32, 32_default_int)*mean &
          + u64_shr(iand(x_q32, Q32_MASK)*mean + Q32_HALF, 32_default_int)
   end function scale_by_mean

   ! ---- splitmix64_t --------------------------------------------------------

   function splitmix64_uniform_below(gen, span_minus_1) result(r)
      !! Uniform unsigned integer in `[0, span_minus_1]`, by rejection.
      type(splitmix64_t), intent(inout) :: gen
      integer(int64), intent(in) :: span_minus_1
         !! Inclusive upper bound, read as unsigned.
      integer(int64) :: r

      integer(int64) :: mask

      if (span_minus_1 == 0_int64) then
         r = 0_int64
         return
      end if
      mask = rejection_mask(span_minus_1)
      do
         r = iand(gen%next_u64(), mask)
         if (.not. u64_less(span_minus_1, r)) exit
      end do
   end function splitmix64_uniform_below

   function splitmix64_next_range(gen, lo, hi, err) result(r)
      !! Uniform integer in `[lo, hi]` from a splitmix64_t generator.
      type(splitmix64_t), intent(inout) :: gen
         !! Generator, advanced by the draw.
      integer(default_int), intent(in) :: lo
         !! Inclusive lower bound.
      integer(default_int), intent(in) :: hi
         !! Inclusive upper bound; must not be below `lo`.
      type(error_t), intent(inout), optional :: err
         !! Set to `ERROR_VALIDATION` when `hi < lo`.
      integer(default_int) :: r

      integer(int64) :: span_minus_1

      r = lo
      if (hi < lo) then
         if (present(err)) then
            call err%set(ERROR_VALIDATION, "pic_random_dist: next_range requires hi >= lo")
         end if
         return
      end if
      if (hi == lo) return

      ! hi - lo in unsigned 64-bit, which is exact even when the span is wider
      ! than the signed range. Negation is spelled as `not(x) + 1` because
      ! negating the most negative value directly is signed overflow.
      span_minus_1 = u64_add(int(hi, int64), u64_add(not(int(lo, int64)), 1_int64))
      r = int(u64_add(int(lo, int64), splitmix64_uniform_below(gen, span_minus_1)), default_int)
   end function splitmix64_next_range

   function splitmix64_next_bernoulli_ppm(gen, ppm) result(r)
      !! True with probability `ppm` in a million, from a splitmix64_t generator.
      type(splitmix64_t), intent(inout) :: gen
         !! Generator, advanced by the draw unless `ppm` is 0 or `PPM_ONE`.
      integer(default_int), intent(in) :: ppm
         !! Probability in parts per million, clamped to `[0, PPM_ONE]`.
      logical :: r

      integer(default_int) :: clamped

      clamped = max(0_default_int, min(PPM_ONE, ppm))
      if (clamped == 0_default_int) then
         r = .false.
         return
      end if
      if (clamped == PPM_ONE) then
         r = .true.
         return
      end if
      r = splitmix64_uniform_below(gen, int(PPM_ONE, int64) - 1_int64) < int(clamped, int64)
   end function splitmix64_next_bernoulli_ppm

   function splitmix64_next_exponential_int(gen, mean, err) result(r)
      !! Exponential integer with the given mean, from a splitmix64_t generator.
      type(splitmix64_t), intent(inout) :: gen
         !! Generator, advanced by one draw, or more in the tail.
      integer(int64), intent(in) :: mean
         !! Mean of the distribution, in `[0, EXPONENTIAL_MAX_MEAN]`.
      type(error_t), intent(inout), optional :: err
         !! Set to `ERROR_VALIDATION` when `mean` is out of range.
      integer(int64) :: r

      integer(int64) :: word, x_q32, gap
      integer(default_int) :: cell, frac, turns

      r = 0_int64
      if (mean < 0_int64 .or. mean > EXPONENTIAL_MAX_MEAN) then
         if (present(err)) then
            call err%set(ERROR_VALIDATION, &
                         "pic_random_dist: next_exponential_int mean out of range")
         end if
         return
      end if
      if (mean == 0_int64) return

      x_q32 = 0_int64
      turns = 0_default_int
      do
         word = gen%next_u64()
         cell = int(ibits(word, 0_default_int, EXP_CELL_BITS), default_int)
         if (cell < EXP_TOP_CELL .or. turns >= EXP_MAX_TAIL) then
            if (cell >= EXP_TOP_CELL) cell = EXP_TOP_CELL - 1_default_int
            frac = int(ibits(word, 33_default_int, FRAC_BITS), default_int)
            gap = EXP_TABLE(cell + 1_default_int) - EXP_TABLE(cell)
            x_q32 = x_q32 + EXP_TABLE(cell) + u64_shr(gap*int(frac, int64), FRAC_BITS)
            exit
         end if
         x_q32 = x_q32 + EXP_LN_CELLS
         turns = turns + 1_default_int
      end do
      r = scale_by_mean(x_q32, mean)
   end function splitmix64_next_exponential_int

   function splitmix64_next_poisson_int(gen, mean_milli, err) result(r)
      !! Poisson count with mean `mean_milli/1000`, from a splitmix64_t generator.
      type(splitmix64_t), intent(inout) :: gen
         !! Generator, advanced once per inter-arrival drawn.
      integer(default_int), intent(in) :: mean_milli
         !! A thousand times the mean, in `[0, POISSON_MAX_MEAN_MILLI]`.
      type(error_t), intent(inout), optional :: err
         !! Set to `ERROR_VALIDATION` when `mean_milli` is out of range.
      integer(int32) :: r

      integer(int64) :: gap_mean, window, elapsed

      r = 0_int32
      if (mean_milli < 0_default_int .or. mean_milli > POISSON_MAX_MEAN_MILLI) then
         if (present(err)) then
            call err%set(ERROR_VALIDATION, &
                         "pic_random_dist: next_poisson_int mean_milli out of range")
         end if
         return
      end if
      if (mean_milli == 0_default_int) return

      ! Mean gap between arrivals, in window ticks: window / (mean_milli/1000).
      ! That division truncates, so the gap actually used is a little short of
      ! the one asked for, and the count over a fixed window comes out high --
      ! by up to 0.048%, worst at mean_milli = 999596.
      !
      ! Fixing the gap and deriving the window from it instead turns that
      ! round-off to the sampler's advantage: whatever gap the truncation
      ! landed on, the window is the one for which that gap is exactly right.
      ! The residual is the truncation of the window itself, under 1e-6
      ! relative.
      gap_mean = (POISSON_WINDOW*1000_int64)/int(mean_milli, int64)
      window = (gap_mean*int(mean_milli, int64))/1000_int64
      elapsed = 0_int64
      do
         elapsed = elapsed + splitmix64_next_exponential_int(gen, gap_mean)
         if (elapsed > window) exit
         r = r + 1_int32
      end do
   end function splitmix64_next_poisson_int

   ! ---- pcg32_t --------------------------------------------------------

   function pcg32_uniform_below(gen, span_minus_1) result(r)
      !! Uniform unsigned integer in `[0, span_minus_1]`, by rejection.
      type(pcg32_t), intent(inout) :: gen
      integer(int64), intent(in) :: span_minus_1
         !! Inclusive upper bound, read as unsigned.
      integer(int64) :: r

      integer(int64) :: mask

      if (span_minus_1 == 0_int64) then
         r = 0_int64
         return
      end if
      mask = rejection_mask(span_minus_1)
      do
         r = iand(gen%next_u64(), mask)
         if (.not. u64_less(span_minus_1, r)) exit
      end do
   end function pcg32_uniform_below

   function pcg32_next_range(gen, lo, hi, err) result(r)
      !! Uniform integer in `[lo, hi]` from a pcg32_t generator.
      type(pcg32_t), intent(inout) :: gen
         !! Generator, advanced by the draw.
      integer(default_int), intent(in) :: lo
         !! Inclusive lower bound.
      integer(default_int), intent(in) :: hi
         !! Inclusive upper bound; must not be below `lo`.
      type(error_t), intent(inout), optional :: err
         !! Set to `ERROR_VALIDATION` when `hi < lo`.
      integer(default_int) :: r

      integer(int64) :: span_minus_1

      r = lo
      if (hi < lo) then
         if (present(err)) then
            call err%set(ERROR_VALIDATION, "pic_random_dist: next_range requires hi >= lo")
         end if
         return
      end if
      if (hi == lo) return

      ! hi - lo in unsigned 64-bit, which is exact even when the span is wider
      ! than the signed range. Negation is spelled as `not(x) + 1` because
      ! negating the most negative value directly is signed overflow.
      span_minus_1 = u64_add(int(hi, int64), u64_add(not(int(lo, int64)), 1_int64))
      r = int(u64_add(int(lo, int64), pcg32_uniform_below(gen, span_minus_1)), default_int)
   end function pcg32_next_range

   function pcg32_next_bernoulli_ppm(gen, ppm) result(r)
      !! True with probability `ppm` in a million, from a pcg32_t generator.
      type(pcg32_t), intent(inout) :: gen
         !! Generator, advanced by the draw unless `ppm` is 0 or `PPM_ONE`.
      integer(default_int), intent(in) :: ppm
         !! Probability in parts per million, clamped to `[0, PPM_ONE]`.
      logical :: r

      integer(default_int) :: clamped

      clamped = max(0_default_int, min(PPM_ONE, ppm))
      if (clamped == 0_default_int) then
         r = .false.
         return
      end if
      if (clamped == PPM_ONE) then
         r = .true.
         return
      end if
      r = pcg32_uniform_below(gen, int(PPM_ONE, int64) - 1_int64) < int(clamped, int64)
   end function pcg32_next_bernoulli_ppm

   function pcg32_next_exponential_int(gen, mean, err) result(r)
      !! Exponential integer with the given mean, from a pcg32_t generator.
      type(pcg32_t), intent(inout) :: gen
         !! Generator, advanced by one draw, or more in the tail.
      integer(int64), intent(in) :: mean
         !! Mean of the distribution, in `[0, EXPONENTIAL_MAX_MEAN]`.
      type(error_t), intent(inout), optional :: err
         !! Set to `ERROR_VALIDATION` when `mean` is out of range.
      integer(int64) :: r

      integer(int64) :: word, x_q32, gap
      integer(default_int) :: cell, frac, turns

      r = 0_int64
      if (mean < 0_int64 .or. mean > EXPONENTIAL_MAX_MEAN) then
         if (present(err)) then
            call err%set(ERROR_VALIDATION, &
                         "pic_random_dist: next_exponential_int mean out of range")
         end if
         return
      end if
      if (mean == 0_int64) return

      x_q32 = 0_int64
      turns = 0_default_int
      do
         word = gen%next_u64()
         cell = int(ibits(word, 0_default_int, EXP_CELL_BITS), default_int)
         if (cell < EXP_TOP_CELL .or. turns >= EXP_MAX_TAIL) then
            if (cell >= EXP_TOP_CELL) cell = EXP_TOP_CELL - 1_default_int
            frac = int(ibits(word, 33_default_int, FRAC_BITS), default_int)
            gap = EXP_TABLE(cell + 1_default_int) - EXP_TABLE(cell)
            x_q32 = x_q32 + EXP_TABLE(cell) + u64_shr(gap*int(frac, int64), FRAC_BITS)
            exit
         end if
         x_q32 = x_q32 + EXP_LN_CELLS
         turns = turns + 1_default_int
      end do
      r = scale_by_mean(x_q32, mean)
   end function pcg32_next_exponential_int

   function pcg32_next_poisson_int(gen, mean_milli, err) result(r)
      !! Poisson count with mean `mean_milli/1000`, from a pcg32_t generator.
      type(pcg32_t), intent(inout) :: gen
         !! Generator, advanced once per inter-arrival drawn.
      integer(default_int), intent(in) :: mean_milli
         !! A thousand times the mean, in `[0, POISSON_MAX_MEAN_MILLI]`.
      type(error_t), intent(inout), optional :: err
         !! Set to `ERROR_VALIDATION` when `mean_milli` is out of range.
      integer(int32) :: r

      integer(int64) :: gap_mean, window, elapsed

      r = 0_int32
      if (mean_milli < 0_default_int .or. mean_milli > POISSON_MAX_MEAN_MILLI) then
         if (present(err)) then
            call err%set(ERROR_VALIDATION, &
                         "pic_random_dist: next_poisson_int mean_milli out of range")
         end if
         return
      end if
      if (mean_milli == 0_default_int) return

      ! Mean gap between arrivals, in window ticks: window / (mean_milli/1000).
      ! That division truncates, so the gap actually used is a little short of
      ! the one asked for, and the count over a fixed window comes out high --
      ! by up to 0.048%, worst at mean_milli = 999596.
      !
      ! Fixing the gap and deriving the window from it instead turns that
      ! round-off to the sampler's advantage: whatever gap the truncation
      ! landed on, the window is the one for which that gap is exactly right.
      ! The residual is the truncation of the window itself, under 1e-6
      ! relative.
      gap_mean = (POISSON_WINDOW*1000_int64)/int(mean_milli, int64)
      window = (gap_mean*int(mean_milli, int64))/1000_int64
      elapsed = 0_int64
      do
         elapsed = elapsed + pcg32_next_exponential_int(gen, gap_mean)
         if (elapsed > window) exit
         r = r + 1_int32
      end do
   end function pcg32_next_poisson_int

end module pic_random_dist