Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(examples): Add a useful set of high quality pseudo-random number generators #2868

Merged
merged 25 commits into from
Dec 5, 2024

Conversation

wyhaines
Copy link
Contributor

@wyhaines wyhaines commented Sep 28, 2024

I ported a number of my pseudo-random number generator implementations from Ruby to gno while traveling to the retreat last weekend as an exercise in expanding my comfort level with gno code, and expanding my understanding of some of the code internals, while contributing code that others may find interesting or useful.

I added two xorshift generators, xorshift64* and xorshiftr128+. These are both many times faster than the PCG generator that is the gno default, and produce high quality randomness with great statistical qualities. In addition to these, I added both the 32-bit ISAAC implementation (with an added function to return 64 bit values), and the 64-bit ISAAC implementation. ISAAC is a stellar pseudo-random number generator. Both implementations are significantly faster than PCG (though not near so fast as the xorshift algorithms), while producing extremely high quality, cryptographically secure randomness that can not be differentiated from real randomness.

All of these were built to be compatible with the standard Rand() implementation. This means that any of these can be used as a drop-in replacement for the default PCG algorithm:

source = isaac.New()
prng := rand.New(source)

All of these leverage the gno.land/p/demo/entropy package to assist with seeding if no seed is provided. In the case of the ISAAC algorithms, they require 256 uint values for their seed, so they leverage a combination of entropy and xorshiftr128+ to generate any missing numbers in the provided seed.

I also added a function to entropy to return uint64, to facilitate using it for seeding.

I added tests to entropy, and wrote tests for the other generators, as well.

There are a few other things that ended up in this PR. In order to make some fact based assertions about the performance of these generators, I included some code that can be ran via gno run -expr. i.e. gno run -expr 'averageISAAC()' isaac.gno that can be used to get some benchmarks and some very simple self-statistical-analysis on the results, and when I did so, I discovered that the current ufmt.Sprintf implementation didn't support any of the float output flags.

I added float support to it's capabilities, which, in turn, required adding FormatFloat to the strconv.gno/strconv.go implementation in the standard library. I added a test to cover this.

I also noticed that there is a test in tm2/pkg/p2p that is failing on both master and my branch. Specifically, there is a call to sw.Logger.Error() that passes a message and an error, but not "err" before the error. Adding that seemed to clear up the build failure. This, specifically, is line 222 of switch.go.

Currently there is one failing test, which is the code coverage check on tm2, because it is non-obvious to me how to setup a test to properly exercise that one changed line.

Contributors' checklist...
  • Added new tests, or not needed, or not feasible
  • Provided an example (e.g. screenshot) to aid review or the PR is self-explanatory
  • Updated the official documentation or not needed
  • No breaking changes were made, or a BREAKING CHANGE: xxx message was included in the description
  • Added references to related issues and PRs

@wyhaines wyhaines requested review from a team as code owners September 28, 2024 08:50
@wyhaines wyhaines requested review from jaekwon and thehowl and removed request for a team September 28, 2024 08:50
@github-actions github-actions bot added the 🧾 package/realm Tag used for new Realms or Packages. label Sep 28, 2024
Copy link

codecov bot commented Sep 28, 2024

Codecov Report

All modified and coverable lines are covered by tests ✅

📢 Thoughts on this report? Let us know!

@github-actions github-actions bot added the 📦 🤖 gnovm Issues or PRs gnovm related label Sep 28, 2024
@wyhaines wyhaines marked this pull request as draft October 1, 2024 00:32
@github-actions github-actions bot added the 📦 🌐 tendermint v2 Issues or PRs tm2 related label Oct 2, 2024
@wyhaines wyhaines marked this pull request as ready for review October 7, 2024 02:27
I ported a number of my pseudo-random number generator implementations from Ruby to Gno, building them be compatible with the standard Rand() implementation, so that any of these can be used as a drop-in replacement for the default PCG algorithm. All of these are faster than PCG, while still having competitive-to-superior statistical properties and predictability resistance. Further, the ISAAC family of generators are cryptographically secure, and when properly seeded, still have no known practical attack vectors.
@zivkovicmilos
Copy link
Member

Hey @wyhaines, can you update the PR branch with the master branch? 🙏

@thehowl thehowl requested review from n2p5 and removed request for deelawn November 6, 2024 21:09
Copy link
Contributor

@n2p5 n2p5 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Very cool work.

It would be valuable to decouple your uint64 and float64 work from the math/random work. The changes you introduce there are generally useful and it would give a cleaner path for merging a PR.

This way the larger discussion on where the isaac and isaac64 work should live can be done in isolation from this. I'm still learning about our namespacing conventions myself and @thehowl brings up valid points that maybe work like this should live in a personal namespace and maybe be considered for "promotion" to official namespaces over time.

@Gno2D2
Copy link
Collaborator

Gno2D2 commented Nov 30, 2024

I'm a bot that assists the Gno Core team in maintaining this repository. My role is to ensure that contributors understand and follow our guidelines, helping to streamline the development process.

The following requirements must be fulfilled before a pull request can be merged.
Some requirement checks are automated and can be verified by the CI, while others need manual verification by a staff member.

These requirements are defined in this configuration file.

Automated Checks

🟢 Maintainers must be able to edit this pull request
🟢 The pull request head branch must be up-to-date with its base

Manual Checks

  • The pull request description provides enough details (checked by @n2p5)
Debug
Automated Checks
Maintainers must be able to edit this pull request

If

🟢 Condition met
└── 🟢 On every pull request

Then

🟢 Requirement satisfied
└── 🟢 Maintainer can modify this pull request

The pull request head branch must be up-to-date with its base

If

🟢 Condition met
└── 🟢 On every pull request

Then

🟢 Requirement satisfied
└── 🟢 Head branch (wyhaines:kh.add-prngs) is up to date with base (master): behind by 0 / ahead by 25

Manual Checks
The pull request description provides enough details

If

🟢 Condition met
└── 🟢 Not (🔴 Pull request author is a member of the team: core-contributors)

Can be checked by

  • team core-contributors

@wyhaines
Copy link
Contributor Author

  • Second, maybe we can put this in a p/wyhaines namespace rather than a p/demo/math/rand namespace. I don't know what we want to do with p/demo long-term (keep it? move a lot of it to p/nt? ...), but for now I still consider it as a "semi-official" space, so I'd prefer your own namespace as a place where to have code that is not vetted by the core team ahead of time.

That's fine with me. This was work that I did as much to make available some interesting things that I have experience with already as it was to just better learn Gno and some of the gnovm internals. So, my intention is to just make sure that it remains a useful set of packages that is available to people. I'll revise this PR to put this under p/wyhaines.

@wyhaines
Copy link
Contributor Author

wyhaines commented Dec 4, 2024

OK. I have moved all of the PRNGs to p/wyhaines. All tests pass.

❯ gno run -expr 'averagePCG()' isaac.gno
Averaging 1000000 random numbers. The average should be very close to 500000.

PCG average of 1000000 uint64: 499867.769406

PCG standard deviation  : 288606.963361

PCG theoretical perfect deviation: 288674.845920
❯ gno run -expr 'averageXorshift64Star()' xorshift64star.gno
Averaging 1000000 random numbers. The average should be very close to 500000.

Xorshift64* average of 1000000 uint64: 500180.663038

Xorshift64* standard deviation  : 288675.294076

Xorshift64* theoretical perfect deviation: 288674.845920
❯ gno run -expr 'averageXorshiftr128Plus()' xorshiftr128plus.gno
Averaging 1000000 random numbers. The average should be very close to 500000.

Xorshiftr128+ average of 1000000 uint64: 500004.786490

Xorshiftr128+ standard deviation  : 288573.599365

Xorshiftr128+ theoretical perfect deviation: 288674.845920
❯ gno run -expr 'averageISAAC()' isaac.gno
Averaging 1000000 random numbers. The average should be very close to 500000.

ISAAC average of 1000000 uint64: 500022.909235

ISAAC standard deviation  : 288700.604699

ISAAC theoretical perfect deviation: 288674.845920
❯ gno run -expr 'averageISAAC()' isaac64.gno
Averaging 1000000 random numbers. The average should be very close to 500000.

ISAAC average of 1000000 uint64: 500016.411968

ISAAC standard deviation  : 288408.533894

ISAAC theoretical perfect deviation: 288674.845920
❯ gno test -v ./...
=== RUN   TestISAACSeeding
--- PASS: TestISAACSeeding (0.00s)
=== RUN   TestISAACRand
--- PASS: TestISAACRand (0.00s)
=== RUN   TestISAACUint64
--- PASS: TestISAACUint64 (0.00s)
=== RUN   TestISAACMarshalUnmarshal
State: [&{[4209704911 4057012920 3951703178 3445732941 3828994374 383523378 3703193909 2730172432 723420044 2083769714 3786470314 1754074102 3365863999 1988364666 405823604 2733968553 2088057772 3748418219 3886707991 1219630691 4015415907 2172682068 4219008391 2674318161 1975458478 3804253980 2141394490 1099003815 639664993 2441521575 1505972577 1080090828 2111583070 2597503247 1341858937 2378058510 2943559180 4288137319 2341545957 992105117 2973120597 3151012920 631225490 479404485 3965453740 2956849264 3973452068 7326921 558798034 2461904994 2154409702 2503735210 572117060 865674639 1637878577 767028539 949262277 3909857959 2474457608 1211492270 3380548394 693542643 3260410854 1544470817 2542774303 3662473947 3500653959 2528540346 3680767186 3981985898 562669476 3573609444 4111646950 2854452274 1839531487 806092774 679708671 3974056032 3336034981 691199987 2310889683 1503260629 3777033881 753570961 1916662646 2172180728 1448905650 650222516 935284682 1710794170 587621237 1366589320 3217355360 611133609 2576245440 59650324 3283886692 2018671125 4167007191 423192597 3535198338 4276851899 917813120 2688120094 3589891207 463615947 1602535227 3248379028 4208992971 1511403113 3625676128 1076017794 3665068977 173180741 286882603 1416416274 273283796 240308875 493563129 4082075652 2398262489 1709896427 495410219 414540142 2238253222 2441726882 173088578 631066487 1987818666 1626979695 1015696398 3691892337 561077812 456190687 1506895989 149659210 954772647 1232539009 2768170265 1243464086 2097922557 388583665 563804088 3201621137 1163257305 1435871922 3523388559 2817213720 2770773501 3164627151 2150942187 3969218635 4039771904 2997165883 2151090560 1048823895 238471502 1231006786 1504824425 893525797 603366767 1073688349 2325899966 153502437 2675858267 1346840384 3016211334 3582001349 1258029475 1654894558 1252980202 1191108696 3623582929 3350787617 2506344656 2263975053 869687063 3655981100 2940153718 2600199169 810844030 2390160201 3186011795 4101944222 1666086622 489980025 2543781213 4218357793 708900320 3497399367 226314861 1380645575 98040005 3401314886 3998615972 3979618660 1970735034 2726558936 2465872269 1449378296 2473221161 1573042626 1702400640 3621633372 1837204362 2952618551 529488510 2298706282 111323531 3559798199 1825091045 3021429010 3371056438 2923180732 3443731839 2089715122 75212469 2574763041 1887390086 524165500 537904381 1376093120 2174605374 3360963971 1680464717 3213290720 467413459 3331015887 1598336357 3201884335 1367286943 2151704580 4026598763 2224701228 1702145497 1710130337 2890440881 2081834996 1000272225 1094435099 1837960955 1435477936 1232222721 2579150040 410352308 1175085247 900875208 1825660414 2088377114 3911120480 3138093164 2141859426 2430135865 1117029526 1393740072 3584530437] 246 [1016917118 2640607321 3240997307 3864853199 3891963253 424056038 3850473966 2414675776 3377861118 4088493611 1794735645 115139612 2966197968 3583896609 2217339051 2009363072 885808714 538229961 3155326863 4189903460 1892393617 2165249156 1891415549 4219211833 2293459771 2658158767 1878888574 320709804 412706750 3923428010 1533300738 2531636436 4093742609 4260640199 127230507 1233688296 231953774 3763017732 2216781023 3733832859 711296336 2246534635 134620606 39014051 459859721 2040297407 2281934078 1629249288 2684957700 1169116422 625519346 901749676 1024186127 2678232259 1649576613 1383822267 850538902 189804240 129434211 192751237 3875881784 8012648 2581106991 1334056026 3146854573 4009972548 3814651142 125756468 24930217 203629235 3117820142 4015588754 3381182428 2722395751 3218255984 2471339977 3347473984 1859005514 1056119971 3277280555 2387356330 2096240426 3223259879 998881112 4153921822 2610670693 279295927 186183662 4149967506 2791133697 21779244 291641305 117326042 803618479 2820916453 983483574 3070331468 4189485332 611512427 2235787465 3916608269 1147835350 3438567777 112796003 4228717382 1935656158 2470197660 2235498929 3398202256 206608690 1847103444 28604617 4238871803 2979280044 1225690169 752492836 1891148042 2830638610 4164394669 3504827229 1920935511 1979693719 3238037773 416109504 2476900349 3636595504 4224223859 4047803360 2108575817 2967629976 2365887720 160223674 3604952393 1991843723 2858299424 1686688687 104799128 1722356839 3864064901 749146969 618695628 2296283728 2126836466 743681836 1660356692 3510785478 1185341497 2475058961 492576496 1009338159 2093693495 2623887334 1316376004 471759485 1862537164 2988929434 2418094160 3493551522 2168281332 1755193804 3604194497 354090583 3554047218 1135423165 2203513237 1864398772 1577683627 1778292630 4161884227 2031302206 3477908566 587068960 4207491907 1184733149 246495450 2102773196 3631775347 3927075846 3741381663 3938340344 1087295342 3660897923 3984423102 3967601396 1579580415 2516193059 1176227892 2478090219 3631576647 4127936150 1522563121 2643482897 3414033402 3966334032 2739384427 3720990957 2026674967 915809601 2338355486 2836339062 585378002 3076120762 3129525710 2708126687 4006001197 2190925232 3697937786 4001690613 1292000208 813826754 1082635866 3419709073 3098742721 2232695488 831726171 1853504963 4163658730 1900173969 3862966557 374890302 946321403 3400011051 908128167 3424114740 3527857114 1545233230 4139985483 901786276 4272373316 2985499950 1178344817 3590250057 1325639768 1736620203 1776558690 708797068 1737090373 4261302637 4121425536 2234248457 1927302626 918797047 3795373668 3759308805 1300600862 3447131972 1080782673 1985422587 2426195356 3980274320 1268379761 3427076058 393208050 1812710280 1950306167 1250893164] 3016697223 3584530437 1 [4129293727 2141104956 1950222777 3348280598 2331780091 3252676982 2971358367 719480689 1055924601 2069574861 4093029412 1690094552 1272903817 3728037312 2119048415 891647724 2862416088 1079724612 1044321720 1134330992 956271590 1697592868 1346206503 2212218435 2406453349 2026142334 807213825 1400663608 2605117588 1752952455 3066569839 2409338887 4164509895 868833322 4290045139 4082317897 3321212571 3375998931 3922866157 3889091601 3103257913 2934205834 1914620598 4039283868 3480221802 2352827340 4210925245 3204700948 2038938269 2489117982 144683195 897531801 832127584 1671322755 239049396 4261653699 1442280140 3658013349 2923902259 529858830 998609719 3066848594 1485721886 3839521017 2211734345 3756411267 3548855513 662076396 4170287379 1623741241 2487317340 312465150 2096084515 21727768 981274242 1844040910 3832552600 3464889477 3466185788 2465787964 1195757784 2978314954 2432124288 4003461929 1754973818 685327490 1623388667 2070429093 309038919 2381135448 3014868836 2988602561 3142232122 3320357997 664879041 3707503804 689472671 214270171 759225709 2599392874 4208314411 2528002245 4109181137 3490013699 2207596577 4099642383 424079079 436239475 3192608307 60479364 2035999722 598798539 2699119142 103174865 2739419655 1179680574 2765841368 1861675375 2388520339 653150268 323459001 649652397 4215730557 1154120416 2356736676 2042987647 2984973278 3342322747 1702601252 1215046520 214253747 3673135926 1102027229 161553126 701599145 1374281323 2319241612 2102529132 1987605529 2525042028 700381092 1947678800 1907144293 3368303019 3946082947 1569466924 3407173619 2658989455 2227259421 1946310134 2391232193 2711444500 2901840573 3497691898 4196318780 1276857246 1792054262 760428634 394228667 3683153283 3324353632 3078003494 2951554820 1693185860 1294591866 2783601643 2908306946 155215181 3562397550 1649221568 4047214254 807969177 4197814040 3795351358 1012718019 18918467 955434884 2105977692 3710695469 3669943432 737032957 3823322115 85402115 1628880323 252531788 3833019817 532727888 1230670170 2332872938 3271865211 2472531012 3931528170 2335887340 2129505668 1268781811 3772777360 2055960181 1026060471 468939787 1393960964 3715208838 2291750470 156206138 1646003644 1774739902 738706566 2525057377 3156671866 1184087324 2403133392 84917401 495862405 531309157 2552242569 1412717728 1598876893 3611804912 1664099183 2136071994 3053908191 2409802659 417598238 1368240468 3661712145 874014522 673457565 1032426210 2733745853 3184538678 3879838473 4264801478 40919635 4221438046 1683978979 3607591519 3023015825 812782253 1438433337 4283770718 2134225584 3834916328 3041337795 2640629892 1196706825 3581887914 1530222991 1252704326 1944379315 74303001 1663063973 2904324259 746708987 1114583919 3383084648 1484777713 3801662828]}]

Marshalled State: [69736161633af620059f7f9eab3c743e09b9c792b5168afc23fbc1dfe976b11b549f2ae267713ef021797b5b34cdf3f6ac2464bccbd84bdef889de3555c07e4e1cdf352576ecaa9d00d8405b4a443e3f15b8439c847038ff8be6652f3624503d7b2783dbc6438f6f906578c47a7e301d1b01537c6e389b46f094687bee87b6c8246f8f9b9807f83960c733c9582affb4e4d3f3533a49c5f5ae9bc939a7d3e9d22fede7ced411b8f7f539aee46d8a721ecab6f0c2949ccf6ff86a8c3d4bccfafd9ebdbf03db147987ba9d945ced1e089fb0bb357f3f9931994260639e5c830e3f9ab4fe03acc355f772ccda08daa5ae4735331f95010e3b859337b6cc6552588e511ee4da70f983d46349dfe64983d3873cd927767becf891891360c853399441735c129fd6fe7cefb623014b8a183a7d0e826de9d4cee4701c98ce860485ce99cc3c92f8f03c4745d0d8b1857aca90f74580ee9ffb29689ac67a28d9448260c2f1fb7b683da5126b8f478ded3e58b3b33f64b22274c1bb4aa83ac5e8a46d27a13fc1dcfc04bc2918849f0cc580db2d40dd6d9aef966afad5c82b96ae40c5f4ed20d1d005620383954021f45b940f1946eee71a007c73be4b5633039ad784795ae3ea23b0f0cba0e14a26062652d1a3483a0746507f3ea4db63d86ef6e96f8e5ded9326ee483c134797b926b8e8adfb46f17d44ca7ae08c78f2a479c5847fb1eb13dec737cc3b657ba224486c23780cc540b3daef9b3641af99dd09a11ae629d18da951e9de6b8a3cd18c7d520c6c767874199681156c29bef7a47417385071acb665c8c439abeb3472835d8c2a2ccb1557f39e7cf58f84c1481d740255f68e874ec1a19d5c14acf692bdd07a8afafa1ebe3c4c1b4b9e6ad093f62d53385a177f73bbdb887583c6259c60b7769b26afed270464ebf7444d29e77aa5ea63ebad593e020940654dd455df6e624d1fc0f13b96ae3028a199fa358f18e238773e3c5cd9c30120ac4338f2c7847d86ab5cdd2cb82ddabee4882bee3afde3e34403051722036116bdc30f0d544ce4773da91fc0c850495a895a8b0cd0eac304b37b935fd444ea565bea8b3acfec7eedad844ba012f3e0e003907a8b76753d2870b71bf3740b53162804dd71968688995646094f843a621c05bc69c861be2c07c48696815161bc26fd7a4693bd1c8f3ce7d0050fbc991d8e42851fab22659820218954345ca05f4cecddd747c4f06330236f7f51df3ab606f0df8fa2aba318e40b1e518db154da414b113418673a2824259d3d8992e2a2f1a6bdbdd03436e741a309fe33b4c602706253fb9e085e645f7ae3d7077a5fb42f8f91307212ad55bcc039ff55275e7f35b2b0e4942de8b54721c39d64d08447544c09d57f45aa5b35598f4aaac04673e4dfb3046dc619632057a5ad1c78a32c81dffb426f336fc9a5c668587fe8f1e298c56cfaeaffcff1d11ab8eb8a348acd61b64de439d14616dc1a32dcba4135a2bb20102b1e838c7c33cd72e1b0f3aa688d0bf6c89f023f7684097a18306074a2f50ca97c753bacdf6c52abe7aa751748b21663ef56626381807f54fb78f5879f66db5175bf1aaee2c04f1c7fa3163a418177a7262083619186a9a759c351614060e0cc7ddc335e9ad2c10f4ffb24798dbe4b0eaf73260cff97c8678b9127e53b22529db1363855bbd0a438259fbc921c9321c5ec5c05acb03df070ecd61124006fccc9214e94d292bdb0628069aee6953bf7aa2219d0443399258f61a00b312db7ed3b389497c5e90bb2a7937d3a084835e7aec97f132a29569ef3c255ebe65c0ec121978fa81fda4ceadbd0a7bd8796b676badb640cd2ed58486a2189a7a4d500f3e4f512c0e6aa237c326da505df300bffe6288387ffecdf4860c6d7daa52932dff389bd60d35999efd5e120f6992cea9491723df3768178d8f8565c8bb226c19bb437bf4fca65f8a5ba2306637551747f88bfc4f260246d28a9998e62c0038e3114c3bc226478527a15f85f7bd719396815d2b6d882feeb94bb36b4b780a039751ed5f964871ba237cb5f84bf3bc19e5494fae022cb5a162e69d81b6d604022ba82da7483b10a52874511197b2b546ccc121049fad40e52d28b1d6b2cf9f34f88048ef294d965eaf2eb1d875c2b18b5616e856908a69189cba20a511f42259d4f77767bb4aa60f9bd6f3c8a4c0edc0dce7121715e341b30eadf59d1687508eb9e4a38e8aca749770d81a4feed194a1dc1967d0bc1fd172950f1219af7b8bed4dc914555e5d95595aab2d202a48fa7eb4518a526a5fdbca060cf8034c5ebec95784bf0ca0700b2a51f3b803709803e83c8570e36c94e495fac4259b1cc6935421f2523f6a56f3fff2f1d8aa26abe092642e59f7e5b5b50472740b3c7bb86d58100c54afc01a362a3afde4aaef5ea46fee058d7fb7cd1c7b8f6219563c8d086f1848d33d65f17d9e9d82caf3f2f769afbe40130547f7e8e76f349bde6ae93f47eb39e634e76de1d348079979f055dfb6f08212a40f5e0d07614470d7d4a6d524afac705d7f8c5cabbf246ee5609a4ed342964757707baa283fcd892fa398d5663c1f8936a5c295dc2b9c265789280d7ddbd5c6d81838aaffd62371f8f5a7e8903796a06a2a98bd42e35b76cc8ade5b4175912c8ee3d36ae3c32bccd432d7f7c8e85b2047ba6b59977c421707f49861f3e217c200fc4fd520583c0819dd83ec8543d836429db4dbf86ece01bdc29d3c68b44cf5f44ad65bed8e0af517f249f80406804f001056b849a3f2c6574add965ee84a1ac48a0b17c1647f43b9ef161413bc11b6d8d0efb558fa7b049723a0199bab4d818757ab4460a60bf35b243c86cd15dfe7c7a1b1ae91ef660bb0b806c7faa2e6290d8ee39429484965312c928d5a798053c9cec7e9d647859c12db1bbe65cfacfe7faa575194694e6e58191ee8fed0740c95611fef3b1762b6af97e1d06dce41cb0cc96d0d59dec218429e8ab77c4728034cc5e4a2014bcc9bc12778ff9bcda6470cba291810f148470bcb5fdfb7c103988b36b3b9e7048af6ffd907e131da4ac189967bee9dac2aa5b64500296e5b4d4f4018e11fdf435c70795622b498896e80dd3556ee04b1804842164dfde8dc49b2a65855085e765eb080625be02534ea31b68e709799c77bf88038cfe611c5f08a009340445af4d062548aaf235bf9bac3d0bd70f9fa294c362528aa5527b73bb32b231960b502ed007b702630b7d2685e7054338007a436899d8912f4f84145abb9130adef035344e35ef506077ee434017c67a90c2322b3b9d628eeef590592c988bfdca2447667bfd2b070934da7c9c78666406ece2c4a3ef31ca3c357552b8e4c2aaa7cf2172ac01f0ae73b89b758f797d11e9b9bac6510a5b7b70b18efeef75b7a92a65d5201014c532c116217d906fe40da2fe63eafa823c4e53a9ec4b6b7018a4cf9b679142472f06b854368c9e972b30d446a93d6ccf4616106b92163fc0d1b46735fc4de933c399c853f01b1ca8c73900c5099326e188fd401b478c9fca80cfbb19434ac490e8c392cda212470b8a10aa8b81e12f8379eadd0e76b5d727f265775ffba97c100890d18cd53c093a27ffdd8c20b30fbc88a73f14493e07dae5049b0e270988d0494e8098cd1bad6df354976b91f8baa5e30206488d3af063f1b9866a91467e650f3852ca7135924e08bcc88de82507ec4f2f22c53af2c62f70854d14255c646a6e039938667111d5c1ef03c29472f7ccb3a379c6557e64e764dc41c1e7a7d6f040fccb227719a90213050d03b5da2813d58f4689e21ccd6d3a4c1151afe57d3d674f243ad2ebd8356f1956f2077b45e098aab69fe9796f81150437913363ecf4cac5622fdf620fac93b43469d97dd0eb138da7d55c5ccd8787e73ea126c06df00f41feabe4df840cecf6eda34de83ed7d78beec7ccaf45e267bff95fa0f23461bd03493b4a7ebd8757647f60b4e965ac078319d905911cb7e03faec697450a347b06bddc9d0ed78cc9b17369625418b60791ea90f197622e428d2b759e0baba88c5cea16abbdfeec6ba2d8296ddb0dc6a0d7aee84f3f54d025bd0308202c24087b65acbd49e91b8b30fc185143ac03193225b6e7a3dc3f82c63ea71425a91e640311d16585f3e3867b7fbcaa80d2b3620efa7cc17d834d246d3da5c1a634ef6c32a4b35c02aa4fea73e44b1f31d2e463c1d71d5fede494f03a8586782b8ab69e422622a3f628c6789e545fdfe516df5a7f680852bed0972e04de236c3baf7e238ce64e01280054d85981ecd770f44406b6f51765724fb909ccd9ced3e2a904b99f071cc4507da176fe0f26c0bc388743f4f774a8f1d6cb3cf2587d5a7980500000001000000f6] -- <nil>

State before unmarshall: [&{[4209704911 4057012920 3951703178 3445732941 3828994374 383523378 3703193909 2730172432 723420044 2083769714 3786470314 1754074102 3365863999 1988364666 405823604 2733968553 2088057772 3748418219 3886707991 1219630691 4015415907 2172682068 4219008391 2674318161 1975458478 3804253980 2141394490 1099003815 639664993 2441521575 1505972577 1080090828 2111583070 2597503247 1341858937 2378058510 2943559180 4288137319 2341545957 992105117 2973120597 3151012920 631225490 479404485 3965453740 2956849264 3973452068 7326921 558798034 2461904994 2154409702 2503735210 572117060 865674639 1637878577 767028539 949262277 3909857959 2474457608 1211492270 3380548394 693542643 3260410854 1544470817 2542774303 3662473947 3500653959 2528540346 3680767186 3981985898 562669476 3573609444 4111646950 2854452274 1839531487 806092774 679708671 3974056032 3336034981 691199987 2310889683 1503260629 3777033881 753570961 1916662646 2172180728 1448905650 650222516 935284682 1710794170 587621237 1366589320 3217355360 611133609 2576245440 59650324 3283886692 2018671125 4167007191 423192597 3535198338 4276851899 917813120 2688120094 3589891207 463615947 1602535227 3248379028 4208992971 1511403113 3625676128 1076017794 3665068977 173180741 286882603 1416416274 273283796 240308875 493563129 4082075652 2398262489 1709896427 495410219 414540142 2238253222 2441726882 173088578 631066487 1987818666 1626979695 1015696398 3691892337 561077812 456190687 1506895989 149659210 954772647 1232539009 2768170265 1243464086 2097922557 388583665 563804088 3201621137 1163257305 1435871922 3523388559 2817213720 2770773501 3164627151 2150942187 3969218635 4039771904 2997165883 2151090560 1048823895 238471502 1231006786 1504824425 893525797 603366767 1073688349 2325899966 153502437 2675858267 1346840384 3016211334 3582001349 1258029475 1654894558 1252980202 1191108696 3623582929 3350787617 2506344656 2263975053 869687063 3655981100 2940153718 2600199169 810844030 2390160201 3186011795 4101944222 1666086622 489980025 2543781213 4218357793 708900320 3497399367 226314861 1380645575 98040005 3401314886 3998615972 3979618660 1970735034 2726558936 2465872269 1449378296 2473221161 1573042626 1702400640 3621633372 1837204362 2952618551 529488510 2298706282 111323531 3559798199 1825091045 3021429010 3371056438 2923180732 3443731839 2089715122 75212469 2574763041 1887390086 524165500 537904381 1376093120 2174605374 3360963971 1680464717 3213290720 467413459 3331015887 1598336357 3201884335 1367286943 2151704580 4026598763 2224701228 1702145497 1710130337 2890440881 2081834996 1000272225 1094435099 1837960955 1435477936 1232222721 2579150040 410352308 1175085247 900875208 1825660414 2088377114 3911120480 3138093164 2141859426 2430135865 1117029526 1393740072 3584530437] 234 [1016917118 2640607321 3240997307 3864853199 3891963253 424056038 3850473966 2414675776 3377861118 4088493611 1794735645 115139612 2966197968 3583896609 2217339051 2009363072 885808714 538229961 3155326863 4189903460 1892393617 2165249156 1891415549 4219211833 2293459771 2658158767 1878888574 320709804 412706750 3923428010 1533300738 2531636436 4093742609 4260640199 127230507 1233688296 231953774 3763017732 2216781023 3733832859 711296336 2246534635 134620606 39014051 459859721 2040297407 2281934078 1629249288 2684957700 1169116422 625519346 901749676 1024186127 2678232259 1649576613 1383822267 850538902 189804240 129434211 192751237 3875881784 8012648 2581106991 1334056026 3146854573 4009972548 3814651142 125756468 24930217 203629235 3117820142 4015588754 3381182428 2722395751 3218255984 2471339977 3347473984 1859005514 1056119971 3277280555 2387356330 2096240426 3223259879 998881112 4153921822 2610670693 279295927 186183662 4149967506 2791133697 21779244 291641305 117326042 803618479 2820916453 983483574 3070331468 4189485332 611512427 2235787465 3916608269 1147835350 3438567777 112796003 4228717382 1935656158 2470197660 2235498929 3398202256 206608690 1847103444 28604617 4238871803 2979280044 1225690169 752492836 1891148042 2830638610 4164394669 3504827229 1920935511 1979693719 3238037773 416109504 2476900349 3636595504 4224223859 4047803360 2108575817 2967629976 2365887720 160223674 3604952393 1991843723 2858299424 1686688687 104799128 1722356839 3864064901 749146969 618695628 2296283728 2126836466 743681836 1660356692 3510785478 1185341497 2475058961 492576496 1009338159 2093693495 2623887334 1316376004 471759485 1862537164 2988929434 2418094160 3493551522 2168281332 1755193804 3604194497 354090583 3554047218 1135423165 2203513237 1864398772 1577683627 1778292630 4161884227 2031302206 3477908566 587068960 4207491907 1184733149 246495450 2102773196 3631775347 3927075846 3741381663 3938340344 1087295342 3660897923 3984423102 3967601396 1579580415 2516193059 1176227892 2478090219 3631576647 4127936150 1522563121 2643482897 3414033402 3966334032 2739384427 3720990957 2026674967 915809601 2338355486 2836339062 585378002 3076120762 3129525710 2708126687 4006001197 2190925232 3697937786 4001690613 1292000208 813826754 1082635866 3419709073 3098742721 2232695488 831726171 1853504963 4163658730 1900173969 3862966557 374890302 946321403 3400011051 908128167 3424114740 3527857114 1545233230 4139985483 901786276 4272373316 2985499950 1178344817 3590250057 1325639768 1736620203 1776558690 708797068 1737090373 4261302637 4121425536 2234248457 1927302626 918797047 3795373668 3759308805 1300600862 3447131972 1080782673 1985422587 2426195356 3980274320 1268379761 3427076058 393208050 1812710280 1950306167 1250893164] 3016697223 3584530437 1 [4129293727 2141104956 1950222777 3348280598 2331780091 3252676982 2971358367 719480689 1055924601 2069574861 4093029412 1690094552 1272903817 3728037312 2119048415 891647724 2862416088 1079724612 1044321720 1134330992 956271590 1697592868 1346206503 2212218435 2406453349 2026142334 807213825 1400663608 2605117588 1752952455 3066569839 2409338887 4164509895 868833322 4290045139 4082317897 3321212571 3375998931 3922866157 3889091601 3103257913 2934205834 1914620598 4039283868 3480221802 2352827340 4210925245 3204700948 2038938269 2489117982 144683195 897531801 832127584 1671322755 239049396 4261653699 1442280140 3658013349 2923902259 529858830 998609719 3066848594 1485721886 3839521017 2211734345 3756411267 3548855513 662076396 4170287379 1623741241 2487317340 312465150 2096084515 21727768 981274242 1844040910 3832552600 3464889477 3466185788 2465787964 1195757784 2978314954 2432124288 4003461929 1754973818 685327490 1623388667 2070429093 309038919 2381135448 3014868836 2988602561 3142232122 3320357997 664879041 3707503804 689472671 214270171 759225709 2599392874 4208314411 2528002245 4109181137 3490013699 2207596577 4099642383 424079079 436239475 3192608307 60479364 2035999722 598798539 2699119142 103174865 2739419655 1179680574 2765841368 1861675375 2388520339 653150268 323459001 649652397 4215730557 1154120416 2356736676 2042987647 2984973278 3342322747 1702601252 1215046520 214253747 3673135926 1102027229 161553126 701599145 1374281323 2319241612 2102529132 1987605529 2525042028 700381092 1947678800 1907144293 3368303019 3946082947 1569466924 3407173619 2658989455 2227259421 1946310134 2391232193 2711444500 2901840573 3497691898 4196318780 1276857246 1792054262 760428634 394228667 3683153283 3324353632 3078003494 2951554820 1693185860 1294591866 2783601643 2908306946 155215181 3562397550 1649221568 4047214254 807969177 4197814040 3795351358 1012718019 18918467 955434884 2105977692 3710695469 3669943432 737032957 3823322115 85402115 1628880323 252531788 3833019817 532727888 1230670170 2332872938 3271865211 2472531012 3931528170 2335887340 2129505668 1268781811 3772777360 2055960181 1026060471 468939787 1393960964 3715208838 2291750470 156206138 1646003644 1774739902 738706566 2525057377 3156671866 1184087324 2403133392 84917401 495862405 531309157 2552242569 1412717728 1598876893 3611804912 1664099183 2136071994 3053908191 2409802659 417598238 1368240468 3661712145 874014522 673457565 1032426210 2733745853 3184538678 3879838473 4264801478 40919635 4221438046 1683978979 3607591519 3023015825 812782253 1438433337 4283770718 2134225584 3834916328 3041337795 2640629892 1196706825 3581887914 1530222991 1252704326 1944379315 74303001 1663063973 2904324259 746708987 1114583919 3383084648 1484777713 3801662828]}]

State after unmarshall: [&{[4209704911 4057012920 3951703178 3445732941 3828994374 383523378 3703193909 2730172432 723420044 2083769714 3786470314 1754074102 3365863999 1988364666 405823604 2733968553 2088057772 3748418219 3886707991 1219630691 4015415907 2172682068 4219008391 2674318161 1975458478 3804253980 2141394490 1099003815 639664993 2441521575 1505972577 1080090828 2111583070 2597503247 1341858937 2378058510 2943559180 4288137319 2341545957 992105117 2973120597 3151012920 631225490 479404485 3965453740 2956849264 3973452068 7326921 558798034 2461904994 2154409702 2503735210 572117060 865674639 1637878577 767028539 949262277 3909857959 2474457608 1211492270 3380548394 693542643 3260410854 1544470817 2542774303 3662473947 3500653959 2528540346 3680767186 3981985898 562669476 3573609444 4111646950 2854452274 1839531487 806092774 679708671 3974056032 3336034981 691199987 2310889683 1503260629 3777033881 753570961 1916662646 2172180728 1448905650 650222516 935284682 1710794170 587621237 1366589320 3217355360 611133609 2576245440 59650324 3283886692 2018671125 4167007191 423192597 3535198338 4276851899 917813120 2688120094 3589891207 463615947 1602535227 3248379028 4208992971 1511403113 3625676128 1076017794 3665068977 173180741 286882603 1416416274 273283796 240308875 493563129 4082075652 2398262489 1709896427 495410219 414540142 2238253222 2441726882 173088578 631066487 1987818666 1626979695 1015696398 3691892337 561077812 456190687 1506895989 149659210 954772647 1232539009 2768170265 1243464086 2097922557 388583665 563804088 3201621137 1163257305 1435871922 3523388559 2817213720 2770773501 3164627151 2150942187 3969218635 4039771904 2997165883 2151090560 1048823895 238471502 1231006786 1504824425 893525797 603366767 1073688349 2325899966 153502437 2675858267 1346840384 3016211334 3582001349 1258029475 1654894558 1252980202 1191108696 3623582929 3350787617 2506344656 2263975053 869687063 3655981100 2940153718 2600199169 810844030 2390160201 3186011795 4101944222 1666086622 489980025 2543781213 4218357793 708900320 3497399367 226314861 1380645575 98040005 3401314886 3998615972 3979618660 1970735034 2726558936 2465872269 1449378296 2473221161 1573042626 1702400640 3621633372 1837204362 2952618551 529488510 2298706282 111323531 3559798199 1825091045 3021429010 3371056438 2923180732 3443731839 2089715122 75212469 2574763041 1887390086 524165500 537904381 1376093120 2174605374 3360963971 1680464717 3213290720 467413459 3331015887 1598336357 3201884335 1367286943 2151704580 4026598763 2224701228 1702145497 1710130337 2890440881 2081834996 1000272225 1094435099 1837960955 1435477936 1232222721 2579150040 410352308 1175085247 900875208 1825660414 2088377114 3911120480 3138093164 2141859426 2430135865 1117029526 1393740072 3584530437] 246 [1016917118 2640607321 3240997307 3864853199 3891963253 424056038 3850473966 2414675776 3377861118 4088493611 1794735645 115139612 2966197968 3583896609 2217339051 2009363072 885808714 538229961 3155326863 4189903460 1892393617 2165249156 1891415549 4219211833 2293459771 2658158767 1878888574 320709804 412706750 3923428010 1533300738 2531636436 4093742609 4260640199 127230507 1233688296 231953774 3763017732 2216781023 3733832859 711296336 2246534635 134620606 39014051 459859721 2040297407 2281934078 1629249288 2684957700 1169116422 625519346 901749676 1024186127 2678232259 1649576613 1383822267 850538902 189804240 129434211 192751237 3875881784 8012648 2581106991 1334056026 3146854573 4009972548 3814651142 125756468 24930217 203629235 3117820142 4015588754 3381182428 2722395751 3218255984 2471339977 3347473984 1859005514 1056119971 3277280555 2387356330 2096240426 3223259879 998881112 4153921822 2610670693 279295927 186183662 4149967506 2791133697 21779244 291641305 117326042 803618479 2820916453 983483574 3070331468 4189485332 611512427 2235787465 3916608269 1147835350 3438567777 112796003 4228717382 1935656158 2470197660 2235498929 3398202256 206608690 1847103444 28604617 4238871803 2979280044 1225690169 752492836 1891148042 2830638610 4164394669 3504827229 1920935511 1979693719 3238037773 416109504 2476900349 3636595504 4224223859 4047803360 2108575817 2967629976 2365887720 160223674 3604952393 1991843723 2858299424 1686688687 104799128 1722356839 3864064901 749146969 618695628 2296283728 2126836466 743681836 1660356692 3510785478 1185341497 2475058961 492576496 1009338159 2093693495 2623887334 1316376004 471759485 1862537164 2988929434 2418094160 3493551522 2168281332 1755193804 3604194497 354090583 3554047218 1135423165 2203513237 1864398772 1577683627 1778292630 4161884227 2031302206 3477908566 587068960 4207491907 1184733149 246495450 2102773196 3631775347 3927075846 3741381663 3938340344 1087295342 3660897923 3984423102 3967601396 1579580415 2516193059 1176227892 2478090219 3631576647 4127936150 1522563121 2643482897 3414033402 3966334032 2739384427 3720990957 2026674967 915809601 2338355486 2836339062 585378002 3076120762 3129525710 2708126687 4006001197 2190925232 3697937786 4001690613 1292000208 813826754 1082635866 3419709073 3098742721 2232695488 831726171 1853504963 4163658730 1900173969 3862966557 374890302 946321403 3400011051 908128167 3424114740 3527857114 1545233230 4139985483 901786276 4272373316 2985499950 1178344817 3590250057 1325639768 1736620203 1776558690 708797068 1737090373 4261302637 4121425536 2234248457 1927302626 918797047 3795373668 3759308805 1300600862 3447131972 1080782673 1985422587 2426195356 3980274320 1268379761 3427076058 393208050 1812710280 1950306167 1250893164] 3016697223 3584530437 1 [4129293727 2141104956 1950222777 3348280598 2331780091 3252676982 2971358367 719480689 1055924601 2069574861 4093029412 1690094552 1272903817 3728037312 2119048415 891647724 2862416088 1079724612 1044321720 1134330992 956271590 1697592868 1346206503 2212218435 2406453349 2026142334 807213825 1400663608 2605117588 1752952455 3066569839 2409338887 4164509895 868833322 4290045139 4082317897 3321212571 3375998931 3922866157 3889091601 3103257913 2934205834 1914620598 4039283868 3480221802 2352827340 4210925245 3204700948 2038938269 2489117982 144683195 897531801 832127584 1671322755 239049396 4261653699 1442280140 3658013349 2923902259 529858830 998609719 3066848594 1485721886 3839521017 2211734345 3756411267 3548855513 662076396 4170287379 1623741241 2487317340 312465150 2096084515 21727768 981274242 1844040910 3832552600 3464889477 3466185788 2465787964 1195757784 2978314954 2432124288 4003461929 1754973818 685327490 1623388667 2070429093 309038919 2381135448 3014868836 2988602561 3142232122 3320357997 664879041 3707503804 689472671 214270171 759225709 2599392874 4208314411 2528002245 4109181137 3490013699 2207596577 4099642383 424079079 436239475 3192608307 60479364 2035999722 598798539 2699119142 103174865 2739419655 1179680574 2765841368 1861675375 2388520339 653150268 323459001 649652397 4215730557 1154120416 2356736676 2042987647 2984973278 3342322747 1702601252 1215046520 214253747 3673135926 1102027229 161553126 701599145 1374281323 2319241612 2102529132 1987605529 2525042028 700381092 1947678800 1907144293 3368303019 3946082947 1569466924 3407173619 2658989455 2227259421 1946310134 2391232193 2711444500 2901840573 3497691898 4196318780 1276857246 1792054262 760428634 394228667 3683153283 3324353632 3078003494 2951554820 1693185860 1294591866 2783601643 2908306946 155215181 3562397550 1649221568 4047214254 807969177 4197814040 3795351358 1012718019 18918467 955434884 2105977692 3710695469 3669943432 737032957 3823322115 85402115 1628880323 252531788 3833019817 532727888 1230670170 2332872938 3271865211 2472531012 3931528170 2335887340 2129505668 1268781811 3772777360 2055960181 1026060471 468939787 1393960964 3715208838 2291750470 156206138 1646003644 1774739902 738706566 2525057377 3156671866 1184087324 2403133392 84917401 495862405 531309157 2552242569 1412717728 1598876893 3611804912 1664099183 2136071994 3053908191 2409802659 417598238 1368240468 3661712145 874014522 673457565 1032426210 2733745853 3184538678 3879838473 4264801478 40919635 4221438046 1683978979 3607591519 3023015825 812782253 1438433337 4283770718 2134225584 3834916328 3041337795 2640629892 1196706825 3581887914 1530222991 1252704326 1944379315 74303001 1663063973 2904324259 746708987 1114583919 3383084648 1484777713 3801662828]}]

--- PASS: TestISAACMarshalUnmarshal (0.00s)
ok      isaac 	1.11s
=== RUN   TestISAACSeeding
--- PASS: TestISAACSeeding (0.00s)
=== RUN   TestISAACRand
--- PASS: TestISAACRand (0.00s)
=== RUN   TestISAACUint64
--- PASS: TestISAACUint64 (0.00s)
=== RUN   TestISAACMarshalUnmarshal
State: [&{[16251696073643503900 5870356962300050281 18414688401703059641 1932439704352199546 5947207860534947856 17631052486011209917 14757556089628175186 15785136543357078020 9860898282052007655 8487979450574619135 15384879988074790091 10488284388888746163 16369234348930641174 6604861059598188071 3161931555919890848 8802889429751710127 15038471671649128718 4837183156992111559 3433887032070144820 2211042620879810706 8458574348980343747 1509815510013103372 11052990961098557663 578715521989304972 11593742354914630888 18164772709628597349 15631475641089096516 3598754457029092996 14089296902440115728 17671718442763108948 14563806838486829633 15153414760373668989 5790546648319098825 2516293515628497799 6138990361725765546 11134531892811222072 807844853905285264 12851751730772621425 10769203691780686454 8276481702416491956 8337963716656413660 13700757176754023970 3439653496724327945 18295285893813704906 6056797485252309324 6288114815786422809 5686251928585717768 3008101955177333900 10694077267907355644 6801574974959572686 13970471218919892742 723645437805469074 8632832631538909202 1676192046890175111 17280525322832607908 10911169904191105748 18385453611840353559 8664877126373785342 6631002600139111636 57896635031807103 17971108535894634028 2609908157064292729 15378028013364622792 17331436302684939742 242044914913411198 8967039983397531754 1509783606366862027 5892316726804772255 2725722511254990076 16334098040988944146 3076275487458995877 9250758315784107886 17973933794004768058 7408885407381436778 652131835053064183 12324627930719651236 18352795743266328113 565081318053396426 18353343395875182634 13228945647132293725 14711223670860373961 9410288709139077404 233754393730712611 103990574160082187 2064030443910635583 14047720068888497441 15132864290864875503 9303617581200270848 14423008612594795589 2052404735042122015 14142183399298642900 5307333684632839096 2867371519403780249 1651913313777441737 9648393861208127222 12670609722902458744 2610396033367677207 16695439487641084549 8520367121563768734 12850435371603204335 11635430794253387593 14533582913406345099 3292423378099591459 7588305281710982646 3467115880214407563 13019114766304182648 15078982205942194907 4737408065922938947 17279823387943010424 8281829817987577713 8036286463808987270 3271963387431001175 15073032512806845047 13835536487506026743 7296471511747275424 13158484182757828049 7777764370833242794 2090486433657456552 10376852378859711588 3778686221507776906 12820562142443738641 6402611076240081700 1588927517269854297 16008584496310744247 2897836750573242376 11231334777167909358 9730383073214814684 10208493288148986191 9558497248930866076 732193456030570025 14195658369083923947 645277912383462190 17793455924863398667 18089330521093831588 17092120738619267421 15594210735938630713 4367433788084861996 7110535636650484909 5991996515605426977 10529509904556001905 12669413257997542716 10396401687083246461 131328544426740757 15117455523991955136 13483311265276961535 7051675166705065401 6340143042219465764 471713754200890264 11488164273271283738 15928003316953307436 14159867327867561733 17692560539182489153 4862422695104647597 7648925527542978231 9106072820033308762 8272018737948969801 11786224395625503213 13287847831192724888 1124826884047411300 13198095843063218242 7139190869292268129 16801408053152366228 1961219767512964568 8599379632883386241 15707989053411647237 6778785509058585560 1723440669175452822 13917776925375470045 14185710972332953401 18035530176819832184 7734701010058289998 17862992995099861883 17063211360187340918 14084530117523492766 12317838058581717578 5385832864737403280 12137134122237821491 14160099624437061647 3263814971958187069 18009001707874135739 12952899682542277204 17546834867314706108 3999209989900718245 4962822946447077438 1249688364952874925 1845412677306464488 14395946300588430240 3225507905477439482 12310844218146328690 584702073568490277 16960556035819745562 6450617565847533747 792617735713423739 12106112025623609543 11531750821504005048 16905070681876973184 6750993485085758953 8241125231286415856 5243194969724768690 2885982595387012670 13129136679752654289 11127441878549704858 6491014783549719501 12664907732845687454 5327924924165638877 4933357636722012681 5872956171031431563 13542672198284747394 17857776481979852761 4274078382767467639 13429149395998348726 7263682730662626921 9125168697561729950 68773113155559878 1727314514327331279 17781290061711205828 12648448783147061958 13116639039489802560 10351074275913891793 14193516546740362171 1382881490443627023 15064293880427312247 16033284128531323855 3471066469748754513 10757162357225109754 369206101428265270 11645619882520467343 10080906209854333894 9873038028764961018 4832707037354847047 9851768368183667749 15061421065117452040 7416374768868098487 2827992907547742993 15702202283231254860 6615327405647638518 2404280314693566309 9236529072676940571 12842758520908813655 14794186959166448513 1814928670306238790 10562372605165851323 6775050939673250291 5930528596202877860 15222455098557002268 6161774355973582692 4977949063252893357 14180160756719376887 15954522518901325556 6877490613942924608 17611101631239575547 12789214124608876433 5328012296808356526 4114322996297394168 14800945299485332986 6781932227698873623] 251 [9328502644838625032 10684341728081891655 6048796399350503798 5869203447748775826 13412578442392450556 16448180669290678701 16722062038900829786 17357409237585547444 1196228638606454820 566726273693456456 9278290363184794630 4992409848424773021 15661352926315532545 5381991870308108433 11938030878759191438 8343185469681799 16149585936999985231 7533307177839506812 1726059552953151091 12273722294098210753 5558581613112413314 17760016148787341385 16202057440650187617 1081961163917786916 10702400586664610058 3259215002235940707 10475345682990071454 17771729517745063449 17065481733522983206 5072246351414961711 4002264267913135247 17826452321781688329 3594112217151751088 8285096529632309398 14566096499949328069 2687979632899908695 1851393777673332290 1308273690232433280 1176503297938656842 5174998545947743997 15145375352597676348 9186429715514070522 5966606590400710454 2694987337446528374 571749245975642084 16725950168794609507 6419887620425941591 12304358015637824011 7873687407869109122 15881611672916738796 10657761570836816558 10630309244642316645 18330331513879356983 13260195121118414451 16075463570933645349 3746221085875993454 16061208417808759904 3350931895891152800 1269612869481655429 13194229391133672619 4026178305342646141 7266692424164267507 7706385247265452111 17871311581763708980 8884920522589178468 7122015821996802446 14457247289608771734 5794658528293897033 2718602593029676079 12431596699403738043 828037908043739244 9374566440817774161 13159318315000366217 5343079913676795070 7880948862553246485 16780544251706137655 13868077351202454569 7912059640528806692 12607494358533135383 3416457931100123256 12067216990322064509 1621714602893446817 14156457713945787502 16097079417375483858 7141169475952000679 6573421344257121229 16615893300405141498 15734895796474748847 18356532622437682167 5964479365848841708 17538317804691825025 6156179640933064203 7359190672996711351 468901239587973036 14934200048278480016 11051762821975737913 2441983428560353468 13371690757602062030 15259759539849937493 15856315197644861237 4790917056755162740 1942732052091856322 374398731836573128 14290016214291750989 1026644854152262235 17992018123020018923 2040250365870916429 14407345910674900046 1587372208356401971 16377616714754962482 2176039821827359674 4898400043481261190 7841129321061893996 12546905802383536985 12601908633653815920 9638323956392338795 9298175578105186729 14066580988107546355 1220788816972734507 17049950518708488269 7781846072486704992 13172808497663729756 10503121626952262977 2644384878885726072 10800167770554725636 3897023005391720247 5442551593644635656 5006050627427778610 13065751494080544838 16258753129298623464 10119749786783566131 2429679121260418104 15825572643970789078 11403887608672340263 2674330762274869703 15895331619888460845 3524023022029451703 14958220928128538240 13153677542841566642 15637138288091904942 9162326080624708376 16501693770935162612 8360523169100594900 15124935955390040724 15612136530595979918 5387583348289685688 1468880808869092405 5823505988401309044 818959612527966267 13710140930885030697 14564572007746967001 12192898246195872480 7588436730289228606 14710095435680888037 15634736586927191852 12017869709332148010 2721472657296941972 9442450303569890258 11274235642797737632 11653761596127871834 15976212104525798351 2934818965672711729 871747087785728729 18073382299544215062 10285125008521554228 11826283383175295549 7378664054477593040 16468708213943851626 4220003439269470897 17977440439435706173 10651595889435281034 11352086127867993677 3695660181686546911 7082435883453453770 17109434671939436764 17334880474347312888 17165292012994369612 17488727522429707851 8723946351452182091 16868915012282248334 15365436480966182269 6014407103211103277 10133194283154883601 3291776537311864838 157006572442440984 5185384141476378961 8461242922230462948 8296977728824639345 7119512714355381322 17989373734427618377 13554459053234924319 1594243711615647437 5164474757373127716 16766470472194387947 17545633134138368911 1024731729592234828 18369679371667981705 6642412006752238494 8358728762813701622 14615468034937975596 798355649120066022 6821578552902208938 14578902078107824241 3854295409829664841 4048767687581784296 17778179577694517433 12571293898799783469 10850409174546116053 7378816549512010281 1036292632720903222 4277938154187385837 1479410164134514873 13507839942374676384 12008002415046067136 9851151886947070493 13859845378466818268 6967623152875425365 11148708691405820465 2804140060065036149 5937805722696978234 3788196054566674009 12805199718308248994 14626943216848176635 14773521929926052793 7838147952860850573 5055358110695165414 5386272270497048523 2181339973144903395 11530871370166162727 15385036658165672712 10162009537789770673 5821923236774890698 16029478493532095147 11031975761990566276 9325243978944460932 8086926191498362908 3963606588351803770 17376856887344062105 8854070530699081433 2705245173928241837 4026111158338387229 13026276709128675765 6379047692725074316 8110151847976643914 5958727574694719631 4017423308161378953 13336783301013170659 7345897067150046416 12661938425895771586 7910195949538180669 13249247737680863941 12030734052890701021 18443323066061302688 16170725978991373623 4514544721711018805 5072527822006535191] 7130954387874351850 6781932227698873623 1 [17735181515184057148 8376143050477581590 13970141264473760763 3090146032329905311 8888756345674670457 7258900832080800804 16011798334580652169 3829597816251882719 4637381900088705240 4871914514523559352 7291105850939116518 9501405831279508263 8702215063977562213 6015804389864577793 7528873468273029268 10348031727712609391 3731610707829547207 17533421863780541651 14499805003297173147 16703521241366147053 12602318099865662777 17348592114235001526 10105316481914894442 13764085769331121853 10690680330614454941 3854869732559663291 7178276574617748064 18303663264321477300 15711047703728714444 2275726349270725939 13172014414012191543 16490617201805381918 16133663544302658377 2843596471822400729 6973915531431741715 1342027602877051740 93320055071159843 7920095401917353602 14881586991802096792 10590478667716611132 12791765325813502168 17194738058268198272 2943459158354740858 8892425244745331195 10226898876815347527 12835950263251713892 14260829011269298234 15923607588640473025 920283377642800287 11164307384044674413 10857686970697893931 14989494703906169041 17607829962488102945 1873634278773288679 259756893655488051 2571820143933580266 443132673643334182 5066689487795927559 7995834854159377368 2805259042822155667 2790235799206467513 4956909446581645693 8774565132353729188 14355166894026855390 5218585068221211172 15775998676146929843 693865393838594525 5902493338490211753 9030293863146508684 10844972933273121817 8365216749812905892 14466751311530210917 6740809114679800451 11420272753041037299 8359338375630637085 11645565454810304193 15022472316296008381 5484060117426945596 3266016115764007926 15819022897034261435 13219924347028085856 7272177897701189380 11955478023071459194 666644129146027522 7083352701980237678 3470201195438249646 16300909963637002008 81254198068173251 9045105314200995716 15762287022320695341 16421043446735583997 6995987716468318723 16462694759187436620 5285688132845488208 14052554080498012394 16885784915925259332 9146157203042521068 16203955377558000371 4406896168719316597 5987016752749573131 9842993322957837958 7069531820233032762 3172720544085205438 13557802431198351713 10321379327749635356 2129712812875824281 10961798365845332581 6867123967177809056 7147251571897124080 13116435807467593530 1793570777487027107 15726933911509250388 2892478217792808762 11741349035243049698 16663779358482117686 175748498354058438 7232634646177908830 12983754107273050719 6178024140703929005 9166429089850271582 13062446369448668648 5139816678915625092 6572257705514190250 8351045570196586566 7142805375265130009 3207090681698613411 14530237923874255727 16328017518163650801 123021934440483418 6248444155748678958 561918186339136558 4900440736817086927 15082275079816282231 13080051316010977930 9010490060674459189 16502592368493141913 14499638424541720397 14910318983135004518 18244193190154580421 4205028772861037477 9023735179767024358 8340295298535445819 1822708028885812226 8432453219516863603 4508331856826379266 14362683053910581124 14489337771939221601 16525654263670880876 13896969700790104114 1939016698822082830 935206283174076500 12687204463426783237 15607488310513638268 14903624283742109467 12658767560325770901 8630768495380669689 5972993821596482959 10089886367625635167 5541501710735695709 2681257336286061135 8508236575453955948 7973135948143725097 9389900474723963993 2451659002353999881 2305816829826609681 8231741942694299282 16704025560927070278 3056346929744143983 13631252446257859347 17968531734199538031 12499379264130220866 1020824990573843725 5125768587777606254 9505118096923319498 17218458401457594713 1896496438429462540 14330638798692244565 3344245038191817406 2134413000162671188 13777391114860887842 14569701884500820549 3729811074217224665 16141106420748115510 5137984178775125217 945142853721198413 649835481155861668 4208916345368369747 12018454430547452 13027555302614879977 11360161635475406984 569606485897468087 18047089624853729202 17456363813816611781 3225749603298401079 1916748144245515559 4253805955452872145 4651222945594737077 14365349531472993523 11469023301952439970 11229503117145506069 10239239462745576710 7832284387013729445 6100932644797724242 18427850759554212 11665322838195598394 5148553484994521307 10840167390140196589 8526840339293963740 18273927811810115543 9450060921196890327 13917071972099001504 3066363006660553225 11653559560517400050 11614775899404539258 17828898524828863537 13507126671081311577 14914550348893235381 3950115880334710113 17420379308607826703 7937492156480551778 3931962165729220638 1577645343500269278 6449042082232909030 11564861556934661806 15346745145276760058 3568886154573580794 9795335162907011023 13274630007446017775 4676294184378154378 7895818774522208620 13162924794907243096 2824574088734024556 16637221276127415632 4261777213956879021 14704868370755138588 16063969239360453421 15861675059136528668 5926864327028744477 10027105136232922974 10272943555681588892 678749506271766962 7154532117411161821 4855235341742849126 16876191802929271348 12377043641284755270 7910351118498255438 8542885916920646394 11744997490876513639 876064920600972713 15870620366504326769 13833866887421572166 12846293944278844805 1061465965875557546 12532721553413984954 2539450389145115840 9732530948189650869]}]

Marshalled State: [69736161633af620059f7f9eab3c743e09b9c792b516c1dfe9768afc23fb2ae26771b11b549f7b5b34cd3ef0217964bccbd8f3f6ac24de3555c04bdef889352576ec7e4e1cdf405b4a44aa9d00d8439c84703e3f15b8652f362438ff8be683dbc643503d7b2778c47a7e8f6f9065537c6e38301d1b01687bee879b46f0948f9b9807b6c8246f33c9582af83960c7f3533a49ffb4e4d3c939a7d3c5f5ae9be7ced411e9d22fedaee46d8ab8f7f539f0c2949c721ecab68c3d4bcccf6ff86abf03db14fafd9ebd945ced1e7987ba9d357f3f99089fb0bb639e5c8331994260fe03acc30e3f9ab4da08daa555f772cc1f95010eae473533b6cc65523b859337e4da70f9588e511edfe6498383d4634927767becd3873cd960c85339f8918913129fd6fe9441735c014b8a187cefb6236de9d4ce3a7d0e82ce860485e4701c9892f8f03cce99cc3cb1857aca4745d0d8ee9ffb2990f7458028d94482689ac67a7b683da560c2f1fb8ded3e58126b8f47b22274c1b3b33f64c5e8a46dbb4aa83adcfc04bc27a13fc10cc580db2918849f9aef966a2d40dd6d96ae40c5fad5c82bd0056203f4ed20d1f45b940f839540211a007c731946eee7039ad784be4b563323b0f0cb795ae3ea062652d1a0e14a2646507f3ea3483a076ef6e96fa4db63d826ee483c8e5ded9326b8e8ad134797b944ca7ae0fb46f17d79c5847f8c78f2a4c737cc3bb1eb13de486c2378657ba224daef9b360cc540b309a11ae641af99dd51e9de6b29d18da97d520c6c8a3cd18c9681156c767874197417385029bef7a4c8c439ab71acb6655d8c2a2ceb3472839e7cf58fcb1557f3740255f684c1481da19d5c148e874ec1d07a8afaacf692bd4c1b4b9efa1ebe3c2d53385a6ad093f6db887583177f73bbb7769b26c6259c6064ebf744afed2704a5ea63eb4d29e77a0940654dad593e02624d1fc0d455df6e3028a199f13b96aee238773efa358f180120ac433c5cd9c37d86ab5c38f2c784dabee488dd2cb82de3e344032bee3afd6116bdc305172203e4773da90f0d544c495a895a1fc0c850c304b37b8b0cd0eaea565bea935fd4447eedad848b3acfece0e003904ba012f33d2870b77a8b7675531628041bf3740b88995646dd719686621c05bc094f843a2c07c48669c861bebc26fd7a968151618f3ce7d04693bd1c1d8e4285050fbc99982021891fab22655f4cecdd54345ca06330236fd747c4f0b606f0df7f51df3a18e40b1e8fa2aba3da414b11518db1542824259d3418673aa2f1a6bd3d8992e2e741a309bdd0343602706253fe33b4c6645f7ae3fb9e085eb42f8f91d7077a5f55bcc039307212ad7f35b2b0ff55275eb54721c3e4942de847544c099d64d0845b35598fd57f45aa73e4dfb34aaac046632057a5046dc6192c81dffbad1c78a3c9a5c668426f336fe298c56c587fe8f101b50fcc2de80a5a56b6eeda9e43fd2e07cc559d0193742e4401dce2f0d601cfd14f0146992d0077b585ad5eeeb70a8a7d0bb0f876b06635e504fc531d1b1f99c93910532269ef4dceec181ded868766fd30650b68c3b1c53a5b4363c4adcba57d3abf5611358ae673beae629f10d53b194b8f4b8efdc40275061786ae66d4733e90cff007b6ac02c752802409dcdf84c91477ef8f165061e556eaff0305ba6cc0dbf45045f5f0321ae8c56a0ad7410e0cfa8528dc4de054b012013d634dc805d898efed283a1b7cced44f52c2557f1bafacfa06ef74ae9577c6a63801cc24f952e4563c05dc7d8f8c067a315e61e55f4ce75e721e9edf5d2535bd5768bda24f7613541638eb476c6ea644e6bf010a29824fa0bb6031945922060adf89b2e0091fffe830a2eeb211723d05aee8fa4692e7d09ebef61a68462a6a5356e1c1666fbd2befe0dedfcb13f95d0c69304c116fad76b737575d83420e2ab2eb9cfed50d4722635f8357026e83e8f68c83405ccaeef440b056b861591a51b5767261b00cc6e0a80f787b5c552e692524c74932be1d9ef550a6abfa54bf33203924e7ff22ca31faab9d02c24533c2f3691e0929d9e000bac53a77de36474dc9636d77ece10d1dd26afa0d0f4d0904aded58bd7ca43a69131dc7045a53002ab2b87b14fdfcb4cb2c86581dcee99da766d19988408807e7a614bdad58b7fa7424656f0b4fb2f2417666a085b3c52cc42a2c66f55b371a99a84825a4a5273b088dfa9635a5d1408c76a0335201b5c75bf949b9c59cf39f2a27ed798d86a29bd73596ad9981158e19160aa31c95066cb1dd271bca9ca554aaddea93c0b652004178085a7f44a4a1e38d50d8e6743a4773561dcc32a8db967002cec31466ed76556c1c881685dcfd9a08868212bfd783255c56d9bdc8d7c1235f390a818ca02a8de8e88466aa09a1b9c2ad557f35f2a12ff9248dc6957af76cf8bf2ce90c31bb72f424be018d59cefb20858a75a8b536d1a176ecfad561f1c19eaf1e226b0f6e27a30fca78fb62369122c1de90d81e15e4ec14c8e1f6de597f999af509bce6a07ea45011a956aed4fa97662aabfffa31873b0c7f2b09fa87f0056ec8f727cfb838f5a8e68f96ef40e588c8dd15bd8a6d9395577241a16cb6ac1a5c5da0b2582732e72b20c3a36ce6e3489a55254d503b24dfcbd5c0f2adcc122fdf9bbcb41cdeeeaee9a2e1bb2ddc1ffd6d7281811c524073b41c7ba11d8b276efedaa87f5e8e90d3bc4a0a169c096b67146ccce9b2634a010df06a66dd436142d1b5813c66ea344707e6f55234abc4179d8848ff466dc7366e72b3d24e768e6d7ab2be0afaa2fe9cfd838c7d670c286867589a0da9dc3fc5231e91f671bffbc4a39ecd3446b24734479cfe05850ebb15ac0d2df4aaaded2bda041f52ba233df0aca1b8dcc08710e5550c56ffb5e1899f794b21b11c5177b28e02a2bb69ff8e1d89410440b91ad167ac2fc6137a5288ba0a1c98b010f4ae14d29cf748bdcccd5f131b30ab52db10120d8dd60a0488d8f2be03f836e775cb5c56cc50c1ffd58212d62936bccb918ddf1516fd18b3e32b33e995222d165ba92e23c028fe272be16fff5ab409a07a2a254bf16441afd0b3624ee16bd10e43212073ea0473c72fa79e0fe95c83341eaf338c90ca30927562e48e113453c314f3f134feb4cd0c99641cb7c5e208df080802b37a2d628ca0e53f3eda165ce8fc163c89cf1f5465d8ee2846c6497b4431f1581c9512a684c3873ce26cf45e10f53e8e4b7f9d4254ca1d092841698a41d24bbe70363bcc7d505c277f3c637fc922ebab9edda7cb87553213354e3607aa9a85cdc363454c380b360a9d4ea6e090b25a981b8e36b8719573e5b33269c27672dbf841f68e25b473b665d2e966bbdcbe22de10024eae222fbc1aa196af0e09fde5e9967cfb18ca540e1138f8f1714c5743df1bedd212194ee9a00082bb480829beecca6680c48c9468fe9d9232a3fc5e640c6747a6d6cec1e1158e0c89e7060a0ae7b10fba1d9277cdfb8a28470012174307c92a394a87efd0c23997947aa4976c4337cf3e6ad4ff2640a6502ab517783fd3d683eabefe5c060dbb75fbbcd400cdb0aeccc2e47ff96633ff95fd6e2c243841a416362979d569bb007a9ab5c8f085a17dccd865de035bea91551a807e7c71535b0122706a14f3d430d9347acb51c5b6d81d4a759f25d3b62eb7a3acfce2ae5fa0638cc7122ab12041cd3c2ea580614bacf34d776ef9703d8e400b153a66d1a606288bb96a090cd672e70fbff7ab09dfcde76705a4feb23a7dc0b0ce3107d79276ffc83fcafeb42c940fe6d82ab796a7f9e2453a5dcc28c3fc38f35fc982980fb91e1a991c033e7661f3018423017172e050ccf50b1ca4e8c0c6e2a03fc2f386f982398d21d202bbe52b31c7ef811d16e5bd856600c828d1eab21cc4451c7b9b3b7f83f11fc44320df879f33d449a76fdde10163b827caf3347522689916ecc6681b715bc985e5fb18ee5eb6f6afd70c69453631782439fd5ca3f81917e7b21dc1fde06285763e6cc114b9d79eb255eae2cd8618efa1795aa9041d4749c9b1a8a853459f8b2db1099e4dd15923694f1372fb9a85f6301dab86034ba98bb4ad2fe6d79a8178d1434e6ca79ee2db41bea7893d683843efce43d1a3d4807872eef857276337716f869ff5f49d60862d68595d81e89c57d12e2b35c5c3fa77c001b321aec0a0f76542462e7b742aa0b69c53a5c7e065d16bf02b7ca6347aaa1d02e655e5ed07a89001fc427899ac64347097191ea2518ab1ebc957a12e161158daa4d9f2458324160d012890b68859de29eac8436d74b728372f2bd6fd88089bddb779429591ee870943d9ef7159dc8dabda8f0414694f84a69a9ad512a39c0a294611a5915629c5011c132a0c5deb08f47cd7ad059b2ef6ef0de3d00d730bfb0a36447e6dfba4ed336940fb7d195dd869c40aec3474393c9c3de3fed63c2c62adb27d014ee4ad5327d915800a33219220557870048a71afd2cc3b9391653c904770407cde637d01d2929d876ccc15d1cbfdb40f4ea6c0bb1e58287adb22ff61dc9533e6e61db957fcb68160a7dc24068bdd2902cf5b989f6e288a25ab201add0ba2a0683ed92cc481f4500034a705f5889a123910de41437acbadd18291ad6a26713dd69dd6b77e5f44fbd8ecc85a72cc1d3712d2cb49a39114a4484d19edb867eb334fafe5980f9c301769749864b7290e3e2557c0426313804543e0ba61e92a979b4e88be941b37a6fcd1159dd877572236f2be4781d9fdfcd1d0535f055e1315814400a3d817eae4284daa1496c125e05fc42219ddc4ddc4f860444f39fa4b1323b52f25786b572d96a461234ef7e6197ca237e37becccb453cb605876c3764d84d3474f9eaaf1c0739a8cf24a4abe5274824c2190a86fc32dcb420233c482c795c2b6980f2d4b666cb02b543df9ecd3a3353daebbb3c1f1a24533d254f382e1583ebb46bc37800c4c0e39d0a544df7d2cf622b03e1157c8f260f46fad199c390d76dab8e8c7c8ace32c2c13a02cc34e59be326ffaaad8e7973bc89072081d4770227bf325eb5fffda8c24b11a5985327fd23cb8b30afff1a193df817ba8018cbf126140c7a00902463a10b3b8ea9ae037e025c6805db058ce6f8355e9725e5bbc0855f1f048c3920b9a8f51b2280d11e14200b63eb634103fc4355dd19a6c9d6ecdc2b09a5a14b78e054a43cdafc2ca7b415d729e49f0977d6ed7cadd4476cea1eec6b2095180ee8573c4498bbbf13c9cb8522282f7d3911886bbe7d93b5093a4e307ec77ba5dec39982215b664cdc8f57a4906697ea31c954dae4b9e00f454c833bc21c617f8a76629db61cff6c3d51a107ae5c4af8851276733d2c6b607a9b623cf81408fa667362b87ffd1c4f980194a169bbb1330fb63845aea0fd10f1f785ef5f477de81aaf788049bcf302bb4905124c85195491e2b859b38fa051faefe3c89e136a19d8d94fedbd78f8be692c97465a3c6890413c70e7558fa431139721910eb4788b883224b046c25d104eaa8eee9470866ec418f038d81b7273f0c90e9b51311d9e96dc86353994c5bce5d39d688aff6215db83531c63f65802ebe411e7a2b1bb23aa4d4b6e41557cd4f82a809d52381192fec027e468146929515ec2c3a52bb5e05d0ef126689f3524d785642f7f3a4d341064296d2f21c5583052159eaaf6445153a4c792d5eadc4ca0d141a3159f7dd69d9b344157ef45f71c1465e26b540f46733a0415657fbb17c6a7c75b86f9149f0e6f4762cdaae391902f76d86e7f8cd678554c3cf95fa5e1e436dcac3d51781757fbb1fe5ef08944668319134514753f1a446fdf2d9765173997079904f92ba230d07ccdd35fce443ad2c2a8489ade810b2d3bcba6e5af0e1e7bcf35ed0b41099db9be249702407dd6a8b1461184880c31bed448f4c0645489a4e6485359dd9584d82530fd1014ab0ad174dc14891a5ac67d57616038e001da4153e373087e01edad87487304f688baef70f06357c17f43204b2f12e73aa550565c3842fc14d240c86c8954c82f678409739aba849e0d945666c6dd3610f03e5f234167f24948690a13c13890a2d3b0ec6c6e5af63915fe765de0b7e9ef6a1ddd67584c619ecd4c538478e092646643d2ec55c262f378ae6259233848ff76447f0253c280931e0da04e238c3b072fa9365ba8e3096ca252b979b8a56c5254d9f3c0e7be45719b178d4e99666421227ebfd5f4b2a801053c7841eb58e4a47d149c25c60d6fdd22f2ea3b98a813c7f7cc1278b4f15fa52cda514df56c736256684b46aad157607ef42e8f2f9bfe4e81e830f85e33763591805c6d96a8257aac1dc6c8752a20b6d44f4fb1a812382dc66d1ac10e642ec93e7f9ae7289a2ae938671efab74d165fe626b64c3ed6637b805ad3506a18673df1784f2413b802533fd403ab1b77b6edee4dff5c7013c602e80e6ce291e4fa0119e922d97b7ec85b71b51b9a78a84ab37dfdbd64c55277d64d87a425a5555f36af2948d5d91704ff803a7328559a8347b4d942416818a6462d67ba7f2d4c18ec8a275cfe71c1896506ac33ae5a5434925ba6aa792fd5c2fac85e7552ae0dbbb0b7dc8171981306c82192682643dce51b69f4a4953e384894a266edf653aecbe6d5ec13c45814b15e8e07816fcaadc37c0754edfec0ffc296dcd4852bb6ca324aef6d1525c1bdc172f69b2631d49f078a7775deaf7b47c7d16817cd6d0870ea1c475d7496593bc6edf645071b1eae7d2631a87cd86fb3ea75b397be2976a9bcde69782ec0470fffada5d945c1eaa1faffebf8129bc448bf752c61661cf913decf3649f1f1290a181556f24c43f4e9e0b662118ed2a563bb70681df316c61a7accf40efd1b242a490995fbfbb59bb863921e3aafd76baf8bcb991c9e5d53eaeced3c58e73aaa24255dc0cf2a9723fef35427cc1ae04405e741af5f88222b365c2053221a9b779c5c8c6505608ff6ea04d0e3f600e323a725bf9b07d2836ffa4eb1c506ce5e698c34dc7f12cc5b9f4444e16077a9cfd692333e348fba1367834321e32d8b0551fc3ba43fa9ce2ff7564866cd14992cbcb476cae1f9059d55bb359aee2f92270dd2a7085c2349282e7256b8109c16ca82c09a9c33688e17869def310f11cf6056de02bec9d97a9899b484d6bfeabc5df56b760b6cf37893d7e605c91c29578c736654124b2be096b65e77895e1e75d96897504361501c6ade60f374b87d3d6aaecb60845791085bf744032b552dfc230334046e1a2b1d41a9d7be88c7092d07911c93321b7f449ace91438db9fba78e304aed69e42bf5c1564c927251d21a8b94b11c7dc978fe4267c742d30e7d844785d31b7cf9646ae9cea5680b68b4008b71ac5b2d902466c8560bbae7f271f06b7eecb18e501cb0e10ddd6f474068b86bea9fed4d1e6911db78e8a94d8a973753b12a28e4ac48a82b89dc8b8146283502e07dc3550d13fd79a0525740b5d876db61ef83bbe44348985f21329ca1fc1131b5b15d9a935e05aaafd02e0694f8b003d6a8b3ecc24c1dc7fdab4e5d8f9be16e499372ca6c80cd3c5ab6f2a25c49cf67c1f6394830a5285d9900bd29c7621956b01c6a0a1ba7a6d6a4a835addb6e843728e5bcf28ba924cc90056310c19115b8d731ad9fad18d71ce2a5e168ebc1ab3cb69e934a41f66142344b23d666647dd1c1499d0e48c9add99ae5a6a3a9076c4fc9562b1f97cb2d4c34ebf3d93d21206e0cd068a9d8ab62ff7361e4d33499f5ad3fb71df6249dde961b915caed70ec2f38b3c0dcf091ddf2815396f8ee375e23e461184cf2b47105bc05264b7911aefc35df564bea1a6cd40d566c8ed53cff11e2d1457d53777765097be42d8ca05683377744112daebd51f2706806022dcca551d5551847f62f6740a4b951756c5f9bb1d5b9e47324c948fbeb7f7162cd9717c907944af9a71819844cec49bc1b1cb1bea52b1f161fe43584403ecd47abe66de4b26c24e8ae780fd838efebf37e9c5fefa4238f0e3894142c6ab34cfeee360fd21745895c2e9686f241bb9e74002b85f959ddf6cad492bde08df32c0b14543ba63a59e65eab1d8d3528cdaaca52aa329cd23071357d35411a50d84938301cc2b46458e8f6b8c8221195f8b9ae76353204ff1e2d969465a80475edd56666d28ea06fda290e61a6a8b0af0c363b5e4a15f36debed1487ebb4be5710b9bb757cdc281357a0a6a4fe934ada83c088b6527291e6321dc0580ff0695aa8dc60b1f8576bed4e559ab82b7c878dd23126ea4e87149e7775526752d84ea28f3a3492603dabfb9e59b1b5354c87b1fda2cafd575bde0b85fbcd0617ebfaaf8bb96cc6b208eb39e98d46283d6ad0600de64abfe217a28367cb1e45ad25f9a97ee3a005e26b0179d527d582a153c253eb088d06b5d580173bb150cba056858f4ccade7425c315be82ab99197381702ac1848169ebfdd8d5b884703a88865910001c37018f31281b717af126ff45c2f15e997adffa3c9e92b6d9258af62716552aad37df9ec46afefd1db4c6a1a6998f21b55886ee143227398c708d0c22e5202d4a52b1a7289300f08f37c0c136ab556a89b915c5c03f4069e365f1de765c0ff4d0afb83de99b62ddc26dc6a94e5bf4fe3db7dec89eb19da2c5a6f5c0e129beecddfff3d89c965a2ba0e069f59a09f62d373ea6e2815c33333546653d2dbffc441762f63d3bfec38aea5e1e436dcac3d517000000000000000100000000000000fb] -- <nil>

State before unmarshall: [&{[16251696073643503900 5870356962300050281 18414688401703059641 1932439704352199546 5947207860534947856 17631052486011209917 14757556089628175186 15785136543357078020 9860898282052007655 8487979450574619135 15384879988074790091 10488284388888746163 16369234348930641174 6604861059598188071 3161931555919890848 8802889429751710127 15038471671649128718 4837183156992111559 3433887032070144820 2211042620879810706 8458574348980343747 1509815510013103372 11052990961098557663 578715521989304972 11593742354914630888 18164772709628597349 15631475641089096516 3598754457029092996 14089296902440115728 17671718442763108948 14563806838486829633 15153414760373668989 5790546648319098825 2516293515628497799 6138990361725765546 11134531892811222072 807844853905285264 12851751730772621425 10769203691780686454 8276481702416491956 8337963716656413660 13700757176754023970 3439653496724327945 18295285893813704906 6056797485252309324 6288114815786422809 5686251928585717768 3008101955177333900 10694077267907355644 6801574974959572686 13970471218919892742 723645437805469074 8632832631538909202 1676192046890175111 17280525322832607908 10911169904191105748 18385453611840353559 8664877126373785342 6631002600139111636 57896635031807103 17971108535894634028 2609908157064292729 15378028013364622792 17331436302684939742 242044914913411198 8967039983397531754 1509783606366862027 5892316726804772255 2725722511254990076 16334098040988944146 3076275487458995877 9250758315784107886 17973933794004768058 7408885407381436778 652131835053064183 12324627930719651236 18352795743266328113 565081318053396426 18353343395875182634 13228945647132293725 14711223670860373961 9410288709139077404 233754393730712611 103990574160082187 2064030443910635583 14047720068888497441 15132864290864875503 9303617581200270848 14423008612594795589 2052404735042122015 14142183399298642900 5307333684632839096 2867371519403780249 1651913313777441737 9648393861208127222 12670609722902458744 2610396033367677207 16695439487641084549 8520367121563768734 12850435371603204335 11635430794253387593 14533582913406345099 3292423378099591459 7588305281710982646 3467115880214407563 13019114766304182648 15078982205942194907 4737408065922938947 17279823387943010424 8281829817987577713 8036286463808987270 3271963387431001175 15073032512806845047 13835536487506026743 7296471511747275424 13158484182757828049 7777764370833242794 2090486433657456552 10376852378859711588 3778686221507776906 12820562142443738641 6402611076240081700 1588927517269854297 16008584496310744247 2897836750573242376 11231334777167909358 9730383073214814684 10208493288148986191 9558497248930866076 732193456030570025 14195658369083923947 645277912383462190 17793455924863398667 18089330521093831588 17092120738619267421 15594210735938630713 4367433788084861996 7110535636650484909 5991996515605426977 10529509904556001905 12669413257997542716 10396401687083246461 131328544426740757 15117455523991955136 13483311265276961535 7051675166705065401 6340143042219465764 471713754200890264 11488164273271283738 15928003316953307436 14159867327867561733 17692560539182489153 4862422695104647597 7648925527542978231 9106072820033308762 8272018737948969801 11786224395625503213 13287847831192724888 1124826884047411300 13198095843063218242 7139190869292268129 16801408053152366228 1961219767512964568 8599379632883386241 15707989053411647237 6778785509058585560 1723440669175452822 13917776925375470045 14185710972332953401 18035530176819832184 7734701010058289998 17862992995099861883 17063211360187340918 14084530117523492766 12317838058581717578 5385832864737403280 12137134122237821491 14160099624437061647 3263814971958187069 18009001707874135739 12952899682542277204 17546834867314706108 3999209989900718245 4962822946447077438 1249688364952874925 1845412677306464488 14395946300588430240 3225507905477439482 12310844218146328690 584702073568490277 16960556035819745562 6450617565847533747 792617735713423739 12106112025623609543 11531750821504005048 16905070681876973184 6750993485085758953 8241125231286415856 5243194969724768690 2885982595387012670 13129136679752654289 11127441878549704858 6491014783549719501 12664907732845687454 5327924924165638877 4933357636722012681 5872956171031431563 13542672198284747394 17857776481979852761 4274078382767467639 13429149395998348726 7263682730662626921 9125168697561729950 68773113155559878 1727314514327331279 17781290061711205828 12648448783147061958 13116639039489802560 10351074275913891793 14193516546740362171 1382881490443627023 15064293880427312247 16033284128531323855 3471066469748754513 10757162357225109754 369206101428265270 11645619882520467343 10080906209854333894 9873038028764961018 4832707037354847047 9851768368183667749 15061421065117452040 7416374768868098487 2827992907547742993 15702202283231254860 6615327405647638518 2404280314693566309 9236529072676940571 12842758520908813655 14794186959166448513 1814928670306238790 10562372605165851323 6775050939673250291 5930528596202877860 15222455098557002268 6161774355973582692 4977949063252893357 14180160756719376887 15954522518901325556 6877490613942924608 17611101631239575547 12789214124608876433 5328012296808356526 4114322996297394168 14800945299485332986 6781932227698873623] 245 [9328502644838625032 10684341728081891655 6048796399350503798 5869203447748775826 13412578442392450556 16448180669290678701 16722062038900829786 17357409237585547444 1196228638606454820 566726273693456456 9278290363184794630 4992409848424773021 15661352926315532545 5381991870308108433 11938030878759191438 8343185469681799 16149585936999985231 7533307177839506812 1726059552953151091 12273722294098210753 5558581613112413314 17760016148787341385 16202057440650187617 1081961163917786916 10702400586664610058 3259215002235940707 10475345682990071454 17771729517745063449 17065481733522983206 5072246351414961711 4002264267913135247 17826452321781688329 3594112217151751088 8285096529632309398 14566096499949328069 2687979632899908695 1851393777673332290 1308273690232433280 1176503297938656842 5174998545947743997 15145375352597676348 9186429715514070522 5966606590400710454 2694987337446528374 571749245975642084 16725950168794609507 6419887620425941591 12304358015637824011 7873687407869109122 15881611672916738796 10657761570836816558 10630309244642316645 18330331513879356983 13260195121118414451 16075463570933645349 3746221085875993454 16061208417808759904 3350931895891152800 1269612869481655429 13194229391133672619 4026178305342646141 7266692424164267507 7706385247265452111 17871311581763708980 8884920522589178468 7122015821996802446 14457247289608771734 5794658528293897033 2718602593029676079 12431596699403738043 828037908043739244 9374566440817774161 13159318315000366217 5343079913676795070 7880948862553246485 16780544251706137655 13868077351202454569 7912059640528806692 12607494358533135383 3416457931100123256 12067216990322064509 1621714602893446817 14156457713945787502 16097079417375483858 7141169475952000679 6573421344257121229 16615893300405141498 15734895796474748847 18356532622437682167 5964479365848841708 17538317804691825025 6156179640933064203 7359190672996711351 468901239587973036 14934200048278480016 11051762821975737913 2441983428560353468 13371690757602062030 15259759539849937493 15856315197644861237 4790917056755162740 1942732052091856322 374398731836573128 14290016214291750989 1026644854152262235 17992018123020018923 2040250365870916429 14407345910674900046 1587372208356401971 16377616714754962482 2176039821827359674 4898400043481261190 7841129321061893996 12546905802383536985 12601908633653815920 9638323956392338795 9298175578105186729 14066580988107546355 1220788816972734507 17049950518708488269 7781846072486704992 13172808497663729756 10503121626952262977 2644384878885726072 10800167770554725636 3897023005391720247 5442551593644635656 5006050627427778610 13065751494080544838 16258753129298623464 10119749786783566131 2429679121260418104 15825572643970789078 11403887608672340263 2674330762274869703 15895331619888460845 3524023022029451703 14958220928128538240 13153677542841566642 15637138288091904942 9162326080624708376 16501693770935162612 8360523169100594900 15124935955390040724 15612136530595979918 5387583348289685688 1468880808869092405 5823505988401309044 818959612527966267 13710140930885030697 14564572007746967001 12192898246195872480 7588436730289228606 14710095435680888037 15634736586927191852 12017869709332148010 2721472657296941972 9442450303569890258 11274235642797737632 11653761596127871834 15976212104525798351 2934818965672711729 871747087785728729 18073382299544215062 10285125008521554228 11826283383175295549 7378664054477593040 16468708213943851626 4220003439269470897 17977440439435706173 10651595889435281034 11352086127867993677 3695660181686546911 7082435883453453770 17109434671939436764 17334880474347312888 17165292012994369612 17488727522429707851 8723946351452182091 16868915012282248334 15365436480966182269 6014407103211103277 10133194283154883601 3291776537311864838 157006572442440984 5185384141476378961 8461242922230462948 8296977728824639345 7119512714355381322 17989373734427618377 13554459053234924319 1594243711615647437 5164474757373127716 16766470472194387947 17545633134138368911 1024731729592234828 18369679371667981705 6642412006752238494 8358728762813701622 14615468034937975596 798355649120066022 6821578552902208938 14578902078107824241 3854295409829664841 4048767687581784296 17778179577694517433 12571293898799783469 10850409174546116053 7378816549512010281 1036292632720903222 4277938154187385837 1479410164134514873 13507839942374676384 12008002415046067136 9851151886947070493 13859845378466818268 6967623152875425365 11148708691405820465 2804140060065036149 5937805722696978234 3788196054566674009 12805199718308248994 14626943216848176635 14773521929926052793 7838147952860850573 5055358110695165414 5386272270497048523 2181339973144903395 11530871370166162727 15385036658165672712 10162009537789770673 5821923236774890698 16029478493532095147 11031975761990566276 9325243978944460932 8086926191498362908 3963606588351803770 17376856887344062105 8854070530699081433 2705245173928241837 4026111158338387229 13026276709128675765 6379047692725074316 8110151847976643914 5958727574694719631 4017423308161378953 13336783301013170659 7345897067150046416 12661938425895771586 7910195949538180669 13249247737680863941 12030734052890701021 18443323066061302688 16170725978991373623 4514544721711018805 5072527822006535191] 7130954387874351850 6781932227698873623 1 [17735181515184057148 8376143050477581590 13970141264473760763 3090146032329905311 8888756345674670457 7258900832080800804 16011798334580652169 3829597816251882719 4637381900088705240 4871914514523559352 7291105850939116518 9501405831279508263 8702215063977562213 6015804389864577793 7528873468273029268 10348031727712609391 3731610707829547207 17533421863780541651 14499805003297173147 16703521241366147053 12602318099865662777 17348592114235001526 10105316481914894442 13764085769331121853 10690680330614454941 3854869732559663291 7178276574617748064 18303663264321477300 15711047703728714444 2275726349270725939 13172014414012191543 16490617201805381918 16133663544302658377 2843596471822400729 6973915531431741715 1342027602877051740 93320055071159843 7920095401917353602 14881586991802096792 10590478667716611132 12791765325813502168 17194738058268198272 2943459158354740858 8892425244745331195 10226898876815347527 12835950263251713892 14260829011269298234 15923607588640473025 920283377642800287 11164307384044674413 10857686970697893931 14989494703906169041 17607829962488102945 1873634278773288679 259756893655488051 2571820143933580266 443132673643334182 5066689487795927559 7995834854159377368 2805259042822155667 2790235799206467513 4956909446581645693 8774565132353729188 14355166894026855390 5218585068221211172 15775998676146929843 693865393838594525 5902493338490211753 9030293863146508684 10844972933273121817 8365216749812905892 14466751311530210917 6740809114679800451 11420272753041037299 8359338375630637085 11645565454810304193 15022472316296008381 5484060117426945596 3266016115764007926 15819022897034261435 13219924347028085856 7272177897701189380 11955478023071459194 666644129146027522 7083352701980237678 3470201195438249646 16300909963637002008 81254198068173251 9045105314200995716 15762287022320695341 16421043446735583997 6995987716468318723 16462694759187436620 5285688132845488208 14052554080498012394 16885784915925259332 9146157203042521068 16203955377558000371 4406896168719316597 5987016752749573131 9842993322957837958 7069531820233032762 3172720544085205438 13557802431198351713 10321379327749635356 2129712812875824281 10961798365845332581 6867123967177809056 7147251571897124080 13116435807467593530 1793570777487027107 15726933911509250388 2892478217792808762 11741349035243049698 16663779358482117686 175748498354058438 7232634646177908830 12983754107273050719 6178024140703929005 9166429089850271582 13062446369448668648 5139816678915625092 6572257705514190250 8351045570196586566 7142805375265130009 3207090681698613411 14530237923874255727 16328017518163650801 123021934440483418 6248444155748678958 561918186339136558 4900440736817086927 15082275079816282231 13080051316010977930 9010490060674459189 16502592368493141913 14499638424541720397 14910318983135004518 18244193190154580421 4205028772861037477 9023735179767024358 8340295298535445819 1822708028885812226 8432453219516863603 4508331856826379266 14362683053910581124 14489337771939221601 16525654263670880876 13896969700790104114 1939016698822082830 935206283174076500 12687204463426783237 15607488310513638268 14903624283742109467 12658767560325770901 8630768495380669689 5972993821596482959 10089886367625635167 5541501710735695709 2681257336286061135 8508236575453955948 7973135948143725097 9389900474723963993 2451659002353999881 2305816829826609681 8231741942694299282 16704025560927070278 3056346929744143983 13631252446257859347 17968531734199538031 12499379264130220866 1020824990573843725 5125768587777606254 9505118096923319498 17218458401457594713 1896496438429462540 14330638798692244565 3344245038191817406 2134413000162671188 13777391114860887842 14569701884500820549 3729811074217224665 16141106420748115510 5137984178775125217 945142853721198413 649835481155861668 4208916345368369747 12018454430547452 13027555302614879977 11360161635475406984 569606485897468087 18047089624853729202 17456363813816611781 3225749603298401079 1916748144245515559 4253805955452872145 4651222945594737077 14365349531472993523 11469023301952439970 11229503117145506069 10239239462745576710 7832284387013729445 6100932644797724242 18427850759554212 11665322838195598394 5148553484994521307 10840167390140196589 8526840339293963740 18273927811810115543 9450060921196890327 13917071972099001504 3066363006660553225 11653559560517400050 11614775899404539258 17828898524828863537 13507126671081311577 14914550348893235381 3950115880334710113 17420379308607826703 7937492156480551778 3931962165729220638 1577645343500269278 6449042082232909030 11564861556934661806 15346745145276760058 3568886154573580794 9795335162907011023 13274630007446017775 4676294184378154378 7895818774522208620 13162924794907243096 2824574088734024556 16637221276127415632 4261777213956879021 14704868370755138588 16063969239360453421 15861675059136528668 5926864327028744477 10027105136232922974 10272943555681588892 678749506271766962 7154532117411161821 4855235341742849126 16876191802929271348 12377043641284755270 7910351118498255438 8542885916920646394 11744997490876513639 876064920600972713 15870620366504326769 13833866887421572166 12846293944278844805 1061465965875557546 12532721553413984954 2539450389145115840 9732530948189650869]}]

State after unmarshall: [&{[16251696073643503900 5870356962300050281 18414688401703059641 1932439704352199546 5947207860534947856 17631052486011209917 14757556089628175186 15785136543357078020 9860898282052007655 8487979450574619135 15384879988074790091 10488284388888746163 16369234348930641174 6604861059598188071 3161931555919890848 8802889429751710127 15038471671649128718 4837183156992111559 3433887032070144820 2211042620879810706 8458574348980343747 1509815510013103372 11052990961098557663 578715521989304972 11593742354914630888 18164772709628597349 15631475641089096516 3598754457029092996 14089296902440115728 17671718442763108948 14563806838486829633 15153414760373668989 5790546648319098825 2516293515628497799 6138990361725765546 11134531892811222072 807844853905285264 12851751730772621425 10769203691780686454 8276481702416491956 8337963716656413660 13700757176754023970 3439653496724327945 18295285893813704906 6056797485252309324 6288114815786422809 5686251928585717768 3008101955177333900 10694077267907355644 6801574974959572686 13970471218919892742 723645437805469074 8632832631538909202 1676192046890175111 17280525322832607908 10911169904191105748 18385453611840353559 8664877126373785342 6631002600139111636 57896635031807103 17971108535894634028 2609908157064292729 15378028013364622792 17331436302684939742 242044914913411198 8967039983397531754 1509783606366862027 5892316726804772255 2725722511254990076 16334098040988944146 3076275487458995877 9250758315784107886 17973933794004768058 7408885407381436778 652131835053064183 12324627930719651236 18352795743266328113 565081318053396426 18353343395875182634 13228945647132293725 14711223670860373961 9410288709139077404 233754393730712611 103990574160082187 2064030443910635583 14047720068888497441 15132864290864875503 9303617581200270848 14423008612594795589 2052404735042122015 14142183399298642900 5307333684632839096 2867371519403780249 1651913313777441737 9648393861208127222 12670609722902458744 2610396033367677207 16695439487641084549 8520367121563768734 12850435371603204335 11635430794253387593 14533582913406345099 3292423378099591459 7588305281710982646 3467115880214407563 13019114766304182648 15078982205942194907 4737408065922938947 17279823387943010424 8281829817987577713 8036286463808987270 3271963387431001175 15073032512806845047 13835536487506026743 7296471511747275424 13158484182757828049 7777764370833242794 2090486433657456552 10376852378859711588 3778686221507776906 12820562142443738641 6402611076240081700 1588927517269854297 16008584496310744247 2897836750573242376 11231334777167909358 9730383073214814684 10208493288148986191 9558497248930866076 732193456030570025 14195658369083923947 645277912383462190 17793455924863398667 18089330521093831588 17092120738619267421 15594210735938630713 4367433788084861996 7110535636650484909 5991996515605426977 10529509904556001905 12669413257997542716 10396401687083246461 131328544426740757 15117455523991955136 13483311265276961535 7051675166705065401 6340143042219465764 471713754200890264 11488164273271283738 15928003316953307436 14159867327867561733 17692560539182489153 4862422695104647597 7648925527542978231 9106072820033308762 8272018737948969801 11786224395625503213 13287847831192724888 1124826884047411300 13198095843063218242 7139190869292268129 16801408053152366228 1961219767512964568 8599379632883386241 15707989053411647237 6778785509058585560 1723440669175452822 13917776925375470045 14185710972332953401 18035530176819832184 7734701010058289998 17862992995099861883 17063211360187340918 14084530117523492766 12317838058581717578 5385832864737403280 12137134122237821491 14160099624437061647 3263814971958187069 18009001707874135739 12952899682542277204 17546834867314706108 3999209989900718245 4962822946447077438 1249688364952874925 1845412677306464488 14395946300588430240 3225507905477439482 12310844218146328690 584702073568490277 16960556035819745562 6450617565847533747 792617735713423739 12106112025623609543 11531750821504005048 16905070681876973184 6750993485085758953 8241125231286415856 5243194969724768690 2885982595387012670 13129136679752654289 11127441878549704858 6491014783549719501 12664907732845687454 5327924924165638877 4933357636722012681 5872956171031431563 13542672198284747394 17857776481979852761 4274078382767467639 13429149395998348726 7263682730662626921 9125168697561729950 68773113155559878 1727314514327331279 17781290061711205828 12648448783147061958 13116639039489802560 10351074275913891793 14193516546740362171 1382881490443627023 15064293880427312247 16033284128531323855 3471066469748754513 10757162357225109754 369206101428265270 11645619882520467343 10080906209854333894 9873038028764961018 4832707037354847047 9851768368183667749 15061421065117452040 7416374768868098487 2827992907547742993 15702202283231254860 6615327405647638518 2404280314693566309 9236529072676940571 12842758520908813655 14794186959166448513 1814928670306238790 10562372605165851323 6775050939673250291 5930528596202877860 15222455098557002268 6161774355973582692 4977949063252893357 14180160756719376887 15954522518901325556 6877490613942924608 17611101631239575547 12789214124608876433 5328012296808356526 4114322996297394168 14800945299485332986 6781932227698873623] 251 [9328502644838625032 10684341728081891655 6048796399350503798 5869203447748775826 13412578442392450556 16448180669290678701 16722062038900829786 17357409237585547444 1196228638606454820 566726273693456456 9278290363184794630 4992409848424773021 15661352926315532545 5381991870308108433 11938030878759191438 8343185469681799 16149585936999985231 7533307177839506812 1726059552953151091 12273722294098210753 5558581613112413314 17760016148787341385 16202057440650187617 1081961163917786916 10702400586664610058 3259215002235940707 10475345682990071454 17771729517745063449 17065481733522983206 5072246351414961711 4002264267913135247 17826452321781688329 3594112217151751088 8285096529632309398 14566096499949328069 2687979632899908695 1851393777673332290 1308273690232433280 1176503297938656842 5174998545947743997 15145375352597676348 9186429715514070522 5966606590400710454 2694987337446528374 571749245975642084 16725950168794609507 6419887620425941591 12304358015637824011 7873687407869109122 15881611672916738796 10657761570836816558 10630309244642316645 18330331513879356983 13260195121118414451 16075463570933645349 3746221085875993454 16061208417808759904 3350931895891152800 1269612869481655429 13194229391133672619 4026178305342646141 7266692424164267507 7706385247265452111 17871311581763708980 8884920522589178468 7122015821996802446 14457247289608771734 5794658528293897033 2718602593029676079 12431596699403738043 828037908043739244 9374566440817774161 13159318315000366217 5343079913676795070 7880948862553246485 16780544251706137655 13868077351202454569 7912059640528806692 12607494358533135383 3416457931100123256 12067216990322064509 1621714602893446817 14156457713945787502 16097079417375483858 7141169475952000679 6573421344257121229 16615893300405141498 15734895796474748847 18356532622437682167 5964479365848841708 17538317804691825025 6156179640933064203 7359190672996711351 468901239587973036 14934200048278480016 11051762821975737913 2441983428560353468 13371690757602062030 15259759539849937493 15856315197644861237 4790917056755162740 1942732052091856322 374398731836573128 14290016214291750989 1026644854152262235 17992018123020018923 2040250365870916429 14407345910674900046 1587372208356401971 16377616714754962482 2176039821827359674 4898400043481261190 7841129321061893996 12546905802383536985 12601908633653815920 9638323956392338795 9298175578105186729 14066580988107546355 1220788816972734507 17049950518708488269 7781846072486704992 13172808497663729756 10503121626952262977 2644384878885726072 10800167770554725636 3897023005391720247 5442551593644635656 5006050627427778610 13065751494080544838 16258753129298623464 10119749786783566131 2429679121260418104 15825572643970789078 11403887608672340263 2674330762274869703 15895331619888460845 3524023022029451703 14958220928128538240 13153677542841566642 15637138288091904942 9162326080624708376 16501693770935162612 8360523169100594900 15124935955390040724 15612136530595979918 5387583348289685688 1468880808869092405 5823505988401309044 818959612527966267 13710140930885030697 14564572007746967001 12192898246195872480 7588436730289228606 14710095435680888037 15634736586927191852 12017869709332148010 2721472657296941972 9442450303569890258 11274235642797737632 11653761596127871834 15976212104525798351 2934818965672711729 871747087785728729 18073382299544215062 10285125008521554228 11826283383175295549 7378664054477593040 16468708213943851626 4220003439269470897 17977440439435706173 10651595889435281034 11352086127867993677 3695660181686546911 7082435883453453770 17109434671939436764 17334880474347312888 17165292012994369612 17488727522429707851 8723946351452182091 16868915012282248334 15365436480966182269 6014407103211103277 10133194283154883601 3291776537311864838 157006572442440984 5185384141476378961 8461242922230462948 8296977728824639345 7119512714355381322 17989373734427618377 13554459053234924319 1594243711615647437 5164474757373127716 16766470472194387947 17545633134138368911 1024731729592234828 18369679371667981705 6642412006752238494 8358728762813701622 14615468034937975596 798355649120066022 6821578552902208938 14578902078107824241 3854295409829664841 4048767687581784296 17778179577694517433 12571293898799783469 10850409174546116053 7378816549512010281 1036292632720903222 4277938154187385837 1479410164134514873 13507839942374676384 12008002415046067136 9851151886947070493 13859845378466818268 6967623152875425365 11148708691405820465 2804140060065036149 5937805722696978234 3788196054566674009 12805199718308248994 14626943216848176635 14773521929926052793 7838147952860850573 5055358110695165414 5386272270497048523 2181339973144903395 11530871370166162727 15385036658165672712 10162009537789770673 5821923236774890698 16029478493532095147 11031975761990566276 9325243978944460932 8086926191498362908 3963606588351803770 17376856887344062105 8854070530699081433 2705245173928241837 4026111158338387229 13026276709128675765 6379047692725074316 8110151847976643914 5958727574694719631 4017423308161378953 13336783301013170659 7345897067150046416 12661938425895771586 7910195949538180669 13249247737680863941 12030734052890701021 18443323066061302688 16170725978991373623 4514544721711018805 5072527822006535191] 7130954387874351850 6781932227698873623 1 [17735181515184057148 8376143050477581590 13970141264473760763 3090146032329905311 8888756345674670457 7258900832080800804 16011798334580652169 3829597816251882719 4637381900088705240 4871914514523559352 7291105850939116518 9501405831279508263 8702215063977562213 6015804389864577793 7528873468273029268 10348031727712609391 3731610707829547207 17533421863780541651 14499805003297173147 16703521241366147053 12602318099865662777 17348592114235001526 10105316481914894442 13764085769331121853 10690680330614454941 3854869732559663291 7178276574617748064 18303663264321477300 15711047703728714444 2275726349270725939 13172014414012191543 16490617201805381918 16133663544302658377 2843596471822400729 6973915531431741715 1342027602877051740 93320055071159843 7920095401917353602 14881586991802096792 10590478667716611132 12791765325813502168 17194738058268198272 2943459158354740858 8892425244745331195 10226898876815347527 12835950263251713892 14260829011269298234 15923607588640473025 920283377642800287 11164307384044674413 10857686970697893931 14989494703906169041 17607829962488102945 1873634278773288679 259756893655488051 2571820143933580266 443132673643334182 5066689487795927559 7995834854159377368 2805259042822155667 2790235799206467513 4956909446581645693 8774565132353729188 14355166894026855390 5218585068221211172 15775998676146929843 693865393838594525 5902493338490211753 9030293863146508684 10844972933273121817 8365216749812905892 14466751311530210917 6740809114679800451 11420272753041037299 8359338375630637085 11645565454810304193 15022472316296008381 5484060117426945596 3266016115764007926 15819022897034261435 13219924347028085856 7272177897701189380 11955478023071459194 666644129146027522 7083352701980237678 3470201195438249646 16300909963637002008 81254198068173251 9045105314200995716 15762287022320695341 16421043446735583997 6995987716468318723 16462694759187436620 5285688132845488208 14052554080498012394 16885784915925259332 9146157203042521068 16203955377558000371 4406896168719316597 5987016752749573131 9842993322957837958 7069531820233032762 3172720544085205438 13557802431198351713 10321379327749635356 2129712812875824281 10961798365845332581 6867123967177809056 7147251571897124080 13116435807467593530 1793570777487027107 15726933911509250388 2892478217792808762 11741349035243049698 16663779358482117686 175748498354058438 7232634646177908830 12983754107273050719 6178024140703929005 9166429089850271582 13062446369448668648 5139816678915625092 6572257705514190250 8351045570196586566 7142805375265130009 3207090681698613411 14530237923874255727 16328017518163650801 123021934440483418 6248444155748678958 561918186339136558 4900440736817086927 15082275079816282231 13080051316010977930 9010490060674459189 16502592368493141913 14499638424541720397 14910318983135004518 18244193190154580421 4205028772861037477 9023735179767024358 8340295298535445819 1822708028885812226 8432453219516863603 4508331856826379266 14362683053910581124 14489337771939221601 16525654263670880876 13896969700790104114 1939016698822082830 935206283174076500 12687204463426783237 15607488310513638268 14903624283742109467 12658767560325770901 8630768495380669689 5972993821596482959 10089886367625635167 5541501710735695709 2681257336286061135 8508236575453955948 7973135948143725097 9389900474723963993 2451659002353999881 2305816829826609681 8231741942694299282 16704025560927070278 3056346929744143983 13631252446257859347 17968531734199538031 12499379264130220866 1020824990573843725 5125768587777606254 9505118096923319498 17218458401457594713 1896496438429462540 14330638798692244565 3344245038191817406 2134413000162671188 13777391114860887842 14569701884500820549 3729811074217224665 16141106420748115510 5137984178775125217 945142853721198413 649835481155861668 4208916345368369747 12018454430547452 13027555302614879977 11360161635475406984 569606485897468087 18047089624853729202 17456363813816611781 3225749603298401079 1916748144245515559 4253805955452872145 4651222945594737077 14365349531472993523 11469023301952439970 11229503117145506069 10239239462745576710 7832284387013729445 6100932644797724242 18427850759554212 11665322838195598394 5148553484994521307 10840167390140196589 8526840339293963740 18273927811810115543 9450060921196890327 13917071972099001504 3066363006660553225 11653559560517400050 11614775899404539258 17828898524828863537 13507126671081311577 14914550348893235381 3950115880334710113 17420379308607826703 7937492156480551778 3931962165729220638 1577645343500269278 6449042082232909030 11564861556934661806 15346745145276760058 3568886154573580794 9795335162907011023 13274630007446017775 4676294184378154378 7895818774522208620 13162924794907243096 2824574088734024556 16637221276127415632 4261777213956879021 14704868370755138588 16063969239360453421 15861675059136528668 5926864327028744477 10027105136232922974 10272943555681588892 678749506271766962 7154532117411161821 4855235341742849126 16876191802929271348 12377043641284755270 7910351118498255438 8542885916920646394 11744997490876513639 876064920600972713 15870620366504326769 13833866887421572166 12846293944278844805 1061465965875557546 12532721553413984954 2539450389145115840 9732530948189650869]}]

--- PASS: TestISAACMarshalUnmarshal (0.01s)
ok      isaac64 	0.04s
=== RUN   TestXorshift64StarSeeding
--- PASS: TestXorshift64StarSeeding (0.00s)
=== RUN   TestXorshift64StarRand
--- PASS: TestXorshift64StarRand (0.00s)
=== RUN   TestXorshift64StarUint64
--- PASS: TestXorshift64StarUint64 (0.00s)
=== RUN   TestXorshift64StarMarshalUnmarshal
Original State: [28650bfbd9799105]

Marshalled State: [786f72736869667436342a3a28650bfbd9799105] -- <nil>

State before unmarshall: [10185d3c6c6135e4]

State after unmarshall: [28650bfbd9799105]

--- PASS: TestXorshift64StarMarshalUnmarshal (0.00s)
ok      xorshift64star 	0.02s
=== RUN   TestXorshift64StarSeeding
--- PASS: TestXorshift64StarSeeding (0.00s)
=== RUN   TestXorshiftr128PlusRand
--- PASS: TestXorshiftr128PlusRand (0.00s)
=== RUN   TestXorshiftr128PlusUint64
--- PASS: TestXorshiftr128PlusUint64 (0.00s)
=== RUN   TestXorshiftr128PlusMarshalUnmarshal
Original State: [[8ecab2aa8d125110 c290e8a71b439535]]

Marshalled State: [786f727368696674723132382b3a8ecab2aa8d125110c290e8a71b439535] -- <nil>

State before unmarshall: [[a3cd79788ae4dd27 8000ee625ada2d8d]]

State after unmarshall: [[8ecab2aa8d125110 c290e8a71b439535]]

--- PASS: TestXorshiftr128PlusMarshalUnmarshal (0.00s)
ok      xorshiftr128plus 	0.01s

@wyhaines
Copy link
Contributor Author

wyhaines commented Dec 4, 2024

Very cool work.

It would be valuable to decouple your uint64 and float64 work from the math/random work. The changes you introduce there are generally useful and it would give a cleaner path for merging a PR.

#3263 has been created. Without that PR, this one will need to retain it's changes to ufmt.Sprintf(). With #3263 merged, however, I can remove those changes from here.

@n2p5 n2p5 self-requested a review December 4, 2024 15:37
wyhaines added a commit that referenced this pull request Dec 4, 2024
This PR includes the changes to `ufmt.Sprintf()` from #2868 as well as
another branch where I had added support for `%v`.

These changes add support for a variety of float formatting options to
Sprintf, as well as support for the %v flag to automatically chose a
default representation for a given type.

Tests were added for these additions. This PR is needed for the PRNG PR
(#2868) to be fully functional, as the generators include some built in
statistical examples/tests which will not function without
`ufmt.Sprintf()` support for floats.

<details><summary>Contributors' checklist...</summary>

- [x] Added new tests, or not needed, or not feasible
- [x] Provided an example (e.g. screenshot) to aid review or the PR is
self-explanatory
- [x] Updated the official documentation or not needed
- [x] No breaking changes were made, or a `BREAKING CHANGE: xxx` message
was included in the description
- [x] Added references to related issues and PRs
</details>

---------

Co-authored-by: Nathan Toups <[email protected]>
@wyhaines wyhaines merged commit b631207 into gnolang:master Dec 5, 2024
104 checks passed
omarsy pushed a commit to TERITORI/gno that referenced this pull request Dec 7, 2024
This PR includes the changes to `ufmt.Sprintf()` from gnolang#2868 as well as
another branch where I had added support for `%v`.

These changes add support for a variety of float formatting options to
Sprintf, as well as support for the %v flag to automatically chose a
default representation for a given type.

Tests were added for these additions. This PR is needed for the PRNG PR
(gnolang#2868) to be fully functional, as the generators include some built in
statistical examples/tests which will not function without
`ufmt.Sprintf()` support for floats.

<details><summary>Contributors' checklist...</summary>

- [x] Added new tests, or not needed, or not feasible
- [x] Provided an example (e.g. screenshot) to aid review or the PR is
self-explanatory
- [x] Updated the official documentation or not needed
- [x] No breaking changes were made, or a `BREAKING CHANGE: xxx` message
was included in the description
- [x] Added references to related issues and PRs
</details>

---------

Co-authored-by: Nathan Toups <[email protected]>
omarsy pushed a commit to TERITORI/gno that referenced this pull request Dec 7, 2024
… generators (gnolang#2868)

I ported a number of my pseudo-random number generator implementations
from Ruby to gno while traveling to the retreat last weekend as an
exercise in expanding my comfort level with gno code, and expanding my
understanding of some of the code internals, while contributing code
that others may find interesting or useful.

I added two xorshift generators, xorshift64* and xorshiftr128+. These
are both many times faster than the PCG generator that is the gno
default, and produce high quality randomness with great statistical
qualities. In addition to these, I added both the 32-bit ISAAC
implementation (with an added function to return 64 bit values), and the
64-bit ISAAC implementation. ISAAC is a stellar pseudo-random number
generator. Both implementations are significantly faster than PCG
(though not near so fast as the xorshift algorithms), while producing
extremely high quality, cryptographically secure randomness that can not
be differentiated from real randomness.

All of these were built to be compatible with the standard Rand()
implementation. This means that any of these can be used as a drop-in
replacement for the default PCG algorithm:

```
source = isaac.New()
prng := rand.New(source)
```

All of these leverage the `gno.land/p/demo/entropy` package to assist
with seeding if no seed is provided. In the case of the ISAAC
algorithms, they require 256 uint values for their seed, so they
leverage a combination of `entropy` and `xorshiftr128+` to generate any
missing numbers in the provided seed.

I also added a function to entropy to return uint64, to facilitate using
it for seeding.

I added tests to entropy, and wrote tests for the other generators, as
well.

There are a few other things that ended up in this PR. In order to make
some fact based assertions about the performance of these generators, I
included some code that can be ran via `gno run -expr`. i.e. `gno run
-expr 'averageISAAC()' isaac.gno` that can be used to get some
benchmarks and some very simple self-statistical-analysis on the
results, and when I did so, I discovered that the current `ufmt.Sprintf`
implementation didn't support any of the float output flags.

I added float support to it's capabilities, which, in turn, required
adding `FormatFloat` to the `strconv.gno/strconv.go` implementation in
the standard library. I added a test to cover this.

I also noticed that there is a test in `tm2/pkg/p2p` that is failing on
both master and my branch. Specifically, there is a call to
`sw.Logger.Error()` that passes a message and an error, but not `"err"`
before the error. Adding that seemed to clear up the build failure.
This, specifically, is line 222 of `switch.go`.

Currently there is one failing test, which is the code coverage check on
tm2, because it is non-obvious to me how to setup a test to properly
exercise that one changed line.

<details><summary>Contributors' checklist...</summary>

- [X] Added new tests, or not needed, or not feasible
- [X] Provided an example (e.g. screenshot) to aid review or the PR is
self-explanatory
- [X] Updated the official documentation or not needed
- [X] No breaking changes were made, or a `BREAKING CHANGE: xxx` message
was included in the description
- [X] Added references to related issues and PRs
</details>

---------

Co-authored-by: Morgan <[email protected]>
Co-authored-by: Nathan Toups <[email protected]>
Co-authored-by: Morgan <[email protected]>
r3v4s pushed a commit to gnoswap-labs/gno that referenced this pull request Dec 10, 2024
This PR includes the changes to `ufmt.Sprintf()` from gnolang#2868 as well as
another branch where I had added support for `%v`.

These changes add support for a variety of float formatting options to
Sprintf, as well as support for the %v flag to automatically chose a
default representation for a given type.

Tests were added for these additions. This PR is needed for the PRNG PR
(gnolang#2868) to be fully functional, as the generators include some built in
statistical examples/tests which will not function without
`ufmt.Sprintf()` support for floats.

<details><summary>Contributors' checklist...</summary>

- [x] Added new tests, or not needed, or not feasible
- [x] Provided an example (e.g. screenshot) to aid review or the PR is
self-explanatory
- [x] Updated the official documentation or not needed
- [x] No breaking changes were made, or a `BREAKING CHANGE: xxx` message
was included in the description
- [x] Added references to related issues and PRs
</details>

---------

Co-authored-by: Nathan Toups <[email protected]>
r3v4s pushed a commit to gnoswap-labs/gno that referenced this pull request Dec 10, 2024
… generators (gnolang#2868)

I ported a number of my pseudo-random number generator implementations
from Ruby to gno while traveling to the retreat last weekend as an
exercise in expanding my comfort level with gno code, and expanding my
understanding of some of the code internals, while contributing code
that others may find interesting or useful.

I added two xorshift generators, xorshift64* and xorshiftr128+. These
are both many times faster than the PCG generator that is the gno
default, and produce high quality randomness with great statistical
qualities. In addition to these, I added both the 32-bit ISAAC
implementation (with an added function to return 64 bit values), and the
64-bit ISAAC implementation. ISAAC is a stellar pseudo-random number
generator. Both implementations are significantly faster than PCG
(though not near so fast as the xorshift algorithms), while producing
extremely high quality, cryptographically secure randomness that can not
be differentiated from real randomness.

All of these were built to be compatible with the standard Rand()
implementation. This means that any of these can be used as a drop-in
replacement for the default PCG algorithm:

```
source = isaac.New()
prng := rand.New(source)
```

All of these leverage the `gno.land/p/demo/entropy` package to assist
with seeding if no seed is provided. In the case of the ISAAC
algorithms, they require 256 uint values for their seed, so they
leverage a combination of `entropy` and `xorshiftr128+` to generate any
missing numbers in the provided seed.

I also added a function to entropy to return uint64, to facilitate using
it for seeding.

I added tests to entropy, and wrote tests for the other generators, as
well.

There are a few other things that ended up in this PR. In order to make
some fact based assertions about the performance of these generators, I
included some code that can be ran via `gno run -expr`. i.e. `gno run
-expr 'averageISAAC()' isaac.gno` that can be used to get some
benchmarks and some very simple self-statistical-analysis on the
results, and when I did so, I discovered that the current `ufmt.Sprintf`
implementation didn't support any of the float output flags.

I added float support to it's capabilities, which, in turn, required
adding `FormatFloat` to the `strconv.gno/strconv.go` implementation in
the standard library. I added a test to cover this.

I also noticed that there is a test in `tm2/pkg/p2p` that is failing on
both master and my branch. Specifically, there is a call to
`sw.Logger.Error()` that passes a message and an error, but not `"err"`
before the error. Adding that seemed to clear up the build failure.
This, specifically, is line 222 of `switch.go`.

Currently there is one failing test, which is the code coverage check on
tm2, because it is non-obvious to me how to setup a test to properly
exercise that one changed line.

<details><summary>Contributors' checklist...</summary>

- [X] Added new tests, or not needed, or not feasible
- [X] Provided an example (e.g. screenshot) to aid review or the PR is
self-explanatory
- [X] Updated the official documentation or not needed
- [X] No breaking changes were made, or a `BREAKING CHANGE: xxx` message
was included in the description
- [X] Added references to related issues and PRs
</details>

---------

Co-authored-by: Morgan <[email protected]>
Co-authored-by: Nathan Toups <[email protected]>
Co-authored-by: Morgan <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
📦 🌐 tendermint v2 Issues or PRs tm2 related 📦 🤖 gnovm Issues or PRs gnovm related 🧾 package/realm Tag used for new Realms or Packages.
Projects
Status: Done
Development

Successfully merging this pull request may close these issues.

5 participants