Kumite (ko͞omiˌtā) is the practice of taking techniques learned from Kata and applying them through the act of freestyle sparring.
You can create a new kumite by providing some initial code and optionally some test cases. From there other warriors can spar with you, by enhancing, refactoring and translating your code. There is no limit to how many warriors you can spar with.
A great use for kumite is to begin an idea for a kata as one. You can collaborate with other code warriors until you have it right, then you can convert it to a kata.
Nice ad.
: getBonusDamage ( health -- bonus ) 250 / dup * ;
1 − function getBonusDamage(currentHP) {
2 − return Math.trunc(currentHP / 250) ** 2
3 − }
1 + : getBonusDamage ( health -- bonus ) 250 / dup * ;
\ ttester.fs with extension for Codewars \ See https://github.com/codewars/ttester-codewars s" getBonusDamage" describe#{ s" Hidden Test Cases" it#{ <{ 35750 getBonusDamage -> 20449 }> <{ 67783 getBonusDamage -> 73441 }> <{ 122488 getBonusDamage -> 239121 }> <{ 125438 getBonusDamage -> 251001 }> <{ 125249 getBonusDamage -> 250000 }> <{ 232001 getBonusDamage -> 861184 }> <{ 231998 getBonusDamage -> 859329 }> <{ 3586126 getBonusDamage -> 205750336 }> <{ 3585990 getBonusDamage -> 205721649 }> <{ 3 getBonusDamage -> 0 }> }# }#
1 − // Since Node 10, we're using Mocha.
2 − // You can use `chai` for assertions.
3 − const chai = require("chai");
4 − const assert = chai.assert;
5 − // Uncomment the following line to disable truncating failure messages for deep equals, do:
6 − // chai.config.truncateThreshold = 0;
7 − // Since Node 12, we no longer include assertions from our deprecated custom test framework by default.
8 − // Uncomment the following to use the old assertions:
9 − // const Test = require("@codewars/test-compat");
1 + \ ttester.fs with extension for Codewars
2 + \ See https://github.com/codewars/ttester-codewars
10 10 11 − 12 − describe('getBonusDamage', () => {
13 − describe('Hidden Test Cases', () => {
14 − it('___SE___works_for_HP_that_evenly_divides_250', () => {
15 − assert.strictEqual(getBonusDamage(35750), 20449)
… Expand 16 − })
17 − it('___SE___works_for_HP_that_does_not_evenly_divide_250_-_I', () => {
18 − assert.strictEqual(getBonusDamage(67783), 73441)
19 − })
20 − it('___SE___works_for_HP_that_almost_creates_another_250_HP_chunk_-_I', () => {
21 − assert.strictEqual(getBonusDamage(122488), 239121)
22 − })
23 − it('___SE___works_for_HP_that_does_not_evenly_divide_250_-_II', () => {
24 − assert.strictEqual(getBonusDamage(125438), 251001)
25 − })
26 − it('___SE___works_for_HP_that_almost_creates_another_250_HP_chunk_-_II', () => {
27 − assert.strictEqual(getBonusDamage(125249), 250000)
28 − })
29 − it('___SE___works_for_HP_that_does_not_evenly_divide_250_-_III', () => {
30 − assert.strictEqual(getBonusDamage(232001), 861184)
31 − })
32 − it('___SE___works_for_HP_that_almost_creates_another_250_HP_chunk_-_III', () => {
33 − assert.strictEqual(getBonusDamage(231998), 859329)
34 − })
35 − it('___SE___works_for_HP_that_does_not_evenly_divide_250_-_IV', () => {
36 − assert.strictEqual(getBonusDamage(3586126), 205750336)
37 − })
38 − it('___SE___works_for_HP_That_almost_creates_another_250_HP_chunk_-_IV', () => {
39 − assert.strictEqual(getBonusDamage(3585990), 205721649)
40 − })
41 − it('___SE___works_when_Nigelius_is_not_fine', () => {
42 − assert.strictEqual(getBonusDamage(3), 0)
43 − })
44 − })
45 − })
4 + s" getBonusDamage" describe#{
5 + s" Hidden Test Cases" it#{
6 + <{ 35750 getBonusDamage -> 20449 }>
7 + <{ 67783 getBonusDamage -> 73441 }>
8 + <{ 122488 getBonusDamage -> 239121 }>
9 + <{ 125438 getBonusDamage -> 251001 }>
10 + <{ 125249 getBonusDamage -> 250000 }>
11 + <{ 232001 getBonusDamage -> 861184 }>
12 + <{ 231998 getBonusDamage -> 859329 }>
13 + <{ 3586126 getBonusDamage -> 205750336 }>
14 + <{ 3585990 getBonusDamage -> 205721649 }>
15 + <{ 3 getBonusDamage -> 0 }>
16 + }#
17 + }#
Recent Moves:
Nigelius is a new Hero in Mobile Legends, and you are invited for an interview by Shanghai Moonton
Technology for a game developer position. Nigelius the Bloodborn has a passive skill that increases
his damage for every 250 HP he has, and your task is to code this skill. The increase goes as
follows:
at 250 HP +1 damage
at 500 HP +4 damage
at 750 HP +9 damage
at 1000 HP +16 damage
at 1250 HP +25 damage
.
.
.
at 2000 HP +64 damage
at 2250 HP +81 damage
...etc
That is, we determine how many chunks of 250 HP Nigelius has, and then we square it to get the bonus
damage. Write a function getBonusDamage
given the current health of Nigelius.
Nigelius does not get fractional damage bonuses, in other words, 500 and 600 HP will give him +4
bonus damage. 749 HP will also give him +4 bonus damage.
function getBonusDamage(currentHP) {
return Math.trunc(currentHP / 250) ** 2
}
// Since Node 10, we're using Mocha.
// You can use `chai` for assertions.
const chai = require("chai");
const assert = chai.assert;
// Uncomment the following line to disable truncating failure messages for deep equals, do:
// chai.config.truncateThreshold = 0;
// Since Node 12, we no longer include assertions from our deprecated custom test framework by default.
// Uncomment the following to use the old assertions:
// const Test = require("@codewars/test-compat");
describe('getBonusDamage', () => {
describe('Hidden Test Cases', () => {
it('___SE___works_for_HP_that_evenly_divides_250', () => {
assert.strictEqual(getBonusDamage(35750), 20449)
})
it('___SE___works_for_HP_that_does_not_evenly_divide_250_-_I', () => {
assert.strictEqual(getBonusDamage(67783), 73441)
})
it('___SE___works_for_HP_that_almost_creates_another_250_HP_chunk_-_I', () => {
assert.strictEqual(getBonusDamage(122488), 239121)
})
it('___SE___works_for_HP_that_does_not_evenly_divide_250_-_II', () => {
assert.strictEqual(getBonusDamage(125438), 251001)
})
it('___SE___works_for_HP_that_almost_creates_another_250_HP_chunk_-_II', () => {
assert.strictEqual(getBonusDamage(125249), 250000)
})
it('___SE___works_for_HP_that_does_not_evenly_divide_250_-_III', () => {
assert.strictEqual(getBonusDamage(232001), 861184)
})
it('___SE___works_for_HP_that_almost_creates_another_250_HP_chunk_-_III', () => {
assert.strictEqual(getBonusDamage(231998), 859329)
})
it('___SE___works_for_HP_that_does_not_evenly_divide_250_-_IV', () => {
assert.strictEqual(getBonusDamage(3586126), 205750336)
})
it('___SE___works_for_HP_That_almost_creates_another_250_HP_chunk_-_IV', () => {
assert.strictEqual(getBonusDamage(3585990), 205721649)
})
it('___SE___works_when_Nigelius_is_not_fine', () => {
assert.strictEqual(getBonusDamage(3), 0)
})
})
})
from math import gcd def greatest_common_divisor(*args): # iterates through entirety of args every time return __import__("functools").reduce(gcd, args) def greatest_common_divisor(*args): acc = args[0] for i in range(1, len(args)): if acc == 1: return 1 acc = gcd(acc, args[i]) return acc
1 − def greatest_common_divisor(*args):
1 + from math import gcd
2 2 3 − def gcd(a, b):
4 − if a == b: return a
5 − elif a > b:
6 − return (gcd(b, a % b) if a % b != 0 else b)
7 − else:
8 − return gcd(b, a)
3 + def greatest_common_divisor(*args):
4 + # iterates through entirety of args every time
5 + return __import__("functools").reduce(gcd, args)
9 9 10 − res = gcd(args[0], args[1])
11 − if len(args) > 2:
12 − for i in range(2, len(args)):
13 − res = gcd(res, args[i])
14 − return res
7 + def greatest_common_divisor(*args):
8 + acc = args[0]
9 + for i in range(1, len(args)):
10 + if acc == 1:
11 + return 1
12 + acc = gcd(acc, args[i])
13 + return acc
test.assert_equals(kata("arbeit"), True) test.assert_equals(kata("text"), False) test.assert_equals(kata(""), False)
1 1 test.assert_equals(kata("arbeit"), True)
2 2 test.assert_equals(kata("text"), False)
3 + test.assert_equals(kata(""), False)
#include <vector> #include <iostream> template <class T, class U> void iterateTwoVectors(std::vector<T> A, std::vector<U> B) { for (struct {typename std::vector<T>::const_iterator a; typename std::vector<U>::const_iterator b;} s = {A.begin(), B.begin()}; s.a < A.end() && s.b < B.end(); ++s.a, ++s.b) std::cout << *s.a << ":" << *s.b << "\n"; }
1 1 #include <vector>
2 − #include <tuple>
3 3 #include <iostream>
3 + 4 4 template <class T, class U>
5 5 void iterateTwoVectors(std::vector<T> A, std::vector<U> B)
6 6 {
7 − 8 − for (auto [a,b] = std::tuple{A.begin(), B.begin()}; a != A.end() && b != B.end(); a++, b++)
9 − {
10 − std::cout << *a << ":" << *b << "\n";
11 − }
7 + for (struct {typename std::vector<T>::const_iterator a; typename std::vector<U>::const_iterator b;} s = {A.begin(), B.begin()}; s.a < A.end() && s.b < B.end(); ++s.a, ++s.b)
8 + std::cout << *s.a << ":" << *s.b << "\n";
12 12 }
fib
is O(n²)
in practice, probably because of BigInt arithmetic.
There is also an optimisation calculating fib(n)
in terms of fib(approx half n)
, which is actually logarithmic before BigInt arithmetic. That's even faster, in this case.
function fib(n) { for ( let [a,b]=[0n,1n], i=0;; i++ ) if ( i<n ) [a,b] = [b,a+b]; else return a; }
1 − module Example where
2 − 3 − import Data.Semigroup (Endo(..),stimes)
4 − 5 − fib :: Integer -> Integer
6 − fib = fst . (`appEndo` (0,1)) . (`stimes` Endo ( \ (a,b) -> (b,a+b) ))
1 + function fib(n) {
2 + for ( let [a,b]=[0n,1n], i=0;; i++ )
3 + if ( i<n )
4 + [a,b] = [b,a+b];
5 + else
6 + return a;
7 + }
describe("tests",()=>{ it("fib 0 -> 0",()=>{ assert.strictEqual( fib(0), 0n ); }); it("fib 1 -> 1",()=>{ assert.strictEqual( fib(1), 1n ); }); it("fib 2 -> 1",()=>{ assert.strictEqual( fib(2), 1n ); }); it("fib 3 -> 2",()=>{ assert.strictEqual( fib(3), 2n ); }); it("fib 4 -> 3",()=>{ assert.strictEqual( fib(4), 3n ); }); it("ib 5 -> 5",()=>{ assert.strictEqual( fib(5), 5n ); }); it("fib 6 -> 8",()=>{ assert.strictEqual( fib(6), 8n ); }); it("fib 7 -> 3",()=>{ assert.strictEqual( fib(7), 13n ); }); it("fib 8 -> 21",()=>{ assert.strictEqual( fib(8), 21n ); }); it("fib 9 -> 34",()=>{ assert.strictEqual( fib(9), 34n ); }); it("fib 1 000 -> bignum",()=>{ assert.strictEqual( fib(1_000), 43466557686937456435688527675040625802564660517371780402481729089536555417949051890403879840079255169295922593080322634775209689623239873322471161642996440906533187938298969649928516003704476137795166849228875n ); }); it("fib 100 000 -> hugenum",()=>{ assert.strictEqual( fib(100_000), 2597406934722172416615503402127591541488048538651769658472477070395253454351127368626555677283671674475463758722307443211163839947387509103096569738218830449305228763853133492135302679278956701051276578271635608073050532200243233114383986516137827238124777453778337299916214634050054669860390862750996639366409211890125271960172105060300350586894028558103675117658251368377438684936413457338834365158775425371912410500332195991330062204363035213756525421823998690848556374080179251761629391754963458558616300762819916081109836526352995440694284206571046044903805647136346033000520852277707554446794723709030979019014860432846819857961015951001850608264919234587313399150133919932363102301864172536477136266475080133982431231703431452964181790051187957316766834979901682011849907756686456845066287392485603914047605199550066288826345877189410680370091879365001733011710028310473947456256091444932821374855573864080579813028266640270354294412104919995803131876805899186513425175959911520563155337703996941035518275274919959802257507902037798103089922984996304496255814045517000250299764322193462165366210841876745428298261398234478366581588040819003307382939500082132009374715485131027220817305432264866949630987914714362925554252624043999615326979876807510646819068792118299167964409178271868561702918102212679267401362650499784968843680975254700131004574186406448299485872551744746695651879126916993244564817673322257149314967763345846623830333820239702436859478287641875788572910710133700300094229333597292779191409212804901545976262791057055248158884051779418192905216769576608748815567860128818354354292307397810154785701328438612728620176653953444993001980062953893698550072328665131718113588661353747268458543254898113717660519461693791688442534259478126310388952047956594380715301911253964847112638900713362856910155145342332944128435722099628674611942095166100230974070996553190050815866991144544264788287264284501725332048648319457892039984893823636745618220375097348566847433887249049337031633826571760729778891798913667325190623247118037280173921572390822769228077292456662750538337500692607721059361942126892030256744356537800831830637593334502350256972906515285327194367756015666039916404882563967693079290502951488693413799125174856667074717514938979038653338139534684837808612673755438382110844897653836848318258836339917310455850905663846202501463131183108742907729262215943020429159474030610183981685506695026197376150857176119947587572212987205312060791864980361596092339594104118635168854883911918517906151156275293615849000872150192226511785315089251027528045151238603792184692121533829287136924321527332714157478829590260157195485316444794546750285840236000238344790520345108033282013803880708980734832620122795263360677366987578332625485944906021917368867786241120562109836985019729017715780112040458649153935115783499546100636635745448508241888279067531359950519206222976015376529797308588164873117308237059828489404487403932053592935976454165560795472477862029969232956138971989467942218727360512336559521133108778758228879597580320459608479024506385194174312616377510459921102486879496341706862092908893068525234805692599833377510390101316617812305114571932706629167125446512151746802548190358351688971707570677865618800822034683632101813026232996027599403579997774046244952114531588370357904483293150007246173417355805567832153454341170020258560809166294198637401514569572272836921963229511187762530753402594781448204657460288485500062806934811398276016855584079542162057543557291510641537592939022884356120792643705560062367986544382464373946972471945996555795505838034825597839682776084731530251788951718630722761103630509360074262261717363058613291544024695432904616258691774630578507674937487992329181750163484068813465534370997589353607405172909412697657593295156818624747127636468836551757018353417274662607306510451195762866349922848678780591085118985653555434958761664016447588028633629704046289097067736256584300235314749461233912068632146637087844699210427541569410912246568571204717241133378489816764096924981633421176857150311671040068175303192115415611958042570658693127276213710697472226029655524611053715554532499750843275200199214301910505362996007042963297805103066650638786268157658772683745128976850796366371059380911225428835839194121154773759981301921650952140133306070987313732926518169226845063443954056729812031546392324981793780469103793422169495229100793029949237507299325063050942813902793084134473061411643355614764093104425918481363930542369378976520526456347648318272633371512112030629233889286487949209737847861884868260804647319539200840398308008803869049557419756219293922110825766397681361044490024720948340326796768837621396744075713887292863079821849314343879778088737958896840946143415927131757836511457828935581859902923534388888846587452130838137779443636119762839036894595760120316502279857901545344747352706972851454599861422902737291131463782045516225447535356773622793648545035710208644541208984235038908770223039849380214734809687433336225449150117411751570704561050895274000206380497967960402617818664481248547269630823473377245543390519841308769781276565916764229022948181763075710255793365008152286383634493138089971785087070863632205869018938377766063006066757732427272929247421295265000706646722730009956124191409138984675224955790729398495608750456694217771551107346630456603944136235888443676215273928597072287937355966723924613827468703217858459948257514745406436460997059316120596841560473234396652457231650317792833860590388360417691428732735703986803342604670071717363573091122981306903286137122597937096605775172964528263757434075792282180744352908669606854021718597891166333863858589736209114248432178645039479195424208191626088571069110433994801473013100869848866430721216762473119618190737820766582968280796079482259549036328266578006994856825300536436674822534603705134503603152154296943991866236857638062351209884448741138600171173647632126029961408561925599707566827866778732377419444462275399909291044697716476151118672327238679208133367306181944849396607123345271856520253643621964198782752978813060080313141817069314468221189275784978281094367751540710106350553798003842219045508482239386993296926659221112742698133062300073465628498093636693049446801628553712633412620378491919498600097200836727876650786886306933418995225768314390832484886340318940194161036979843833346608676709431643653538430912157815543512852077720858098902099586449602479491970687230765687109234380719509824814473157813780080639358418756655098501321882852840184981407690738507369535377711880388528935347600930338598691608289335421147722936561907276264603726027239320991187820407067412272258120766729040071924237930330972132364184093956102995971291799828290009539147382437802779051112030954582532888721146170133440385939654047806199333224547317803407340902512130217279595753863158148810392952475410943880555098382627633127606718126171022011356181800775400227516734144169216424973175621363128588281978005788832454534581522434937268133433997710512532081478345067139835038332901313945986481820272322043341930929011907832896569222878337497354301561722829115627329468814853281922100752373626827643152685735493223028018101449649009015529248638338885664893002250974343601200814365153625369199446709711126951966725780061891215440222487564601554632812091945824653557432047644212650790655208208337976071465127508320487165271577472325887275761128357592132553934446289433258105028633583669291828566894736223508250294964065798630809614341696830467595174355313224362664207197608459024263017473392225291248366316428006552870975051997504913009859468071013602336440164400179188610853230764991714372054467823597211760465153200163085336319351589645890681722372812310320271897917951272799656053694032111242846590994556380215461316106267521633805664394318881268199494005537068697621855231858921100963441012933535733918459668197539834284696822889460076352031688922002021931318369757556962061115774305826305535862015637891246031220672933992617378379625150999935403648731423208873977968908908369996292995391977217796533421249291978383751460062054967341662833487341011097770535898066498136011395571584328308713940582535274056081011503907941688079197212933148303072638678631411038443128215994936824342998188719768637604496342597524256886188688978980888315865076262604856465004322896856149255063968811404400429503894245872382233543101078691517328333604779262727765686076177705616874050257743749983775830143856135427273838589774133526949165483929721519554793578923866762502745370104660909382449626626935321303744538892479216161188889702077910448563199514826630802879549546453583866307344423753319712279158861707289652090149848305435983200771326653407290662016775706409690183771201306823245333477966660525325490873601961480378241566071271650383582257289215708209369510995890132859490724306183325755201208090007175022022949742801823445413711916298449914722254196594682221468260644961839254249670903104007581488857971672246322887016438403908463856731164308169537326790303114583680575021119639905615169154708510459700542098571797318015564741406172334145847111268547929892443001391468289103679179216978616582489007322033591376706527676521307143985302760988478056216994659655461379174985659739227379416726495377801992098355427866179123126699374730777730569324430166839333011554515542656864937492128687049121754245967831132969248492466744261999033972825674873460201150442228780466124320183016108232183908654771042398228531316559685688005226571474428823317539456543881928624432662503345388199590085105211383124491861802624432195540433985722841341254409411771722156867086291742124053110620522842986199273629406208834754853645128123279609097213953775360023076765694208219943034648783348544492713539450224591334374664937701655605763384697062918725745426505879414630176639760457474311081556747091652708748125267159913793240527304613693961169892589808311906322510777928562071999459487700611801002296132304588294558440952496611158342804908643860880796440557763691857743754025896855927252514563404385217825890599553954627451385454452916761042969267970893580056234501918571489030418495767400819359973218711957496357095967825171096264752068890806407651445893132870767454169607107931692704285168093413311046353506242209810363216771910420786162184213763938194625697286781413636389620123976910465418956806197323148414224550071617215851321302030684176087215892702098879108938081045903397276547326416916845445627600759561367103584575649094430692452532085003091068783157561519847567569191284784654692558665111557913461272425336083635131342183905177154511228464455136016013513228948543271504760839307556100908786096663870612278690274831819331606701484957163004705262228238406266818448788374548131994380387613830128859885264201992286188208499588640888521352501457615396482647451025902530743172956899636499615707551855837165935367125448515089362904567736630035562457374779100987992499146967224041481601289530944015488942613783140087804311431741858071826185149051138744831358439067228949408258286021650288927228387426432786168690381960530155894459451808735197246008221529343980828254126128257157209350985382800738560472910941184006084485235377833503306861977724501886364070344973366473100602018128792886991861824418453968994777259482169137133647470453172979809245844361129618997595696240971845564020511432589591844724920942930301651488713079802102379065536525154780298059407529440513145807551537794861635879901158192019808879694967187448224156836463534326160242632934761634458163890163805123894184523973421841496889262398489648642093409816681494771155177009562669029850101513537599801272501241971119871526593747484778935488777815192931171431167444773882941064615028751327709474504763922874890662989841540259350834035142035136168819248238998027706666916342133424312054507359388616687691188185776118135771332483965209882085982391298606386822804754362408956522921410859852037330544625953261340234864689275060526893755148403298542086991221052597005628576707702567695300978970046408920009852106980295419699802138053295798159478289934443245491565327845223840551240445208226435420656313310702940722371552770504263482073984454889589248861397657079145414427653584572951329719091947694411910966797474262675590953832039169673494261360032263077428684105040061351052194413778158095005714526846009810352109249040027958050736436961021241137739717164869525493114805040126568351268829598413983222676377804500626507241731757395219796890754825199329259649801627068665658030178877405615167159731927320479376247375505855052839660294566992522173600874081212014209071041937598571721431338017425141582491824710905084715977249417049320254165239323233258851588893337097136310892571531417761978326033750109026284066415801371359356529278088456305951770081443994114674291850360748852366654744869928083230516815711602911836374147958492100860528981469547750812338896943152861021202736747049903930417035171342126923486700566627506229058636911882228903170510305406882096970875545329369434063981297696478031825451642178347347716471058423238594580183052756213910186997604305844068665712346869679456044155742100039179758348979935882751881524675930878928159243492197545387668305684668420775409821781247053354523194797398953320175988640281058825557698004397120538312459428957377696001857497335249965013509368925958021863811725906506436882127156815751021712900765992750370228283963962915973251173418586721023497317765969454283625519371556009143680329311962842546628403142444370648432390374906410811300792848955767243481200090309888457270907750873638873299642555050473812528975962934822878917619920725138309388288292510416837622758204081918933603653875284116785703720989718832986921927816629675844580174911809119663048187434155067790863948831489241504300476704527971283482211522202837062857314244107823792513645086677566622804977211397140621664116324756784216612961477109018826094677377686406176721484293894976671380122788941309026553511096118347012565197540807095384060916863936906673786627209429434264260402902158317345003727462588992622049877121178405563348492490326003508569099382392777297498413565614830788262363322368380709822346012274241379036473451735925215754757160934270935192901723954921426490691115271523338109124042812102893738488167358953934508930697715522989199698903885883275409044300321986834003470271220020159699371690650330547577095398748580670024491045504890061727189168031394528036165633941571334637222550477547460756055024108764382121688848916940371258901948490685379722244562009483819491532724502276218589169507405794983759821006604481996519360110261576947176202571702048684914616894068404140833587562118319210838005632144562018941505945780025318747471911604840677997765414830622179069330853875129298983009580277554145435058768984944179136535891620098725222049055183554603706533183176716110738009786625247488691476077664470147193074476302411660335671765564874440577990531996271632972009109449249216456030618827772947750764777446452586328919159107444252320082918209518021083700353881330983215894608680127954224752071924134648334963915094813097541433244209299930751481077919002346128122330161799429930618800533414550633932139339646861616416955220216447995417243171165744471364197733204899365074767844149929548073025856442942381787641506492878361767978677158510784235702640213388018875601989234056868423215585628508645525258377010620532224244987990625263484010774322488172558602233302076399933854152015343847725442917895130637050320444917797752370871958277976799686113626532291118629631164685159934660693460557545956063155830033697634000276685151293843638886090828376141157732003527565158745906567025439437931104838571313294490604926582363108949535090082673154497226396648088618041573977888472892174618974189721700770009862449653759012727015227634510874906948012210684952063002519011655963580552429180205586904259685261047412834518466736938580027700252965356366721619883672428226933950325930390994583168665542234654857020875504617520521853721567282679903418135520602999895366470106557900532129541336924472492212436324523042895188461779122338069674233980694887270587503389228395095135209123109258159006960395156367736067109050566299603571876423247920752836160805597697778756476767210521222327184821484446631261487584226092608875764331731023263768864822594691211032367737558122133470556805958008310127481673962019583598023967414489867276845869819376783757167936723213081586191045995058970991064686919463448038574143829629547131372173669836184558144505748676124322451519943362182916191468026091121793001864788050061351603144350076189213441602488091741051232290357179205497927970924502479940842696158818442616163780044759478212240873204124421169199805572649118243661921835714762891425805771871743688000324113008704819373962295017143090098476927237498875938639942530595331607891618810863505982444578942799346514915952884869757488025823353571677864826828051140885429732788197765736966005727700162592404301688659946862983717270595809808730901820120931003430058796552694788049809205484305467611034654748067290674399763612592434637719995843862812391985470202414880076880818848087892391591369463293113276849329777201646641727587259122354784480813433328050087758855264686119576962172239308693795757165821852416204341972383989932734803429262340722338155102209101262949249742423271698842023297303260161790575673111235465890298298313115123607606773968998153812286999642014609852579793691246016346088762321286205634215901479188632194659637483482564291616278532948239313229440231043277288768139550213348266388687453259281587854503890991561949632478855035090289390973718988003999026132015872678637873095678109625311008054489418857983565902063680699643165033912029944327726770869305240718416592070096139286401966725750087012218149733133695809600369751764951350040285926249203398111014953227533621844500744331562434532484217986108346261345897591234839970751854223281677187215956827243245910829019886390369784542622566912542747056097567984857136623679023878478161201477982939080513150258174523773529510165296934562786122241150783587755373348372764439838082000667214740034466322776918936967612878983488942094688102308427036452854504966759697318836044496702853190637396916357980928865719935397723495486787180416401415281489443785036291071517805285857583987711145474240156416477194116391354935466755593592608849200546384685403028080936417250583653368093407225310820844723570226809826951426162451204040711501448747856199922814664565893938488028643822313849852328452360667045805113679663751039248163336173274547275775636810977344539275827560597425160705468689657794530521602315939865780974801515414987097778078705357058008472376892422189750312758527140173117621279898744958406199843913365680297721208751934988504499713914285158032324823021340630312586072624541637765234505522051086318285359658520708173392709566445011404055106579055037417780393351658360904543047721422281816832539613634982525215232257690920254216409657452618066051777901592902884240599998882753691957540116954696152270401280857579766154722192925655963991820948894642657512288766330302133746367449217449351637104725732980832812726468187759356584218383594702792013663907689741738962252575782663990809792647011407580367850599381887184560094695833270775126181282015391041773950918244137561999937819240362469558235924171478702779448443108751901807414110290370706052085162975798361754251041642244867577350756338018895379263183389855955956527857227926155524494739363665533904528656215464288343162282921123290451842212532888101415884061619939195042230059898349966569463580186816717074818823215848647734386780911564660755175385552224428524049468033692299989300783900020690121517740696428573930196910500988278523053797637940257968953295112436166778910585557213381789089945453947915927374958600268237844486872037243488834616856290097850532497036933361942439802882364323553808208003875741710969289725499878566253048867033095150518452126944989251596392079421452606508516052325614861938282489838000815085351564642761700832096483117944401971780149213345335903336672376719229722069970766055482452247416927774637522135201716231722137632445699154022395494158227418930589911746931773776518735850032318014432883916374243795854695691221774098948611515564046609565094538115520921863711518684562543275047870530006998423140180169421109105925493596116719457630962328831271268328501760321771680400249657674186927113215573270049935709942324416387089242427584407651215572676037924765341808984312676941110313165951429479377670698881249643421933287404390485538222160837088907598277390184204138197811025854537088586701450623578513960109987476052535450100439353062072439709976445146790993381448994644609780957731953604938734950026860564555693224229691815630293922487606470873431166384205442489628760213650246991893040112513103835085621908060270866604873585849001704200923929789193938125116798421788115209259130435572321635660895603514383883939018953166274355609970015699780289236362349895374653428746875n ); }); it("fib 200 000 -> gargantuannum",()=>{ assert.strictEqual( fib(200_000), 15085683557988938992636878948173134441848416561658689740214300814007875839363948123516190995732093471171781051796266302937774866189506849346804997282989249330595609531388039656501674951902073416282675686754561200874525785650478495872265413273367800711235597082735947816183336948276642243536623243673687653137709786396616593596131209935806463007982171384055659316358464507733861243852413459934417443926921039675036360272864675639374407908082412318246291986517133289505130691422859640541931718590209286465750564440958058698593501452343223936433808865549263390925624340993701901875364566854412634976985363310914966611028208391464770822371375451091438763371418025894341294855631121040642228526766919418069072433195848445930784362588088491909572194728708365539666263098137255830767958717493568606834420525320846163411042908319498384318452793710499043613471398014209198982537539904024638954080366868480568190346431254639643204961745213087536318839695283601715446673606666665117886524931399765276208337463288537773131251108750756205096068672482133243054818126655239593578836887709032159318387668321645414703302374612215409379498205215169804568727320555709112553062891139655572302702943696287370260859239641774127344508295242107705606350459617412156947098736427827456587177013177581482931107215813931583655562846111188339452737408562216970417356954474367646357836770047579714349363918537229775630512391906292199257245684177055398254384561339361240059032004771683110236979742274095091212087886573239889803102442948352264520634417935211386348068898717439271641470846064518805826291167417302637960746320260477303289023345521932215347151804409026447421183429858973401256005212609284636977483396468020797603532714720320796067735030253310010004018892191108744839032913101026883244890018391134322754777428039177402757235024044531132909998555148719529758110694391509970670766825134091462135522008231438438311963865614327695985652085123960764363853506121004650277976974669012431467655262543108545665271997195753751331983006023065033390558715071488056180423480849000879122375472253596279212410119798261160155145391513233256653728899774402724562338640423747275464196304702115047650233920577521289544322435073199810910350817178158268244966795131619967072982140330846222321228491824282670510201925345860118114522297550262881434453491609347909808566366591395767722777171081691994055473565472995683578002917709708728363865996462149559924364151507700393525657768703381090056930715568351735846809360013863191709880114676998804054124152553747131005174745322076228564924764559102615232992118102832157883953206061093181099287329552157297494984983043426928197951655990060841775003398814750333821609052979099965594323363665761937339095477586808571113645523433293021940419185981990656374599024097663144170271345840596027755878233337664256068305902267959269233160738665253093679265611078049139060290958350748010448271317482857597575463444495477649154610573995158301446004829200742260771986218585206481522837685047143133077919181312047395094538114857885380157092654166402431601320838996109513861332688685558512741980682675203120209938330685430458154035110881364380166940417004720187141794009622745357707354123656825690395732682181677684919099902483420129364679843188856568849368929591587350404250453997082875048188619913350899166960552686168651349874831939745877612238633461605762188368322936277762538418210448861023120673681317902706674697123824651055871913821574968702919861340036559533951476404399872470320954218597819528834459776220222578802865085504168793326315042768508239325103570985654583548683651207756898548050108243470642480045092287973725346758236634307224222541981904600814891159816559455821494764255796799398461770459636430249759056664491440112300387936559942982841168920723101155223100265305405420238647542690407813012604895745487631134030630711439909463709370791940485092057983014052297854008336006675705835512685246877983057450878959121900247063666580965237038040046310649184412850601560678313247250805368002003208419435286877778843376164906324167858463453199325465003030875017449863223779731721197227277439712469791691319497617280874461345762405079701281145920923786928592022870327249666210540032339821250395048613742040568163888091658974274179493596127855782278050917582550632122915846324573178758697766743148185600141204716327674342084357578093472267623737852660488357993867599516884141554750520959061533423904223176432204125282567161104340244009884135226785160643196013771658852277787597495841419759144506180967400479569883780567542414918919778859532384177358386991942754709712599731985714984441749561536575562490386177411899440370012571846886712291883050131272894430753792264013728406147395422793887696723304698325689018106772972096309840531652108156678395472244497539941248687671270212915525107158336735057327762557303054123868246520226868237407311857684169071047107910368373953244203778048818923989762413516466019445208846669914404926662825601676280619978300657000574828580226024890159110199111823944688000863538366170791706879326540807799502270441641331982451150245668249506459783196172391505560333289300733518169871416328790546697950341156093595689025802923275594921144827826661889442016578796418979865131234762536903240127617235969899531970391269715325096317902870930969037344026838102673574014796206565001859017241833612303324460962993195164206726208503399510000436770669674520952858448472670330495604183766724952170386711108222512546562536451876975376395267735007470186081953411694831262224862436425418411586354303654855429638878895243031393415442157410387782085267234303543447490011184095163718433009758535053174396139539625900012215908839710462432049100557045791750192360118171842792525089310071573262848590489191827026416713414593805060412959632680415037739534633365772122824645193915887355647270969489492292235438303234094038988295520676741321062638792071858423273499125856381655379335539871897213462359825462268325077299588723721299964102421714731074454168330275986429989053027745797498485145939105574678563258730426847959454949326446831807902188373086350654180751344156757472412473712727485483718546139939320046751379470503273142255334523313764555950505055328692117601067359364493228079858151791493357057340807327695448544764570856047094960286002534608236580039319843507106275308871448740641003605877030943767108981164245755096942553987461741235462847606193457051745814132583812878111716272105631110012612226515807469598373374794066573012701638207641604012501671447676351631288438541816688866829263298200696174735206390921043287445055876054021127915356937870322951062276556644994057393137901937332226863172143363108514141597434327394293612898124066990042010999772738651611066349625519695528500703318537359341796408192249052133382519304289342502719485799110623470808045811873774979692468563253159843101171471720792524869943347096380715922814740042584305499693952932202358566013899141349815840799377877482987583971143783091095466644110045243315081964140346928274136181320264486408257848670698587597597527487480160889602809283301430288690282251222398361301808721230231909201517280524650814043522083037145188231839840060630647682250762345548980202237403968434614588760775466444999777669423159951130814879979408811580824695031917514063743588369274793782365496964570423741096630550500868075881107611662144044219374596304370888597309387100136953362486564571029799982584952010264764331645898911160755707551286416623028075579097061915351190205793344665488825493646460524825712604584897492134197927416672817486245674215488083771283447261139474164913030204482879650795906657986282497118520251579500093139801939046822054042732001787048249557873529490066786371569911391580374407204155817776404460200788044099713581561339505800324399203403850581904538732830790177320871997937370910658482023190521691978617615628037869759332756568196359708793754434531998720447153688144033011364743694218083109432028294084743839976447192736022850230294646392061615339889686994176267492909238403731792022627906581945886319822611046601977681305943651915627115019842180469046938205503205136541161036677364140224182378253842168910983601121105363819428690684520701648681438077633363685813042360192999190816761026460000898739902992779061065482822052261929296684964206427518195528116867280473816324028274294206795845654742466628053155611939733663390173114151831433020533138993194814175097251685809856083669217939376900849081980130487714534118535201364522770797524739006365154925589641324070912310450073852694385897690512554991795320408939147040626329910233108810222003561812823286090123263178979002325729531532177046784338800817913548579645076955839046614926595064953691092582019516764630542699921093636744763429270776861615160320119413159894438004229752482952383540714364746386465378023263248586344739730875053396397709208910500452459151017318488442842520857119223351945169502505759199548690589155698921016688408930787286464422907536165255577180910063382996126621647175411991032250118608385805286720204631129999419223449600910114597057395076953220647064741105994294004538991774500187902216661365794416966273107787418760733818961456086721816519048831395243706902928993114506434908020560825123581070950748974026073160179091298044553630489694174332116470484173132676688643501366705946990778094782082324224180205069433074228985743824027273309502466630745746279487177277884021640858539776127704321293087420277070485915397325920980784253015245346628054933682614539962451247904432597353106047894372149513760437930202606186530720928121273559050992964549357860114486314784205375258266962235311045487148748670168178647438228957765044134396712587459501750593882881063670921342308418722493836950675317574905394803480235523980594129772894338536400297252322289342879096423388055925703013166956445424360723218733077456899992712631929078352763204433066764341998744336949250469607398370767846999693683597083167905239895734609514574169444981913013746919875956791086386668960216237535836026551304978068369285307622024171002680318071601242949695188736024468508741350335858186942030074015526308706268722791504191230656989118508306252111900387571337048229590002151422197500759478331835549275092830995504104113764791718174705131914503246660818337609975129652990475206126083799539927398014708253524121469808750504219399758670160145916261408656099715873174222170002317462122622118472150075146179997078939918012922985151940692189382201388265632553790178347541685837815167787013705261611855169858039720316206856765356568632776321407225473926553603724138787779753995513521677902565183027622290427581916494093086391807992544585438457611917733177694509003712088691924372194350573274592326838727751934030067505784243687387561591344384818779119137159147229524410251466818915389560039468073943045221046453377934489220766694651617321356460656021444779469018819051653203525534871510826343331161350867497988152473284581477853157348576954138218544220824806207124396637244090354697539096354784098727567721384563568647190689413946202420705795233889533141742792114708466118536509969889241852578950774333306826891603513884902615921051241302305057018501353570628249232045775636191102911044444615276196784504408390647665717378011090430949347016640782876882361324144349298654260956708520266861081370672039670568908834668440742298473173527921280843556545305344902163450373205342575134243977426431747476043499077654350851912779536275530024795771538661871475095092412088634756818653411633803370170164120841788803156779631900301445149244218207432839178096780915169749975289519053292340058514564260026234329208199084633616916498563776441841508755264200205314628464037174996819760618068181034674136939404735894644253336972286268456785808561663589980842216080268533112052466827389691524502434709224412008186391849521355105111529252707367854829469426665750596727547904508356257592613936774502699616874392141078516142537240319632245043380144990007474161457470799195529055487197895400652651203355674516926420548610009354329571038400524178961124952055732989916288133799541602967602400896355477954085970099560507247100976234773799851486369730172117719153339881186863571513752138549722229630742310727650899873802362612242483108266905657849271113894595701351246363185792274380794940007330522401742738950009060239834961588495965646090111116033983219501246791676960618352116040562984032254318487297665338380880965062122932284564590932772438949838648556260414067687281779241500643305239898490272273381684836885573401851147212204835447982007020682217742336545993916742855371788930398528669555096059336853864410940574759066094735878796164317014696253163219326563486978261610654960358038758133684097814190881458336053873559158158807908899935942927442543248974144615765408799360290972542995537559896453691328098995106257685132560604128292378600169251260205758979339727374954651484749099559175354738259258519366542902860323319173493006578105019405418768977113450092813989938106835660022826566060645781972913155887803315184337772606229551372076111806438556932563227985120115186954261514653968854707266347296164806853232587587661223957496824912782523239963177005125744160791020149701901648467685740970451406930600825449707686622028628568122925803362005986151104285902641008193542214537979763781776526172148280961634110436802526294941574515933869837983297672185145999110584547632284725151493878478120165476797858226459462127625766429340231776101191568792673334210167191762136501990088992041526750439463289449699179662254749956392546045930468526202817326337771016281108149064785446482161599261343922898500211811354213492192155006249528404004510461233363727508505630538707720264579437140757821086980173563895322165038912863281665857525620387784059555046108716591907361766566143194287219189396153918731512366891821504469159793434008645505820059381104910334463402881580236576548382345299213216348628343551913418018734081712452805528216109448828270738875106835540387770939048814742045890751748149765127052071154886358660646594873213557092872808726656038937306295043843584078686897792467509743578982962680749654747674750097551345314590195297716691808059794318225578814282965222186680471104466252818197111387659632551641787724355795798958913380959239396918763521166108125135373527448473786463598960380328155567178779165866449298706521648749654925831719740807966386403326579734302799180848116793084276902936965263360222702067432628593803858538385467622216937469500521296073979010789475191015682716088542214904982608451992145278954414234686662888023892239963648424155045981363101519942933830397148045520257623788484169205431930628788462473733599900582861077683093979188825187649530578095925519878344593270055228997028220771431959561692072554105738207069578387898385217368629008442546607825770834418425473503255914649886128860249993080805123734786906257143824067728471481889857595246883316057681863160833548224907125969012919559790270011681465806629266829442584822072151295667875158037160597497762827696326948722733287995203624711557612878611423361185816350827129140954950673768281614670530551390151989062994194973688711061637441204187569028438539172773381920903068135723565943679779234417101396271642499303731143841327324906172563894593582182099941033294280284087751252146815392212160369198601154802976039059370882676446186589659690707176889364417416024837705107328570684296847910693622408465372635239225468925746254495427551802623986102462952122332591500307952028148601775601750690405480177616864004577188678103698167827563101747027255030746360667150851438551600782270892223938175332698249142403834443433317482218749937323841604222532381572786791170359529286742124777727198841461883849894989108155947603213775901273261108198069507878709457155697824630494318808148644272409997666663162117346043218805693413821678211258441939383881481031477048418800798883438722303153079107547817378859627801431640765366404707214513484689596271814621976810689216723830334837445731105110850145206136745507185611624526084931395121750417802257974283984291503802572446081034289275598842636877435291618484115526561437360847928868402693349920253621274431616533447533140061250632890985479864395031008880928254452239806323286817523829269293312241694490914043953706569260753593015900667487872253432300569678753325970618440744461716960777739013946260415180905522690441172976312704408691680522744622102038710475490884897877750806320366769033764145483088970037705641733443499261566659954367936941969713173124678603421789728015110700850921029950066080278596249824509066896437304912129712498010973237316466610034184894291099012256045628951948359087515510198364259207352833665006461711865024445416322519076373997709496212552570040146257031346043121301607968731560365178054128419447128867763716716081960623903373119939944053469325172967609072929187927895064596281080544214628194157722060552622388751547569379342417571113495169747328084399200597086216210813136296114969583389355331493695134106179030867951626720184238132745776867105071814697145510081156763333259184854200327465733208960871787417731720708225511419133939335724780169727603918889607389966383053587271802192092263501688723393502563947343252171287974780662002472573587706173918093081235391273124090050839876229081932173218389376201133133241031556001772081915191402515259062091007861689637664460648771613726799376107748793894401750311763493764955199226330562742603256162353804072262992857020444216989842611855926137531120325387206092698257603966097045458364223988110069199600543515011046950728114399555493216493263439111323646791309326485132688958700245721695768948068609393875950722685078618847068282541037975041812426387727387282176157706972734550628454039741922555663054606021449699929417970607559170782669866377460272970039937268096284888384826051686578188196782538862971190724120925329212042407625520101644673357031883734219531491371452189925945475370781696035128081522446388339421865411495209789632588538954846369973376132065832351169141752139383636603595748727483042357285145468731616068465970840740720035801703155610510249876529609505423368994839493375252322848837559374307471136852252041980062693769264084165803363585887163815797000034547389319783986573572201962487690018259209068776433532366286551960861731938666660043669600057561047279444655764644827195305214776713021102670775494986626529458979387186608553746375086283965489206208318775179668985843920628790134069777127500393869048150588129379472630630602688829508980060638632590479400800516402764789408081013567436375430877506161426930253853589412649782692638608348348316228391499471733695278063192548880536661732689298627877894947660201648575477486296280991010257241763060252629026193187575360050978773006140204213035202233157042822292910128415882361981249293280758837873697137451280456318776996300322217435023415341233995658520175828364118855876514537810977185620306785770133110488715020268737105647858149645930446814560966002446421647200239324688711533806533310450265766831479044658965379836205397367016291469949864002533499396130444385719094560139930134181382549266154463304953067388280437282102408558513534771639434052739235375619617440444273242500228659589221140224811774029199764282008566413671116251247672553432982151486800263952366947910196303129130934930868465482381591165593101525742649591960723609301553953961880392483435775072480909312638016392700381143201630619253541178615601875860118998959461517450768139463423471712648344390307906587339735652846953799050395996577640478340456068683848504452349835587729868512791262628326985539915496670617047207795190294713756895529111860423587295431711661177392427979167315728471186440870368234239883954591051345828999844185892706497655116676744607482621083571826085260712167914070376017053845082795097663249107262971950908992470571134087134802557892574677222749425515629594235023797178412318247368734124991926842279808185369151870073790534655619276383647522446412360000069619267770739268617158527284406254174079750268475217297474822218136666661688841895607550568367983262108635270500708781257091905398133130665565726444444734220257454768694175011637202918599881581769231215733212308677740258092108688163661721912876069086207858170447572515299135414813701630940434756362872903441709533490051362947411013584438425563157739333434794973404316836193092139501500926978045539180666725805230828582281722610507717870772076419706725305972937564973721829700632241242626449915775251703814337623542754621121712213326151052603410475840031832281554096177333094885026920432104866526181267834110350858195312284472831756911082150045690426825151656110752809109786733872473404305592771168535078140891401294795747836128644368114325243458618830448974533046134814759429372705625113305824864023621749811106063809851335590993964358755886711354020347308876284595515203760376386851829199793400162838393611202358259053993539772997547755538430705500377235077409333026909872678280001781825968150674851389187961751950138741086227437536101486581241065914089624855492790012991448821413350128730917754801580736426821611315175912777527669877468990060258593590609978865160100988658108625375519037190879471014528742520510390334238137958884664347284595704800550571946258297871205115068749805388447464719396401877549696654358323844286383283474208241032617121614671823379423457394629887184446975549355109949576733849408730404962531647313064685691894485131917261061173922163024130069166828056831195717878940592977964100566157312734244396847468032047321250118461232930057576826212437237348718897522689560844248024622250789250951760959709981868617376641878573598090466320024149866105438633859410755547341093820409360532089524213731236426314413238860226442644364380696559212160935933277506242754770958970250669542522718147099411893996999524789974678037032980525474048911461525760717059829525696988198409476005577843549264616701997964939778627979683254874969715305075550866852747360869865560084363957438438884652576378023902186102663314219429792528689771422001429415796156243325940357371859123660536055782384148367005834985670820958270143556554508269804411836611099449611794065945898300579531709835904085060291546503450169521568795533744403636585916487941820527410557633713125331989945242930389695417374812677649123360297977686173868985905856782862139760003243975248921023314435951797377525952163849021752009880788201643371661763590422194003167590269072684536949566882914710464113086896144643900420865847342375906652360377295277746432392409972226773898020021400485175821434227788237636471479303364734335813524332670831990422259043038801116561486025094886374758068613315524924712830477319599640903341014894542041235227143443833944355371877797630154394684355754068528407188495965093775001839513688321615362246861217723211050937080054534564992549040572405556973387163280679480092557884447615165387338475874624464720767966691320543282857198005463835025206388537480664604231368317798826205899470254882365972015551136112489039069677107154161437209897146402617487126658600893008336249040732486942583024689533459844430387679323937936766258169996524484980219975335526702183303593792943713314239944868975189893279218128312280925956758098346681458064904086598072367057773932885760464438548480739829858786154906580262419089664483653218076121119288936387918596692736321370100210533948226561632203556616063106375132938604383885624257060894460159432090363037888239982399574887369967918469137577563512595513131413117915595873160373085315907898967276173401206495889335453212920262843178325286472578486439454874203622951480903897162133534405352363246467215203950446877600182028672622050389812155014076508595424892321255076062575005628191510749985817746977739199475874724490183186918910372306630651938235134733890495074757429420924492887220783012203692575084367225607303735193814756345936461489440308261057076535821691490901973426911471426235226543669165748263034121801562036046914428721968871851099904296623553098405213024102035444486299477768658352481369015753030369029551987302489881870425124767911998014210639340191467909020710687655019483266922860392551881239325760098352465261127128186358045882391313999579321296590453895984160816348787510722631816730099857463553719963120455039569570032982148016677570250631500657495750353757091673667505787871102025452458423447698591556372709950060699767514440215714666201072650539728001477946796350618839134047013600665873298414249441922222986168906498629350156213348243565861005137015747350040746720794360897104632438876664320987792322348380405665283567887277480452135129848260820199368083336001260917620692966197797720272277526880292339554042280201311535412320677290875574319449945136455871651736755475489062119607374771465446959619080295316385187239381274977394248345347786894226405097184042973125759158037796835831297900242165553400600434287665653775840512963334676150936567677433372135857210202473677979561680753246748294601736865925290779787324703860344260852652062753330055977550418600725995700758148863591654758213683658583838010571981209161182212534703445861736146543440072675449400375171102692395491454286611644805199168005699804614398915256482956548007152702883737919894061773294576329231438253929315805515480308968061774431362989927301468812143972722196169191915569835307446391234269912230961384968018434458534190504165296838478637340161013832060400327837373040244577245862863788375101665738385912684710260568039996830971547625229030246635927399914591185533095136109930393629528370504202256361284351199174140811391588894091319424394659742179393498896642638596284682490739241821319672885190901298854662934860354753883634823940168204752617751530242000575850250539902329844525651300932447595168562616913256329642503000477952908238532389009478873357633683336032752218957219867315875079322801152310398249266858336356655105245620656699993775904428022922169165513622933966704238927142844200019171099309947762479558881008423328812453341266604883374891340999987531464675319021539467322791712250373070275840179970932970556430453563415015418566913417325623263816835567850633674074484884880668822905662920033207329232436600167582132974759527323312792088261840778888810824358205629168087088452452134946103557552493082963005161855928065076718239698456873003465741173329656021595815131211525788813216326550915179600589447832224205000318778746209870471475840376861190015192288332550180733850707906532095537447803921280600790877860237850959802588974803599830458341431853372324616240897222628280582387157977807482769433183630860243507095580504117997586937371797057724107181494125015906963777730501286739829906600802584073230780499744902216918873368829387628581344620697477547555610611241480499621990972834304998738112215250826236696246530540446170906380223203797442843657572041305437725072682629860381328493772132287600990463337588387543537464417896679223669069365195002368044797955021664071873286485714025049386237555631417651118648372257223890615578520756033140996061101092507376610220643950533073776053103936229245721374048880342159670965605398965104380413810319705068064907876562838723078981847838599159519066909510759726209847252515464462278175665518817161057173274477185285065158978649375053414262776773825919932065708981259770614319443129596680607741929563645404736276062669555131087319407537490415147629096668359773095202174581748368910751316245632799248732236188680339300620418137994636059926000139235490442518032977249595411361977099020375185585891118013403961422311767976246211970204650170560278208173782342183408793726116312296911526811662171726346063930524834663708270225373938391089842254538112010523515294240639944257431537945695648305015798869240808036093481066180078777920837748847783110601023791562882378065865502167311785905874338118683591312431898126438357950421708295195182566091361965975946804455709510318717477788523091570077781257312564735276716749382017555695081387150099126915432734489840968076824764922746396582443161175409143057445990558134869693243216365461310560577369019539548381159461457066411803120539646587164078559637706726996336550216559224447570134657783623755464592247569572135728038225722338467998551669849477627979424651720647346535401340394942018566063253425973120517217373344424356704433160176015725930484333827075072363557703265757210716474017331260804897548948360984469330471127068798391591775623328312121568678342257479403374798629218926825661590252925808583009515065369338241015904298892499036517780932963881691387282974245316843252392624142458760009857195414693257958512313126757935010158342252953228333225928925546917858792089581720528588831911122275461517482055369358015988755942127328242966681640090207742558721885198678374581898907422973478877698985315476704295993223153490023253150437820682675225254290021090144661086278587828417439437127882550619497962795512555645728693902205403924161301050508165623343862669527927150439232947638544447507654645021044562603838615219799487907284201189049757953719514260363960765086901756083795024146076270007233264904561537289187555333946651487262992862353445884872903899256362192840464464457888186785703203837188653939796619026103475676768664796875998976185601386078479350699189002260447222052135915260838536984085037322748051930870805633567716175169051792728774040892632804591298181450412076452644633273200341521978218997359721363694344431247210357878785543946937017495551356202023376141431675558054640518247320296458304858159332781374789838666283515454029745258390647192227402531983734226888833981307884793198719661320669657930253936876773123462526766464109434299988067441919739225330803145399611697435718460161693317527479372272027773986870106449645683429318929449388524564067978231216731780026104714727191033987809507267825374630715928873538598518809555387090496655954148744692466144302237604829323582446172592365964737524501295640386641819736748894838682121908713263754068269538463804387069007834605144971159259398753514028035360544145960439967902064412888376873935494491377619686534281727822712268086656520820043220810636095124978807651506415467410111999795577595201545403926193043681847432550114410056556833198102831484468302835338783470984933535063436250540329056278989337241257352279395685336003562106068360505291363495342544728617836543983771188351479824610837564115441916807893339230022879941778696283453746331077873467603742372419964414953236869697576576625978358529731697320681077869812946014900367549463323241536650359130042427946461712467731396706946788170396900113127679820113848718891377404182010034628902961400041850379617264612297772855009697186675134173964937132140006197872864226144366196494494869725335706235341562158952950508055747426768476786347031175356624908424143298019185124748717768773763101671783861716061336381179066443228229052358302075907259488763908982193802227534112989228533630754904267359004933085986334246063706473714650271629588160694197371091351092839045697459478032040894833913322171200304503673882072270344188089460756669692220251073201948034132743321679542399148730835817333977824755341442943641212705913505681472939107469544706893175703513477551722788697640529267188959723834534388553496792202443205118362234150572449071170891154511906052155109155162779709819549297554054958943609524369571571319557603197322858311529535221628428002351535700234580449855545430585034920789308621770620038389191734235138303531950363773032523445252242669957900789821247390501850746866855843991857906159073330757847398280197715257362683148113174163291969052274522286928820119968576642978998622432210747348218469172256487278419562335733139976224409846216027211749977630246873633651143591319075740237180682971897105419640858508012857509926922965209778889380764490185570226025205181495580946679471946231922730711947625558008525924051867472897129934142872219185906183051353684593145876163632817227155797661519064717922663671158068961308279699742939629503524428597383421729960002918172473375656117097770397793051839204955959072709161183564629909982604665599728043882362533134083546283820180942328152577709090948627850769981315310042032049959143330262668587161908691898534145749311024558653080542353057237342813618843974702643552706546283439536578335099286818239867194705323002158727258480634800810671722986821927828294437612728999706830773580292025726350556846260637554612802703786683205739653231790505373966423922119941011154795791300225657681323247665864633385458723412178779241323891586379509047449256847786234783263663496624645507241435213906347405340390618167389365838016118159099609109058230832171615346339435150517849182456479140683233455418497180199327929532878290634693991953327627602167773698923789303027188811640999908991517777147594215166081379677997498608588614736860060993400939321420339653138704316458093133155720484077640497606562010100544955001451023961537807037867926388681890464079649686187984756207365671234480236583137859601711566871935760596541102118582254768729316690416330734929732206712552911640264207551734106895894802353580427857772394441305470017703984650700188016040342115906757784599401403359548656996433181362078560152795163610470325700633517138127625606315898116491079255207735934389646282142520695578332964053335695655702036416695887685638512183811751548508772976536164757401723830571287526719795845735896559204402917746493474817314135059148605066468440428457133731763531473579970529189868880795047234967487628732917374507104446947637145861742226974572812403986222344081322735036342421556488711333957446570509386398669167142809600597269811019336925752757241085155984741859687860170120921834673882278986749276057682881807684244848958952313593729199820342735471722218420672024201671108861401094289601404541086167471748905793724738206559536429338045205880454820242461082849848620692107490167955535180707693410547424760986498610081086590924239260565136539549685195903208100431263615384605587955915993892245578806347288774157615697652140686800759126212387898256396379941226877481884071416278278354751856990691754211277836242223334967887631702755887386827436155079117264003090781668536831001436276406729197938993775584815425752331244980298450804830924598476884649098119082204404690473237741770394978130184055394113669004597287963283705266636823647358244518165204334063747836661079519598279806382862539761691050279824116692079950115269380612830268245914476929043386341127902066798565170023170349944324836038809870067672625705690140224948152367532094267879681823076926544510095354364120675649998957064348488796791524518437827583011248777164297442612499372249375211909640362126535971379800744549107559583660269211151657743051658902079457388446123746781748014565976976048839618365751140923615159671484718261577449635915141020110044861881265524278500987423797354957485057844565675963152652527351293819107860957016908401679801517177247856527438025839221701638982734159394553304711950099507880543720646569818879038747145557357736941714288435198821377667889363578075636819830154043021679135605479052478952973897403985025827136420035411315087198283699626867476117719422725850744341024086362684032162760035033733882335990865933768719478882479570892225457675569938688841242767794891037986131704312119197769324539972534083493484740563059284695718285390383981963005450112467271453188075053842754928702190345177762932535641629793735740310572811223321975839274211265323056116418352575524384073494615819539642512912861776268736413557868635899997637011759177683252267049160417484983902821397940729973388519573707531501452668825971839312268418956876997339026014888957965236876043412560478308543025260707780900532389139961535171053888173313295475700969309274525995299731110857254440360981315526732729228978225791405882198093480571443741033958969448912351246103767222877952445422007437359495792964188066354877261373548262787488962965974967122962454717606507053928387506667087880355058979578985722606231223026264176941514176377659136326831549563615794185910586321671693126744686897809041729803641060570218272039474669003224634257713145416148963722810248267114175241221731514632685607507688849322393367030391450017818630468971232707992793114435682986612731656382537559783602428086499915551262461847811035824321908522473406245671405250288760313286905835613213842270788229765277720266460995985529365166947708724332740808886626678256490568501054824550943358328960920973095363367290831377071767525587754955629012446456238040831004229160041234305445702713504389447385803654281525925475734413640168384972341711415918719240108800857298169419174935529760758111258909764227184155112899021930497607881234857153277630747772243665809339345678925366345468359985915625757202763126885162437342778147529876001792924908973274460755023441712681468028153793405998801381913108034358643586450220951069509350125355134817547627969976338542905820363503754925936852799302420274664243076033683249939825705827671217260354464815137688553482592235095102853015119153469568228392243599299626306987000755672774571416723228099644157168639117878114272242161639236399377889453947689476525838550940473412240035558264149427067493132327640680030350081669728528803124678653601242173246537981495842398479190706130724282399195808841508502764608260715462163555004827946331651397335782451263611714762028385583654441183138030308768607592730893151891833758462110001667260350788285781681989596372493013662327775324797679396467467980304591012281752145356318412307650695167134649452412515895662973386937302554466983103417497786076608124644706831615997334778660038394162791559338971967418593529359029781987822153997853099873319053519681944458037120064939704938584792466476495105825771749529037605568791458407252996313013595014817077200564692722346337730040991305123594110377183291182566932146433117269899376111364220643503629661196491517873749781557901899783549700009531982880325939814899603705314653199500306176365837717711620846119360275981382620236895333709888339118302679468172934766209184578685771128241459670356677102811512514428474492069130880242557690693242955852774811330605454388674900752298500496530868096850793807753394595585379684030537323015063601995540357834738512965407569955046310704117618797967673773927921280734790208692476605868741645993382989267513820422554708576495393839333325551833031475218381008077369076852207183340955134246205665359223234171557101261036751927474923378292766685945182882557312448473155354423335187820019146812975548389163014376068374353843272634383334083080794551583248480865237680876028911028381875538961037104255329005796111783526742644445570267814609726560358082762120316415324437262293094859477790086785983277580439654331845031238746311276697680385585551555074081101243317502483547015218450649703858469585903155017592082105943221103529030282769822791427931098003279754286051672739521345816147647888877429858574263109941456986833205688362569053425148839806191926645207849650256648108186678501140940596268515947101601969535688127860592198311930359662773420761637005270605960904549558081877940350443701724725404996046248606697620807660913978344523902866931358632080983221347618021126751699323022187656330217244610988129572760203772726874541592823069263015673438898066573110599095152059516364642142841244964400257632087042283113541609579753766084793377201559348620440571261029964701714087693972133058459453256067666139189881884999191822430072189580924357151747580809345832036347609385118205303751810612988689145849550748057457907701739913532002681162649274694456719526518562114539690079315906982573951885791515481537250854150582971579446545083338324624139829049114232969760099976735592132627469618459333685067623075225382599959075543308176497561967429587999987054022207780370393752198480775531811441542082990950288209761769035150057364420651306653397251821344130021717230332704692995392488314001930122439008590414582889463358076030027606162788198418190971881123428018747882547538695195556249280803555584353342431591557579918648365030455868696814963017821396808597069303690704789405813103052553048199565000975174822313803612937455759876411317425424712812098265078143494230178008470586927985046681206378592995248364386836464137115474236714407855279832137983610856310973320009472676055929744423618276594342187090252289138584814663317058835654251618320463528436011942924124009469007776892134678748963453878482390960542852481408275101687072968254356859751267921738089189199713734923149719456692505182171911762503766964830362795115396692635817899893609137406732663057463276700091270968610899774729756330362380363565616876346960361686370075035028733575942196011876203927955672844191346800899001036244331334237659891171115390203860017523801025895409534450128633507951081898642632316928393550332380276336265546804163545091584983459317237600767453392221675507334813178263462773450514130081524919687992505128527576836103959432375643219502038366034433183683204533295658965603424085185577946570068592928984955534461925998422249496638367291750279959864864512760340779157064748736410617957210877352691460504184690032929546039085294083664015608268777827443174868154084480756724322828140797634332508949655572110764856735922195951983542863532053789465176801176476145904307611669181655274531762607974884654512445258110187577652222498273143423817768742063562500307677503832922378111078778604520002405700736460028146322074663608710382775925386381233021451154898973135879073889989551527483679528554063979518185375561730683368174848654163996368228663526277371329831173794802100538328557966807994261325501473041815712374581102500909294547880512383367075631551424536975857443042597093250554065699275626353574322186287559282059723208383808531011618825713740726934434742559093323706126196002712537368795203860187900060895217407977181945388053286947239052473752453296225053538805624817479197417467060417752514347515076498182239531088303954238221549351009970624402084900272950782638693852022231142741503929713071110792074068146485179081595572528904785663877616462653669462689359261747364212532866024476944192614519310076109974861926126352359630329214201957704677119789193142654798777312450935031089429802652246259408175853125n ); }); it("fib 400 000 -> preposterousnum",()=>{ assert.strictEqual( fib(400_000), 508879539221877742509404323165037106408585081496656752962424600619207160342328626613349370477235756610437255590271027530049883553677265410876521227217363544010143699384920812088691108690514974972274692461956139616935762281220385238995618410781350467237915882147058582638254974382726740530574778229758675251875607011233215473676669270533645055601369003104235185947104965780014844459358678605151230199141652894052740410259205856598842424951027541126919382356148309054495511411297780681981155592084694406594038399969137387681421892625939539738678474422913520113323914793395022014657007128739431226223818527660595499689768194765826655776706420728875197457538650926253568161538878490376706759846331999593034655680379810097209673122167515014861077158264989129436317557015990974346068341128535603504592916916709976025200420394918696108990179070734940119992246779851008568327753683729557460181095638719407937612048994625515606351202631057994743654987459153765600833479546292820240354821099982829898550984618344070363415731412851980223897825042881749190170220750258069990657865825386039088023550194606622251930025915668224350826647822759065148068681468081265886523970703106224597673475518741134485166975816459358678813620848155132114307630940585328469943312299883836376533783522617825780183633289123104776930141606180663107215594174528939137484528447403326323147735248273521255120207814520801323179212247442733725337799026447270666922120378659461426439166571712910995990324080759054218525918529033099469000095747176740324953986082368022937675614450811072670595376818987626554625921343738881182469361168606382858379204875873783331875704932851192412008914727223124299298938584826033014534514524919716715569953128902457279860372013016262458876395893931558323383760688036483050602880494366027992328965734955646789051646458042547726848542102999723525104952722054515151934617978303318967681905465912979012828568260321751936108085909158012261566075258846888682870260195135035715374180325115757028873618118929825224925160516261326295457946568788569295246725442647319518446060755792733183362740574155421606364569070304133110999183609108044828258097754075482024950262824132139316155931482432279940635811438490448029592928151074250494845243561516043501224022333257634129517104550839213082069008973038194780652324714481869520143279237690491889785180629329288934135292687109910607204119243082034696250524284770336091622404355866979869477283934442989551992343913265988759643695171799419049798759196516719604070996875911664867462564719713741849424572217736859970193370190974153304859732046817017181139702005290769598402417524188262762739958274665387136111917265035268828487596179328307118090375558430385694353597686006524977267232561054286911608093073998264764446862185772724720112179167108605557842180590466687107138359306652217930101929860815218881852363019229982092001982499566493690824300981662858422404428206788349834034883236833993821978142719376245780803907319624333006820263210145434104668582781051341412697286642565775861126900064000512445518085544540155849394735091324668608677682471086903859107237777476801816019905543474718116476465095483201419060008188683204842117864787307171140890433577980880821974652846090429805259226242497141210088737551236939582740840469581987886497783526856606466963771371690028088881474832446317517014895659829496502677717498446340171854127807779591966185526512515101265382862582539341141391035065776747131287037575005035578715205006019572791434613617513039739125218701689935572603398856001247730514926142659345534009269173036585464331879795932077902934384311031115226860254161029036808724075863873313707256619038404686441197697573621521864675249377773227409672246298434739444934320790820234840007039112151884230195997294826338277172708867804413255318951579638277499173493587072346110143628565751140542558447545673020471492965429898175762589834536116962897122505611567946860993843516060088842716775930540804152070540972211891511935160536202829387506087866765766544445297124907001015499885284735400681636541508922942145978546359829798454590447358639379611839564333198669384762372852470045828025091123981186322831599754749768856933146406084369796617611797752332919113840817814343058426490406571586668168460355399424510259573256234118493006302094448618449556946597441299089682162648844025853548991759407111784661106907992942912117121123634456454861491389422467715111988942096135969083482395165599799460506051957484509609847079915410631662648624758766831697659682946771782821771035611896885301202874336090363782233374898066067028680483681348655201910933634559262258795930118445559198241213374606566505859417109947425238469018759778103964185814479191774956029338061418093031232272022429720939970313332006045429049955119967989376328878962492054542418395261692153831211166355947759844156284358899781031566017690137025237301772288033301979024491533545175336724129715056327030779984161759238750494301984566424234466313718319558782218515720578333556457756872794081194194566503409240155974293388232247194008074473418550286960145880992510254962143511152892568764208490650903038601447969612995522183688981171722678714390421575964391791114419737520777463664360717449402090479497662407530261685484382534550102920042840966386895715297170393186308149985186943880843370096834282171276066488231098765999302975232045349817884277137221049670023432518787288966676931584662288211189495614209013421531216789168726694408112520781483621174517557124308400809374778447858614059354021127446906868604705939645386133947230780821213333899649692733811211531826017645772143684569895997795851050693037855788049125933613467948234895594837367835276233286427159827801918285864943665292933148632712208974885618434480627806005450019119807566304790411189621398213307966115080136424844316391895220380687058381461602389297982036944989550954347831480688486808338872403224224554606409563101963399659622829561562048294159957222748154600725124737778523666820934676768541446573462027844422243436622430566305756298063648632932943620188402796560630378724386705844080373957359823709243300945863979340106117198764344632427347837821270900830376506421854621337787806516130200694800915732426004706215904101139614497719184622218092029656286294901807172387064682363243193878967915655595454584414144164064677625180011753038765150999773372244917772592675508781410869394538538402078780141119224739434409709065342412789312812249898959058539681038088202537840435292116268024472261249591578098960937850255225547740224027028682205063164120933959076396705987080127569159391363246046783430156179168793700306483574114785710700162193391921552065626898275543893485803352939348550721582912974997768331148766089605563475171759327490154816127573887287633145765341175847279069091473979699946159097555237234464476958122019069959561436108468874150933529369785115775126449797682024574604837321926116380228990831554780597692169787312152394715590356610683085332796348640154111015567896382889666450210846780394487860763355237597375105866277678024751650124749418812882571729636299346025249078354929774173715965248277735512108666731298700271555829551504961857863484917400007636713150618969432756978332235394098631195308934454168149531429950101347451066704311138790626727597058476003515949531900511572520267239980013357907209310689112641616513368879972923512279763634424607539115052704557381453303705025273880940983350453118655717475474327096741238298724344931853305204276083820634486230973039924442400399487449978738462850498433133053059484352627778838168587590375930938848784949217937743511650569613595469593273882888109610716609416198340269245655170172601844645497850854774535029222149632884289872162043505456168419699773278040253753872105658538285908100740614500169048282744744954230902747561909465589405482731109332462290438211251528913122162934585455707037205862729065843262102734290429999581334394588697031994903467465120913651944560393134419253672215940156745499150814714120048046365527468141052668706198222234084958110572890217012688186605729213739273301083395356761290519368652908660747556460694020868972288568123215386027514542163611200846310485421572432307842833884180802618000047106692895186078136549679804945882254753271046837483287720204810447802658362356034672251739714059147008039901310364856189763815717299983894249578783632971999119519329843193430983527826716060555001917483472039596029153370978484808502079678671096459563370412205788906923085516714850569438212319373095113146037391565197134972809954668804447318114680315432123220527424357101964519724824859756000498722168261653451274201348845563214578411162446291678086407765448141064679900481940178825270545206398594135468343877244374556695484201201522934421818723852837427657589578293854586848336409085983555107418196632656410047059205305020440982345151515306555060198309807833941289732345860192796484414349939961809679918671419139911841426940984783192275947086143943841521914928291675520001827435148451254148337111108731033491585973538873979706012768480443356386269729780392662333195747498371340607075634418202640890391643170432376650828043330775919326541757620994481999540295372940563296757302649586797181631021626710132213030533952219445855124282746217047057649256421031644902719187675142532939433482518861501307402959366678594150697252003837908699221923957115113454950242820895813856265000631349724747716626172564014261778879107085760900182145715929504986505567364460790647251317655272795772806005628208261006812283184913207387143548460244975533623758043356278204863111173758910155748340510545147162070083003072549565488456065992719524186466306571701198110753753570257216530678685589290282377820626872253644786266813879769056242420429257016206508243536569430416617444889304761855775625405105423697046983314194701527015172195923092790446989666987126133252629675893309071576931691669750493772961618789009562831143889456887292639449666882455971599654286214863197187330724950928282325156497355391807976626341291999898352283328815416027886955625923111068708015933725493485610358470185773272638327490833557475110589542192089962591008940283846161800901943801971649944433882271544159808893767909722285080048090308924892758999632194916327819884009805777404913213354468449843152994304123565876773531298463856414978492565372096423998852726342248950208256767468904340046327105099302950404536547818752007715028300874375982043839303619686333314681279733512567498807359018573446855685541533166770729117638129264612069806713725619956523293978655158225302226970401617971972321236892695619722008073704441198504671348647793156612517581015450034531480614238131039896112845646770517703941419712164484344871198680044102423328268109021513644130356730012230133019665895975992076171808679457577272927716764598644782942417647566048822107973372104122344927326990773277253487291404085410353316900254288369974627458119914669765977380948839195976061140889260294011939220408474195664484861766189494282492194855822876484033256567789451748526193469990913718691612808710412335440920753308002179390214997128552477510361946083123344584126207093043480909382991084424819118447410408826651304960344026321445597793029254130222888720991897686831049249551657084551691455437686172256420339527920097815761666694573774912364196311635765326208175981107580101720518698220953029108978631928061165180542644093678309273294079053620056609806412981846200318448018672373441128228237506659410679844304956892147605002789688276996485030888022221587135244071219664585676340064486305125462271073687963012179223182771295191428035526814138374512080780115254977139696726979249820864477736157247384608211662216600317430205532075640186240771664088176261380440661169210455196698564304243497032696264250291443146766130806807287583660532228139340269210081496715890282120835481996962749526130228018836030188061894723588549987930444909089929071732709623136707992808629865608759690085853000344229422469544690855780793345909359101836021825860668522227295455404090204447037595287825453219035070575152410477943784325404133157545348298173461102670573971581486561234509742520793676865842797617709971585813506397256061214319269927491311492709348540064725837393608907597972319605232419727926525315458718560101319713426500937754802957770265614590561117833176437138363825625227595903073718210327241917827865820968480570278166452512708746479849578081686609755003514726668389012933260478917078932584990761386859795623156886217453419096560763988642475545336917280967022682960532902366740520680776685374717147926030897524233308707766206970613349369718269890580149524671204715101740576183288755660015720509457233252122799730308899505250283823817509373792902021651711463703856787290829499864673226018148359075170015349497155556600676236314462070345257189658494984529063143627364693037190925484405603764998451010432651135677057434094948708379570850863744435959000468036048649286213829045368233358429563577652699493305797571648781293180251088562640650867955189391095332773086909576271158742351739164576784442439701778456110853086767447805662644848124238656125977623236542056268773051660469076154414761609090124817607371576880722020170093438220049881131776414745925669578134427735130338055591099387585534805165670022542182003962118174369134320555331693379920300372196073222901287571442984337093800552288613870910128768811894703694341899394918021684566153895725400535251974102277307914327598339706677564224693235833678675361200389838313125574802714315043334472902420338043777705494864064514734612459849088935526239534772428284157404198293515986716661630708575725615376188742724108585721891279876616280943006418121859107859671535546203992814233683422779677379235644018694156710527065317866823957709963294238567321945190225586538522124482820414253445351660271366630779650559480613527249702543649517643007019055414667945934988740452421821392698427733585629698509823147447486734707133836953899926273386971725843086324942788235110119160064860502357789011456353996109886383704677617267510577062955559585109724993546312793828157575657936906710767166983950144365998989955145323841983056799923399175731593872085317817271816302558643661831851011458541600448524747990313731720578381169805009361983229272790915242526724400532503925898402953442736129844030110719088483509483581928841932786101465893814779086695995045677231893352000106859501994180271398872337284041472484856801574911214972303247829377037320720778503992087417954546210689497220676297117843951033113918954366147986325820914852471578538034194488012190587408247192023013839921609439809985316130547594248413638059701010856320548703223233913895522377742962323745839313496372925327573428771602653136431737524112402913198588194404446942578836548086926546449006370758657162949507092495059896887456953779109060380853433488058921158067576915166913561200245753184285219355414785185218370416719957121954395793390219446175610361853344739456326665971108365470299332383281100709858163760513958799069051957894536956823217407220374984539490709586561274216892498177568350380568878667569494419397159562572493876839514869410595526430745040727164188531888235256437873381087076093659184965511564977188829507802517633427641316866198201860614430474569247665951096520650634505567740767878313507409915394493962066062999298749573615157371693525756322033149168539124427915174852047818272547225017227528172368584945683852740385778406298735855022081880788091261080411370774435757168485526411132543080648087275402646207699771227017841520084141958011844122144411670839874622153185166036451981820987304542383140310070773118160210529194219119845322976771934304343697017145070653789366736495116968695026923951618295863222215848151951084907830331867679970781301658921902074558551943264763231618556974328584863444838740096847767193919001558595513211186464690477149365187252150902816167372197659232144249241923650221554065935688102759774875997732726655800634207017184151256776284525867535297470327275397989661362493149120873311660474228899385032232167966531654956939301728822633616595254817603993537286699725833999159818296443617734971492304031179102212228306333948419095183629344986652675668038887071086171226158002198661908498368175851072311326653924337909392612053093098371768342148886330945826790453550974298540236932195344061064944510730444635568484239971456382948759415687575852449811380193786058071081153329435203138328272493304198945729301639728919666847935397915488954124528091770329527219501714628509797746745651189880741985425988190073849715577005692678296486913988618803482811595848813660126870138109365274608821994115522401560777932547774633200015244951913647003764798990093487942430337358099248746986370065043248089604407854463631687063889286985884362038152113805878517931951756219556931423336777530127324492372390795365915620248872099143229069363851765008974113844152069368943033822154427201808119040209481294176803779930475421238167427370375168165016162334773870525644639139618950214412306434080042306113767272512301938996664514643520891176789602636627924491417458716941827900285573971654110512647669365772813741961831545546734990430479548207347543800788751944405048909011205339868126621677959113895368587011097788047839734001716412212176731522228725373078477393082294834653555672556454300798560927893989556008645987572354302736557186236758606324323420285770169793573204301659389817614745690427388723927686153407387545048408102372095256174261639690714877940866766705141459876336086445102604813994724012821278970542716344808089049076979310454968967320633469376632427488283955058754375179251470446984910492779451218698420301561638108012499076438384545617138431079562610928946633674880309224767948322945028695061674927871388804008290299935116719701008410970278180917918010749177790482229991085346838518906330761799685003202631842630454118691737356925250206368439368970332965404432048297589652506950102601194868700445457610424717612457284604950218101623418936845950019310676318614532986749810414622868187920922866649043224101021285131800488419478543314979784145635936686964635728522451306631297861913463921072939578420523442669314476607614425290549173555017991514407306981945520466636939993409370878108957334035016293193016440380770153018630704760445805535767774480705308807930427940039987067737719653199031870655795674234091508406353281466847131485016022017641886949099694635705330836771675037238019771803622283854155849352717351317105614331483475421344698049172806479076060194042130175427979861516240778176320789091862970935747305772812310706163249642788153780833645345613291870270865293834411921988239426284431487203809689019021095187564492832113966031133288624445053607159308451661180735272549143708611836174492182591832085106553170275250707544298924051013842043005325395958131547215842710120253665684228209753115813705616390717123151317959685673683521177396303313340105210934413447019783214719542197082066354517337486581136129914200009925061582903729348300730948021145481313261275454785225821189883334940047917180794962733162639378854543618738812210562702968571336364916042162934445354195374020064680284609297565389187268269812621489965672109597619537403831100818174014720059356125329650446694174476902640656347730870156198735744136745447005744186731306813776527595301326476374985951347716391873717481379711553040531371854540149514864494121718276689004046348417814043446446741983661209327399989957176391821828346650488043990873854185902691004015407463065661130451658445079654217621451976886700470774180937034139388334838157492738065280782867617650110527849346732513324348109914790737871255980982606675726695050640282713575483688079683567350514773470205910685601994053875570697470873787735788058961642255014604730585212908206361158581697405931475880625055180085106876923208593892165729609300106947949665073835986781297806495243951581302546720460965883994862742846782541577011560247597007875448252781168967419573217752978212875368326805025736908548213227068744781856074828871926233752835752345894290058900810184965105944072054418813715682033425706540884259301827692114659979968146065080014442460355994448256772515834809229534895741529748845460715053287266264259236709428315371313991240964972131395273432128698388482535633455033636158167138792961758984583475119931256995564986172122914608731506884299451845421198931554720524684108708186809336799844921997709990135643768963747947421500953848209930695472452007305122838877949230851419266827866544649129086805197883217628907578400894423648437492855440676565071932152935115876156271193885960339479951337513495283371899653395119362145813334379302252194834986458983886420581621917818272916174362330919480139941665929573740142986450967868488121688984961840047379931824978785490504610487037150373124218456296965092722236841519713510926739634317729328892554023876425945334390429964312953124219958411407442322027136198890859113031729103591664054109506333105940741055786283724009428200979225318325419079317411422536549478647465850739006810415386075168319599445765404897265646264633371006293596398818078832941542442493862514562115270184000642041161335675082290817963404019561716391176004103067785054912486005071909816049980998866626474294714048176533988998645821094476736778817911891632659319940591704654764373803987290986660904449203744684451870033539019771623243457316054567893331928904412131742057828785822504768780864835682160550565830951886204410449593064715106400733240467761263010780660227973970052213504149839935873952581823228367447552812905943625139355348905194536637190380890231807885724078603851645888729546787988950166783083201513175514317007193925089238211443650384779706443174318341018593467683003103481020680323311263730763031927853951287859450453118125065794616127060043854368670736669482664679236999136218111227820068803727259590210190665090177728439154099761155885404865247812647414499154269742425573264825236843796457201660907011645557617301911942990875832497016448671498419592750100776698457334168071860264773140719796993324327862580506787480378623437366524294743213438333105910752359041588591096765446823500328038920994648881699358583414771714985133318318341880858156039931353382929978376994114824307887194948977239810877573958606065698581915388983363921879806714771379730423030980922960838271436104133354774618322588344349784556757011561505791831313238463934800048359947070918311158080354200347168649216504941390593462118904158770448994427515928621566405749645235883397909126398574814320375215082349686745821847071922572852000959391819029159939347471697189915912846244429225036404244687278699277478269984358436880351851558086814145034941932663757634776256598820449480499151348826061550966628881813219638487964045773628028147814375792122783995813106051442404312561550719827910707478039098158323093196444981061636068845744289581042668732728625497707838101733959937875216549691088478481754299809200277002427483709857031667995705909708265346314918674124647537702473497768409957886824302776702194983630183132001579725490684498998373928243016793916438416875161962473634512293219377770451971628798272508027047324540973291492069643284966683067273175897466566657544367337774957713701073408489079440709506621845991733723888582265486196434278968630211340228430597829078584968069473614301382030869486823240711867268728152999272673956765214306779233929910656910351053953386495987508566459539952027776930267119259142011280152857246495047903368331837274377411501729048680366699033329521166867873870090966110851081753309912839266523216655038652229709474360611338896731765193024432296466002507638587594993543481230623391182534227714705783728328578511713833961915891120146278969846213585375407802913486362482464253205432988068069588550702150446643976503138290107223781298335751803403698208070345282110206280045422822231471147640579177006324359462435569794398988607493655942676323340596130509481520812977872790968722763340928968126715161992524564329869691165361317381658077172086170153075140176788330795940400145073937274908832763889275896343142458378774873918516851550690893303363888282749864296030535995815884581469377810992471354752177356877159339597831258155100943545530980283549970704386142410542772587513501344825859994023748983443844727016082347752150570880823773110003800028378335895593853711113490745518171484186841355866954049044937201310223612110958394810096790610721084383894811503670451546365404665045302981159145896926565507233165461144905895487801590644628541017332315840318869346496478090920165242506607408734256779874189166413310175098443128655353689793513100119926392098518912238364711585726809509800241178795074683449423576945727381138146604672105603551304277683499933544682990720931927530905119302537582035072674274379007167890086135116307276189516184317254879436903522342097419668533660901333354675213779056274550685272647570909948729483766242613783513318741452552980305164810285830392584118095869115100570097909041438420138501730097429868506355412518789974656527512434842418855386102841365941047120543764378280305098866341852807154716117121316691347141635203977649513910346087660872967698764701939204788778242817777017958546302582049581701495880798235988727973903784057235497371522633944675806061016417881191128389806959938074965662784232434113926239177305526238658719336643893053545049537862612777069051446550698004679006847247424196571110555406279215606782223885832707719472051052319186972765813370248356316669140403023650024583766660725766414409209389257582423183770921774543029278134960778699764183689769136449186892667310550045382274605451691002331228371731720339381952919889051817295864579354286873946199508433664783658051771416453767511895245103976116480530053973985523891832459022574286072942436501457381443814111217019701353367918012248047065983665727504886766218002773301494210065248232515491951377505356007519395790879288264090400279119744938157818165482227809143671508766413160739174029267201498729297733062166510367093961561235169265619403531815606228934920840344372788594612730527687952574230816461712752386026831027854830057238247886509693768165020319575008194226608679230770030460856929962824018421670074588985251628356474932260421531767558712070701732073221242968008128613602124499930944785147823498532172366947755325112443081681884025437021779521968105182088490204290237864703126068630432785136614265715861415859032213151377764710964237684169007997268088160049029208916032969012414797998568424657881140247526635320933871974351396989102416902051248265443831360129314503825496093490910353474635623450302126405013842328070553199020067066286953354105266446822064539878134342432443824250198831779823547405712924491546806805640234954525959087605025162087072246913527177318017293243040101432799802576092918429982860598969565528121289396920820134400412519149401149866376839263646526560217329644547545637858256601954384359914427422338533493556750743208239171864727263991465132842767700786809532553191594918833413966651430563511177504242239787248169831062795641100784820243653393257175295045646211821562847875090057079254237191692265564618555995792797923487066465633108936400527094460046667707803903839191773965251482037373182146042838299112492446045227052216891606582324166869043351571808940450707894985124110705391954202017058385227582842638106991320618659427854628608692150990412102409697172510800381882166767526607557812296830490533618259695091958200138886982645045540843569589378851472725345767111827298219835026405737355762105906621084177546744479059471994315390637011572812066562931319417418839505224757972647299581415656371976034187779854443866628680038271053760199378250793642274456222523561914640344949264993015761298517305113475669048356660246282632340180475794932372816885292850544334818795673837431822087909260160806453943583826233650825109375941331011203369927260689007089512862442106594791112072325806734179715049586884478466062231786300957507102550484838216707354126159535800053412368073158191429903458248300465450412781547689139657030591132970186174951891322584009236482888644714093960534058704146981971829459848079175051229148530759095476739241010801944737551927526811078374829905511197850016423964633390026089016867777575538691880032613833693546081041029518736510561130115015967174170588394024133082858534534847534516509998313334340701796244005183842458891354670083860283500425859454872504617948593758786042057740167130545243011499221485725753689161325681416338731515221723810757813698193656749508345487514448901516417838821103327922236847074314167235595287690791954178068014767851221274509962847074887820888968236067824350195294494873352112904597986083145540925445021288793049874483239741175730258671980296366985212788008557616213456772320565598842358040275775619109562183762270810542457856189214249116413899772940568633912467152206622417657991741854091117746981674906069461587715755180529760282352879116334155599310215343807432687421198125387521145486003071038756569149732910008560976582554354202837782082482053831279044817553002682454324636731576110681832986296069674408986286904114099274232762769021265088953388215930174108003597874829269980384466007329716937755219916193746977338817087928563008170574400749665699517007085236869959685206309562106578962574085179219534797298658320574809489756745767975727059811995019769846208219993918837369263799088538092724617213015730492471484813504501539592611047976798402455052382061613212203278623954681621995240694087114814463534708132832062589626988098132956046782453203135454335483069418952041981958618542546748932855566558188918587673476683408349753535217355143001841452106183297499805203685555732383564198675988206964937228768950727287083204618607536342797542160991295901073235307883502503853289398463841198472078406582499834857328074894756913675255141627273783730318735456684894386296912241246336129111052770301309956099514469325303211780898642879917653857241648331570386660922420916590695539710266135966034228926645257666941306358337502684272961715387186276154306084118353805360412782722364352175255658230995532932204046315725389723285310354177908021326543404981256349405216160659797552293183201895229168479547482121203320495525129072097693280012120251567467045843370831830457845884799617722627288053864101286758538631081286799057714139245246996892218413716524458981588860056072188907616654988811653549833211806914222098905290707853958083757898707763752765912868108866170482628220661966468712507385784646720606757224675339300986555505582083764211827615021975381590147252093490228098681764186598641879717671305674400596018843303588359924372437989746816416606481254857849633328970038912413674754309398995213712229487183372420592046549492322015609280558434403687377888316055447683966447435770034267629270520667057482152975528156593102213654402363505041260414868699713914907480349896983998316629451384459426526913847555279736756846389588247702646634028204106168305540233198287012732951105792192572511957519205744678086668361051143810268061286455673182460276003739963435011725294259079039387169180623135967172575044957909953545584424527614018761765878078812736674096801526818064142938379464566611696273432612758129769267092038593665358570102957732184017578959304447934641891431710778643381340616215257326609588263580029448134752499165761607742409571642195685906254824961931339118838613209022565898546309372767514015034295308640330619206299606472486867550352637796254955181277551325853654651981998365196063588983218772122346915019118241575071638431350600555405718701178195131214524687595949532212288123583635014644640043526490162521165855487991398759098070239025821038620675441690115392779367612571975538731902882567023270073297653464884801204924958070754832660996907715956511069400874734542785617986475405225184142183696960442925523329170415827736846184947313870553823743938879007694089776704061996187501541721488864461236386254742834184492305570531249427553398270198353151668978942859529216126189806810691603968016202818940324369638605215239624311189375884559846826424871650352000112519973828619444185113988495416387277614378130057407367181382866627536574752926778623643616238340518275105588857914213865833128537813740022159156040748856460088860423979968488804396441703720637598698392364530090516334472151544686069171952472632251469500168386881029339601118992059737412003018684439220849272667224904294692855859258529051895251276106459941448810945318359774424347318209451158230870798230275152713622616841111352257599056725624306708688267863455196357063221939845711346086025701004691331616414354598406777718544376863895361530889180498422814964893629221545986862719804361131685652807802416884359051289890710359307146719394436578009077757738236757713970247808600112289757508459276727783014091285549483808256323835294290438912602389371877270748384415696636228255915496718883397120672963747177752780786801830256633832203730634451260985325681804122107316709414373105852485759679218474753683641331606503053154598324769972725051764520326522931030010536607875958693562631923214049455500040305137867125848123134906084366977288532896818536607204208620503028201297722059370193458705431032060862926019180238365482993862220228243972689902732285415683337466186764740511342828331152685552750345943908784579110780108244645899092146769190178342828778352000349145617411842280422068870268615383109320415190542955726054564332057293603108160817742656196627664269664258875988641131589812815929006576068671415202879780372117218414366290994246368254485749390423515826605431731386924235993899798567989898213511193840823143870516674775498087435899402706359748532459583452165299042708669736190846990739047458080929618160772425784696142841226246197375157935445040796440879881263925528569748894632403037521222347898201667710854648607848506308501112252080608884992230293060917953284721297927657221611287413612060411436484185133876795661601506221642426933157643558363273650738182975726217047937579577494911707559877619171377563255816680957385650785207545582869215874849523994507531047498502228559933432376823742096562652135207405443689227940926519209497421752582769321090968092440934948766269947920518395901041781060905530809999702257444310735110444304035796961456365820421745124809864819647286043320740924229122582223157596353091638790309582353848801447566582339559490653678335816275441244998505349707096016349455932453315882528707697361235182412841754249277690413126837468557331264415340150278276114373245567068759305101506982899065849438828305233227891337425413569977145825922352630259047420063969148394694993042980520713374155127734352058500593541331152318315601117298853750643510813830357698745001691956251475281585555939393893907959360877620477378162361283652786640697510611598245395534830833966182628805139522166360489256679480415924554370177106730027138021208110172467402855380602939681289472614816275034999368955048991855297768651053945350749685110042496467509180092265555072308116276387086327175812479871040827778011275662599882138953946964384541556149904544183669245685383289976417722791020302725337304859194261003660438993887644956355552415450309095229043250082528882629169248720768818698761361709736736171173809174568725544456848319136528771446779686772827834247103816626982087376585067331769906090583456202917265160929157248875691968250426246324954707292476385652084712179702796714993501643895206619737439302817020382310274907221122690448120478273839812398699276024950332296254836693749854858143210587392131192902750612082396379016540651138296487171268965496410698366257039087544796366329732552220393295792663886057684891596647288444399976908094570073739840621656216697486995529681230473496138723000730710438219658192514721192561451993693104237928172022554717634856302132344862524262659231801565516417366884964386019205990175241536783485458262618621102506000617261204923849808443118843196049679425064020442769208524586922198829686388183112849775065317947991027760033024225297292112961043013630849132348373425321563419676151410002881792434878711826262691843269080010941582780231558571715174451743873335468290462158945637509421708627913338620971593050538761557870112204888439007786082009051556452327484959352852811666428600404587621409691341558756662317742879178431096677997864940779285327980458118864776408354981202021203405695903850569000681002788988733377034538520541981385969711459748454443093884158494353445858020996596583070630505158740171662406348964439199014077092368048699072127395648489926290508872349745734444647044803331262856872378455108467681852025041560348175867416209442355586321283631321002230592576193936394401235745691204159446207066987785912374270690101532936766323265811866743024058933303075731947404360269503733255789995615418272615506050379995055103361174377619350509498783262567546493962121516145900134987456157229655843332592044238696060274695571787765668710976657047062048750061010258484855851933955584485033603082144768588968335576863228279485215030009189297721516068779525604675180279699791876124409973018793014213735593204435514335293017654591823216775847165750261016562994193618789570318715635220192066329527378234559198140746427492125984641037460987493867415709007735468016367394597491372133432984006680608593344238877933619474668661888013189485275166957496910618096333672283610231862768838032302811873992093273411925903967944749117819274020465269479880642829189690900275189241627653947501056797697532080876416486310259565772288980929935984635645477331203305047249130259955238128113288591814798346666166340640083040510059718385642175703583474362018750148473931768357767892995791555822887744348965424808431436719442451770123532543516793240604306596851786172950964618086263389106197407278683730284688539281431090948736802353935643779186767767853839207341041503329134853267491663683075125044506073629349359467602820345010069109859929700427773517841299683102998491971874601628695989962470930341808572955866943100320043678257133102342275283057437213800422823102585949180618841345132013511717442355116644394732966146531143724195855224858044847751161276619145724367218494445161725697678776997963010624563210268966103037214514783631509026007666101288190217068824554186005159943275288572508344463858408578647222085223216461338077975693229998186460474013206315686537992179056822942740649057262715014765802633243602746186689064915389979640565928508439496620958864108389217375614788784848836670060028169622567309335786745402156194810804900183490536957696401616659313756237341808055650640333798545117358922847548937220327020635901761937841425070761794949959927186931701169807356983459343395266678227017712696668883760663046465848189423377163644448253210238332241364205455557446293834354360760760584944456474922031281043382667957360535226430537351521886133283732733096568834862022309526083010119524394567232219969153982854041719826970538629065171720229516164680710599734656543686058405211190349016886848751402420548366671911648290720470739214629561429257673048823849232656758363165517175795079933495515676922755974032474106156224452935009733695245495274380463109486284179318957772268283138782646831333977793484204032263037443395736549954656739245727979792026813219891647210706026665507880603612778450367534176399626955011553681108399459938652461487802086555192595837425925787923010970865378593363412363035073797522354934933870224272753486894589856294004930583683482743486908450895395685686037201480963571657857459672972667358706215947104479982360718032887153846870376306958966064065543069665824538674617163072600177435276224481373770336838416971668428674089957108374893060634243068654734684672029828243557681878728859166973552745148118924520347027621203647218599609979440236429554565481503851278627704360778370824939651337634962963618120423089149976383075761961517562963458556023196376038794977190905077748906231135676316602981708883528144941996895220948832753662876576572915722328721381316414577001617302021523639634915432942774612381306348300570623816153837892623942883962067580932509611516457316286152394947190161480106820336583276911613687912162623552160638915174801500098861498033415399429302247706626039773855338283216260784476512667473428641454056661912032905799769829773673591137298977607492973199188555786581692367525534669025448819423143102116687039154266030948633772261115381789548313487682622954754810915747161425484964118305087533768196476357223583883897931996498117907695649707160566307915174714097730978629875487724208742109611913410003899359080889288423334210090268078890896573964194016689444831724284187906201834476365753068573369357721805907963825081042185933386076553838604962632459566341692358523159750767853606120702506342747125563675928906579131658271802409167832356579399599605354132424519728876429728316544526872787207437284351769348747197796308183165268290372008702959492854290355693261132221305268276163252462497059294380781398731525903955034068767539794743232993388981318591312815354487004112504785183604736646281991983555998113721023038518764475208466746123429373828638504161494220107198054548379797368173829265468879124870727626787634487647402182664590190797063995813203707420867993184721694771471147011365044167192595409118482529149372457453168579424662671198528150298677905426496108822933293404151155400873453696945227490087619930431925222644110524762741976680469642307015291977271220071468800611095028868733429660871854442095490639842473996831793098867426142067135822549477132442580069430316836174247067837816361680236129896496484693261490881767251175676411609018717273093775091197982469676560763427629037094581987683543566295712949391367477230992734845718884167146056050701331070208342137645177485248135913308958213626444667467786168193453880317702954781641161581948903523839862102860451450488101396011574071546990884864539318396665619231953718493380181917264905612417692893996653214989765067119433236446911262895646356890540750049171133155454834541757437909363383617608936179473685471257909062639445798057358859352058955943351366326574757986910984418724973289993000206256431293570530144171849054422724643371994496877478793912610719128280373544791065794044641742881707629997316396198669426167653486544815320739866297615325407331767928551107166858227742403713232986792937171138895575443256833083970941827639356343387472217266438397387776928643002773571012578414459626472215581754051221407429677739273802384493711583683621605811371077628079165732791793125004870881066771249633719327363878177556772653995414291141719849089596753488055403172390226623137697574274852914420648495265507653205985077732114058354138531778780618544597147907396322237623853811117616915276396633904775937475505736085486283043007374760797366381189391022138049849012397339798156281485301117022535333573508052906991126786573398501484873878642099107608547107934667486004072757984470038527320511788841476648641666559526504232044589120784780996823974074663792939786429725476962893821525988334151373631922371043275244191654035129999503076610650154182826432625722442510314736341279879862312261501439057693820083821724464311614739815265597715022905686502389610332479366330773579503167790085985450517785640855611060019368665690527833876062152861779570239620769654734142115166816349268460268124906268998461928089154858734277142126010589256924799250417914728153782011040854352011762106795346362661222026792528785078707630557654645461731025420862087798483538452240583099707881998533637790147802008756866105944713731360024874072925291702233518284474835733036885049064562254104138124497269829247187104709090020126410268093314506116988441370918185671784358838915937189352427481470628686619215940612157336771437642805588642009686113883748477785013290658874757882614301559909747373695461981947225214363578373501726063990218306485568850446729709423024905492898346061112181536241689883021745229250705561299539721581314554095393372425327001629064785237605914963644554647499036045072293249910600814626076357136696001345065581301567512896912197709315014858694863352777802600694578059419067302731648654414121189403745199159204620337061317803258074012948306225556204322626196780861564536756040665487362715925640263512125175972822211363288275304802833429064081143004746087308831453060649609583578122316097366968808317420782529469799385418013728582059967347450982221959500036102889894150703434439070395012093814158751737555558172691879014884953395151293544585502884915453729904516691041325383022994006362209466065583981279513920025080841954836055460724165118578906842934855010294847359560938638152804607440948045945182079595895609377820813328158428442611882044280340063403171652147051231954066637478499982434764271417571229258974215412313332847160447319652358329885172582790214550478810106959995706333616274809384489103434723908104885678126256234873216604927864995790671827085106781230014694603718415558776880869618227615433202068636642313420791030910564987173397083238809161648408686424151123305715561753597904375851473627513230116323433189414611987464132381242921064191306453150054708242049362821299301514345352268215298859733523525205414839383325394023158278884992078330789860568052883164133513883944423278679802471397821755278418832695671433028435127802557200433035408942318846899426267463719536780216976043444443500486320421269110471654805726064103421083815475339484250400069796959447088426732037894990411441158930135893063478936612572322162795862033370905638846172795558185444370903734985928184374783976615583832431884211403540899972992094732454693707347195514969269116915005969980789795435619772491666597028789718473945515824920396787258958721383593371559189808054831674603784382441334721080241846556866931886653648629909150335406502466202777495383061966846556975585412134398422705090371326464131922192922768670131942874346853130351881870664259603158769802498447461846128660419740535374825384208386600711056655011975955368261661778054571085746275200803647925165105306908896167053350516674334638732514892189478015761700424198377751566802133696932210790315473995949325203276754960441650322773550171087606960798575128969037160305789476812598758413008645267832491481854990535469702899426649354597173032673350630243688712728395238060568504185399548822132121265366534750705239557553939299456993517920985023544585356510282197938809159377959191728664744268715730186278152086859354913915712208808179713360179361057038837078586206488545041747908839146021452659093159003396278572754019073059709237029037912971209748210445022094070728037320349197649481029459586249896862477833124074394693810441026588528028686502776754273182345828333467409096126761807754460039309656292307827253873289155304031881791196122014308355655648093290232498582752455204882827508340477544673984785307023802938984422297265351311200826870141371700298117000723025693010814961511273278378047504666547673751208116546316278821804103677075258250746890213985266413691935538256383061107293438983687549627472509728849941579379590330213552024810480565455881913965334823379863400502435529356449019610242018336899703789548309251282281833756981000429622226906704793164599822079894917833485186040991650880327975596672119870417777353574908463431450004755839693566119829123285938832039827437447656656769170831618530045316761797337403076952446019538546605430564885130779516125513191505948998264342940231801398415634888635194226859747779212262872230897749911980443696426901984894731340162583242815858705237368556098402123234485453760245874470080967624008647164856013643588032812544112973681887850850295047232882464302036300005492015904577007347205008779093591365764521806294968882337059346544194582535373411595680496448045664336079650030721440865924194171819482021840649916202255521789475171240912863344617308912794790635394948156868017675690269278511750818261644524311892227995478435254481635302724414334092009320673265725722099697937091534980620254346441814191238321000262611149148682934090620640504384258714902511127150989609206026860729899212691671591753251687384569482313236804987864354846355122813138910052903998597599462817877923904068370252030271279712722116814861833010021110213057494969562856922524532715609175895038491727489693262359120441190562561655617845839286988504950526969472703827272807940012492170131317434908211906264121860056396790618089302221915795845711349513807222718340478842613017573592210023062139784402569202038039319681932805129386832801446640018935117221745056590630076347806940285268667675466907777605544974055768407919631578940537512382387590271603023946691107042604660145039293661465430271406639013076188599612099145325257917278963698600422643479089172427728493315720971442190519453022590005842103496046927902502108499025937801882363191796803921196475516474783736628108683399679483385555997480354253770301030341438611485456628854113848973771577766918054425368917241758268004240168586864486725007979715373992582328339432884415491936987820421920395729346191281382325513773452428848418150492793469186582469800051909252768647225718355577534522266170800741172065615817245728158693486013150490415271424121770067569331755900125173330968013309433385966301746112339197956303172225338579418736757604301804789270195951057422707460091589429650715529105759916978606367801027274784985206873052019366877702179588800820285726239603846800438708942388781996349519622706231182577621453917053874807740996002801874859234843199557508483654377352698236351326892694279219857763631288833398851656393908950704565008400310124289331026216539185690543415806032297706057281728297630819470599078671605881959327968978513461826663825971409975981147653267504472851476089048428126704024867638834013588475129037769692095211376929572496672996399051301717668131784518155675977918304460399774158745614613929414899924439979516747569129149514783421882106900432669578679656944997699851082520937160160737284643256113647357514698521588633849887097746863305993352031898606505671963457810745140121298569883403483577962699689881917807374873438361002060104601934086618013307679665824550220876842182292428864930428126036412000251783514017509526927130023840274810231967364403240666797274009552648357522001901817068287030669385907197324420481275467472485991407141545959934859837078087542107271219756531666358619308486806679950780593383731685299623051255970261361270812478691210672783189423848543310637081635781348704278773057327865058045459073002534434339497996005957224931622177684886166222374824305936270207086233919342239691213736550403950147704651075538815816141187045061611010897445608012222582088912196694393761232761809557901432558742511748083478731614523962057127316238785487443493048615452678862179035977769239778814746369621106506319619677210700376802990825021677006716790692452977077498547582066500178893334400307377780579638894733756461394555080033697141635093962862648654877412403442750176219151980419547284055150655694030025539308037829594530167266264204208777702201472005410464646849113554932602861300282903157978220437774021655993211073336149755324258452659718986343920589845595612750241902850252464731127406878137478528178688204039664320825555389233588011556883315410217865797653383227855613796556988555841410193033690897192809692594674630321599379906628837293133933296792497695229136786771327573280739726464405115538047448414927216661725898309128818432425708548656433861469787003909341829790779762693822472715577569968275085358951135209629821806351297411933287449577725317847403135754565720013653056605831858754378333020639134144837669441337956684586261308051915221481125990549492286901294679565542331429913354208882996785627625215209172391374157204684170170230504358314214612616230134413889084972240007209637749156010458176942944173909525363347505897448722701840900580409423230270013395488534073441446795363701925741220416885797443653485123977261877630292083122879856280086765263200766364741393897572761802543514633847839781208506512619339273634890029858377664499635122104551429066792204200849518687507730283350266823931901926798106867812956647220491261481003243862747556793744324995253971785703475628044735952702208525993211417965868986149460021225239103584115030786399845583206098790031267051521560477235833868791797083600001214362291943149113980481487823659816772368039336818638658849219457050451630818734810566327194156864987026677247679550234695820589988661484189861564993300792902862767181592033826478568365055073448601693542527970597344803299991698917334921157586346601034781871720431067508827269010721511058171299722658917431870790557410969622685906000387789919929900018870403456956425942560724594366519511723002406584526631945728729367948585438212460696569151184743525490436733124218071218013375070508790785030611183222647126129750920983212423576182060196850551701933449490434981493193184349650363929042214271233326207942909132572688476931441635376608588370543058386973771711906596505361331132398983059053700770294096307524352044709912287142119901468701642748827319539206826055633942907735490303014833576424138685291340988842402645153113884657077841775939609530023249260595751365704801363845896307605022622494688781429971910893601959117097270604389977723356360159563523719518685648041421867417684312990654057770826067136296627539445240582425455161189384289390184013829532641898893771349324961345485877815724433140510145537929716624620966355461937150739714332120017901737476992114573095708484244884402898135433971342496450023789858528516652484553220933198869283637350766762939634141292805301359530829186353786808028940365993163437945535657137211439845945756897830276447878945643593085915017377705013674814842099577322525028102093432824676919489418055471330313075014051259142822312412454566257213802997173510705515695615662666068282784837422528031398006759559187841666451826076909365582120824159530382351984439456186054961139015709322125156535465084998583524914696464300496993548517067376783931302810113665321761463942937820667388821573697187058204064589036050659097337022743817629226098568727626088268973967607608650269235186284704251142335315967756040207468610463419976172599825438427001197846819103242950952546621876550842538162616374904997358560428975979275563650601705355475380190499476187873340759564997019461626078664957962698040829667517577115497115666108176922260915825834117907875769668837613038871340353848111549873873836525808883895971031199923786339904769696325215176546856465432408239926998845263307297892583287652078578745502532223852103118886362644141284789445368508950950976394602847850042700476323489626104735016171540112686225391181254611385942662488713452964918408036507819354368417506634388617538181800833526412342702142626910794341290559900820512177323934874852891423389654288211365987216152911173233744816509882546558429640221226927753692957723301261244000852933114116559792597406796026114674809926174696080900177877868481219822778539906927637758979763567592861666256295625079773808518307264090328061084978905766483157814939696602213411092988222655989669564237547051862534924164625626610183960379635263092136666242230377301448969979910323767828689251428197981529912486474010089560636963782809058491804600697029044710505535433267980900209331631390238131519229763770325097900545049999311651556603586334463390554550024972541516532468981489309369160946349044472657272439912144557216807213691283819020601343485539813812814686024058889165820023801946725935549153011567254461513046480176270350687532487297805601852857934595170805135269951354156296004890724917700283073497138484671666995546483119283975164159924488124595608164192119281648616170786805558568589881954510565715496837869139158569740575850338988627981412951358954630160082315182270450470549670409370870840658320706690517743843757992410700630527053658278791384479055612852002292441637267547453249194720135805758499792631942927603482771628664150875412520653696520282479697557691378321533857535098368044623372842001791005280411603162748705284500801629483067581559259359586417529362180449475284784085381799253670441512066246355281135939047663152858090302876979638487633057031041003603764852796994995223342126426945213768591957650614902915375853585250818950463255279499210035630187799342068730303248337992694866458592083103846596311043050814192994660808402567911765425355571230611915623796286185677124797253135559711026853035735250788632643658482914880021017651292685737728417936147118230867755294751963178219476873724184725356481733498992990477808434955868973217861812644064583853346668807438608616316902681310270121170233658893740572641450470857946947628234842486520213704437823040918147887962729912139712893851165863095369444950977197666682490477074482825683437510729672523437335742858460527954893317492574482639770923584882210862404914181012379379240943297602389515192594874843994977413769651992433487661016845790452603914330931693814271095543491069092493220968574959251248637520078580180688709469537818001240634237943457074988463068159127245160133525810756067193388799181791418771905978827962537851795760203374836102468872554629822989263991855486214229935482938856346742065355619154628224788604808363021482279057530102653544238160785239856627472344452267024995862466551605077834653395203321593267171770168367468375074004854882920531993301113633552958307475837609595792312975130036713228890658133455896429269790092373482599338572385329444869992613872223254467967302401484242085362645100206992844658991620912113037038530138035857551580642134983114828524802405423549558676067154150641486618761616267853598889329562036128766369620770676442845160139468042230409320344485123358916007434049260291466444822099782663549938109630739552594454937340544739041107444531957232307094663010718826774912371263264897007025157761408437672205412803274986038424544404228620629566582696056690649734613839100633929585708766933705680389369668269485207474273117097240047723775763873621975125111923804866468028040891759790627272278193065371434988287932846778126548178465803128847563362706780419830490520409788338594153731235825073906815935018524053791449601816106270290944949009925601988762168430749444531337064248291113533917698545957597336841213366629497133473742822582538644685390516510941224874780108618088299344245795771951062846570398068441196425051844711731283734343629483683425203945207562959932372137549509408459392091794364053760787696050515330525760193425799790683732373233555780243437396718514508838938817011162093664238238349444356587618116283249997276730611981745160247809138129601619498369759159800185333607818013943557578599518451028272514320703554843165604147963393766035612448469619140949336055758916959267977037688344438655913996284339800829540384773764567613946570529502496350001890944121507235875281230173024698568679043062519571896546414380322702145874062609813885483646269038007436947894212488665198083421277033576921426791385410226976408534306088551501632005641895197659287903556851709987167066055517812461246918530818548180780793871288242627861860832624160904364902805183938676642609535999639834062070973986901921300079224045298988988621254629167375870118118181765288461916486783960318699018634205248614323104340192664257172215294464883628440082980753809241239871786218645074918644076688695617270562680815508849386892806861495390742500985238266779210615787562657764113260657092854042269333670688074248590694881834295878550660623897364595920629598706582065667545683623092127433063580830238060795599639174365862396266866042539207296887843671498182662207819755106902714049015096867722340828106455341478052067027570341651067036773565498110089836517280175953406742238299164430476045439329923543277371027773801878350635452463751093327128061883023971928928174707751714790790555455727990935776168465589373414361626842290758582618190316299591130955523996757497590836281839233122024799379967257930670585604579138888781456825256946043205163867067659715576584520970327259660316013700649161602184360138474368805613471070725910092180087174152413740414826720082948141593065293290743926632556912881570036598732288620816346341514816611869223777163866307369070684348755253252807692018061696812574517401225808498163838383609367053032728573234624735185083124133899514820414047479739383750450035702040421064399335174860300103293257146757110743224293175580442824661555707860515041289633304107028489412498316924186018935099359364853707758382546229359453719739694701213445783349843014266705423029646441211287594070703478541825597194411538063201070835999239884330052244442951517860298276296506617483477396380690590798020818562231672365295471618231004472855015151236283340777910533784467377733272277583405037398144628246719646057354399742813638607592611155068429655191952619833500476038499520997206746015109233808014233883904680305972119880174444250454536143142168553029857274513984543464170597306143095946864568607059139305761117731800337586378447931080002669172044894508033229385356737699098664543772409213237027152806535791058013487333257151317880573244924908381165783532178094578628558978805774703551722588047458046055919837292378568956090923537052366866319292263559698739978447508466451910413855037053153336548809371319368999407336185579842877737570851107127223336961338555321939527174830291775177562500770928165929081761176571002137268518545366523355874609830440932331309445910676218977032819798387519299205515377575203952541982614690326170486024544729632329512537798758031325485541157430617458768246348453366254339745397501435913632941605726158027123368928396089104739827997060473805753153957178507735361496378591527771805138712004552037237341701736119972353493210444488182469416977802817597414224843731725329126321045086054704509241224489271817568567832691898707652281410234900570994509082036596401035407356118587542133906042042490284862317884686350210662014318410279134971044601318266940431000106239990009625128313033343510961138596470686931601544257666166854646519537806503716155704870247490831006810193198786048110074019711215652596247992791304828541751813980514012789318749839008468258145641018474744277647508067069715327291829401038064270287485206750297834643102873021543136672434387521629339589809195169747717895267529942613799591499734142914266309975112190795020033384718183804403432828375893852929742277635196628708088008610325819917522980365222348946668568967596561520194589870484531726700352585929636993862232921487972344558206121752382310708829675347388235638777968096251165817936063008468948340235367567208355069834310274836031979305322061856833991266619784400208877322438216408274658809291153729025751077897322066791400252549658229137089177995186201658728772497972773953652485731150351892051268609884188032128382526280541260792494716808687781079155891013214703110599201430497807104914009945448302541193559298776193115642073486677208212501359861817761870769040029063175700460440801830408802082271578475985793479395677425246041177139145120498096262810694888242917248264181973551528866776135574555980652511401534671546683650547737938969082560976194581807317206935955188574186684987032566140632497048300889857015436933811530598689783650102981165778598590848581578674605656788517147094054624180039253654784282743606679350388167089769305247645282581299984162028511235208151693239329617505124008778908092942827149899162221633102340977429302385825209091178677259509236013075406635729293634399689857588019461486212104384720994961510140508117529099597432904495370087828116932145027677791843835428683336448371435606958616721434474666480451043134173543576039557706898868395246683786429018011058634572645442421992166444170293278952684981885635205819395367694747271075344084431236377715446030583306797168576133228028176745259816632949111689817257615752352702425622993695824076422234509130210299129965917780529602565848412195976781283769640800592270897341799365372245507032322315943940729931559415576787416527111167917141395069452947671493454724730815318133610103989350774409339664239103921036423350931627357455222160506236005401356949589042973780210566172389719303554509672237206466218386430843128066326434794180367917810767065675416913339839042805730951521495809259045409057203507564202732770768450703850801641866577676681786094207520720905186160408209030836022817355539881193759240821103306475747062417299813115301799631140428857020211277701232190362126046684257451101542145092022235460405752205053451518285933365056614158822634230245410657047470432625998552090977291804964065305591196277031859350358955715008445831663915460678579752049382585738065813701013608200079710328911583874859243021233588572301705099105175186272193237739197880429252760814775977053749209232315965165323407601405002772884793540286154051235375213139092153210047342065695605770403154421291276559663511113060914918695378001794321973206022379362463632638998043505893483375405130469670481657622159792213133413699974355955945501764580696278725413661054034792946994776111315537200340936404628016280472126264738267886638546169752258425134350935494074213200955867605927534066763376061483192957524435965932996798966299831114275500316379797572066698820914389009892847176294954208762576405743705947086540453943209982964983124404615578180334028046840629828311183532311984724606575256817877190140150940935334782383890229661636197245833164118433218945604483809421852768662051547395565040798087654226361140829001540084000336081199294220345762149769287348703059617136575891587532845990476665742650730790074439199575337768778236312824470510320196972781672204365760870412205207101529208590111661097556221136616862032301448827648641634592257599427061737757885277785739302905039250986386329979560655626610872762275224189841692441958187544884079432382915922566478138488617022191257293728616622999512086828648849324053840007176616932415588035180273382697391522693794178919284506456496918583635812214532953878080537043292679641747203391851586464251976176015887194434162163487602051298672236906144922698929863041383495584424166068491241677919780442410773260786238111089242873412502643087324443742612851013012872962092862890045788203329668905082395539981101963848766404147353290214879406467018891037305290433959814531567696663934509880637841536475469499180678731530722542572412558746045551119672584446042582548116776542317224077742411228129872495343808013729885746365002513743932542121871985486423595559766594160388494447613137380003642122781326533982031220853196354874222796636842020207703416289918594443513821648269867109010961384962397477366452315202476534169109718340780207956581262511111643142036552242350060549312015412019502560695504106293220470888626139969983435756711996475811918951575293467432720594285483128886446260025952028120819942708286840322947676436611654830995994102374655833904617079796734682292057818997222106380196258797107536678357014682759440873614437182221955288715778409175336181971808592302011375570743217001751262165405948467638957295090874189315529536960046718417608194254457048316103663857456750300716852684543795371199059600756468421457020307628668676342895731606190841184166706382577063142867091338846819431257101333398383137585617832740625307550537304138957961002393204456564131839221665154236983403675768903246684343406048524623229630106242028435682240000282804598732718719347442501548291594849998982619567603621525735744515186087706382710074881479195964367578378152730198317013151884076883375336431504312484617100139422994083551973969926249477700411291555323567707351792567370654065441944149995523181526312591417249520860198787632172913201837716337175835241868212472654154339475505700099230528955982796556044750534897713978401838102904252495038983267587404715760144697379339992883508629269397376446396604792449748567697572958579751222613615147147833567078639874014550008400050768110098406658096860408126090510821148261669695748106465277890661163652388253419200873818742166009019763220931768679841689225681569151301838037163637425791628896471879836916010664242723655828864617907727158655287268364196820292152730116633663215882020964815619654402635133099902407824327551664534344770606891497150385027387766222230281499631737546205169905000552681488371495980467863711694726021663112093443979648500284566665486034913940670635720577031936444253255689765207229382027382301620488200192642051253167920679376724568684091731206952422301998200905416574754887949581792207223042267079153871717290013787361660811863455024777650306228231749918696057297044729967741245718581493238504024575168184561319901110829457707337812440237265976998651640183814688064921444216650158681492677356082028623240777855455804395057001131827097107396983363184907805734006331698202204874909478177833477223143995355403597341123281857013385202154613062865158768027989557044197152405711240833119554462489826191010662484610306365273415197369424101852085022413932100884216549198738042238175315352199842693415281161874925129395393802026682932170519275040230856365677357182238822546332676363254487669066986066681486451972241643363835118563397822592351533809557452074849530505471440297785062773356958640617910936485954282922843087834864532020781396706212477335846792849383273976177729741082090735400683727671748261205302046191890027856911580891672213785838318019794910936563053286105183884999251089044435858618892415967779119465937652231563490966251747675229494401352727955198188270787898259384728366106189825286632133612666462407115949845965962329180284068546923952931595154405563176679340257347313163982618797077340235084472529763448420093804934337041397551838479070035481713133849177907699960063530841123055630155306378636086596669907763545949518009578583417753287872993830907087530592505649801791206145592410640180003693934259570980303056751137129715177931897141647240645826718313733928487454591513254647242623966812346568197192635388044071698557423087488395961981491742782108470741727515951082649038353162721625697589719329439171925923949687689195442211967036036150202103188634904938639366474352163576384748769946306252845134871548669511944920630670207705356344223718454782714639117991510629184705103580353027708267316209589117867582913141784805696272475140025000030488920127859049691957775979085971466305260046170666336667342437778328483228105078560581860942166038223775601121152077541852108815642811588641744028188757967891887372149037734706193207826641336661059732503302270603958621752329680373398396858345339616123491944338523321008803618865039691163172229291841678194075308043109003625465870272014284217128196725932397721976980431831759592741085856159365015157733789321527903148752913125276857566706158271975437172917990747021847880860305288978781114273337900840292576996086643707188466621813078520440940369524993353564920271752947210292285117441184023675014922613868911444429517789115451079558445229673211636864014769056456535645109618990918605901814461528485015345611738693407589564531467126339372893912410798961279956956161721885716096218450025811763051501200268028409143180878270887785287481990908917337705009228664996410766232524875881833433421259736652573277484701364327831796137882200096679137469006914491731647394042912696521419954521574749850766489879811216937699299476094945397135809577572298537735790680831757596706557647018011357986181793167784944064101769143942247207290735816465288115727979559366490280423177019296763594361382799918488829616176512476591453186626896310516844688160418254290044564778071469171429729234049958315364005202724915366660235220447970148091881581445901761063189354327743080984313826402931520310752786935138418178719209214841238070877890249708990496027785408138533684738310317505762773649242695253131181469454256553074970629126359674025382084579297596111692914538520719333067357276008599390837758352762186741528921863352073824421177441010429243320801154729117093643334146512546142917785444169052267385162735208512443633181508486970631193678403529416725604626979393807806250405212331837847301256221541052949357124247375160987681148102647312123435446809702494883448259361892239588906077169530365386544775061951920142588769865147854660598475286744322131876272804110284633732040811966442269651935078007718138885857056447692880792946554854405549161820830059976806193327463771215535100176282657394165652883769552815319084748077719666051544748464480611994704502751836277969112584972424423283627411970607301833582403761431798975274612462239719361468158489206924592097687996238765705865042312730358208727213590113216116418840405493586745135840202639222860628569326993783686879373213073347075918336954777885629577312683056607736024439408137381364315304614388131495934534839443038249640607431737457649104528028030172299584362615566320473019685987253728225845670255405926611603544432334656987197924711709349774307535055846402580263563965573401066293707143435407064295594794467922616894208697973601331334476054870224892881170797246450039267137919326136020793870061277172294760367839959870324985939538586613868846384644263071673017283606293360041003137685941115760578755825094318414933051057243750040558379086825209356919372479222847831369773332611893070281021035088045039033263189437952143004993686995294458105316187621008513726128263797278771616927387558164137794040013432888746756925440058534406997404748563896661176782076445885952862491914893816475537720666556551432492043243039250567574443108958429191313545716245928729026481449767116213829831378210196913293171996813847764697778791796964256047184270950986805842565053227887863250880351175412048574832987670764029788356190324791890873037921174841793287050751532665103250329720294755568691504624489149340880779391358155243787819939220470476483602389422641104645203396153822100083893911417858294314474844296463534488929812807473455471247391357336036824171069415615209136135368335029030674010078293401981023084546468239813475811257675863554400813751105834363620346328619525312739810604918301600772509740806292874768665930283596409354207257646439491051752919696752835617055807037402732291614489540537957840630067576997812264529669071742350069444047069874067521513308802740379191291275002080768291400188819752641018488586126186688419100183996682496491712122174354096735554727823893694275685112249988328405463823816229270907116406180219159743444097910850763567462302239323430539613334075650545407476909698598596398367716489348845841227721326595127470475169337503757302936011161767079822041944067504199794490127755726088130993299966014764498696302768797938774747745077379955952679907871635509846274125706733591181735210446681984203283918983896585718279152488499240628713201032050765916390745670069645989489573077708097628502545212058292716343379310245096426846662485706474939528464706700033662900712417624387841186746678444687043216985579639727079781211943790520948495580895816398468339197420833955892388165325858263441542793716827063832533321280624665175407845208291378497019981330038426539839411296739318045640593272958427837110379413970969892444721740114078974218278083258056492138230533329640969059052980861238430989499980317220575988308198221514194432243236220890124937024649442188636939840045346717215188363792690375091861260863998238278945816060186773035238253057625134194960007363676513680813080110575602249043793243652693908658361239345757784316428007817083153010757286906083759397963091915034966817846633933386427828011979653925783484794058471516201121183524991174823114998884377202768047555753605017212685895016669128722999632304889440821599396326653346333788427280671962237196183338894448899504766772795516322223357754680899437232248064985617092540419639754208604509692709667713529445331355439527926312651091593985129657719822222856223522001038610997662969047458516385268821135730228273820551949954405847639903102640582180379651319527304773069886527026655136445984980749672685322489876404028889684790697148819693766246698484981871278590086284170456851277894913330724220621828682041252019352762612549278066428665461216974037039342301881624302971812712397178572748366655024403040969259940018238576806937044456295243336456901972664270176177864795173197926322809063326866405838783117800775182983203736668266314191459660789431382909634794110964802521888838385271752061974414503710315560854918718113922438312156177393078494791819036582092520832569730515653025590229385618211594946758940226524844122092378038130867058088141971601447984756044996949728314191109100929997390103032108613958485632940463331126822640437266343855262323334129297980895230841410390532139928660167167628290741447473434819019774440177587334588135702831935424653966008157759112025553345522124794171041974783394116700259966521442755142690116123201719074072754171771754179280494241027375280637958355279779065491863300141035057824276840653974650480630672140766421817560543390949378327467080906812417849821917071455342711654516017976181839843247324833917935489269221905976487574179102333976893931406134002086628426495954362269481698789166699856231984625412729126034454108114612048238778402753037816432365697497249318133397097752366684908668122202868962033190860464406218075177311260040245782645835450453555318513305827213636000541340702108011700376494018463013111625057058658771732189167380930310140016081355495860225996499221161171742344548076452323884813106376581918828390132602543773302228169373217555292372303641034536888079175606756356853699846255171074659583093240327166294714045723482179278493489466437038005261146916482036821565631924663215928272821233009808118904562789434374729940564330187716969755094535025623346884799427414620117057456069412120126627013834393086601169045209268374171211425059460809076773013845390169564381974705065896467500921637648611591553136400690319601093408301597247973059782625274182894045486043992623433299382804448545026041855500162930703833435216844350061116286002508561408004973316557881705878127496408894790491532896542289031939711360026042127188000292942232504019069575515633776642287015184352787561679545207699664220247164666184384826471322461478171039287880833951061791776694836891505844444104962479321293899189101887776768394308377443930215539868080552137148036121556708517269000154319865802497113559732700000455837336701087346099346600974943794790842046560659724163058614737400042299532832554688105814669703940670282047576612911861103707651399016720024199694432761330826064917433151180912981584654646954546043780988760064126522229023916400735780222393066778677690164502653178102776240763539072797802251880218261466243250327237813083270250852406994034060766266566898500113419221060308637646685139066896027126214381000180298838277474861892417277597264199402643063107347529216558280746942320385970097720903596357688989262148459530565504515064460233649792486375624204239450899961316531242897595428811536376404089689866866994125082531663823530602310225195555648245166232279959281194125627461852207291046120412123069143549165688533459681058731611021029206499233955103535733716867086195229018472298461719963123704004880027517438856685245979884104491183409262160088307060602550314528918330754541028978886405484623902317785759641806462172549420830400669563096054249561310295120713929199905786048180605243943206673684833684788186174716904587990132015281202249818040922330765432172479531389783425997351478521425195753285847079695218980185271795440792533936204760997379799357478648982442986424535043160470393343767052768199909931734104636286862268411263357752828293397653687321803197968615920150013387006168649211778447618879063943614973837128205697194696809062331167880481104049207499327646014974368811303552293309240357894754470599365539538390984708621398498536446183038056149903669182809171532625318794177314929979978628803442852914565991660929674580546092161722713069484055716160405349127277251208020493277171054480824491120269389445916701594711996199694542242870342500090985850858751683770178603024915158602833567885103079171683623013538651585586876751976261594343685794274489468020441916712799004080528162964276197844124281680260604923637878247164688198720233809261982216375138622257213685327968615829580422104429583967745332280225286052434022945602020812481127632427113208008960489699774596334533389427580461499245343828964229115323188641537440890001134470812546859369581938773045067229910137319580688625963082220385707583197361545336264647185081315826651007346907898512277807074289147518032931666442225751334050985948207045777203629059439885255410024508057758630695506450019751868703855590434515881244940577119427200135054775977789582924533802787391823022197376774498687866660477754787863278353177260827397418522642818365341857317241828344481088479426136298782255354427581107926192021227353067301711086962043236500284179902048138887142760510673381434578418459041992731690750845365173394311593043205780251833182725519032442235823341796634485865963854811583444963771877067420109760378517152222406152798692588411437425645755353901926556315845297834299637396499238744507017178731422724045319265500257448415982311412330626911558972968190740106322082060383239377639049066187616500844617209097145958141192298249792193299914411523676777471670771953819495072584320013950015405277531416372965571994718046651398701461733859570961809926738914050784805153902481682223710074907781125785796885279114100374079505962786267435143253509561226780498457585984473079905546205521592149082563025942489683927937986880436580449409240885602116370726026566781412796552371776135565222986882763277964533309384751649637768049875551356392869665874899011348202494045745873348432585869428618081271636521837311686186920807490609884496586793149781647297990811224624321666870145522617826535108068688903694546841763560875827082976301660545908968632692295268179140480398103726563543601817263149697192947866896439921790817398856119908838270990243742021276883816393452364381499363125145501919615981411593895183082310889437786907596410166861811247643948458461114556557434414498438221820219443527168774748989473453575007271735677566962069674077889515209865888629314760484932401555995863134497824038559107445314699342145998755417391351579489505363865493808786817995302011514445214313849391754088821519557124441050137566128779703394240089551210990741640918346448120434038215993493539454133293234758728632630932197478995128836656978707055171537829279832598897742223512538780630002371687097174185995184714945631435359643343764879081343251324633210134638261171468450650986451390041460947332758838787138756206894590802664918073572261832170175113809875953915720603500472665399569786079832774048473460243997353224020830618411579291508792237967379406489555295127493350478889159147400658807975450249489647165391782797691503436944333388730698597462589568072716723927406425340822082567470003128556492416777424166695024076914389325406345786248797127531050096068601616587690407653135224548678157270379565387206811354239908552464929078948360372676457119489222411389806132868695155704960757995667783578357294671758461873381177200636697684640216886662684475838095797590783189629097954850358018504430470393038189808005139722948447226689993747023533073372842511544065034326774157055555273604369241698935822286552784383548926909047570783989672797877179957379158023017817626621348305649350934850834002321714157324110249801490250431288642552737060847879550843328984147022487663172465588481630795033849804419105899677219830593092471958883135398602340619512752787625560136531028763299845411201590594009137456021583611114515606561406101182725011172016468922232132548687129853584458310426787281935756006929613197852942233011244236811742999982729325969805393662199561856262470727953420296118002356945319918624344733235303397860079941140054896457313172601598280086763707979982598658729568376910361466610996998786160725036638225443264106943147896161339327401078504195231228046256132013605388846450234815149239323432328041926676032671691208374242584320863528303501051697881298348019067483901236391767084421419281824132503081451661403615108014867183524471445495446223883493955903654669430574982376880169519251588533182226602171343278909052239593969383813964918746810956400397414858096890007662236223731168444067991744920369444569883184073061385892289302468217549051402669001839140766756265751089857704285077382688585811046020020415727872898285486733505776210971922094856960804257884230033195433411636244991048760871915725635646503872211069988599645536383715033346875n ); }); });
1 − module ExampleSpec where
2 − 3 − import Test.Hspec
4 − import Example
5 − 6 − spec :: Spec
7 − spec = do
8 − it "tests" $ do
9 − fib 0 `shouldBe` 0
10 − fib 1 `shouldBe` 1
11 − fib 2 `shouldBe` 1
12 − fib 3 `shouldBe` 2
13 − fib 4 `shouldBe` 3
14 − fib 5 `shouldBe` 5
15 − fib 6 `shouldBe` 8
16 − fib 7 `shouldBe` 13
17 − fib 8 `shouldBe` 21
18 − fib 9 `shouldBe` 34
19 − fib 1000 `shouldBe` 43466557686937456435688527675040625802564660517371780402481729089536555417949051890403879840079255169295922593080322634775209689623239873322471161642996440906533187938298969649928516003704476137795166849228875
20 − fib 100000 `shouldBe` 2597406934722172416615503402127591541488048538651769658472477070395253454351127368626555677283671674475463758722307443211163839947387509103096569738218830449305228763853133492135302679278956701051276578271635608073050532200243233114383986516137827238124777453778337299916214634050054669860390862750996639366409211890125271960172105060300350586894028558103675117658251368377438684936413457338834365158775425371912410500332195991330062204363035213756525421823998690848556374080179251761629391754963458558616300762819916081109836526352995440694284206571046044903805647136346033000520852277707554446794723709030979019014860432846819857961015951001850608264919234587313399150133919932363102301864172536477136266475080133982431231703431452964181790051187957316766834979901682011849907756686456845066287392485603914047605199550066288826345877189410680370091879365001733011710028310473947456256091444932821374855573864080579813028266640270354294412104919995803131876805899186513425175959911520563155337703996941035518275274919959802257507902037798103089922984996304496255814045517000250299764322193462165366210841876745428298261398234478366581588040819003307382939500082132009374715485131027220817305432264866949630987914714362925554252624043999615326979876807510646819068792118299167964409178271868561702918102212679267401362650499784968843680975254700131004574186406448299485872551744746695651879126916993244564817673322257149314967763345846623830333820239702436859478287641875788572910710133700300094229333597292779191409212804901545976262791057055248158884051779418192905216769576608748815567860128818354354292307397810154785701328438612728620176653953444993001980062953893698550072328665131718113588661353747268458543254898113717660519461693791688442534259478126310388952047956594380715301911253964847112638900713362856910155145342332944128435722099628674611942095166100230974070996553190050815866991144544264788287264284501725332048648319457892039984893823636745618220375097348566847433887249049337031633826571760729778891798913667325190623247118037280173921572390822769228077292456662750538337500692607721059361942126892030256744356537800831830637593334502350256972906515285327194367756015666039916404882563967693079290502951488693413799125174856667074717514938979038653338139534684837808612673755438382110844897653836848318258836339917310455850905663846202501463131183108742907729262215943020429159474030610183981685506695026197376150857176119947587572212987205312060791864980361596092339594104118635168854883911918517906151156275293615849000872150192226511785315089251027528045151238603792184692121533829287136924321527332714157478829590260157195485316444794546750285840236000238344790520345108033282013803880708980734832620122795263360677366987578332625485944906021917368867786241120562109836985019729017715780112040458649153935115783499546100636635745448508241888279067531359950519206222976015376529797308588164873117308237059828489404487403932053592935976454165560795472477862029969232956138971989467942218727360512336559521133108778758228879597580320459608479024506385194174312616377510459921102486879496341706862092908893068525234805692599833377510390101316617812305114571932706629167125446512151746802548190358351688971707570677865618800822034683632101813026232996027599403579997774046244952114531588370357904483293150007246173417355805567832153454341170020258560809166294198637401514569572272836921963229511187762530753402594781448204657460288485500062806934811398276016855584079542162057543557291510641537592939022884356120792643705560062367986544382464373946972471945996555795505838034825597839682776084731530251788951718630722761103630509360074262261717363058613291544024695432904616258691774630578507674937487992329181750163484068813465534370997589353607405172909412697657593295156818624747127636468836551757018353417274662607306510451195762866349922848678780591085118985653555434958761664016447588028633629704046289097067736256584300235314749461233912068632146637087844699210427541569410912246568571204717241133378489816764096924981633421176857150311671040068175303192115415611958042570658693127276213710697472226029655524611053715554532499750843275200199214301910505362996007042963297805103066650638786268157658772683745128976850796366371059380911225428835839194121154773759981301921650952140133306070987313732926518169226845063443954056729812031546392324981793780469103793422169495229100793029949237507299325063050942813902793084134473061411643355614764093104425918481363930542369378976520526456347648318272633371512112030629233889286487949209737847861884868260804647319539200840398308008803869049557419756219293922110825766397681361044490024720948340326796768837621396744075713887292863079821849314343879778088737958896840946143415927131757836511457828935581859902923534388888846587452130838137779443636119762839036894595760120316502279857901545344747352706972851454599861422902737291131463782045516225447535356773622793648545035710208644541208984235038908770223039849380214734809687433336225449150117411751570704561050895274000206380497967960402617818664481248547269630823473377245543390519841308769781276565916764229022948181763075710255793365008152286383634493138089971785087070863632205869018938377766063006066757732427272929247421295265000706646722730009956124191409138984675224955790729398495608750456694217771551107346630456603944136235888443676215273928597072287937355966723924613827468703217858459948257514745406436460997059316120596841560473234396652457231650317792833860590388360417691428732735703986803342604670071717363573091122981306903286137122597937096605775172964528263757434075792282180744352908669606854021718597891166333863858589736209114248432178645039479195424208191626088571069110433994801473013100869848866430721216762473119618190737820766582968280796079482259549036328266578006994856825300536436674822534603705134503603152154296943991866236857638062351209884448741138600171173647632126029961408561925599707566827866778732377419444462275399909291044697716476151118672327238679208133367306181944849396607123345271856520253643621964198782752978813060080313141817069314468221189275784978281094367751540710106350553798003842219045508482239386993296926659221112742698133062300073465628498093636693049446801628553712633412620378491919498600097200836727876650786886306933418995225768314390832484886340318940194161036979843833346608676709431643653538430912157815543512852077720858098902099586449602479491970687230765687109234380719509824814473157813780080639358418756655098501321882852840184981407690738507369535377711880388528935347600930338598691608289335421147722936561907276264603726027239320991187820407067412272258120766729040071924237930330972132364184093956102995971291799828290009539147382437802779051112030954582532888721146170133440385939654047806199333224547317803407340902512130217279595753863158148810392952475410943880555098382627633127606718126171022011356181800775400227516734144169216424973175621363128588281978005788832454534581522434937268133433997710512532081478345067139835038332901313945986481820272322043341930929011907832896569222878337497354301561722829115627329468814853281922100752373626827643152685735493223028018101449649009015529248638338885664893002250974343601200814365153625369199446709711126951966725780061891215440222487564601554632812091945824653557432047644212650790655208208337976071465127508320487165271577472325887275761128357592132553934446289433258105028633583669291828566894736223508250294964065798630809614341696830467595174355313224362664207197608459024263017473392225291248366316428006552870975051997504913009859468071013602336440164400179188610853230764991714372054467823597211760465153200163085336319351589645890681722372812310320271897917951272799656053694032111242846590994556380215461316106267521633805664394318881268199494005537068697621855231858921100963441012933535733918459668197539834284696822889460076352031688922002021931318369757556962061115774305826305535862015637891246031220672933992617378379625150999935403648731423208873977968908908369996292995391977217796533421249291978383751460062054967341662833487341011097770535898066498136011395571584328308713940582535274056081011503907941688079197212933148303072638678631411038443128215994936824342998188719768637604496342597524256886188688978980888315865076262604856465004322896856149255063968811404400429503894245872382233543101078691517328333604779262727765686076177705616874050257743749983775830143856135427273838589774133526949165483929721519554793578923866762502745370104660909382449626626935321303744538892479216161188889702077910448563199514826630802879549546453583866307344423753319712279158861707289652090149848305435983200771326653407290662016775706409690183771201306823245333477966660525325490873601961480378241566071271650383582257289215708209369510995890132859490724306183325755201208090007175022022949742801823445413711916298449914722254196594682221468260644961839254249670903104007581488857971672246322887016438403908463856731164308169537326790303114583680575021119639905615169154708510459700542098571797318015564741406172334145847111268547929892443001391468289103679179216978616582489007322033591376706527676521307143985302760988478056216994659655461379174985659739227379416726495377801992098355427866179123126699374730777730569324430166839333011554515542656864937492128687049121754245967831132969248492466744261999033972825674873460201150442228780466124320183016108232183908654771042398228531316559685688005226571474428823317539456543881928624432662503345388199590085105211383124491861802624432195540433985722841341254409411771722156867086291742124053110620522842986199273629406208834754853645128123279609097213953775360023076765694208219943034648783348544492713539450224591334374664937701655605763384697062918725745426505879414630176639760457474311081556747091652708748125267159913793240527304613693961169892589808311906322510777928562071999459487700611801002296132304588294558440952496611158342804908643860880796440557763691857743754025896855927252514563404385217825890599553954627451385454452916761042969267970893580056234501918571489030418495767400819359973218711957496357095967825171096264752068890806407651445893132870767454169607107931692704285168093413311046353506242209810363216771910420786162184213763938194625697286781413636389620123976910465418956806197323148414224550071617215851321302030684176087215892702098879108938081045903397276547326416916845445627600759561367103584575649094430692452532085003091068783157561519847567569191284784654692558665111557913461272425336083635131342183905177154511228464455136016013513228948543271504760839307556100908786096663870612278690274831819331606701484957163004705262228238406266818448788374548131994380387613830128859885264201992286188208499588640888521352501457615396482647451025902530743172956899636499615707551855837165935367125448515089362904567736630035562457374779100987992499146967224041481601289530944015488942613783140087804311431741858071826185149051138744831358439067228949408258286021650288927228387426432786168690381960530155894459451808735197246008221529343980828254126128257157209350985382800738560472910941184006084485235377833503306861977724501886364070344973366473100602018128792886991861824418453968994777259482169137133647470453172979809245844361129618997595696240971845564020511432589591844724920942930301651488713079802102379065536525154780298059407529440513145807551537794861635879901158192019808879694967187448224156836463534326160242632934761634458163890163805123894184523973421841496889262398489648642093409816681494771155177009562669029850101513537599801272501241971119871526593747484778935488777815192931171431167444773882941064615028751327709474504763922874890662989841540259350834035142035136168819248238998027706666916342133424312054507359388616687691188185776118135771332483965209882085982391298606386822804754362408956522921410859852037330544625953261340234864689275060526893755148403298542086991221052597005628576707702567695300978970046408920009852106980295419699802138053295798159478289934443245491565327845223840551240445208226435420656313310702940722371552770504263482073984454889589248861397657079145414427653584572951329719091947694411910966797474262675590953832039169673494261360032263077428684105040061351052194413778158095005714526846009810352109249040027958050736436961021241137739717164869525493114805040126568351268829598413983222676377804500626507241731757395219796890754825199329259649801627068665658030178877405615167159731927320479376247375505855052839660294566992522173600874081212014209071041937598571721431338017425141582491824710905084715977249417049320254165239323233258851588893337097136310892571531417761978326033750109026284066415801371359356529278088456305951770081443994114674291850360748852366654744869928083230516815711602911836374147958492100860528981469547750812338896943152861021202736747049903930417035171342126923486700566627506229058636911882228903170510305406882096970875545329369434063981297696478031825451642178347347716471058423238594580183052756213910186997604305844068665712346869679456044155742100039179758348979935882751881524675930878928159243492197545387668305684668420775409821781247053354523194797398953320175988640281058825557698004397120538312459428957377696001857497335249965013509368925958021863811725906506436882127156815751021712900765992750370228283963962915973251173418586721023497317765969454283625519371556009143680329311962842546628403142444370648432390374906410811300792848955767243481200090309888457270907750873638873299642555050473812528975962934822878917619920725138309388288292510416837622758204081918933603653875284116785703720989718832986921927816629675844580174911809119663048187434155067790863948831489241504300476704527971283482211522202837062857314244107823792513645086677566622804977211397140621664116324756784216612961477109018826094677377686406176721484293894976671380122788941309026553511096118347012565197540807095384060916863936906673786627209429434264260402902158317345003727462588992622049877121178405563348492490326003508569099382392777297498413565614830788262363322368380709822346012274241379036473451735925215754757160934270935192901723954921426490691115271523338109124042812102893738488167358953934508930697715522989199698903885883275409044300321986834003470271220020159699371690650330547577095398748580670024491045504890061727189168031394528036165633941571334637222550477547460756055024108764382121688848916940371258901948490685379722244562009483819491532724502276218589169507405794983759821006604481996519360110261576947176202571702048684914616894068404140833587562118319210838005632144562018941505945780025318747471911604840677997765414830622179069330853875129298983009580277554145435058768984944179136535891620098725222049055183554603706533183176716110738009786625247488691476077664470147193074476302411660335671765564874440577990531996271632972009109449249216456030618827772947750764777446452586328919159107444252320082918209518021083700353881330983215894608680127954224752071924134648334963915094813097541433244209299930751481077919002346128122330161799429930618800533414550633932139339646861616416955220216447995417243171165744471364197733204899365074767844149929548073025856442942381787641506492878361767978677158510784235702640213388018875601989234056868423215585628508645525258377010620532224244987990625263484010774322488172558602233302076399933854152015343847725442917895130637050320444917797752370871958277976799686113626532291118629631164685159934660693460557545956063155830033697634000276685151293843638886090828376141157732003527565158745906567025439437931104838571313294490604926582363108949535090082673154497226396648088618041573977888472892174618974189721700770009862449653759012727015227634510874906948012210684952063002519011655963580552429180205586904259685261047412834518466736938580027700252965356366721619883672428226933950325930390994583168665542234654857020875504617520521853721567282679903418135520602999895366470106557900532129541336924472492212436324523042895188461779122338069674233980694887270587503389228395095135209123109258159006960395156367736067109050566299603571876423247920752836160805597697778756476767210521222327184821484446631261487584226092608875764331731023263768864822594691211032367737558122133470556805958008310127481673962019583598023967414489867276845869819376783757167936723213081586191045995058970991064686919463448038574143829629547131372173669836184558144505748676124322451519943362182916191468026091121793001864788050061351603144350076189213441602488091741051232290357179205497927970924502479940842696158818442616163780044759478212240873204124421169199805572649118243661921835714762891425805771871743688000324113008704819373962295017143090098476927237498875938639942530595331607891618810863505982444578942799346514915952884869757488025823353571677864826828051140885429732788197765736966005727700162592404301688659946862983717270595809808730901820120931003430058796552694788049809205484305467611034654748067290674399763612592434637719995843862812391985470202414880076880818848087892391591369463293113276849329777201646641727587259122354784480813433328050087758855264686119576962172239308693795757165821852416204341972383989932734803429262340722338155102209101262949249742423271698842023297303260161790575673111235465890298298313115123607606773968998153812286999642014609852579793691246016346088762321286205634215901479188632194659637483482564291616278532948239313229440231043277288768139550213348266388687453259281587854503890991561949632478855035090289390973718988003999026132015872678637873095678109625311008054489418857983565902063680699643165033912029944327726770869305240718416592070096139286401966725750087012218149733133695809600369751764951350040285926249203398111014953227533621844500744331562434532484217986108346261345897591234839970751854223281677187215956827243245910829019886390369784542622566912542747056097567984857136623679023878478161201477982939080513150258174523773529510165296934562786122241150783587755373348372764439838082000667214740034466322776918936967612878983488942094688102308427036452854504966759697318836044496702853190637396916357980928865719935397723495486787180416401415281489443785036291071517805285857583987711145474240156416477194116391354935466755593592608849200546384685403028080936417250583653368093407225310820844723570226809826951426162451204040711501448747856199922814664565893938488028643822313849852328452360667045805113679663751039248163336173274547275775636810977344539275827560597425160705468689657794530521602315939865780974801515414987097778078705357058008472376892422189750312758527140173117621279898744958406199843913365680297721208751934988504499713914285158032324823021340630312586072624541637765234505522051086318285359658520708173392709566445011404055106579055037417780393351658360904543047721422281816832539613634982525215232257690920254216409657452618066051777901592902884240599998882753691957540116954696152270401280857579766154722192925655963991820948894642657512288766330302133746367449217449351637104725732980832812726468187759356584218383594702792013663907689741738962252575782663990809792647011407580367850599381887184560094695833270775126181282015391041773950918244137561999937819240362469558235924171478702779448443108751901807414110290370706052085162975798361754251041642244867577350756338018895379263183389855955956527857227926155524494739363665533904528656215464288343162282921123290451842212532888101415884061619939195042230059898349966569463580186816717074818823215848647734386780911564660755175385552224428524049468033692299989300783900020690121517740696428573930196910500988278523053797637940257968953295112436166778910585557213381789089945453947915927374958600268237844486872037243488834616856290097850532497036933361942439802882364323553808208003875741710969289725499878566253048867033095150518452126944989251596392079421452606508516052325614861938282489838000815085351564642761700832096483117944401971780149213345335903336672376719229722069970766055482452247416927774637522135201716231722137632445699154022395494158227418930589911746931773776518735850032318014432883916374243795854695691221774098948611515564046609565094538115520921863711518684562543275047870530006998423140180169421109105925493596116719457630962328831271268328501760321771680400249657674186927113215573270049935709942324416387089242427584407651215572676037924765341808984312676941110313165951429479377670698881249643421933287404390485538222160837088907598277390184204138197811025854537088586701450623578513960109987476052535450100439353062072439709976445146790993381448994644609780957731953604938734950026860564555693224229691815630293922487606470873431166384205442489628760213650246991893040112513103835085621908060270866604873585849001704200923929789193938125116798421788115209259130435572321635660895603514383883939018953166274355609970015699780289236362349895374653428746875
1 + describe("tests",()=>{
2 + it("fib 0 -> 0",()=>{
3 + assert.strictEqual( fib(0), 0n );
4 + });
5 + it("fib 1 -> 1",()=>{
6 + assert.strictEqual( fib(1), 1n );
7 + });
8 + it("fib 2 -> 1",()=>{
9 + assert.strictEqual( fib(2), 1n );
10 + });
11 + it("fib 3 -> 2",()=>{
12 + assert.strictEqual( fib(3), 2n );
13 + });
14 + it("fib 4 -> 3",()=>{
15 + assert.strictEqual( fib(4), 3n );
16 + });
17 + it("ib 5 -> 5",()=>{
18 + assert.strictEqual( fib(5), 5n );
19 + });
20 + it("fib 6 -> 8",()=>{
21 + assert.strictEqual( fib(6), 8n );
22 + });
23 + it("fib 7 -> 3",()=>{
24 + assert.strictEqual( fib(7), 13n );
25 + });
26 + it("fib 8 -> 21",()=>{
27 + assert.strictEqual( fib(8), 21n );
28 + });
29 + it("fib 9 -> 34",()=>{
30 + assert.strictEqual( fib(9), 34n );
31 + });
32 + it("fib 1 000 -> bignum",()=>{
33 + assert.strictEqual( fib(1_000), 43466557686937456435688527675040625802564660517371780402481729089536555417949051890403879840079255169295922593080322634775209689623239873322471161642996440906533187938298969649928516003704476137795166849228875n );
34 + });
35 + it("fib 100 000 -> hugenum",()=>{
36 + assert.strictEqual( fib(100_000), 2597406934722172416615503402127591541488048538651769658472477070395253454351127368626555677283671674475463758722307443211163839947387509103096569738218830449305228763853133492135302679278956701051276578271635608073050532200243233114383986516137827238124777453778337299916214634050054669860390862750996639366409211890125271960172105060300350586894028558103675117658251368377438684936413457338834365158775425371912410500332195991330062204363035213756525421823998690848556374080179251761629391754963458558616300762819916081109836526352995440694284206571046044903805647136346033000520852277707554446794723709030979019014860432846819857961015951001850608264919234587313399150133919932363102301864172536477136266475080133982431231703431452964181790051187957316766834979901682011849907756686456845066287392485603914047605199550066288826345877189410680370091879365001733011710028310473947456256091444932821374855573864080579813028266640270354294412104919995803131876805899186513425175959911520563155337703996941035518275274919959802257507902037798103089922984996304496255814045517000250299764322193462165366210841876745428298261398234478366581588040819003307382939500082132009374715485131027220817305432264866949630987914714362925554252624043999615326979876807510646819068792118299167964409178271868561702918102212679267401362650499784968843680975254700131004574186406448299485872551744746695651879126916993244564817673322257149314967763345846623830333820239702436859478287641875788572910710133700300094229333597292779191409212804901545976262791057055248158884051779418192905216769576608748815567860128818354354292307397810154785701328438612728620176653953444993001980062953893698550072328665131718113588661353747268458543254898113717660519461693791688442534259478126310388952047956594380715301911253964847112638900713362856910155145342332944128435722099628674611942095166100230974070996553190050815866991144544264788287264284501725332048648319457892039984893823636745618220375097348566847433887249049337031633826571760729778891798913667325190623247118037280173921572390822769228077292456662750538337500692607721059361942126892030256744356537800831830637593334502350256972906515285327194367756015666039916404882563967693079290502951488693413799125174856667074717514938979038653338139534684837808612673755438382110844897653836848318258836339917310455850905663846202501463131183108742907729262215943020429159474030610183981685506695026197376150857176119947587572212987205312060791864980361596092339594104118635168854883911918517906151156275293615849000872150192226511785315089251027528045151238603792184692121533829287136924321527332714157478829590260157195485316444794546750285840236000238344790520345108033282013803880708980734832620122795263360677366987578332625485944906021917368867786241120562109836985019729017715780112040458649153935115783499546100636635745448508241888279067531359950519206222976015376529797308588164873117308237059828489404487403932053592935976454165560795472477862029969232956138971989467942218727360512336559521133108778758228879597580320459608479024506385194174312616377510459921102486879496341706862092908893068525234805692599833377510390101316617812305114571932706629167125446512151746802548190358351688971707570677865618800822034683632101813026232996027599403579997774046244952114531588370357904483293150007246173417355805567832153454341170020258560809166294198637401514569572272836921963229511187762530753402594781448204657460288485500062806934811398276016855584079542162057543557291510641537592939022884356120792643705560062367986544382464373946972471945996555795505838034825597839682776084731530251788951718630722761103630509360074262261717363058613291544024695432904616258691774630578507674937487992329181750163484068813465534370997589353607405172909412697657593295156818624747127636468836551757018353417274662607306510451195762866349922848678780591085118985653555434958761664016447588028633629704046289097067736256584300235314749461233912068632146637087844699210427541569410912246568571204717241133378489816764096924981633421176857150311671040068175303192115415611958042570658693127276213710697472226029655524611053715554532499750843275200199214301910505362996007042963297805103066650638786268157658772683745128976850796366371059380911225428835839194121154773759981301921650952140133306070987313732926518169226845063443954056729812031546392324981793780469103793422169495229100793029949237507299325063050942813902793084134473061411643355614764093104425918481363930542369378976520526456347648318272633371512112030629233889286487949209737847861884868260804647319539200840398308008803869049557419756219293922110825766397681361044490024720948340326796768837621396744075713887292863079821849314343879778088737958896840946143415927131757836511457828935581859902923534388888846587452130838137779443636119762839036894595760120316502279857901545344747352706972851454599861422902737291131463782045516225447535356773622793648545035710208644541208984235038908770223039849380214734809687433336225449150117411751570704561050895274000206380497967960402617818664481248547269630823473377245543390519841308769781276565916764229022948181763075710255793365008152286383634493138089971785087070863632205869018938377766063006066757732427272929247421295265000706646722730009956124191409138984675224955790729398495608750456694217771551107346630456603944136235888443676215273928597072287937355966723924613827468703217858459948257514745406436460997059316120596841560473234396652457231650317792833860590388360417691428732735703986803342604670071717363573091122981306903286137122597937096605775172964528263757434075792282180744352908669606854021718597891166333863858589736209114248432178645039479195424208191626088571069110433994801473013100869848866430721216762473119618190737820766582968280796079482259549036328266578006994856825300536436674822534603705134503603152154296943991866236857638062351209884448741138600171173647632126029961408561925599707566827866778732377419444462275399909291044697716476151118672327238679208133367306181944849396607123345271856520253643621964198782752978813060080313141817069314468221189275784978281094367751540710106350553798003842219045508482239386993296926659221112742698133062300073465628498093636693049446801628553712633412620378491919498600097200836727876650786886306933418995225768314390832484886340318940194161036979843833346608676709431643653538430912157815543512852077720858098902099586449602479491970687230765687109234380719509824814473157813780080639358418756655098501321882852840184981407690738507369535377711880388528935347600930338598691608289335421147722936561907276264603726027239320991187820407067412272258120766729040071924237930330972132364184093956102995971291799828290009539147382437802779051112030954582532888721146170133440385939654047806199333224547317803407340902512130217279595753863158148810392952475410943880555098382627633127606718126171022011356181800775400227516734144169216424973175621363128588281978005788832454534581522434937268133433997710512532081478345067139835038332901313945986481820272322043341930929011907832896569222878337497354301561722829115627329468814853281922100752373626827643152685735493223028018101449649009015529248638338885664893002250974343601200814365153625369199446709711126951966725780061891215440222487564601554632812091945824653557432047644212650790655208208337976071465127508320487165271577472325887275761128357592132553934446289433258105028633583669291828566894736223508250294964065798630809614341696830467595174355313224362664207197608459024263017473392225291248366316428006552870975051997504913009859468071013602336440164400179188610853230764991714372054467823597211760465153200163085336319351589645890681722372812310320271897917951272799656053694032111242846590994556380215461316106267521633805664394318881268199494005537068697621855231858921100963441012933535733918459668197539834284696822889460076352031688922002021931318369757556962061115774305826305535862015637891246031220672933992617378379625150999935403648731423208873977968908908369996292995391977217796533421249291978383751460062054967341662833487341011097770535898066498136011395571584328308713940582535274056081011503907941688079197212933148303072638678631411038443128215994936824342998188719768637604496342597524256886188688978980888315865076262604856465004322896856149255063968811404400429503894245872382233543101078691517328333604779262727765686076177705616874050257743749983775830143856135427273838589774133526949165483929721519554793578923866762502745370104660909382449626626935321303744538892479216161188889702077910448563199514826630802879549546453583866307344423753319712279158861707289652090149848305435983200771326653407290662016775706409690183771201306823245333477966660525325490873601961480378241566071271650383582257289215708209369510995890132859490724306183325755201208090007175022022949742801823445413711916298449914722254196594682221468260644961839254249670903104007581488857971672246322887016438403908463856731164308169537326790303114583680575021119639905615169154708510459700542098571797318015564741406172334145847111268547929892443001391468289103679179216978616582489007322033591376706527676521307143985302760988478056216994659655461379174985659739227379416726495377801992098355427866179123126699374730777730569324430166839333011554515542656864937492128687049121754245967831132969248492466744261999033972825674873460201150442228780466124320183016108232183908654771042398228531316559685688005226571474428823317539456543881928624432662503345388199590085105211383124491861802624432195540433985722841341254409411771722156867086291742124053110620522842986199273629406208834754853645128123279609097213953775360023076765694208219943034648783348544492713539450224591334374664937701655605763384697062918725745426505879414630176639760457474311081556747091652708748125267159913793240527304613693961169892589808311906322510777928562071999459487700611801002296132304588294558440952496611158342804908643860880796440557763691857743754025896855927252514563404385217825890599553954627451385454452916761042969267970893580056234501918571489030418495767400819359973218711957496357095967825171096264752068890806407651445893132870767454169607107931692704285168093413311046353506242209810363216771910420786162184213763938194625697286781413636389620123976910465418956806197323148414224550071617215851321302030684176087215892702098879108938081045903397276547326416916845445627600759561367103584575649094430692452532085003091068783157561519847567569191284784654692558665111557913461272425336083635131342183905177154511228464455136016013513228948543271504760839307556100908786096663870612278690274831819331606701484957163004705262228238406266818448788374548131994380387613830128859885264201992286188208499588640888521352501457615396482647451025902530743172956899636499615707551855837165935367125448515089362904567736630035562457374779100987992499146967224041481601289530944015488942613783140087804311431741858071826185149051138744831358439067228949408258286021650288927228387426432786168690381960530155894459451808735197246008221529343980828254126128257157209350985382800738560472910941184006084485235377833503306861977724501886364070344973366473100602018128792886991861824418453968994777259482169137133647470453172979809245844361129618997595696240971845564020511432589591844724920942930301651488713079802102379065536525154780298059407529440513145807551537794861635879901158192019808879694967187448224156836463534326160242632934761634458163890163805123894184523973421841496889262398489648642093409816681494771155177009562669029850101513537599801272501241971119871526593747484778935488777815192931171431167444773882941064615028751327709474504763922874890662989841540259350834035142035136168819248238998027706666916342133424312054507359388616687691188185776118135771332483965209882085982391298606386822804754362408956522921410859852037330544625953261340234864689275060526893755148403298542086991221052597005628576707702567695300978970046408920009852106980295419699802138053295798159478289934443245491565327845223840551240445208226435420656313310702940722371552770504263482073984454889589248861397657079145414427653584572951329719091947694411910966797474262675590953832039169673494261360032263077428684105040061351052194413778158095005714526846009810352109249040027958050736436961021241137739717164869525493114805040126568351268829598413983222676377804500626507241731757395219796890754825199329259649801627068665658030178877405615167159731927320479376247375505855052839660294566992522173600874081212014209071041937598571721431338017425141582491824710905084715977249417049320254165239323233258851588893337097136310892571531417761978326033750109026284066415801371359356529278088456305951770081443994114674291850360748852366654744869928083230516815711602911836374147958492100860528981469547750812338896943152861021202736747049903930417035171342126923486700566627506229058636911882228903170510305406882096970875545329369434063981297696478031825451642178347347716471058423238594580183052756213910186997604305844068665712346869679456044155742100039179758348979935882751881524675930878928159243492197545387668305684668420775409821781247053354523194797398953320175988640281058825557698004397120538312459428957377696001857497335249965013509368925958021863811725906506436882127156815751021712900765992750370228283963962915973251173418586721023497317765969454283625519371556009143680329311962842546628403142444370648432390374906410811300792848955767243481200090309888457270907750873638873299642555050473812528975962934822878917619920725138309388288292510416837622758204081918933603653875284116785703720989718832986921927816629675844580174911809119663048187434155067790863948831489241504300476704527971283482211522202837062857314244107823792513645086677566622804977211397140621664116324756784216612961477109018826094677377686406176721484293894976671380122788941309026553511096118347012565197540807095384060916863936906673786627209429434264260402902158317345003727462588992622049877121178405563348492490326003508569099382392777297498413565614830788262363322368380709822346012274241379036473451735925215754757160934270935192901723954921426490691115271523338109124042812102893738488167358953934508930697715522989199698903885883275409044300321986834003470271220020159699371690650330547577095398748580670024491045504890061727189168031394528036165633941571334637222550477547460756055024108764382121688848916940371258901948490685379722244562009483819491532724502276218589169507405794983759821006604481996519360110261576947176202571702048684914616894068404140833587562118319210838005632144562018941505945780025318747471911604840677997765414830622179069330853875129298983009580277554145435058768984944179136535891620098725222049055183554603706533183176716110738009786625247488691476077664470147193074476302411660335671765564874440577990531996271632972009109449249216456030618827772947750764777446452586328919159107444252320082918209518021083700353881330983215894608680127954224752071924134648334963915094813097541433244209299930751481077919002346128122330161799429930618800533414550633932139339646861616416955220216447995417243171165744471364197733204899365074767844149929548073025856442942381787641506492878361767978677158510784235702640213388018875601989234056868423215585628508645525258377010620532224244987990625263484010774322488172558602233302076399933854152015343847725442917895130637050320444917797752370871958277976799686113626532291118629631164685159934660693460557545956063155830033697634000276685151293843638886090828376141157732003527565158745906567025439437931104838571313294490604926582363108949535090082673154497226396648088618041573977888472892174618974189721700770009862449653759012727015227634510874906948012210684952063002519011655963580552429180205586904259685261047412834518466736938580027700252965356366721619883672428226933950325930390994583168665542234654857020875504617520521853721567282679903418135520602999895366470106557900532129541336924472492212436324523042895188461779122338069674233980694887270587503389228395095135209123109258159006960395156367736067109050566299603571876423247920752836160805597697778756476767210521222327184821484446631261487584226092608875764331731023263768864822594691211032367737558122133470556805958008310127481673962019583598023967414489867276845869819376783757167936723213081586191045995058970991064686919463448038574143829629547131372173669836184558144505748676124322451519943362182916191468026091121793001864788050061351603144350076189213441602488091741051232290357179205497927970924502479940842696158818442616163780044759478212240873204124421169199805572649118243661921835714762891425805771871743688000324113008704819373962295017143090098476927237498875938639942530595331607891618810863505982444578942799346514915952884869757488025823353571677864826828051140885429732788197765736966005727700162592404301688659946862983717270595809808730901820120931003430058796552694788049809205484305467611034654748067290674399763612592434637719995843862812391985470202414880076880818848087892391591369463293113276849329777201646641727587259122354784480813433328050087758855264686119576962172239308693795757165821852416204341972383989932734803429262340722338155102209101262949249742423271698842023297303260161790575673111235465890298298313115123607606773968998153812286999642014609852579793691246016346088762321286205634215901479188632194659637483482564291616278532948239313229440231043277288768139550213348266388687453259281587854503890991561949632478855035090289390973718988003999026132015872678637873095678109625311008054489418857983565902063680699643165033912029944327726770869305240718416592070096139286401966725750087012218149733133695809600369751764951350040285926249203398111014953227533621844500744331562434532484217986108346261345897591234839970751854223281677187215956827243245910829019886390369784542622566912542747056097567984857136623679023878478161201477982939080513150258174523773529510165296934562786122241150783587755373348372764439838082000667214740034466322776918936967612878983488942094688102308427036452854504966759697318836044496702853190637396916357980928865719935397723495486787180416401415281489443785036291071517805285857583987711145474240156416477194116391354935466755593592608849200546384685403028080936417250583653368093407225310820844723570226809826951426162451204040711501448747856199922814664565893938488028643822313849852328452360667045805113679663751039248163336173274547275775636810977344539275827560597425160705468689657794530521602315939865780974801515414987097778078705357058008472376892422189750312758527140173117621279898744958406199843913365680297721208751934988504499713914285158032324823021340630312586072624541637765234505522051086318285359658520708173392709566445011404055106579055037417780393351658360904543047721422281816832539613634982525215232257690920254216409657452618066051777901592902884240599998882753691957540116954696152270401280857579766154722192925655963991820948894642657512288766330302133746367449217449351637104725732980832812726468187759356584218383594702792013663907689741738962252575782663990809792647011407580367850599381887184560094695833270775126181282015391041773950918244137561999937819240362469558235924171478702779448443108751901807414110290370706052085162975798361754251041642244867577350756338018895379263183389855955956527857227926155524494739363665533904528656215464288343162282921123290451842212532888101415884061619939195042230059898349966569463580186816717074818823215848647734386780911564660755175385552224428524049468033692299989300783900020690121517740696428573930196910500988278523053797637940257968953295112436166778910585557213381789089945453947915927374958600268237844486872037243488834616856290097850532497036933361942439802882364323553808208003875741710969289725499878566253048867033095150518452126944989251596392079421452606508516052325614861938282489838000815085351564642761700832096483117944401971780149213345335903336672376719229722069970766055482452247416927774637522135201716231722137632445699154022395494158227418930589911746931773776518735850032318014432883916374243795854695691221774098948611515564046609565094538115520921863711518684562543275047870530006998423140180169421109105925493596116719457630962328831271268328501760321771680400249657674186927113215573270049935709942324416387089242427584407651215572676037924765341808984312676941110313165951429479377670698881249643421933287404390485538222160837088907598277390184204138197811025854537088586701450623578513960109987476052535450100439353062072439709976445146790993381448994644609780957731953604938734950026860564555693224229691815630293922487606470873431166384205442489628760213650246991893040112513103835085621908060270866604873585849001704200923929789193938125116798421788115209259130435572321635660895603514383883939018953166274355609970015699780289236362349895374653428746875n );
37 + });
38 + it("fib 200 000 -> gargantuannum",()=>{
39 + assert.strictEqual( fib(200_000), 15085683557988938992636878948173134441848416561658689740214300814007875839363948123516190995732093471171781051796266302937774866189506849346804997282989249330595609531388039656501674951902073416282675686754561200874525785650478495872265413273367800711235597082735947816183336948276642243536623243673687653137709786396616593596131209935806463007982171384055659316358464507733861243852413459934417443926921039675036360272864675639374407908082412318246291986517133289505130691422859640541931718590209286465750564440958058698593501452343223936433808865549263390925624340993701901875364566854412634976985363310914966611028208391464770822371375451091438763371418025894341294855631121040642228526766919418069072433195848445930784362588088491909572194728708365539666263098137255830767958717493568606834420525320846163411042908319498384318452793710499043613471398014209198982537539904024638954080366868480568190346431254639643204961745213087536318839695283601715446673606666665117886524931399765276208337463288537773131251108750756205096068672482133243054818126655239593578836887709032159318387668321645414703302374612215409379498205215169804568727320555709112553062891139655572302702943696287370260859239641774127344508295242107705606350459617412156947098736427827456587177013177581482931107215813931583655562846111188339452737408562216970417356954474367646357836770047579714349363918537229775630512391906292199257245684177055398254384561339361240059032004771683110236979742274095091212087886573239889803102442948352264520634417935211386348068898717439271641470846064518805826291167417302637960746320260477303289023345521932215347151804409026447421183429858973401256005212609284636977483396468020797603532714720320796067735030253310010004018892191108744839032913101026883244890018391134322754777428039177402757235024044531132909998555148719529758110694391509970670766825134091462135522008231438438311963865614327695985652085123960764363853506121004650277976974669012431467655262543108545665271997195753751331983006023065033390558715071488056180423480849000879122375472253596279212410119798261160155145391513233256653728899774402724562338640423747275464196304702115047650233920577521289544322435073199810910350817178158268244966795131619967072982140330846222321228491824282670510201925345860118114522297550262881434453491609347909808566366591395767722777171081691994055473565472995683578002917709708728363865996462149559924364151507700393525657768703381090056930715568351735846809360013863191709880114676998804054124152553747131005174745322076228564924764559102615232992118102832157883953206061093181099287329552157297494984983043426928197951655990060841775003398814750333821609052979099965594323363665761937339095477586808571113645523433293021940419185981990656374599024097663144170271345840596027755878233337664256068305902267959269233160738665253093679265611078049139060290958350748010448271317482857597575463444495477649154610573995158301446004829200742260771986218585206481522837685047143133077919181312047395094538114857885380157092654166402431601320838996109513861332688685558512741980682675203120209938330685430458154035110881364380166940417004720187141794009622745357707354123656825690395732682181677684919099902483420129364679843188856568849368929591587350404250453997082875048188619913350899166960552686168651349874831939745877612238633461605762188368322936277762538418210448861023120673681317902706674697123824651055871913821574968702919861340036559533951476404399872470320954218597819528834459776220222578802865085504168793326315042768508239325103570985654583548683651207756898548050108243470642480045092287973725346758236634307224222541981904600814891159816559455821494764255796799398461770459636430249759056664491440112300387936559942982841168920723101155223100265305405420238647542690407813012604895745487631134030630711439909463709370791940485092057983014052297854008336006675705835512685246877983057450878959121900247063666580965237038040046310649184412850601560678313247250805368002003208419435286877778843376164906324167858463453199325465003030875017449863223779731721197227277439712469791691319497617280874461345762405079701281145920923786928592022870327249666210540032339821250395048613742040568163888091658974274179493596127855782278050917582550632122915846324573178758697766743148185600141204716327674342084357578093472267623737852660488357993867599516884141554750520959061533423904223176432204125282567161104340244009884135226785160643196013771658852277787597495841419759144506180967400479569883780567542414918919778859532384177358386991942754709712599731985714984441749561536575562490386177411899440370012571846886712291883050131272894430753792264013728406147395422793887696723304698325689018106772972096309840531652108156678395472244497539941248687671270212915525107158336735057327762557303054123868246520226868237407311857684169071047107910368373953244203778048818923989762413516466019445208846669914404926662825601676280619978300657000574828580226024890159110199111823944688000863538366170791706879326540807799502270441641331982451150245668249506459783196172391505560333289300733518169871416328790546697950341156093595689025802923275594921144827826661889442016578796418979865131234762536903240127617235969899531970391269715325096317902870930969037344026838102673574014796206565001859017241833612303324460962993195164206726208503399510000436770669674520952858448472670330495604183766724952170386711108222512546562536451876975376395267735007470186081953411694831262224862436425418411586354303654855429638878895243031393415442157410387782085267234303543447490011184095163718433009758535053174396139539625900012215908839710462432049100557045791750192360118171842792525089310071573262848590489191827026416713414593805060412959632680415037739534633365772122824645193915887355647270969489492292235438303234094038988295520676741321062638792071858423273499125856381655379335539871897213462359825462268325077299588723721299964102421714731074454168330275986429989053027745797498485145939105574678563258730426847959454949326446831807902188373086350654180751344156757472412473712727485483718546139939320046751379470503273142255334523313764555950505055328692117601067359364493228079858151791493357057340807327695448544764570856047094960286002534608236580039319843507106275308871448740641003605877030943767108981164245755096942553987461741235462847606193457051745814132583812878111716272105631110012612226515807469598373374794066573012701638207641604012501671447676351631288438541816688866829263298200696174735206390921043287445055876054021127915356937870322951062276556644994057393137901937332226863172143363108514141597434327394293612898124066990042010999772738651611066349625519695528500703318537359341796408192249052133382519304289342502719485799110623470808045811873774979692468563253159843101171471720792524869943347096380715922814740042584305499693952932202358566013899141349815840799377877482987583971143783091095466644110045243315081964140346928274136181320264486408257848670698587597597527487480160889602809283301430288690282251222398361301808721230231909201517280524650814043522083037145188231839840060630647682250762345548980202237403968434614588760775466444999777669423159951130814879979408811580824695031917514063743588369274793782365496964570423741096630550500868075881107611662144044219374596304370888597309387100136953362486564571029799982584952010264764331645898911160755707551286416623028075579097061915351190205793344665488825493646460524825712604584897492134197927416672817486245674215488083771283447261139474164913030204482879650795906657986282497118520251579500093139801939046822054042732001787048249557873529490066786371569911391580374407204155817776404460200788044099713581561339505800324399203403850581904538732830790177320871997937370910658482023190521691978617615628037869759332756568196359708793754434531998720447153688144033011364743694218083109432028294084743839976447192736022850230294646392061615339889686994176267492909238403731792022627906581945886319822611046601977681305943651915627115019842180469046938205503205136541161036677364140224182378253842168910983601121105363819428690684520701648681438077633363685813042360192999190816761026460000898739902992779061065482822052261929296684964206427518195528116867280473816324028274294206795845654742466628053155611939733663390173114151831433020533138993194814175097251685809856083669217939376900849081980130487714534118535201364522770797524739006365154925589641324070912310450073852694385897690512554991795320408939147040626329910233108810222003561812823286090123263178979002325729531532177046784338800817913548579645076955839046614926595064953691092582019516764630542699921093636744763429270776861615160320119413159894438004229752482952383540714364746386465378023263248586344739730875053396397709208910500452459151017318488442842520857119223351945169502505759199548690589155698921016688408930787286464422907536165255577180910063382996126621647175411991032250118608385805286720204631129999419223449600910114597057395076953220647064741105994294004538991774500187902216661365794416966273107787418760733818961456086721816519048831395243706902928993114506434908020560825123581070950748974026073160179091298044553630489694174332116470484173132676688643501366705946990778094782082324224180205069433074228985743824027273309502466630745746279487177277884021640858539776127704321293087420277070485915397325920980784253015245346628054933682614539962451247904432597353106047894372149513760437930202606186530720928121273559050992964549357860114486314784205375258266962235311045487148748670168178647438228957765044134396712587459501750593882881063670921342308418722493836950675317574905394803480235523980594129772894338536400297252322289342879096423388055925703013166956445424360723218733077456899992712631929078352763204433066764341998744336949250469607398370767846999693683597083167905239895734609514574169444981913013746919875956791086386668960216237535836026551304978068369285307622024171002680318071601242949695188736024468508741350335858186942030074015526308706268722791504191230656989118508306252111900387571337048229590002151422197500759478331835549275092830995504104113764791718174705131914503246660818337609975129652990475206126083799539927398014708253524121469808750504219399758670160145916261408656099715873174222170002317462122622118472150075146179997078939918012922985151940692189382201388265632553790178347541685837815167787013705261611855169858039720316206856765356568632776321407225473926553603724138787779753995513521677902565183027622290427581916494093086391807992544585438457611917733177694509003712088691924372194350573274592326838727751934030067505784243687387561591344384818779119137159147229524410251466818915389560039468073943045221046453377934489220766694651617321356460656021444779469018819051653203525534871510826343331161350867497988152473284581477853157348576954138218544220824806207124396637244090354697539096354784098727567721384563568647190689413946202420705795233889533141742792114708466118536509969889241852578950774333306826891603513884902615921051241302305057018501353570628249232045775636191102911044444615276196784504408390647665717378011090430949347016640782876882361324144349298654260956708520266861081370672039670568908834668440742298473173527921280843556545305344902163450373205342575134243977426431747476043499077654350851912779536275530024795771538661871475095092412088634756818653411633803370170164120841788803156779631900301445149244218207432839178096780915169749975289519053292340058514564260026234329208199084633616916498563776441841508755264200205314628464037174996819760618068181034674136939404735894644253336972286268456785808561663589980842216080268533112052466827389691524502434709224412008186391849521355105111529252707367854829469426665750596727547904508356257592613936774502699616874392141078516142537240319632245043380144990007474161457470799195529055487197895400652651203355674516926420548610009354329571038400524178961124952055732989916288133799541602967602400896355477954085970099560507247100976234773799851486369730172117719153339881186863571513752138549722229630742310727650899873802362612242483108266905657849271113894595701351246363185792274380794940007330522401742738950009060239834961588495965646090111116033983219501246791676960618352116040562984032254318487297665338380880965062122932284564590932772438949838648556260414067687281779241500643305239898490272273381684836885573401851147212204835447982007020682217742336545993916742855371788930398528669555096059336853864410940574759066094735878796164317014696253163219326563486978261610654960358038758133684097814190881458336053873559158158807908899935942927442543248974144615765408799360290972542995537559896453691328098995106257685132560604128292378600169251260205758979339727374954651484749099559175354738259258519366542902860323319173493006578105019405418768977113450092813989938106835660022826566060645781972913155887803315184337772606229551372076111806438556932563227985120115186954261514653968854707266347296164806853232587587661223957496824912782523239963177005125744160791020149701901648467685740970451406930600825449707686622028628568122925803362005986151104285902641008193542214537979763781776526172148280961634110436802526294941574515933869837983297672185145999110584547632284725151493878478120165476797858226459462127625766429340231776101191568792673334210167191762136501990088992041526750439463289449699179662254749956392546045930468526202817326337771016281108149064785446482161599261343922898500211811354213492192155006249528404004510461233363727508505630538707720264579437140757821086980173563895322165038912863281665857525620387784059555046108716591907361766566143194287219189396153918731512366891821504469159793434008645505820059381104910334463402881580236576548382345299213216348628343551913418018734081712452805528216109448828270738875106835540387770939048814742045890751748149765127052071154886358660646594873213557092872808726656038937306295043843584078686897792467509743578982962680749654747674750097551345314590195297716691808059794318225578814282965222186680471104466252818197111387659632551641787724355795798958913380959239396918763521166108125135373527448473786463598960380328155567178779165866449298706521648749654925831719740807966386403326579734302799180848116793084276902936965263360222702067432628593803858538385467622216937469500521296073979010789475191015682716088542214904982608451992145278954414234686662888023892239963648424155045981363101519942933830397148045520257623788484169205431930628788462473733599900582861077683093979188825187649530578095925519878344593270055228997028220771431959561692072554105738207069578387898385217368629008442546607825770834418425473503255914649886128860249993080805123734786906257143824067728471481889857595246883316057681863160833548224907125969012919559790270011681465806629266829442584822072151295667875158037160597497762827696326948722733287995203624711557612878611423361185816350827129140954950673768281614670530551390151989062994194973688711061637441204187569028438539172773381920903068135723565943679779234417101396271642499303731143841327324906172563894593582182099941033294280284087751252146815392212160369198601154802976039059370882676446186589659690707176889364417416024837705107328570684296847910693622408465372635239225468925746254495427551802623986102462952122332591500307952028148601775601750690405480177616864004577188678103698167827563101747027255030746360667150851438551600782270892223938175332698249142403834443433317482218749937323841604222532381572786791170359529286742124777727198841461883849894989108155947603213775901273261108198069507878709457155697824630494318808148644272409997666663162117346043218805693413821678211258441939383881481031477048418800798883438722303153079107547817378859627801431640765366404707214513484689596271814621976810689216723830334837445731105110850145206136745507185611624526084931395121750417802257974283984291503802572446081034289275598842636877435291618484115526561437360847928868402693349920253621274431616533447533140061250632890985479864395031008880928254452239806323286817523829269293312241694490914043953706569260753593015900667487872253432300569678753325970618440744461716960777739013946260415180905522690441172976312704408691680522744622102038710475490884897877750806320366769033764145483088970037705641733443499261566659954367936941969713173124678603421789728015110700850921029950066080278596249824509066896437304912129712498010973237316466610034184894291099012256045628951948359087515510198364259207352833665006461711865024445416322519076373997709496212552570040146257031346043121301607968731560365178054128419447128867763716716081960623903373119939944053469325172967609072929187927895064596281080544214628194157722060552622388751547569379342417571113495169747328084399200597086216210813136296114969583389355331493695134106179030867951626720184238132745776867105071814697145510081156763333259184854200327465733208960871787417731720708225511419133939335724780169727603918889607389966383053587271802192092263501688723393502563947343252171287974780662002472573587706173918093081235391273124090050839876229081932173218389376201133133241031556001772081915191402515259062091007861689637664460648771613726799376107748793894401750311763493764955199226330562742603256162353804072262992857020444216989842611855926137531120325387206092698257603966097045458364223988110069199600543515011046950728114399555493216493263439111323646791309326485132688958700245721695768948068609393875950722685078618847068282541037975041812426387727387282176157706972734550628454039741922555663054606021449699929417970607559170782669866377460272970039937268096284888384826051686578188196782538862971190724120925329212042407625520101644673357031883734219531491371452189925945475370781696035128081522446388339421865411495209789632588538954846369973376132065832351169141752139383636603595748727483042357285145468731616068465970840740720035801703155610510249876529609505423368994839493375252322848837559374307471136852252041980062693769264084165803363585887163815797000034547389319783986573572201962487690018259209068776433532366286551960861731938666660043669600057561047279444655764644827195305214776713021102670775494986626529458979387186608553746375086283965489206208318775179668985843920628790134069777127500393869048150588129379472630630602688829508980060638632590479400800516402764789408081013567436375430877506161426930253853589412649782692638608348348316228391499471733695278063192548880536661732689298627877894947660201648575477486296280991010257241763060252629026193187575360050978773006140204213035202233157042822292910128415882361981249293280758837873697137451280456318776996300322217435023415341233995658520175828364118855876514537810977185620306785770133110488715020268737105647858149645930446814560966002446421647200239324688711533806533310450265766831479044658965379836205397367016291469949864002533499396130444385719094560139930134181382549266154463304953067388280437282102408558513534771639434052739235375619617440444273242500228659589221140224811774029199764282008566413671116251247672553432982151486800263952366947910196303129130934930868465482381591165593101525742649591960723609301553953961880392483435775072480909312638016392700381143201630619253541178615601875860118998959461517450768139463423471712648344390307906587339735652846953799050395996577640478340456068683848504452349835587729868512791262628326985539915496670617047207795190294713756895529111860423587295431711661177392427979167315728471186440870368234239883954591051345828999844185892706497655116676744607482621083571826085260712167914070376017053845082795097663249107262971950908992470571134087134802557892574677222749425515629594235023797178412318247368734124991926842279808185369151870073790534655619276383647522446412360000069619267770739268617158527284406254174079750268475217297474822218136666661688841895607550568367983262108635270500708781257091905398133130665565726444444734220257454768694175011637202918599881581769231215733212308677740258092108688163661721912876069086207858170447572515299135414813701630940434756362872903441709533490051362947411013584438425563157739333434794973404316836193092139501500926978045539180666725805230828582281722610507717870772076419706725305972937564973721829700632241242626449915775251703814337623542754621121712213326151052603410475840031832281554096177333094885026920432104866526181267834110350858195312284472831756911082150045690426825151656110752809109786733872473404305592771168535078140891401294795747836128644368114325243458618830448974533046134814759429372705625113305824864023621749811106063809851335590993964358755886711354020347308876284595515203760376386851829199793400162838393611202358259053993539772997547755538430705500377235077409333026909872678280001781825968150674851389187961751950138741086227437536101486581241065914089624855492790012991448821413350128730917754801580736426821611315175912777527669877468990060258593590609978865160100988658108625375519037190879471014528742520510390334238137958884664347284595704800550571946258297871205115068749805388447464719396401877549696654358323844286383283474208241032617121614671823379423457394629887184446975549355109949576733849408730404962531647313064685691894485131917261061173922163024130069166828056831195717878940592977964100566157312734244396847468032047321250118461232930057576826212437237348718897522689560844248024622250789250951760959709981868617376641878573598090466320024149866105438633859410755547341093820409360532089524213731236426314413238860226442644364380696559212160935933277506242754770958970250669542522718147099411893996999524789974678037032980525474048911461525760717059829525696988198409476005577843549264616701997964939778627979683254874969715305075550866852747360869865560084363957438438884652576378023902186102663314219429792528689771422001429415796156243325940357371859123660536055782384148367005834985670820958270143556554508269804411836611099449611794065945898300579531709835904085060291546503450169521568795533744403636585916487941820527410557633713125331989945242930389695417374812677649123360297977686173868985905856782862139760003243975248921023314435951797377525952163849021752009880788201643371661763590422194003167590269072684536949566882914710464113086896144643900420865847342375906652360377295277746432392409972226773898020021400485175821434227788237636471479303364734335813524332670831990422259043038801116561486025094886374758068613315524924712830477319599640903341014894542041235227143443833944355371877797630154394684355754068528407188495965093775001839513688321615362246861217723211050937080054534564992549040572405556973387163280679480092557884447615165387338475874624464720767966691320543282857198005463835025206388537480664604231368317798826205899470254882365972015551136112489039069677107154161437209897146402617487126658600893008336249040732486942583024689533459844430387679323937936766258169996524484980219975335526702183303593792943713314239944868975189893279218128312280925956758098346681458064904086598072367057773932885760464438548480739829858786154906580262419089664483653218076121119288936387918596692736321370100210533948226561632203556616063106375132938604383885624257060894460159432090363037888239982399574887369967918469137577563512595513131413117915595873160373085315907898967276173401206495889335453212920262843178325286472578486439454874203622951480903897162133534405352363246467215203950446877600182028672622050389812155014076508595424892321255076062575005628191510749985817746977739199475874724490183186918910372306630651938235134733890495074757429420924492887220783012203692575084367225607303735193814756345936461489440308261057076535821691490901973426911471426235226543669165748263034121801562036046914428721968871851099904296623553098405213024102035444486299477768658352481369015753030369029551987302489881870425124767911998014210639340191467909020710687655019483266922860392551881239325760098352465261127128186358045882391313999579321296590453895984160816348787510722631816730099857463553719963120455039569570032982148016677570250631500657495750353757091673667505787871102025452458423447698591556372709950060699767514440215714666201072650539728001477946796350618839134047013600665873298414249441922222986168906498629350156213348243565861005137015747350040746720794360897104632438876664320987792322348380405665283567887277480452135129848260820199368083336001260917620692966197797720272277526880292339554042280201311535412320677290875574319449945136455871651736755475489062119607374771465446959619080295316385187239381274977394248345347786894226405097184042973125759158037796835831297900242165553400600434287665653775840512963334676150936567677433372135857210202473677979561680753246748294601736865925290779787324703860344260852652062753330055977550418600725995700758148863591654758213683658583838010571981209161182212534703445861736146543440072675449400375171102692395491454286611644805199168005699804614398915256482956548007152702883737919894061773294576329231438253929315805515480308968061774431362989927301468812143972722196169191915569835307446391234269912230961384968018434458534190504165296838478637340161013832060400327837373040244577245862863788375101665738385912684710260568039996830971547625229030246635927399914591185533095136109930393629528370504202256361284351199174140811391588894091319424394659742179393498896642638596284682490739241821319672885190901298854662934860354753883634823940168204752617751530242000575850250539902329844525651300932447595168562616913256329642503000477952908238532389009478873357633683336032752218957219867315875079322801152310398249266858336356655105245620656699993775904428022922169165513622933966704238927142844200019171099309947762479558881008423328812453341266604883374891340999987531464675319021539467322791712250373070275840179970932970556430453563415015418566913417325623263816835567850633674074484884880668822905662920033207329232436600167582132974759527323312792088261840778888810824358205629168087088452452134946103557552493082963005161855928065076718239698456873003465741173329656021595815131211525788813216326550915179600589447832224205000318778746209870471475840376861190015192288332550180733850707906532095537447803921280600790877860237850959802588974803599830458341431853372324616240897222628280582387157977807482769433183630860243507095580504117997586937371797057724107181494125015906963777730501286739829906600802584073230780499744902216918873368829387628581344620697477547555610611241480499621990972834304998738112215250826236696246530540446170906380223203797442843657572041305437725072682629860381328493772132287600990463337588387543537464417896679223669069365195002368044797955021664071873286485714025049386237555631417651118648372257223890615578520756033140996061101092507376610220643950533073776053103936229245721374048880342159670965605398965104380413810319705068064907876562838723078981847838599159519066909510759726209847252515464462278175665518817161057173274477185285065158978649375053414262776773825919932065708981259770614319443129596680607741929563645404736276062669555131087319407537490415147629096668359773095202174581748368910751316245632799248732236188680339300620418137994636059926000139235490442518032977249595411361977099020375185585891118013403961422311767976246211970204650170560278208173782342183408793726116312296911526811662171726346063930524834663708270225373938391089842254538112010523515294240639944257431537945695648305015798869240808036093481066180078777920837748847783110601023791562882378065865502167311785905874338118683591312431898126438357950421708295195182566091361965975946804455709510318717477788523091570077781257312564735276716749382017555695081387150099126915432734489840968076824764922746396582443161175409143057445990558134869693243216365461310560577369019539548381159461457066411803120539646587164078559637706726996336550216559224447570134657783623755464592247569572135728038225722338467998551669849477627979424651720647346535401340394942018566063253425973120517217373344424356704433160176015725930484333827075072363557703265757210716474017331260804897548948360984469330471127068798391591775623328312121568678342257479403374798629218926825661590252925808583009515065369338241015904298892499036517780932963881691387282974245316843252392624142458760009857195414693257958512313126757935010158342252953228333225928925546917858792089581720528588831911122275461517482055369358015988755942127328242966681640090207742558721885198678374581898907422973478877698985315476704295993223153490023253150437820682675225254290021090144661086278587828417439437127882550619497962795512555645728693902205403924161301050508165623343862669527927150439232947638544447507654645021044562603838615219799487907284201189049757953719514260363960765086901756083795024146076270007233264904561537289187555333946651487262992862353445884872903899256362192840464464457888186785703203837188653939796619026103475676768664796875998976185601386078479350699189002260447222052135915260838536984085037322748051930870805633567716175169051792728774040892632804591298181450412076452644633273200341521978218997359721363694344431247210357878785543946937017495551356202023376141431675558054640518247320296458304858159332781374789838666283515454029745258390647192227402531983734226888833981307884793198719661320669657930253936876773123462526766464109434299988067441919739225330803145399611697435718460161693317527479372272027773986870106449645683429318929449388524564067978231216731780026104714727191033987809507267825374630715928873538598518809555387090496655954148744692466144302237604829323582446172592365964737524501295640386641819736748894838682121908713263754068269538463804387069007834605144971159259398753514028035360544145960439967902064412888376873935494491377619686534281727822712268086656520820043220810636095124978807651506415467410111999795577595201545403926193043681847432550114410056556833198102831484468302835338783470984933535063436250540329056278989337241257352279395685336003562106068360505291363495342544728617836543983771188351479824610837564115441916807893339230022879941778696283453746331077873467603742372419964414953236869697576576625978358529731697320681077869812946014900367549463323241536650359130042427946461712467731396706946788170396900113127679820113848718891377404182010034628902961400041850379617264612297772855009697186675134173964937132140006197872864226144366196494494869725335706235341562158952950508055747426768476786347031175356624908424143298019185124748717768773763101671783861716061336381179066443228229052358302075907259488763908982193802227534112989228533630754904267359004933085986334246063706473714650271629588160694197371091351092839045697459478032040894833913322171200304503673882072270344188089460756669692220251073201948034132743321679542399148730835817333977824755341442943641212705913505681472939107469544706893175703513477551722788697640529267188959723834534388553496792202443205118362234150572449071170891154511906052155109155162779709819549297554054958943609524369571571319557603197322858311529535221628428002351535700234580449855545430585034920789308621770620038389191734235138303531950363773032523445252242669957900789821247390501850746866855843991857906159073330757847398280197715257362683148113174163291969052274522286928820119968576642978998622432210747348218469172256487278419562335733139976224409846216027211749977630246873633651143591319075740237180682971897105419640858508012857509926922965209778889380764490185570226025205181495580946679471946231922730711947625558008525924051867472897129934142872219185906183051353684593145876163632817227155797661519064717922663671158068961308279699742939629503524428597383421729960002918172473375656117097770397793051839204955959072709161183564629909982604665599728043882362533134083546283820180942328152577709090948627850769981315310042032049959143330262668587161908691898534145749311024558653080542353057237342813618843974702643552706546283439536578335099286818239867194705323002158727258480634800810671722986821927828294437612728999706830773580292025726350556846260637554612802703786683205739653231790505373966423922119941011154795791300225657681323247665864633385458723412178779241323891586379509047449256847786234783263663496624645507241435213906347405340390618167389365838016118159099609109058230832171615346339435150517849182456479140683233455418497180199327929532878290634693991953327627602167773698923789303027188811640999908991517777147594215166081379677997498608588614736860060993400939321420339653138704316458093133155720484077640497606562010100544955001451023961537807037867926388681890464079649686187984756207365671234480236583137859601711566871935760596541102118582254768729316690416330734929732206712552911640264207551734106895894802353580427857772394441305470017703984650700188016040342115906757784599401403359548656996433181362078560152795163610470325700633517138127625606315898116491079255207735934389646282142520695578332964053335695655702036416695887685638512183811751548508772976536164757401723830571287526719795845735896559204402917746493474817314135059148605066468440428457133731763531473579970529189868880795047234967487628732917374507104446947637145861742226974572812403986222344081322735036342421556488711333957446570509386398669167142809600597269811019336925752757241085155984741859687860170120921834673882278986749276057682881807684244848958952313593729199820342735471722218420672024201671108861401094289601404541086167471748905793724738206559536429338045205880454820242461082849848620692107490167955535180707693410547424760986498610081086590924239260565136539549685195903208100431263615384605587955915993892245578806347288774157615697652140686800759126212387898256396379941226877481884071416278278354751856990691754211277836242223334967887631702755887386827436155079117264003090781668536831001436276406729197938993775584815425752331244980298450804830924598476884649098119082204404690473237741770394978130184055394113669004597287963283705266636823647358244518165204334063747836661079519598279806382862539761691050279824116692079950115269380612830268245914476929043386341127902066798565170023170349944324836038809870067672625705690140224948152367532094267879681823076926544510095354364120675649998957064348488796791524518437827583011248777164297442612499372249375211909640362126535971379800744549107559583660269211151657743051658902079457388446123746781748014565976976048839618365751140923615159671484718261577449635915141020110044861881265524278500987423797354957485057844565675963152652527351293819107860957016908401679801517177247856527438025839221701638982734159394553304711950099507880543720646569818879038747145557357736941714288435198821377667889363578075636819830154043021679135605479052478952973897403985025827136420035411315087198283699626867476117719422725850744341024086362684032162760035033733882335990865933768719478882479570892225457675569938688841242767794891037986131704312119197769324539972534083493484740563059284695718285390383981963005450112467271453188075053842754928702190345177762932535641629793735740310572811223321975839274211265323056116418352575524384073494615819539642512912861776268736413557868635899997637011759177683252267049160417484983902821397940729973388519573707531501452668825971839312268418956876997339026014888957965236876043412560478308543025260707780900532389139961535171053888173313295475700969309274525995299731110857254440360981315526732729228978225791405882198093480571443741033958969448912351246103767222877952445422007437359495792964188066354877261373548262787488962965974967122962454717606507053928387506667087880355058979578985722606231223026264176941514176377659136326831549563615794185910586321671693126744686897809041729803641060570218272039474669003224634257713145416148963722810248267114175241221731514632685607507688849322393367030391450017818630468971232707992793114435682986612731656382537559783602428086499915551262461847811035824321908522473406245671405250288760313286905835613213842270788229765277720266460995985529365166947708724332740808886626678256490568501054824550943358328960920973095363367290831377071767525587754955629012446456238040831004229160041234305445702713504389447385803654281525925475734413640168384972341711415918719240108800857298169419174935529760758111258909764227184155112899021930497607881234857153277630747772243665809339345678925366345468359985915625757202763126885162437342778147529876001792924908973274460755023441712681468028153793405998801381913108034358643586450220951069509350125355134817547627969976338542905820363503754925936852799302420274664243076033683249939825705827671217260354464815137688553482592235095102853015119153469568228392243599299626306987000755672774571416723228099644157168639117878114272242161639236399377889453947689476525838550940473412240035558264149427067493132327640680030350081669728528803124678653601242173246537981495842398479190706130724282399195808841508502764608260715462163555004827946331651397335782451263611714762028385583654441183138030308768607592730893151891833758462110001667260350788285781681989596372493013662327775324797679396467467980304591012281752145356318412307650695167134649452412515895662973386937302554466983103417497786076608124644706831615997334778660038394162791559338971967418593529359029781987822153997853099873319053519681944458037120064939704938584792466476495105825771749529037605568791458407252996313013595014817077200564692722346337730040991305123594110377183291182566932146433117269899376111364220643503629661196491517873749781557901899783549700009531982880325939814899603705314653199500306176365837717711620846119360275981382620236895333709888339118302679468172934766209184578685771128241459670356677102811512514428474492069130880242557690693242955852774811330605454388674900752298500496530868096850793807753394595585379684030537323015063601995540357834738512965407569955046310704117618797967673773927921280734790208692476605868741645993382989267513820422554708576495393839333325551833031475218381008077369076852207183340955134246205665359223234171557101261036751927474923378292766685945182882557312448473155354423335187820019146812975548389163014376068374353843272634383334083080794551583248480865237680876028911028381875538961037104255329005796111783526742644445570267814609726560358082762120316415324437262293094859477790086785983277580439654331845031238746311276697680385585551555074081101243317502483547015218450649703858469585903155017592082105943221103529030282769822791427931098003279754286051672739521345816147647888877429858574263109941456986833205688362569053425148839806191926645207849650256648108186678501140940596268515947101601969535688127860592198311930359662773420761637005270605960904549558081877940350443701724725404996046248606697620807660913978344523902866931358632080983221347618021126751699323022187656330217244610988129572760203772726874541592823069263015673438898066573110599095152059516364642142841244964400257632087042283113541609579753766084793377201559348620440571261029964701714087693972133058459453256067666139189881884999191822430072189580924357151747580809345832036347609385118205303751810612988689145849550748057457907701739913532002681162649274694456719526518562114539690079315906982573951885791515481537250854150582971579446545083338324624139829049114232969760099976735592132627469618459333685067623075225382599959075543308176497561967429587999987054022207780370393752198480775531811441542082990950288209761769035150057364420651306653397251821344130021717230332704692995392488314001930122439008590414582889463358076030027606162788198418190971881123428018747882547538695195556249280803555584353342431591557579918648365030455868696814963017821396808597069303690704789405813103052553048199565000975174822313803612937455759876411317425424712812098265078143494230178008470586927985046681206378592995248364386836464137115474236714407855279832137983610856310973320009472676055929744423618276594342187090252289138584814663317058835654251618320463528436011942924124009469007776892134678748963453878482390960542852481408275101687072968254356859751267921738089189199713734923149719456692505182171911762503766964830362795115396692635817899893609137406732663057463276700091270968610899774729756330362380363565616876346960361686370075035028733575942196011876203927955672844191346800899001036244331334237659891171115390203860017523801025895409534450128633507951081898642632316928393550332380276336265546804163545091584983459317237600767453392221675507334813178263462773450514130081524919687992505128527576836103959432375643219502038366034433183683204533295658965603424085185577946570068592928984955534461925998422249496638367291750279959864864512760340779157064748736410617957210877352691460504184690032929546039085294083664015608268777827443174868154084480756724322828140797634332508949655572110764856735922195951983542863532053789465176801176476145904307611669181655274531762607974884654512445258110187577652222498273143423817768742063562500307677503832922378111078778604520002405700736460028146322074663608710382775925386381233021451154898973135879073889989551527483679528554063979518185375561730683368174848654163996368228663526277371329831173794802100538328557966807994261325501473041815712374581102500909294547880512383367075631551424536975857443042597093250554065699275626353574322186287559282059723208383808531011618825713740726934434742559093323706126196002712537368795203860187900060895217407977181945388053286947239052473752453296225053538805624817479197417467060417752514347515076498182239531088303954238221549351009970624402084900272950782638693852022231142741503929713071110792074068146485179081595572528904785663877616462653669462689359261747364212532866024476944192614519310076109974861926126352359630329214201957704677119789193142654798777312450935031089429802652246259408175853125n );
40 + });
41 + it("fib 400 000 -> preposterousnum",()=>{
42 + assert.strictEqual( fib(400_000), 508879539221877742509404323165037106408585081496656752962424600619207160342328626613349370477235756610437255590271027530049883553677265410876521227217363544010143699384920812088691108690514974972274692461956139616935762281220385238995618410781350467237915882147058582638254974382726740530574778229758675251875607011233215473676669270533645055601369003104235185947104965780014844459358678605151230199141652894052740410259205856598842424951027541126919382356148309054495511411297780681981155592084694406594038399969137387681421892625939539738678474422913520113323914793395022014657007128739431226223818527660595499689768194765826655776706420728875197457538650926253568161538878490376706759846331999593034655680379810097209673122167515014861077158264989129436317557015990974346068341128535603504592916916709976025200420394918696108990179070734940119992246779851008568327753683729557460181095638719407937612048994625515606351202631057994743654987459153765600833479546292820240354821099982829898550984618344070363415731412851980223897825042881749190170220750258069990657865825386039088023550194606622251930025915668224350826647822759065148068681468081265886523970703106224597673475518741134485166975816459358678813620848155132114307630940585328469943312299883836376533783522617825780183633289123104776930141606180663107215594174528939137484528447403326323147735248273521255120207814520801323179212247442733725337799026447270666922120378659461426439166571712910995990324080759054218525918529033099469000095747176740324953986082368022937675614450811072670595376818987626554625921343738881182469361168606382858379204875873783331875704932851192412008914727223124299298938584826033014534514524919716715569953128902457279860372013016262458876395893931558323383760688036483050602880494366027992328965734955646789051646458042547726848542102999723525104952722054515151934617978303318967681905465912979012828568260321751936108085909158012261566075258846888682870260195135035715374180325115757028873618118929825224925160516261326295457946568788569295246725442647319518446060755792733183362740574155421606364569070304133110999183609108044828258097754075482024950262824132139316155931482432279940635811438490448029592928151074250494845243561516043501224022333257634129517104550839213082069008973038194780652324714481869520143279237690491889785180629329288934135292687109910607204119243082034696250524284770336091622404355866979869477283934442989551992343913265988759643695171799419049798759196516719604070996875911664867462564719713741849424572217736859970193370190974153304859732046817017181139702005290769598402417524188262762739958274665387136111917265035268828487596179328307118090375558430385694353597686006524977267232561054286911608093073998264764446862185772724720112179167108605557842180590466687107138359306652217930101929860815218881852363019229982092001982499566493690824300981662858422404428206788349834034883236833993821978142719376245780803907319624333006820263210145434104668582781051341412697286642565775861126900064000512445518085544540155849394735091324668608677682471086903859107237777476801816019905543474718116476465095483201419060008188683204842117864787307171140890433577980880821974652846090429805259226242497141210088737551236939582740840469581987886497783526856606466963771371690028088881474832446317517014895659829496502677717498446340171854127807779591966185526512515101265382862582539341141391035065776747131287037575005035578715205006019572791434613617513039739125218701689935572603398856001247730514926142659345534009269173036585464331879795932077902934384311031115226860254161029036808724075863873313707256619038404686441197697573621521864675249377773227409672246298434739444934320790820234840007039112151884230195997294826338277172708867804413255318951579638277499173493587072346110143628565751140542558447545673020471492965429898175762589834536116962897122505611567946860993843516060088842716775930540804152070540972211891511935160536202829387506087866765766544445297124907001015499885284735400681636541508922942145978546359829798454590447358639379611839564333198669384762372852470045828025091123981186322831599754749768856933146406084369796617611797752332919113840817814343058426490406571586668168460355399424510259573256234118493006302094448618449556946597441299089682162648844025853548991759407111784661106907992942912117121123634456454861491389422467715111988942096135969083482395165599799460506051957484509609847079915410631662648624758766831697659682946771782821771035611896885301202874336090363782233374898066067028680483681348655201910933634559262258795930118445559198241213374606566505859417109947425238469018759778103964185814479191774956029338061418093031232272022429720939970313332006045429049955119967989376328878962492054542418395261692153831211166355947759844156284358899781031566017690137025237301772288033301979024491533545175336724129715056327030779984161759238750494301984566424234466313718319558782218515720578333556457756872794081194194566503409240155974293388232247194008074473418550286960145880992510254962143511152892568764208490650903038601447969612995522183688981171722678714390421575964391791114419737520777463664360717449402090479497662407530261685484382534550102920042840966386895715297170393186308149985186943880843370096834282171276066488231098765999302975232045349817884277137221049670023432518787288966676931584662288211189495614209013421531216789168726694408112520781483621174517557124308400809374778447858614059354021127446906868604705939645386133947230780821213333899649692733811211531826017645772143684569895997795851050693037855788049125933613467948234895594837367835276233286427159827801918285864943665292933148632712208974885618434480627806005450019119807566304790411189621398213307966115080136424844316391895220380687058381461602389297982036944989550954347831480688486808338872403224224554606409563101963399659622829561562048294159957222748154600725124737778523666820934676768541446573462027844422243436622430566305756298063648632932943620188402796560630378724386705844080373957359823709243300945863979340106117198764344632427347837821270900830376506421854621337787806516130200694800915732426004706215904101139614497719184622218092029656286294901807172387064682363243193878967915655595454584414144164064677625180011753038765150999773372244917772592675508781410869394538538402078780141119224739434409709065342412789312812249898959058539681038088202537840435292116268024472261249591578098960937850255225547740224027028682205063164120933959076396705987080127569159391363246046783430156179168793700306483574114785710700162193391921552065626898275543893485803352939348550721582912974997768331148766089605563475171759327490154816127573887287633145765341175847279069091473979699946159097555237234464476958122019069959561436108468874150933529369785115775126449797682024574604837321926116380228990831554780597692169787312152394715590356610683085332796348640154111015567896382889666450210846780394487860763355237597375105866277678024751650124749418812882571729636299346025249078354929774173715965248277735512108666731298700271555829551504961857863484917400007636713150618969432756978332235394098631195308934454168149531429950101347451066704311138790626727597058476003515949531900511572520267239980013357907209310689112641616513368879972923512279763634424607539115052704557381453303705025273880940983350453118655717475474327096741238298724344931853305204276083820634486230973039924442400399487449978738462850498433133053059484352627778838168587590375930938848784949217937743511650569613595469593273882888109610716609416198340269245655170172601844645497850854774535029222149632884289872162043505456168419699773278040253753872105658538285908100740614500169048282744744954230902747561909465589405482731109332462290438211251528913122162934585455707037205862729065843262102734290429999581334394588697031994903467465120913651944560393134419253672215940156745499150814714120048046365527468141052668706198222234084958110572890217012688186605729213739273301083395356761290519368652908660747556460694020868972288568123215386027514542163611200846310485421572432307842833884180802618000047106692895186078136549679804945882254753271046837483287720204810447802658362356034672251739714059147008039901310364856189763815717299983894249578783632971999119519329843193430983527826716060555001917483472039596029153370978484808502079678671096459563370412205788906923085516714850569438212319373095113146037391565197134972809954668804447318114680315432123220527424357101964519724824859756000498722168261653451274201348845563214578411162446291678086407765448141064679900481940178825270545206398594135468343877244374556695484201201522934421818723852837427657589578293854586848336409085983555107418196632656410047059205305020440982345151515306555060198309807833941289732345860192796484414349939961809679918671419139911841426940984783192275947086143943841521914928291675520001827435148451254148337111108731033491585973538873979706012768480443356386269729780392662333195747498371340607075634418202640890391643170432376650828043330775919326541757620994481999540295372940563296757302649586797181631021626710132213030533952219445855124282746217047057649256421031644902719187675142532939433482518861501307402959366678594150697252003837908699221923957115113454950242820895813856265000631349724747716626172564014261778879107085760900182145715929504986505567364460790647251317655272795772806005628208261006812283184913207387143548460244975533623758043356278204863111173758910155748340510545147162070083003072549565488456065992719524186466306571701198110753753570257216530678685589290282377820626872253644786266813879769056242420429257016206508243536569430416617444889304761855775625405105423697046983314194701527015172195923092790446989666987126133252629675893309071576931691669750493772961618789009562831143889456887292639449666882455971599654286214863197187330724950928282325156497355391807976626341291999898352283328815416027886955625923111068708015933725493485610358470185773272638327490833557475110589542192089962591008940283846161800901943801971649944433882271544159808893767909722285080048090308924892758999632194916327819884009805777404913213354468449843152994304123565876773531298463856414978492565372096423998852726342248950208256767468904340046327105099302950404536547818752007715028300874375982043839303619686333314681279733512567498807359018573446855685541533166770729117638129264612069806713725619956523293978655158225302226970401617971972321236892695619722008073704441198504671348647793156612517581015450034531480614238131039896112845646770517703941419712164484344871198680044102423328268109021513644130356730012230133019665895975992076171808679457577272927716764598644782942417647566048822107973372104122344927326990773277253487291404085410353316900254288369974627458119914669765977380948839195976061140889260294011939220408474195664484861766189494282492194855822876484033256567789451748526193469990913718691612808710412335440920753308002179390214997128552477510361946083123344584126207093043480909382991084424819118447410408826651304960344026321445597793029254130222888720991897686831049249551657084551691455437686172256420339527920097815761666694573774912364196311635765326208175981107580101720518698220953029108978631928061165180542644093678309273294079053620056609806412981846200318448018672373441128228237506659410679844304956892147605002789688276996485030888022221587135244071219664585676340064486305125462271073687963012179223182771295191428035526814138374512080780115254977139696726979249820864477736157247384608211662216600317430205532075640186240771664088176261380440661169210455196698564304243497032696264250291443146766130806807287583660532228139340269210081496715890282120835481996962749526130228018836030188061894723588549987930444909089929071732709623136707992808629865608759690085853000344229422469544690855780793345909359101836021825860668522227295455404090204447037595287825453219035070575152410477943784325404133157545348298173461102670573971581486561234509742520793676865842797617709971585813506397256061214319269927491311492709348540064725837393608907597972319605232419727926525315458718560101319713426500937754802957770265614590561117833176437138363825625227595903073718210327241917827865820968480570278166452512708746479849578081686609755003514726668389012933260478917078932584990761386859795623156886217453419096560763988642475545336917280967022682960532902366740520680776685374717147926030897524233308707766206970613349369718269890580149524671204715101740576183288755660015720509457233252122799730308899505250283823817509373792902021651711463703856787290829499864673226018148359075170015349497155556600676236314462070345257189658494984529063143627364693037190925484405603764998451010432651135677057434094948708379570850863744435959000468036048649286213829045368233358429563577652699493305797571648781293180251088562640650867955189391095332773086909576271158742351739164576784442439701778456110853086767447805662644848124238656125977623236542056268773051660469076154414761609090124817607371576880722020170093438220049881131776414745925669578134427735130338055591099387585534805165670022542182003962118174369134320555331693379920300372196073222901287571442984337093800552288613870910128768811894703694341899394918021684566153895725400535251974102277307914327598339706677564224693235833678675361200389838313125574802714315043334472902420338043777705494864064514734612459849088935526239534772428284157404198293515986716661630708575725615376188742724108585721891279876616280943006418121859107859671535546203992814233683422779677379235644018694156710527065317866823957709963294238567321945190225586538522124482820414253445351660271366630779650559480613527249702543649517643007019055414667945934988740452421821392698427733585629698509823147447486734707133836953899926273386971725843086324942788235110119160064860502357789011456353996109886383704677617267510577062955559585109724993546312793828157575657936906710767166983950144365998989955145323841983056799923399175731593872085317817271816302558643661831851011458541600448524747990313731720578381169805009361983229272790915242526724400532503925898402953442736129844030110719088483509483581928841932786101465893814779086695995045677231893352000106859501994180271398872337284041472484856801574911214972303247829377037320720778503992087417954546210689497220676297117843951033113918954366147986325820914852471578538034194488012190587408247192023013839921609439809985316130547594248413638059701010856320548703223233913895522377742962323745839313496372925327573428771602653136431737524112402913198588194404446942578836548086926546449006370758657162949507092495059896887456953779109060380853433488058921158067576915166913561200245753184285219355414785185218370416719957121954395793390219446175610361853344739456326665971108365470299332383281100709858163760513958799069051957894536956823217407220374984539490709586561274216892498177568350380568878667569494419397159562572493876839514869410595526430745040727164188531888235256437873381087076093659184965511564977188829507802517633427641316866198201860614430474569247665951096520650634505567740767878313507409915394493962066062999298749573615157371693525756322033149168539124427915174852047818272547225017227528172368584945683852740385778406298735855022081880788091261080411370774435757168485526411132543080648087275402646207699771227017841520084141958011844122144411670839874622153185166036451981820987304542383140310070773118160210529194219119845322976771934304343697017145070653789366736495116968695026923951618295863222215848151951084907830331867679970781301658921902074558551943264763231618556974328584863444838740096847767193919001558595513211186464690477149365187252150902816167372197659232144249241923650221554065935688102759774875997732726655800634207017184151256776284525867535297470327275397989661362493149120873311660474228899385032232167966531654956939301728822633616595254817603993537286699725833999159818296443617734971492304031179102212228306333948419095183629344986652675668038887071086171226158002198661908498368175851072311326653924337909392612053093098371768342148886330945826790453550974298540236932195344061064944510730444635568484239971456382948759415687575852449811380193786058071081153329435203138328272493304198945729301639728919666847935397915488954124528091770329527219501714628509797746745651189880741985425988190073849715577005692678296486913988618803482811595848813660126870138109365274608821994115522401560777932547774633200015244951913647003764798990093487942430337358099248746986370065043248089604407854463631687063889286985884362038152113805878517931951756219556931423336777530127324492372390795365915620248872099143229069363851765008974113844152069368943033822154427201808119040209481294176803779930475421238167427370375168165016162334773870525644639139618950214412306434080042306113767272512301938996664514643520891176789602636627924491417458716941827900285573971654110512647669365772813741961831545546734990430479548207347543800788751944405048909011205339868126621677959113895368587011097788047839734001716412212176731522228725373078477393082294834653555672556454300798560927893989556008645987572354302736557186236758606324323420285770169793573204301659389817614745690427388723927686153407387545048408102372095256174261639690714877940866766705141459876336086445102604813994724012821278970542716344808089049076979310454968967320633469376632427488283955058754375179251470446984910492779451218698420301561638108012499076438384545617138431079562610928946633674880309224767948322945028695061674927871388804008290299935116719701008410970278180917918010749177790482229991085346838518906330761799685003202631842630454118691737356925250206368439368970332965404432048297589652506950102601194868700445457610424717612457284604950218101623418936845950019310676318614532986749810414622868187920922866649043224101021285131800488419478543314979784145635936686964635728522451306631297861913463921072939578420523442669314476607614425290549173555017991514407306981945520466636939993409370878108957334035016293193016440380770153018630704760445805535767774480705308807930427940039987067737719653199031870655795674234091508406353281466847131485016022017641886949099694635705330836771675037238019771803622283854155849352717351317105614331483475421344698049172806479076060194042130175427979861516240778176320789091862970935747305772812310706163249642788153780833645345613291870270865293834411921988239426284431487203809689019021095187564492832113966031133288624445053607159308451661180735272549143708611836174492182591832085106553170275250707544298924051013842043005325395958131547215842710120253665684228209753115813705616390717123151317959685673683521177396303313340105210934413447019783214719542197082066354517337486581136129914200009925061582903729348300730948021145481313261275454785225821189883334940047917180794962733162639378854543618738812210562702968571336364916042162934445354195374020064680284609297565389187268269812621489965672109597619537403831100818174014720059356125329650446694174476902640656347730870156198735744136745447005744186731306813776527595301326476374985951347716391873717481379711553040531371854540149514864494121718276689004046348417814043446446741983661209327399989957176391821828346650488043990873854185902691004015407463065661130451658445079654217621451976886700470774180937034139388334838157492738065280782867617650110527849346732513324348109914790737871255980982606675726695050640282713575483688079683567350514773470205910685601994053875570697470873787735788058961642255014604730585212908206361158581697405931475880625055180085106876923208593892165729609300106947949665073835986781297806495243951581302546720460965883994862742846782541577011560247597007875448252781168967419573217752978212875368326805025736908548213227068744781856074828871926233752835752345894290058900810184965105944072054418813715682033425706540884259301827692114659979968146065080014442460355994448256772515834809229534895741529748845460715053287266264259236709428315371313991240964972131395273432128698388482535633455033636158167138792961758984583475119931256995564986172122914608731506884299451845421198931554720524684108708186809336799844921997709990135643768963747947421500953848209930695472452007305122838877949230851419266827866544649129086805197883217628907578400894423648437492855440676565071932152935115876156271193885960339479951337513495283371899653395119362145813334379302252194834986458983886420581621917818272916174362330919480139941665929573740142986450967868488121688984961840047379931824978785490504610487037150373124218456296965092722236841519713510926739634317729328892554023876425945334390429964312953124219958411407442322027136198890859113031729103591664054109506333105940741055786283724009428200979225318325419079317411422536549478647465850739006810415386075168319599445765404897265646264633371006293596398818078832941542442493862514562115270184000642041161335675082290817963404019561716391176004103067785054912486005071909816049980998866626474294714048176533988998645821094476736778817911891632659319940591704654764373803987290986660904449203744684451870033539019771623243457316054567893331928904412131742057828785822504768780864835682160550565830951886204410449593064715106400733240467761263010780660227973970052213504149839935873952581823228367447552812905943625139355348905194536637190380890231807885724078603851645888729546787988950166783083201513175514317007193925089238211443650384779706443174318341018593467683003103481020680323311263730763031927853951287859450453118125065794616127060043854368670736669482664679236999136218111227820068803727259590210190665090177728439154099761155885404865247812647414499154269742425573264825236843796457201660907011645557617301911942990875832497016448671498419592750100776698457334168071860264773140719796993324327862580506787480378623437366524294743213438333105910752359041588591096765446823500328038920994648881699358583414771714985133318318341880858156039931353382929978376994114824307887194948977239810877573958606065698581915388983363921879806714771379730423030980922960838271436104133354774618322588344349784556757011561505791831313238463934800048359947070918311158080354200347168649216504941390593462118904158770448994427515928621566405749645235883397909126398574814320375215082349686745821847071922572852000959391819029159939347471697189915912846244429225036404244687278699277478269984358436880351851558086814145034941932663757634776256598820449480499151348826061550966628881813219638487964045773628028147814375792122783995813106051442404312561550719827910707478039098158323093196444981061636068845744289581042668732728625497707838101733959937875216549691088478481754299809200277002427483709857031667995705909708265346314918674124647537702473497768409957886824302776702194983630183132001579725490684498998373928243016793916438416875161962473634512293219377770451971628798272508027047324540973291492069643284966683067273175897466566657544367337774957713701073408489079440709506621845991733723888582265486196434278968630211340228430597829078584968069473614301382030869486823240711867268728152999272673956765214306779233929910656910351053953386495987508566459539952027776930267119259142011280152857246495047903368331837274377411501729048680366699033329521166867873870090966110851081753309912839266523216655038652229709474360611338896731765193024432296466002507638587594993543481230623391182534227714705783728328578511713833961915891120146278969846213585375407802913486362482464253205432988068069588550702150446643976503138290107223781298335751803403698208070345282110206280045422822231471147640579177006324359462435569794398988607493655942676323340596130509481520812977872790968722763340928968126715161992524564329869691165361317381658077172086170153075140176788330795940400145073937274908832763889275896343142458378774873918516851550690893303363888282749864296030535995815884581469377810992471354752177356877159339597831258155100943545530980283549970704386142410542772587513501344825859994023748983443844727016082347752150570880823773110003800028378335895593853711113490745518171484186841355866954049044937201310223612110958394810096790610721084383894811503670451546365404665045302981159145896926565507233165461144905895487801590644628541017332315840318869346496478090920165242506607408734256779874189166413310175098443128655353689793513100119926392098518912238364711585726809509800241178795074683449423576945727381138146604672105603551304277683499933544682990720931927530905119302537582035072674274379007167890086135116307276189516184317254879436903522342097419668533660901333354675213779056274550685272647570909948729483766242613783513318741452552980305164810285830392584118095869115100570097909041438420138501730097429868506355412518789974656527512434842418855386102841365941047120543764378280305098866341852807154716117121316691347141635203977649513910346087660872967698764701939204788778242817777017958546302582049581701495880798235988727973903784057235497371522633944675806061016417881191128389806959938074965662784232434113926239177305526238658719336643893053545049537862612777069051446550698004679006847247424196571110555406279215606782223885832707719472051052319186972765813370248356316669140403023650024583766660725766414409209389257582423183770921774543029278134960778699764183689769136449186892667310550045382274605451691002331228371731720339381952919889051817295864579354286873946199508433664783658051771416453767511895245103976116480530053973985523891832459022574286072942436501457381443814111217019701353367918012248047065983665727504886766218002773301494210065248232515491951377505356007519395790879288264090400279119744938157818165482227809143671508766413160739174029267201498729297733062166510367093961561235169265619403531815606228934920840344372788594612730527687952574230816461712752386026831027854830057238247886509693768165020319575008194226608679230770030460856929962824018421670074588985251628356474932260421531767558712070701732073221242968008128613602124499930944785147823498532172366947755325112443081681884025437021779521968105182088490204290237864703126068630432785136614265715861415859032213151377764710964237684169007997268088160049029208916032969012414797998568424657881140247526635320933871974351396989102416902051248265443831360129314503825496093490910353474635623450302126405013842328070553199020067066286953354105266446822064539878134342432443824250198831779823547405712924491546806805640234954525959087605025162087072246913527177318017293243040101432799802576092918429982860598969565528121289396920820134400412519149401149866376839263646526560217329644547545637858256601954384359914427422338533493556750743208239171864727263991465132842767700786809532553191594918833413966651430563511177504242239787248169831062795641100784820243653393257175295045646211821562847875090057079254237191692265564618555995792797923487066465633108936400527094460046667707803903839191773965251482037373182146042838299112492446045227052216891606582324166869043351571808940450707894985124110705391954202017058385227582842638106991320618659427854628608692150990412102409697172510800381882166767526607557812296830490533618259695091958200138886982645045540843569589378851472725345767111827298219835026405737355762105906621084177546744479059471994315390637011572812066562931319417418839505224757972647299581415656371976034187779854443866628680038271053760199378250793642274456222523561914640344949264993015761298517305113475669048356660246282632340180475794932372816885292850544334818795673837431822087909260160806453943583826233650825109375941331011203369927260689007089512862442106594791112072325806734179715049586884478466062231786300957507102550484838216707354126159535800053412368073158191429903458248300465450412781547689139657030591132970186174951891322584009236482888644714093960534058704146981971829459848079175051229148530759095476739241010801944737551927526811078374829905511197850016423964633390026089016867777575538691880032613833693546081041029518736510561130115015967174170588394024133082858534534847534516509998313334340701796244005183842458891354670083860283500425859454872504617948593758786042057740167130545243011499221485725753689161325681416338731515221723810757813698193656749508345487514448901516417838821103327922236847074314167235595287690791954178068014767851221274509962847074887820888968236067824350195294494873352112904597986083145540925445021288793049874483239741175730258671980296366985212788008557616213456772320565598842358040275775619109562183762270810542457856189214249116413899772940568633912467152206622417657991741854091117746981674906069461587715755180529760282352879116334155599310215343807432687421198125387521145486003071038756569149732910008560976582554354202837782082482053831279044817553002682454324636731576110681832986296069674408986286904114099274232762769021265088953388215930174108003597874829269980384466007329716937755219916193746977338817087928563008170574400749665699517007085236869959685206309562106578962574085179219534797298658320574809489756745767975727059811995019769846208219993918837369263799088538092724617213015730492471484813504501539592611047976798402455052382061613212203278623954681621995240694087114814463534708132832062589626988098132956046782453203135454335483069418952041981958618542546748932855566558188918587673476683408349753535217355143001841452106183297499805203685555732383564198675988206964937228768950727287083204618607536342797542160991295901073235307883502503853289398463841198472078406582499834857328074894756913675255141627273783730318735456684894386296912241246336129111052770301309956099514469325303211780898642879917653857241648331570386660922420916590695539710266135966034228926645257666941306358337502684272961715387186276154306084118353805360412782722364352175255658230995532932204046315725389723285310354177908021326543404981256349405216160659797552293183201895229168479547482121203320495525129072097693280012120251567467045843370831830457845884799617722627288053864101286758538631081286799057714139245246996892218413716524458981588860056072188907616654988811653549833211806914222098905290707853958083757898707763752765912868108866170482628220661966468712507385784646720606757224675339300986555505582083764211827615021975381590147252093490228098681764186598641879717671305674400596018843303588359924372437989746816416606481254857849633328970038912413674754309398995213712229487183372420592046549492322015609280558434403687377888316055447683966447435770034267629270520667057482152975528156593102213654402363505041260414868699713914907480349896983998316629451384459426526913847555279736756846389588247702646634028204106168305540233198287012732951105792192572511957519205744678086668361051143810268061286455673182460276003739963435011725294259079039387169180623135967172575044957909953545584424527614018761765878078812736674096801526818064142938379464566611696273432612758129769267092038593665358570102957732184017578959304447934641891431710778643381340616215257326609588263580029448134752499165761607742409571642195685906254824961931339118838613209022565898546309372767514015034295308640330619206299606472486867550352637796254955181277551325853654651981998365196063588983218772122346915019118241575071638431350600555405718701178195131214524687595949532212288123583635014644640043526490162521165855487991398759098070239025821038620675441690115392779367612571975538731902882567023270073297653464884801204924958070754832660996907715956511069400874734542785617986475405225184142183696960442925523329170415827736846184947313870553823743938879007694089776704061996187501541721488864461236386254742834184492305570531249427553398270198353151668978942859529216126189806810691603968016202818940324369638605215239624311189375884559846826424871650352000112519973828619444185113988495416387277614378130057407367181382866627536574752926778623643616238340518275105588857914213865833128537813740022159156040748856460088860423979968488804396441703720637598698392364530090516334472151544686069171952472632251469500168386881029339601118992059737412003018684439220849272667224904294692855859258529051895251276106459941448810945318359774424347318209451158230870798230275152713622616841111352257599056725624306708688267863455196357063221939845711346086025701004691331616414354598406777718544376863895361530889180498422814964893629221545986862719804361131685652807802416884359051289890710359307146719394436578009077757738236757713970247808600112289757508459276727783014091285549483808256323835294290438912602389371877270748384415696636228255915496718883397120672963747177752780786801830256633832203730634451260985325681804122107316709414373105852485759679218474753683641331606503053154598324769972725051764520326522931030010536607875958693562631923214049455500040305137867125848123134906084366977288532896818536607204208620503028201297722059370193458705431032060862926019180238365482993862220228243972689902732285415683337466186764740511342828331152685552750345943908784579110780108244645899092146769190178342828778352000349145617411842280422068870268615383109320415190542955726054564332057293603108160817742656196627664269664258875988641131589812815929006576068671415202879780372117218414366290994246368254485749390423515826605431731386924235993899798567989898213511193840823143870516674775498087435899402706359748532459583452165299042708669736190846990739047458080929618160772425784696142841226246197375157935445040796440879881263925528569748894632403037521222347898201667710854648607848506308501112252080608884992230293060917953284721297927657221611287413612060411436484185133876795661601506221642426933157643558363273650738182975726217047937579577494911707559877619171377563255816680957385650785207545582869215874849523994507531047498502228559933432376823742096562652135207405443689227940926519209497421752582769321090968092440934948766269947920518395901041781060905530809999702257444310735110444304035796961456365820421745124809864819647286043320740924229122582223157596353091638790309582353848801447566582339559490653678335816275441244998505349707096016349455932453315882528707697361235182412841754249277690413126837468557331264415340150278276114373245567068759305101506982899065849438828305233227891337425413569977145825922352630259047420063969148394694993042980520713374155127734352058500593541331152318315601117298853750643510813830357698745001691956251475281585555939393893907959360877620477378162361283652786640697510611598245395534830833966182628805139522166360489256679480415924554370177106730027138021208110172467402855380602939681289472614816275034999368955048991855297768651053945350749685110042496467509180092265555072308116276387086327175812479871040827778011275662599882138953946964384541556149904544183669245685383289976417722791020302725337304859194261003660438993887644956355552415450309095229043250082528882629169248720768818698761361709736736171173809174568725544456848319136528771446779686772827834247103816626982087376585067331769906090583456202917265160929157248875691968250426246324954707292476385652084712179702796714993501643895206619737439302817020382310274907221122690448120478273839812398699276024950332296254836693749854858143210587392131192902750612082396379016540651138296487171268965496410698366257039087544796366329732552220393295792663886057684891596647288444399976908094570073739840621656216697486995529681230473496138723000730710438219658192514721192561451993693104237928172022554717634856302132344862524262659231801565516417366884964386019205990175241536783485458262618621102506000617261204923849808443118843196049679425064020442769208524586922198829686388183112849775065317947991027760033024225297292112961043013630849132348373425321563419676151410002881792434878711826262691843269080010941582780231558571715174451743873335468290462158945637509421708627913338620971593050538761557870112204888439007786082009051556452327484959352852811666428600404587621409691341558756662317742879178431096677997864940779285327980458118864776408354981202021203405695903850569000681002788988733377034538520541981385969711459748454443093884158494353445858020996596583070630505158740171662406348964439199014077092368048699072127395648489926290508872349745734444647044803331262856872378455108467681852025041560348175867416209442355586321283631321002230592576193936394401235745691204159446207066987785912374270690101532936766323265811866743024058933303075731947404360269503733255789995615418272615506050379995055103361174377619350509498783262567546493962121516145900134987456157229655843332592044238696060274695571787765668710976657047062048750061010258484855851933955584485033603082144768588968335576863228279485215030009189297721516068779525604675180279699791876124409973018793014213735593204435514335293017654591823216775847165750261016562994193618789570318715635220192066329527378234559198140746427492125984641037460987493867415709007735468016367394597491372133432984006680608593344238877933619474668661888013189485275166957496910618096333672283610231862768838032302811873992093273411925903967944749117819274020465269479880642829189690900275189241627653947501056797697532080876416486310259565772288980929935984635645477331203305047249130259955238128113288591814798346666166340640083040510059718385642175703583474362018750148473931768357767892995791555822887744348965424808431436719442451770123532543516793240604306596851786172950964618086263389106197407278683730284688539281431090948736802353935643779186767767853839207341041503329134853267491663683075125044506073629349359467602820345010069109859929700427773517841299683102998491971874601628695989962470930341808572955866943100320043678257133102342275283057437213800422823102585949180618841345132013511717442355116644394732966146531143724195855224858044847751161276619145724367218494445161725697678776997963010624563210268966103037214514783631509026007666101288190217068824554186005159943275288572508344463858408578647222085223216461338077975693229998186460474013206315686537992179056822942740649057262715014765802633243602746186689064915389979640565928508439496620958864108389217375614788784848836670060028169622567309335786745402156194810804900183490536957696401616659313756237341808055650640333798545117358922847548937220327020635901761937841425070761794949959927186931701169807356983459343395266678227017712696668883760663046465848189423377163644448253210238332241364205455557446293834354360760760584944456474922031281043382667957360535226430537351521886133283732733096568834862022309526083010119524394567232219969153982854041719826970538629065171720229516164680710599734656543686058405211190349016886848751402420548366671911648290720470739214629561429257673048823849232656758363165517175795079933495515676922755974032474106156224452935009733695245495274380463109486284179318957772268283138782646831333977793484204032263037443395736549954656739245727979792026813219891647210706026665507880603612778450367534176399626955011553681108399459938652461487802086555192595837425925787923010970865378593363412363035073797522354934933870224272753486894589856294004930583683482743486908450895395685686037201480963571657857459672972667358706215947104479982360718032887153846870376306958966064065543069665824538674617163072600177435276224481373770336838416971668428674089957108374893060634243068654734684672029828243557681878728859166973552745148118924520347027621203647218599609979440236429554565481503851278627704360778370824939651337634962963618120423089149976383075761961517562963458556023196376038794977190905077748906231135676316602981708883528144941996895220948832753662876576572915722328721381316414577001617302021523639634915432942774612381306348300570623816153837892623942883962067580932509611516457316286152394947190161480106820336583276911613687912162623552160638915174801500098861498033415399429302247706626039773855338283216260784476512667473428641454056661912032905799769829773673591137298977607492973199188555786581692367525534669025448819423143102116687039154266030948633772261115381789548313487682622954754810915747161425484964118305087533768196476357223583883897931996498117907695649707160566307915174714097730978629875487724208742109611913410003899359080889288423334210090268078890896573964194016689444831724284187906201834476365753068573369357721805907963825081042185933386076553838604962632459566341692358523159750767853606120702506342747125563675928906579131658271802409167832356579399599605354132424519728876429728316544526872787207437284351769348747197796308183165268290372008702959492854290355693261132221305268276163252462497059294380781398731525903955034068767539794743232993388981318591312815354487004112504785183604736646281991983555998113721023038518764475208466746123429373828638504161494220107198054548379797368173829265468879124870727626787634487647402182664590190797063995813203707420867993184721694771471147011365044167192595409118482529149372457453168579424662671198528150298677905426496108822933293404151155400873453696945227490087619930431925222644110524762741976680469642307015291977271220071468800611095028868733429660871854442095490639842473996831793098867426142067135822549477132442580069430316836174247067837816361680236129896496484693261490881767251175676411609018717273093775091197982469676560763427629037094581987683543566295712949391367477230992734845718884167146056050701331070208342137645177485248135913308958213626444667467786168193453880317702954781641161581948903523839862102860451450488101396011574071546990884864539318396665619231953718493380181917264905612417692893996653214989765067119433236446911262895646356890540750049171133155454834541757437909363383617608936179473685471257909062639445798057358859352058955943351366326574757986910984418724973289993000206256431293570530144171849054422724643371994496877478793912610719128280373544791065794044641742881707629997316396198669426167653486544815320739866297615325407331767928551107166858227742403713232986792937171138895575443256833083970941827639356343387472217266438397387776928643002773571012578414459626472215581754051221407429677739273802384493711583683621605811371077628079165732791793125004870881066771249633719327363878177556772653995414291141719849089596753488055403172390226623137697574274852914420648495265507653205985077732114058354138531778780618544597147907396322237623853811117616915276396633904775937475505736085486283043007374760797366381189391022138049849012397339798156281485301117022535333573508052906991126786573398501484873878642099107608547107934667486004072757984470038527320511788841476648641666559526504232044589120784780996823974074663792939786429725476962893821525988334151373631922371043275244191654035129999503076610650154182826432625722442510314736341279879862312261501439057693820083821724464311614739815265597715022905686502389610332479366330773579503167790085985450517785640855611060019368665690527833876062152861779570239620769654734142115166816349268460268124906268998461928089154858734277142126010589256924799250417914728153782011040854352011762106795346362661222026792528785078707630557654645461731025420862087798483538452240583099707881998533637790147802008756866105944713731360024874072925291702233518284474835733036885049064562254104138124497269829247187104709090020126410268093314506116988441370918185671784358838915937189352427481470628686619215940612157336771437642805588642009686113883748477785013290658874757882614301559909747373695461981947225214363578373501726063990218306485568850446729709423024905492898346061112181536241689883021745229250705561299539721581314554095393372425327001629064785237605914963644554647499036045072293249910600814626076357136696001345065581301567512896912197709315014858694863352777802600694578059419067302731648654414121189403745199159204620337061317803258074012948306225556204322626196780861564536756040665487362715925640263512125175972822211363288275304802833429064081143004746087308831453060649609583578122316097366968808317420782529469799385418013728582059967347450982221959500036102889894150703434439070395012093814158751737555558172691879014884953395151293544585502884915453729904516691041325383022994006362209466065583981279513920025080841954836055460724165118578906842934855010294847359560938638152804607440948045945182079595895609377820813328158428442611882044280340063403171652147051231954066637478499982434764271417571229258974215412313332847160447319652358329885172582790214550478810106959995706333616274809384489103434723908104885678126256234873216604927864995790671827085106781230014694603718415558776880869618227615433202068636642313420791030910564987173397083238809161648408686424151123305715561753597904375851473627513230116323433189414611987464132381242921064191306453150054708242049362821299301514345352268215298859733523525205414839383325394023158278884992078330789860568052883164133513883944423278679802471397821755278418832695671433028435127802557200433035408942318846899426267463719536780216976043444443500486320421269110471654805726064103421083815475339484250400069796959447088426732037894990411441158930135893063478936612572322162795862033370905638846172795558185444370903734985928184374783976615583832431884211403540899972992094732454693707347195514969269116915005969980789795435619772491666597028789718473945515824920396787258958721383593371559189808054831674603784382441334721080241846556866931886653648629909150335406502466202777495383061966846556975585412134398422705090371326464131922192922768670131942874346853130351881870664259603158769802498447461846128660419740535374825384208386600711056655011975955368261661778054571085746275200803647925165105306908896167053350516674334638732514892189478015761700424198377751566802133696932210790315473995949325203276754960441650322773550171087606960798575128969037160305789476812598758413008645267832491481854990535469702899426649354597173032673350630243688712728395238060568504185399548822132121265366534750705239557553939299456993517920985023544585356510282197938809159377959191728664744268715730186278152086859354913915712208808179713360179361057038837078586206488545041747908839146021452659093159003396278572754019073059709237029037912971209748210445022094070728037320349197649481029459586249896862477833124074394693810441026588528028686502776754273182345828333467409096126761807754460039309656292307827253873289155304031881791196122014308355655648093290232498582752455204882827508340477544673984785307023802938984422297265351311200826870141371700298117000723025693010814961511273278378047504666547673751208116546316278821804103677075258250746890213985266413691935538256383061107293438983687549627472509728849941579379590330213552024810480565455881913965334823379863400502435529356449019610242018336899703789548309251282281833756981000429622226906704793164599822079894917833485186040991650880327975596672119870417777353574908463431450004755839693566119829123285938832039827437447656656769170831618530045316761797337403076952446019538546605430564885130779516125513191505948998264342940231801398415634888635194226859747779212262872230897749911980443696426901984894731340162583242815858705237368556098402123234485453760245874470080967624008647164856013643588032812544112973681887850850295047232882464302036300005492015904577007347205008779093591365764521806294968882337059346544194582535373411595680496448045664336079650030721440865924194171819482021840649916202255521789475171240912863344617308912794790635394948156868017675690269278511750818261644524311892227995478435254481635302724414334092009320673265725722099697937091534980620254346441814191238321000262611149148682934090620640504384258714902511127150989609206026860729899212691671591753251687384569482313236804987864354846355122813138910052903998597599462817877923904068370252030271279712722116814861833010021110213057494969562856922524532715609175895038491727489693262359120441190562561655617845839286988504950526969472703827272807940012492170131317434908211906264121860056396790618089302221915795845711349513807222718340478842613017573592210023062139784402569202038039319681932805129386832801446640018935117221745056590630076347806940285268667675466907777605544974055768407919631578940537512382387590271603023946691107042604660145039293661465430271406639013076188599612099145325257917278963698600422643479089172427728493315720971442190519453022590005842103496046927902502108499025937801882363191796803921196475516474783736628108683399679483385555997480354253770301030341438611485456628854113848973771577766918054425368917241758268004240168586864486725007979715373992582328339432884415491936987820421920395729346191281382325513773452428848418150492793469186582469800051909252768647225718355577534522266170800741172065615817245728158693486013150490415271424121770067569331755900125173330968013309433385966301746112339197956303172225338579418736757604301804789270195951057422707460091589429650715529105759916978606367801027274784985206873052019366877702179588800820285726239603846800438708942388781996349519622706231182577621453917053874807740996002801874859234843199557508483654377352698236351326892694279219857763631288833398851656393908950704565008400310124289331026216539185690543415806032297706057281728297630819470599078671605881959327968978513461826663825971409975981147653267504472851476089048428126704024867638834013588475129037769692095211376929572496672996399051301717668131784518155675977918304460399774158745614613929414899924439979516747569129149514783421882106900432669578679656944997699851082520937160160737284643256113647357514698521588633849887097746863305993352031898606505671963457810745140121298569883403483577962699689881917807374873438361002060104601934086618013307679665824550220876842182292428864930428126036412000251783514017509526927130023840274810231967364403240666797274009552648357522001901817068287030669385907197324420481275467472485991407141545959934859837078087542107271219756531666358619308486806679950780593383731685299623051255970261361270812478691210672783189423848543310637081635781348704278773057327865058045459073002534434339497996005957224931622177684886166222374824305936270207086233919342239691213736550403950147704651075538815816141187045061611010897445608012222582088912196694393761232761809557901432558742511748083478731614523962057127316238785487443493048615452678862179035977769239778814746369621106506319619677210700376802990825021677006716790692452977077498547582066500178893334400307377780579638894733756461394555080033697141635093962862648654877412403442750176219151980419547284055150655694030025539308037829594530167266264204208777702201472005410464646849113554932602861300282903157978220437774021655993211073336149755324258452659718986343920589845595612750241902850252464731127406878137478528178688204039664320825555389233588011556883315410217865797653383227855613796556988555841410193033690897192809692594674630321599379906628837293133933296792497695229136786771327573280739726464405115538047448414927216661725898309128818432425708548656433861469787003909341829790779762693822472715577569968275085358951135209629821806351297411933287449577725317847403135754565720013653056605831858754378333020639134144837669441337956684586261308051915221481125990549492286901294679565542331429913354208882996785627625215209172391374157204684170170230504358314214612616230134413889084972240007209637749156010458176942944173909525363347505897448722701840900580409423230270013395488534073441446795363701925741220416885797443653485123977261877630292083122879856280086765263200766364741393897572761802543514633847839781208506512619339273634890029858377664499635122104551429066792204200849518687507730283350266823931901926798106867812956647220491261481003243862747556793744324995253971785703475628044735952702208525993211417965868986149460021225239103584115030786399845583206098790031267051521560477235833868791797083600001214362291943149113980481487823659816772368039336818638658849219457050451630818734810566327194156864987026677247679550234695820589988661484189861564993300792902862767181592033826478568365055073448601693542527970597344803299991698917334921157586346601034781871720431067508827269010721511058171299722658917431870790557410969622685906000387789919929900018870403456956425942560724594366519511723002406584526631945728729367948585438212460696569151184743525490436733124218071218013375070508790785030611183222647126129750920983212423576182060196850551701933449490434981493193184349650363929042214271233326207942909132572688476931441635376608588370543058386973771711906596505361331132398983059053700770294096307524352044709912287142119901468701642748827319539206826055633942907735490303014833576424138685291340988842402645153113884657077841775939609530023249260595751365704801363845896307605022622494688781429971910893601959117097270604389977723356360159563523719518685648041421867417684312990654057770826067136296627539445240582425455161189384289390184013829532641898893771349324961345485877815724433140510145537929716624620966355461937150739714332120017901737476992114573095708484244884402898135433971342496450023789858528516652484553220933198869283637350766762939634141292805301359530829186353786808028940365993163437945535657137211439845945756897830276447878945643593085915017377705013674814842099577322525028102093432824676919489418055471330313075014051259142822312412454566257213802997173510705515695615662666068282784837422528031398006759559187841666451826076909365582120824159530382351984439456186054961139015709322125156535465084998583524914696464300496993548517067376783931302810113665321761463942937820667388821573697187058204064589036050659097337022743817629226098568727626088268973967607608650269235186284704251142335315967756040207468610463419976172599825438427001197846819103242950952546621876550842538162616374904997358560428975979275563650601705355475380190499476187873340759564997019461626078664957962698040829667517577115497115666108176922260915825834117907875769668837613038871340353848111549873873836525808883895971031199923786339904769696325215176546856465432408239926998845263307297892583287652078578745502532223852103118886362644141284789445368508950950976394602847850042700476323489626104735016171540112686225391181254611385942662488713452964918408036507819354368417506634388617538181800833526412342702142626910794341290559900820512177323934874852891423389654288211365987216152911173233744816509882546558429640221226927753692957723301261244000852933114116559792597406796026114674809926174696080900177877868481219822778539906927637758979763567592861666256295625079773808518307264090328061084978905766483157814939696602213411092988222655989669564237547051862534924164625626610183960379635263092136666242230377301448969979910323767828689251428197981529912486474010089560636963782809058491804600697029044710505535433267980900209331631390238131519229763770325097900545049999311651556603586334463390554550024972541516532468981489309369160946349044472657272439912144557216807213691283819020601343485539813812814686024058889165820023801946725935549153011567254461513046480176270350687532487297805601852857934595170805135269951354156296004890724917700283073497138484671666995546483119283975164159924488124595608164192119281648616170786805558568589881954510565715496837869139158569740575850338988627981412951358954630160082315182270450470549670409370870840658320706690517743843757992410700630527053658278791384479055612852002292441637267547453249194720135805758499792631942927603482771628664150875412520653696520282479697557691378321533857535098368044623372842001791005280411603162748705284500801629483067581559259359586417529362180449475284784085381799253670441512066246355281135939047663152858090302876979638487633057031041003603764852796994995223342126426945213768591957650614902915375853585250818950463255279499210035630187799342068730303248337992694866458592083103846596311043050814192994660808402567911765425355571230611915623796286185677124797253135559711026853035735250788632643658482914880021017651292685737728417936147118230867755294751963178219476873724184725356481733498992990477808434955868973217861812644064583853346668807438608616316902681310270121170233658893740572641450470857946947628234842486520213704437823040918147887962729912139712893851165863095369444950977197666682490477074482825683437510729672523437335742858460527954893317492574482639770923584882210862404914181012379379240943297602389515192594874843994977413769651992433487661016845790452603914330931693814271095543491069092493220968574959251248637520078580180688709469537818001240634237943457074988463068159127245160133525810756067193388799181791418771905978827962537851795760203374836102468872554629822989263991855486214229935482938856346742065355619154628224788604808363021482279057530102653544238160785239856627472344452267024995862466551605077834653395203321593267171770168367468375074004854882920531993301113633552958307475837609595792312975130036713228890658133455896429269790092373482599338572385329444869992613872223254467967302401484242085362645100206992844658991620912113037038530138035857551580642134983114828524802405423549558676067154150641486618761616267853598889329562036128766369620770676442845160139468042230409320344485123358916007434049260291466444822099782663549938109630739552594454937340544739041107444531957232307094663010718826774912371263264897007025157761408437672205412803274986038424544404228620629566582696056690649734613839100633929585708766933705680389369668269485207474273117097240047723775763873621975125111923804866468028040891759790627272278193065371434988287932846778126548178465803128847563362706780419830490520409788338594153731235825073906815935018524053791449601816106270290944949009925601988762168430749444531337064248291113533917698545957597336841213366629497133473742822582538644685390516510941224874780108618088299344245795771951062846570398068441196425051844711731283734343629483683425203945207562959932372137549509408459392091794364053760787696050515330525760193425799790683732373233555780243437396718514508838938817011162093664238238349444356587618116283249997276730611981745160247809138129601619498369759159800185333607818013943557578599518451028272514320703554843165604147963393766035612448469619140949336055758916959267977037688344438655913996284339800829540384773764567613946570529502496350001890944121507235875281230173024698568679043062519571896546414380322702145874062609813885483646269038007436947894212488665198083421277033576921426791385410226976408534306088551501632005641895197659287903556851709987167066055517812461246918530818548180780793871288242627861860832624160904364902805183938676642609535999639834062070973986901921300079224045298988988621254629167375870118118181765288461916486783960318699018634205248614323104340192664257172215294464883628440082980753809241239871786218645074918644076688695617270562680815508849386892806861495390742500985238266779210615787562657764113260657092854042269333670688074248590694881834295878550660623897364595920629598706582065667545683623092127433063580830238060795599639174365862396266866042539207296887843671498182662207819755106902714049015096867722340828106455341478052067027570341651067036773565498110089836517280175953406742238299164430476045439329923543277371027773801878350635452463751093327128061883023971928928174707751714790790555455727990935776168465589373414361626842290758582618190316299591130955523996757497590836281839233122024799379967257930670585604579138888781456825256946043205163867067659715576584520970327259660316013700649161602184360138474368805613471070725910092180087174152413740414826720082948141593065293290743926632556912881570036598732288620816346341514816611869223777163866307369070684348755253252807692018061696812574517401225808498163838383609367053032728573234624735185083124133899514820414047479739383750450035702040421064399335174860300103293257146757110743224293175580442824661555707860515041289633304107028489412498316924186018935099359364853707758382546229359453719739694701213445783349843014266705423029646441211287594070703478541825597194411538063201070835999239884330052244442951517860298276296506617483477396380690590798020818562231672365295471618231004472855015151236283340777910533784467377733272277583405037398144628246719646057354399742813638607592611155068429655191952619833500476038499520997206746015109233808014233883904680305972119880174444250454536143142168553029857274513984543464170597306143095946864568607059139305761117731800337586378447931080002669172044894508033229385356737699098664543772409213237027152806535791058013487333257151317880573244924908381165783532178094578628558978805774703551722588047458046055919837292378568956090923537052366866319292263559698739978447508466451910413855037053153336548809371319368999407336185579842877737570851107127223336961338555321939527174830291775177562500770928165929081761176571002137268518545366523355874609830440932331309445910676218977032819798387519299205515377575203952541982614690326170486024544729632329512537798758031325485541157430617458768246348453366254339745397501435913632941605726158027123368928396089104739827997060473805753153957178507735361496378591527771805138712004552037237341701736119972353493210444488182469416977802817597414224843731725329126321045086054704509241224489271817568567832691898707652281410234900570994509082036596401035407356118587542133906042042490284862317884686350210662014318410279134971044601318266940431000106239990009625128313033343510961138596470686931601544257666166854646519537806503716155704870247490831006810193198786048110074019711215652596247992791304828541751813980514012789318749839008468258145641018474744277647508067069715327291829401038064270287485206750297834643102873021543136672434387521629339589809195169747717895267529942613799591499734142914266309975112190795020033384718183804403432828375893852929742277635196628708088008610325819917522980365222348946668568967596561520194589870484531726700352585929636993862232921487972344558206121752382310708829675347388235638777968096251165817936063008468948340235367567208355069834310274836031979305322061856833991266619784400208877322438216408274658809291153729025751077897322066791400252549658229137089177995186201658728772497972773953652485731150351892051268609884188032128382526280541260792494716808687781079155891013214703110599201430497807104914009945448302541193559298776193115642073486677208212501359861817761870769040029063175700460440801830408802082271578475985793479395677425246041177139145120498096262810694888242917248264181973551528866776135574555980652511401534671546683650547737938969082560976194581807317206935955188574186684987032566140632497048300889857015436933811530598689783650102981165778598590848581578674605656788517147094054624180039253654784282743606679350388167089769305247645282581299984162028511235208151693239329617505124008778908092942827149899162221633102340977429302385825209091178677259509236013075406635729293634399689857588019461486212104384720994961510140508117529099597432904495370087828116932145027677791843835428683336448371435606958616721434474666480451043134173543576039557706898868395246683786429018011058634572645442421992166444170293278952684981885635205819395367694747271075344084431236377715446030583306797168576133228028176745259816632949111689817257615752352702425622993695824076422234509130210299129965917780529602565848412195976781283769640800592270897341799365372245507032322315943940729931559415576787416527111167917141395069452947671493454724730815318133610103989350774409339664239103921036423350931627357455222160506236005401356949589042973780210566172389719303554509672237206466218386430843128066326434794180367917810767065675416913339839042805730951521495809259045409057203507564202732770768450703850801641866577676681786094207520720905186160408209030836022817355539881193759240821103306475747062417299813115301799631140428857020211277701232190362126046684257451101542145092022235460405752205053451518285933365056614158822634230245410657047470432625998552090977291804964065305591196277031859350358955715008445831663915460678579752049382585738065813701013608200079710328911583874859243021233588572301705099105175186272193237739197880429252760814775977053749209232315965165323407601405002772884793540286154051235375213139092153210047342065695605770403154421291276559663511113060914918695378001794321973206022379362463632638998043505893483375405130469670481657622159792213133413699974355955945501764580696278725413661054034792946994776111315537200340936404628016280472126264738267886638546169752258425134350935494074213200955867605927534066763376061483192957524435965932996798966299831114275500316379797572066698820914389009892847176294954208762576405743705947086540453943209982964983124404615578180334028046840629828311183532311984724606575256817877190140150940935334782383890229661636197245833164118433218945604483809421852768662051547395565040798087654226361140829001540084000336081199294220345762149769287348703059617136575891587532845990476665742650730790074439199575337768778236312824470510320196972781672204365760870412205207101529208590111661097556221136616862032301448827648641634592257599427061737757885277785739302905039250986386329979560655626610872762275224189841692441958187544884079432382915922566478138488617022191257293728616622999512086828648849324053840007176616932415588035180273382697391522693794178919284506456496918583635812214532953878080537043292679641747203391851586464251976176015887194434162163487602051298672236906144922698929863041383495584424166068491241677919780442410773260786238111089242873412502643087324443742612851013012872962092862890045788203329668905082395539981101963848766404147353290214879406467018891037305290433959814531567696663934509880637841536475469499180678731530722542572412558746045551119672584446042582548116776542317224077742411228129872495343808013729885746365002513743932542121871985486423595559766594160388494447613137380003642122781326533982031220853196354874222796636842020207703416289918594443513821648269867109010961384962397477366452315202476534169109718340780207956581262511111643142036552242350060549312015412019502560695504106293220470888626139969983435756711996475811918951575293467432720594285483128886446260025952028120819942708286840322947676436611654830995994102374655833904617079796734682292057818997222106380196258797107536678357014682759440873614437182221955288715778409175336181971808592302011375570743217001751262165405948467638957295090874189315529536960046718417608194254457048316103663857456750300716852684543795371199059600756468421457020307628668676342895731606190841184166706382577063142867091338846819431257101333398383137585617832740625307550537304138957961002393204456564131839221665154236983403675768903246684343406048524623229630106242028435682240000282804598732718719347442501548291594849998982619567603621525735744515186087706382710074881479195964367578378152730198317013151884076883375336431504312484617100139422994083551973969926249477700411291555323567707351792567370654065441944149995523181526312591417249520860198787632172913201837716337175835241868212472654154339475505700099230528955982796556044750534897713978401838102904252495038983267587404715760144697379339992883508629269397376446396604792449748567697572958579751222613615147147833567078639874014550008400050768110098406658096860408126090510821148261669695748106465277890661163652388253419200873818742166009019763220931768679841689225681569151301838037163637425791628896471879836916010664242723655828864617907727158655287268364196820292152730116633663215882020964815619654402635133099902407824327551664534344770606891497150385027387766222230281499631737546205169905000552681488371495980467863711694726021663112093443979648500284566665486034913940670635720577031936444253255689765207229382027382301620488200192642051253167920679376724568684091731206952422301998200905416574754887949581792207223042267079153871717290013787361660811863455024777650306228231749918696057297044729967741245718581493238504024575168184561319901110829457707337812440237265976998651640183814688064921444216650158681492677356082028623240777855455804395057001131827097107396983363184907805734006331698202204874909478177833477223143995355403597341123281857013385202154613062865158768027989557044197152405711240833119554462489826191010662484610306365273415197369424101852085022413932100884216549198738042238175315352199842693415281161874925129395393802026682932170519275040230856365677357182238822546332676363254487669066986066681486451972241643363835118563397822592351533809557452074849530505471440297785062773356958640617910936485954282922843087834864532020781396706212477335846792849383273976177729741082090735400683727671748261205302046191890027856911580891672213785838318019794910936563053286105183884999251089044435858618892415967779119465937652231563490966251747675229494401352727955198188270787898259384728366106189825286632133612666462407115949845965962329180284068546923952931595154405563176679340257347313163982618797077340235084472529763448420093804934337041397551838479070035481713133849177907699960063530841123055630155306378636086596669907763545949518009578583417753287872993830907087530592505649801791206145592410640180003693934259570980303056751137129715177931897141647240645826718313733928487454591513254647242623966812346568197192635388044071698557423087488395961981491742782108470741727515951082649038353162721625697589719329439171925923949687689195442211967036036150202103188634904938639366474352163576384748769946306252845134871548669511944920630670207705356344223718454782714639117991510629184705103580353027708267316209589117867582913141784805696272475140025000030488920127859049691957775979085971466305260046170666336667342437778328483228105078560581860942166038223775601121152077541852108815642811588641744028188757967891887372149037734706193207826641336661059732503302270603958621752329680373398396858345339616123491944338523321008803618865039691163172229291841678194075308043109003625465870272014284217128196725932397721976980431831759592741085856159365015157733789321527903148752913125276857566706158271975437172917990747021847880860305288978781114273337900840292576996086643707188466621813078520440940369524993353564920271752947210292285117441184023675014922613868911444429517789115451079558445229673211636864014769056456535645109618990918605901814461528485015345611738693407589564531467126339372893912410798961279956956161721885716096218450025811763051501200268028409143180878270887785287481990908917337705009228664996410766232524875881833433421259736652573277484701364327831796137882200096679137469006914491731647394042912696521419954521574749850766489879811216937699299476094945397135809577572298537735790680831757596706557647018011357986181793167784944064101769143942247207290735816465288115727979559366490280423177019296763594361382799918488829616176512476591453186626896310516844688160418254290044564778071469171429729234049958315364005202724915366660235220447970148091881581445901761063189354327743080984313826402931520310752786935138418178719209214841238070877890249708990496027785408138533684738310317505762773649242695253131181469454256553074970629126359674025382084579297596111692914538520719333067357276008599390837758352762186741528921863352073824421177441010429243320801154729117093643334146512546142917785444169052267385162735208512443633181508486970631193678403529416725604626979393807806250405212331837847301256221541052949357124247375160987681148102647312123435446809702494883448259361892239588906077169530365386544775061951920142588769865147854660598475286744322131876272804110284633732040811966442269651935078007718138885857056447692880792946554854405549161820830059976806193327463771215535100176282657394165652883769552815319084748077719666051544748464480611994704502751836277969112584972424423283627411970607301833582403761431798975274612462239719361468158489206924592097687996238765705865042312730358208727213590113216116418840405493586745135840202639222860628569326993783686879373213073347075918336954777885629577312683056607736024439408137381364315304614388131495934534839443038249640607431737457649104528028030172299584362615566320473019685987253728225845670255405926611603544432334656987197924711709349774307535055846402580263563965573401066293707143435407064295594794467922616894208697973601331334476054870224892881170797246450039267137919326136020793870061277172294760367839959870324985939538586613868846384644263071673017283606293360041003137685941115760578755825094318414933051057243750040558379086825209356919372479222847831369773332611893070281021035088045039033263189437952143004993686995294458105316187621008513726128263797278771616927387558164137794040013432888746756925440058534406997404748563896661176782076445885952862491914893816475537720666556551432492043243039250567574443108958429191313545716245928729026481449767116213829831378210196913293171996813847764697778791796964256047184270950986805842565053227887863250880351175412048574832987670764029788356190324791890873037921174841793287050751532665103250329720294755568691504624489149340880779391358155243787819939220470476483602389422641104645203396153822100083893911417858294314474844296463534488929812807473455471247391357336036824171069415615209136135368335029030674010078293401981023084546468239813475811257675863554400813751105834363620346328619525312739810604918301600772509740806292874768665930283596409354207257646439491051752919696752835617055807037402732291614489540537957840630067576997812264529669071742350069444047069874067521513308802740379191291275002080768291400188819752641018488586126186688419100183996682496491712122174354096735554727823893694275685112249988328405463823816229270907116406180219159743444097910850763567462302239323430539613334075650545407476909698598596398367716489348845841227721326595127470475169337503757302936011161767079822041944067504199794490127755726088130993299966014764498696302768797938774747745077379955952679907871635509846274125706733591181735210446681984203283918983896585718279152488499240628713201032050765916390745670069645989489573077708097628502545212058292716343379310245096426846662485706474939528464706700033662900712417624387841186746678444687043216985579639727079781211943790520948495580895816398468339197420833955892388165325858263441542793716827063832533321280624665175407845208291378497019981330038426539839411296739318045640593272958427837110379413970969892444721740114078974218278083258056492138230533329640969059052980861238430989499980317220575988308198221514194432243236220890124937024649442188636939840045346717215188363792690375091861260863998238278945816060186773035238253057625134194960007363676513680813080110575602249043793243652693908658361239345757784316428007817083153010757286906083759397963091915034966817846633933386427828011979653925783484794058471516201121183524991174823114998884377202768047555753605017212685895016669128722999632304889440821599396326653346333788427280671962237196183338894448899504766772795516322223357754680899437232248064985617092540419639754208604509692709667713529445331355439527926312651091593985129657719822222856223522001038610997662969047458516385268821135730228273820551949954405847639903102640582180379651319527304773069886527026655136445984980749672685322489876404028889684790697148819693766246698484981871278590086284170456851277894913330724220621828682041252019352762612549278066428665461216974037039342301881624302971812712397178572748366655024403040969259940018238576806937044456295243336456901972664270176177864795173197926322809063326866405838783117800775182983203736668266314191459660789431382909634794110964802521888838385271752061974414503710315560854918718113922438312156177393078494791819036582092520832569730515653025590229385618211594946758940226524844122092378038130867058088141971601447984756044996949728314191109100929997390103032108613958485632940463331126822640437266343855262323334129297980895230841410390532139928660167167628290741447473434819019774440177587334588135702831935424653966008157759112025553345522124794171041974783394116700259966521442755142690116123201719074072754171771754179280494241027375280637958355279779065491863300141035057824276840653974650480630672140766421817560543390949378327467080906812417849821917071455342711654516017976181839843247324833917935489269221905976487574179102333976893931406134002086628426495954362269481698789166699856231984625412729126034454108114612048238778402753037816432365697497249318133397097752366684908668122202868962033190860464406218075177311260040245782645835450453555318513305827213636000541340702108011700376494018463013111625057058658771732189167380930310140016081355495860225996499221161171742344548076452323884813106376581918828390132602543773302228169373217555292372303641034536888079175606756356853699846255171074659583093240327166294714045723482179278493489466437038005261146916482036821565631924663215928272821233009808118904562789434374729940564330187716969755094535025623346884799427414620117057456069412120126627013834393086601169045209268374171211425059460809076773013845390169564381974705065896467500921637648611591553136400690319601093408301597247973059782625274182894045486043992623433299382804448545026041855500162930703833435216844350061116286002508561408004973316557881705878127496408894790491532896542289031939711360026042127188000292942232504019069575515633776642287015184352787561679545207699664220247164666184384826471322461478171039287880833951061791776694836891505844444104962479321293899189101887776768394308377443930215539868080552137148036121556708517269000154319865802497113559732700000455837336701087346099346600974943794790842046560659724163058614737400042299532832554688105814669703940670282047576612911861103707651399016720024199694432761330826064917433151180912981584654646954546043780988760064126522229023916400735780222393066778677690164502653178102776240763539072797802251880218261466243250327237813083270250852406994034060766266566898500113419221060308637646685139066896027126214381000180298838277474861892417277597264199402643063107347529216558280746942320385970097720903596357688989262148459530565504515064460233649792486375624204239450899961316531242897595428811536376404089689866866994125082531663823530602310225195555648245166232279959281194125627461852207291046120412123069143549165688533459681058731611021029206499233955103535733716867086195229018472298461719963123704004880027517438856685245979884104491183409262160088307060602550314528918330754541028978886405484623902317785759641806462172549420830400669563096054249561310295120713929199905786048180605243943206673684833684788186174716904587990132015281202249818040922330765432172479531389783425997351478521425195753285847079695218980185271795440792533936204760997379799357478648982442986424535043160470393343767052768199909931734104636286862268411263357752828293397653687321803197968615920150013387006168649211778447618879063943614973837128205697194696809062331167880481104049207499327646014974368811303552293309240357894754470599365539538390984708621398498536446183038056149903669182809171532625318794177314929979978628803442852914565991660929674580546092161722713069484055716160405349127277251208020493277171054480824491120269389445916701594711996199694542242870342500090985850858751683770178603024915158602833567885103079171683623013538651585586876751976261594343685794274489468020441916712799004080528162964276197844124281680260604923637878247164688198720233809261982216375138622257213685327968615829580422104429583967745332280225286052434022945602020812481127632427113208008960489699774596334533389427580461499245343828964229115323188641537440890001134470812546859369581938773045067229910137319580688625963082220385707583197361545336264647185081315826651007346907898512277807074289147518032931666442225751334050985948207045777203629059439885255410024508057758630695506450019751868703855590434515881244940577119427200135054775977789582924533802787391823022197376774498687866660477754787863278353177260827397418522642818365341857317241828344481088479426136298782255354427581107926192021227353067301711086962043236500284179902048138887142760510673381434578418459041992731690750845365173394311593043205780251833182725519032442235823341796634485865963854811583444963771877067420109760378517152222406152798692588411437425645755353901926556315845297834299637396499238744507017178731422724045319265500257448415982311412330626911558972968190740106322082060383239377639049066187616500844617209097145958141192298249792193299914411523676777471670771953819495072584320013950015405277531416372965571994718046651398701461733859570961809926738914050784805153902481682223710074907781125785796885279114100374079505962786267435143253509561226780498457585984473079905546205521592149082563025942489683927937986880436580449409240885602116370726026566781412796552371776135565222986882763277964533309384751649637768049875551356392869665874899011348202494045745873348432585869428618081271636521837311686186920807490609884496586793149781647297990811224624321666870145522617826535108068688903694546841763560875827082976301660545908968632692295268179140480398103726563543601817263149697192947866896439921790817398856119908838270990243742021276883816393452364381499363125145501919615981411593895183082310889437786907596410166861811247643948458461114556557434414498438221820219443527168774748989473453575007271735677566962069674077889515209865888629314760484932401555995863134497824038559107445314699342145998755417391351579489505363865493808786817995302011514445214313849391754088821519557124441050137566128779703394240089551210990741640918346448120434038215993493539454133293234758728632630932197478995128836656978707055171537829279832598897742223512538780630002371687097174185995184714945631435359643343764879081343251324633210134638261171468450650986451390041460947332758838787138756206894590802664918073572261832170175113809875953915720603500472665399569786079832774048473460243997353224020830618411579291508792237967379406489555295127493350478889159147400658807975450249489647165391782797691503436944333388730698597462589568072716723927406425340822082567470003128556492416777424166695024076914389325406345786248797127531050096068601616587690407653135224548678157270379565387206811354239908552464929078948360372676457119489222411389806132868695155704960757995667783578357294671758461873381177200636697684640216886662684475838095797590783189629097954850358018504430470393038189808005139722948447226689993747023533073372842511544065034326774157055555273604369241698935822286552784383548926909047570783989672797877179957379158023017817626621348305649350934850834002321714157324110249801490250431288642552737060847879550843328984147022487663172465588481630795033849804419105899677219830593092471958883135398602340619512752787625560136531028763299845411201590594009137456021583611114515606561406101182725011172016468922232132548687129853584458310426787281935756006929613197852942233011244236811742999982729325969805393662199561856262470727953420296118002356945319918624344733235303397860079941140054896457313172601598280086763707979982598658729568376910361466610996998786160725036638225443264106943147896161339327401078504195231228046256132013605388846450234815149239323432328041926676032671691208374242584320863528303501051697881298348019067483901236391767084421419281824132503081451661403615108014867183524471445495446223883493955903654669430574982376880169519251588533182226602171343278909052239593969383813964918746810956400397414858096890007662236223731168444067991744920369444569883184073061385892289302468217549051402669001839140766756265751089857704285077382688585811046020020415727872898285486733505776210971922094856960804257884230033195433411636244991048760871915725635646503872211069988599645536383715033346875n );
43 + });
44 + });
Recent Moves:
module Example where import Data.Semigroup (Endo(..),stimes) fib :: Integer -> Integer fib = fst . (`appEndo` (0,1)) . (`stimes` Endo ( \ (a,b) -> (b,a+b) ))
1 1 module Example where
2 2 3 3 import Data.Semigroup (Endo(..),stimes)
4 4 5 5 fib :: Integer -> Integer
6 − fib n = fst $ n `stimes` Endo ( \ (a,b) -> (b,a+b) ) `appEndo` (0,1)
6 + fib = fst . (`appEndo` (0,1)) . (`stimes` Endo ( \ (a,b) -> (b,a+b) ))
Endo
wraps a function; appEndo
unwraps it.
stimes
composes a wrapped function with itself n
times. It is optimised to take O(log n)
time.
module Example where
import Data.Semigroup (Endo(..),stimes)
fib :: Integer -> Integer
fib n = fst $ n `stimes` Endo ( \ (a,b) -> (b,a+b) ) `appEndo` (0,1)
module ExampleSpec where
import Test.Hspec
import Example
spec :: Spec
spec = do
it "tests" $ do
fib 0 `shouldBe` 0
fib 1 `shouldBe` 1
fib 2 `shouldBe` 1
fib 3 `shouldBe` 2
fib 4 `shouldBe` 3
fib 5 `shouldBe` 5
fib 6 `shouldBe` 8
fib 7 `shouldBe` 13
fib 8 `shouldBe` 21
fib 9 `shouldBe` 34
fib 1000 `shouldBe` 43466557686937456435688527675040625802564660517371780402481729089536555417949051890403879840079255169295922593080322634775209689623239873322471161642996440906533187938298969649928516003704476137795166849228875
fib 100000 `shouldBe` 2597406934722172416615503402127591541488048538651769658472477070395253454351127368626555677283671674475463758722307443211163839947387509103096569738218830449305228763853133492135302679278956701051276578271635608073050532200243233114383986516137827238124777453778337299916214634050054669860390862750996639366409211890125271960172105060300350586894028558103675117658251368377438684936413457338834365158775425371912410500332195991330062204363035213756525421823998690848556374080179251761629391754963458558616300762819916081109836526352995440694284206571046044903805647136346033000520852277707554446794723709030979019014860432846819857961015951001850608264919234587313399150133919932363102301864172536477136266475080133982431231703431452964181790051187957316766834979901682011849907756686456845066287392485603914047605199550066288826345877189410680370091879365001733011710028310473947456256091444932821374855573864080579813028266640270354294412104919995803131876805899186513425175959911520563155337703996941035518275274919959802257507902037798103089922984996304496255814045517000250299764322193462165366210841876745428298261398234478366581588040819003307382939500082132009374715485131027220817305432264866949630987914714362925554252624043999615326979876807510646819068792118299167964409178271868561702918102212679267401362650499784968843680975254700131004574186406448299485872551744746695651879126916993244564817673322257149314967763345846623830333820239702436859478287641875788572910710133700300094229333597292779191409212804901545976262791057055248158884051779418192905216769576608748815567860128818354354292307397810154785701328438612728620176653953444993001980062953893698550072328665131718113588661353747268458543254898113717660519461693791688442534259478126310388952047956594380715301911253964847112638900713362856910155145342332944128435722099628674611942095166100230974070996553190050815866991144544264788287264284501725332048648319457892039984893823636745618220375097348566847433887249049337031633826571760729778891798913667325190623247118037280173921572390822769228077292456662750538337500692607721059361942126892030256744356537800831830637593334502350256972906515285327194367756015666039916404882563967693079290502951488693413799125174856667074717514938979038653338139534684837808612673755438382110844897653836848318258836339917310455850905663846202501463131183108742907729262215943020429159474030610183981685506695026197376150857176119947587572212987205312060791864980361596092339594104118635168854883911918517906151156275293615849000872150192226511785315089251027528045151238603792184692121533829287136924321527332714157478829590260157195485316444794546750285840236000238344790520345108033282013803880708980734832620122795263360677366987578332625485944906021917368867786241120562109836985019729017715780112040458649153935115783499546100636635745448508241888279067531359950519206222976015376529797308588164873117308237059828489404487403932053592935976454165560795472477862029969232956138971989467942218727360512336559521133108778758228879597580320459608479024506385194174312616377510459921102486879496341706862092908893068525234805692599833377510390101316617812305114571932706629167125446512151746802548190358351688971707570677865618800822034683632101813026232996027599403579997774046244952114531588370357904483293150007246173417355805567832153454341170020258560809166294198637401514569572272836921963229511187762530753402594781448204657460288485500062806934811398276016855584079542162057543557291510641537592939022884356120792643705560062367986544382464373946972471945996555795505838034825597839682776084731530251788951718630722761103630509360074262261717363058613291544024695432904616258691774630578507674937487992329181750163484068813465534370997589353607405172909412697657593295156818624747127636468836551757018353417274662607306510451195762866349922848678780591085118985653555434958761664016447588028633629704046289097067736256584300235314749461233912068632146637087844699210427541569410912246568571204717241133378489816764096924981633421176857150311671040068175303192115415611958042570658693127276213710697472226029655524611053715554532499750843275200199214301910505362996007042963297805103066650638786268157658772683745128976850796366371059380911225428835839194121154773759981301921650952140133306070987313732926518169226845063443954056729812031546392324981793780469103793422169495229100793029949237507299325063050942813902793084134473061411643355614764093104425918481363930542369378976520526456347648318272633371512112030629233889286487949209737847861884868260804647319539200840398308008803869049557419756219293922110825766397681361044490024720948340326796768837621396744075713887292863079821849314343879778088737958896840946143415927131757836511457828935581859902923534388888846587452130838137779443636119762839036894595760120316502279857901545344747352706972851454599861422902737291131463782045516225447535356773622793648545035710208644541208984235038908770223039849380214734809687433336225449150117411751570704561050895274000206380497967960402617818664481248547269630823473377245543390519841308769781276565916764229022948181763075710255793365008152286383634493138089971785087070863632205869018938377766063006066757732427272929247421295265000706646722730009956124191409138984675224955790729398495608750456694217771551107346630456603944136235888443676215273928597072287937355966723924613827468703217858459948257514745406436460997059316120596841560473234396652457231650317792833860590388360417691428732735703986803342604670071717363573091122981306903286137122597937096605775172964528263757434075792282180744352908669606854021718597891166333863858589736209114248432178645039479195424208191626088571069110433994801473013100869848866430721216762473119618190737820766582968280796079482259549036328266578006994856825300536436674822534603705134503603152154296943991866236857638062351209884448741138600171173647632126029961408561925599707566827866778732377419444462275399909291044697716476151118672327238679208133367306181944849396607123345271856520253643621964198782752978813060080313141817069314468221189275784978281094367751540710106350553798003842219045508482239386993296926659221112742698133062300073465628498093636693049446801628553712633412620378491919498600097200836727876650786886306933418995225768314390832484886340318940194161036979843833346608676709431643653538430912157815543512852077720858098902099586449602479491970687230765687109234380719509824814473157813780080639358418756655098501321882852840184981407690738507369535377711880388528935347600930338598691608289335421147722936561907276264603726027239320991187820407067412272258120766729040071924237930330972132364184093956102995971291799828290009539147382437802779051112030954582532888721146170133440385939654047806199333224547317803407340902512130217279595753863158148810392952475410943880555098382627633127606718126171022011356181800775400227516734144169216424973175621363128588281978005788832454534581522434937268133433997710512532081478345067139835038332901313945986481820272322043341930929011907832896569222878337497354301561722829115627329468814853281922100752373626827643152685735493223028018101449649009015529248638338885664893002250974343601200814365153625369199446709711126951966725780061891215440222487564601554632812091945824653557432047644212650790655208208337976071465127508320487165271577472325887275761128357592132553934446289433258105028633583669291828566894736223508250294964065798630809614341696830467595174355313224362664207197608459024263017473392225291248366316428006552870975051997504913009859468071013602336440164400179188610853230764991714372054467823597211760465153200163085336319351589645890681722372812310320271897917951272799656053694032111242846590994556380215461316106267521633805664394318881268199494005537068697621855231858921100963441012933535733918459668197539834284696822889460076352031688922002021931318369757556962061115774305826305535862015637891246031220672933992617378379625150999935403648731423208873977968908908369996292995391977217796533421249291978383751460062054967341662833487341011097770535898066498136011395571584328308713940582535274056081011503907941688079197212933148303072638678631411038443128215994936824342998188719768637604496342597524256886188688978980888315865076262604856465004322896856149255063968811404400429503894245872382233543101078691517328333604779262727765686076177705616874050257743749983775830143856135427273838589774133526949165483929721519554793578923866762502745370104660909382449626626935321303744538892479216161188889702077910448563199514826630802879549546453583866307344423753319712279158861707289652090149848305435983200771326653407290662016775706409690183771201306823245333477966660525325490873601961480378241566071271650383582257289215708209369510995890132859490724306183325755201208090007175022022949742801823445413711916298449914722254196594682221468260644961839254249670903104007581488857971672246322887016438403908463856731164308169537326790303114583680575021119639905615169154708510459700542098571797318015564741406172334145847111268547929892443001391468289103679179216978616582489007322033591376706527676521307143985302760988478056216994659655461379174985659739227379416726495377801992098355427866179123126699374730777730569324430166839333011554515542656864937492128687049121754245967831132969248492466744261999033972825674873460201150442228780466124320183016108232183908654771042398228531316559685688005226571474428823317539456543881928624432662503345388199590085105211383124491861802624432195540433985722841341254409411771722156867086291742124053110620522842986199273629406208834754853645128123279609097213953775360023076765694208219943034648783348544492713539450224591334374664937701655605763384697062918725745426505879414630176639760457474311081556747091652708748125267159913793240527304613693961169892589808311906322510777928562071999459487700611801002296132304588294558440952496611158342804908643860880796440557763691857743754025896855927252514563404385217825890599553954627451385454452916761042969267970893580056234501918571489030418495767400819359973218711957496357095967825171096264752068890806407651445893132870767454169607107931692704285168093413311046353506242209810363216771910420786162184213763938194625697286781413636389620123976910465418956806197323148414224550071617215851321302030684176087215892702098879108938081045903397276547326416916845445627600759561367103584575649094430692452532085003091068783157561519847567569191284784654692558665111557913461272425336083635131342183905177154511228464455136016013513228948543271504760839307556100908786096663870612278690274831819331606701484957163004705262228238406266818448788374548131994380387613830128859885264201992286188208499588640888521352501457615396482647451025902530743172956899636499615707551855837165935367125448515089362904567736630035562457374779100987992499146967224041481601289530944015488942613783140087804311431741858071826185149051138744831358439067228949408258286021650288927228387426432786168690381960530155894459451808735197246008221529343980828254126128257157209350985382800738560472910941184006084485235377833503306861977724501886364070344973366473100602018128792886991861824418453968994777259482169137133647470453172979809245844361129618997595696240971845564020511432589591844724920942930301651488713079802102379065536525154780298059407529440513145807551537794861635879901158192019808879694967187448224156836463534326160242632934761634458163890163805123894184523973421841496889262398489648642093409816681494771155177009562669029850101513537599801272501241971119871526593747484778935488777815192931171431167444773882941064615028751327709474504763922874890662989841540259350834035142035136168819248238998027706666916342133424312054507359388616687691188185776118135771332483965209882085982391298606386822804754362408956522921410859852037330544625953261340234864689275060526893755148403298542086991221052597005628576707702567695300978970046408920009852106980295419699802138053295798159478289934443245491565327845223840551240445208226435420656313310702940722371552770504263482073984454889589248861397657079145414427653584572951329719091947694411910966797474262675590953832039169673494261360032263077428684105040061351052194413778158095005714526846009810352109249040027958050736436961021241137739717164869525493114805040126568351268829598413983222676377804500626507241731757395219796890754825199329259649801627068665658030178877405615167159731927320479376247375505855052839660294566992522173600874081212014209071041937598571721431338017425141582491824710905084715977249417049320254165239323233258851588893337097136310892571531417761978326033750109026284066415801371359356529278088456305951770081443994114674291850360748852366654744869928083230516815711602911836374147958492100860528981469547750812338896943152861021202736747049903930417035171342126923486700566627506229058636911882228903170510305406882096970875545329369434063981297696478031825451642178347347716471058423238594580183052756213910186997604305844068665712346869679456044155742100039179758348979935882751881524675930878928159243492197545387668305684668420775409821781247053354523194797398953320175988640281058825557698004397120538312459428957377696001857497335249965013509368925958021863811725906506436882127156815751021712900765992750370228283963962915973251173418586721023497317765969454283625519371556009143680329311962842546628403142444370648432390374906410811300792848955767243481200090309888457270907750873638873299642555050473812528975962934822878917619920725138309388288292510416837622758204081918933603653875284116785703720989718832986921927816629675844580174911809119663048187434155067790863948831489241504300476704527971283482211522202837062857314244107823792513645086677566622804977211397140621664116324756784216612961477109018826094677377686406176721484293894976671380122788941309026553511096118347012565197540807095384060916863936906673786627209429434264260402902158317345003727462588992622049877121178405563348492490326003508569099382392777297498413565614830788262363322368380709822346012274241379036473451735925215754757160934270935192901723954921426490691115271523338109124042812102893738488167358953934508930697715522989199698903885883275409044300321986834003470271220020159699371690650330547577095398748580670024491045504890061727189168031394528036165633941571334637222550477547460756055024108764382121688848916940371258901948490685379722244562009483819491532724502276218589169507405794983759821006604481996519360110261576947176202571702048684914616894068404140833587562118319210838005632144562018941505945780025318747471911604840677997765414830622179069330853875129298983009580277554145435058768984944179136535891620098725222049055183554603706533183176716110738009786625247488691476077664470147193074476302411660335671765564874440577990531996271632972009109449249216456030618827772947750764777446452586328919159107444252320082918209518021083700353881330983215894608680127954224752071924134648334963915094813097541433244209299930751481077919002346128122330161799429930618800533414550633932139339646861616416955220216447995417243171165744471364197733204899365074767844149929548073025856442942381787641506492878361767978677158510784235702640213388018875601989234056868423215585628508645525258377010620532224244987990625263484010774322488172558602233302076399933854152015343847725442917895130637050320444917797752370871958277976799686113626532291118629631164685159934660693460557545956063155830033697634000276685151293843638886090828376141157732003527565158745906567025439437931104838571313294490604926582363108949535090082673154497226396648088618041573977888472892174618974189721700770009862449653759012727015227634510874906948012210684952063002519011655963580552429180205586904259685261047412834518466736938580027700252965356366721619883672428226933950325930390994583168665542234654857020875504617520521853721567282679903418135520602999895366470106557900532129541336924472492212436324523042895188461779122338069674233980694887270587503389228395095135209123109258159006960395156367736067109050566299603571876423247920752836160805597697778756476767210521222327184821484446631261487584226092608875764331731023263768864822594691211032367737558122133470556805958008310127481673962019583598023967414489867276845869819376783757167936723213081586191045995058970991064686919463448038574143829629547131372173669836184558144505748676124322451519943362182916191468026091121793001864788050061351603144350076189213441602488091741051232290357179205497927970924502479940842696158818442616163780044759478212240873204124421169199805572649118243661921835714762891425805771871743688000324113008704819373962295017143090098476927237498875938639942530595331607891618810863505982444578942799346514915952884869757488025823353571677864826828051140885429732788197765736966005727700162592404301688659946862983717270595809808730901820120931003430058796552694788049809205484305467611034654748067290674399763612592434637719995843862812391985470202414880076880818848087892391591369463293113276849329777201646641727587259122354784480813433328050087758855264686119576962172239308693795757165821852416204341972383989932734803429262340722338155102209101262949249742423271698842023297303260161790575673111235465890298298313115123607606773968998153812286999642014609852579793691246016346088762321286205634215901479188632194659637483482564291616278532948239313229440231043277288768139550213348266388687453259281587854503890991561949632478855035090289390973718988003999026132015872678637873095678109625311008054489418857983565902063680699643165033912029944327726770869305240718416592070096139286401966725750087012218149733133695809600369751764951350040285926249203398111014953227533621844500744331562434532484217986108346261345897591234839970751854223281677187215956827243245910829019886390369784542622566912542747056097567984857136623679023878478161201477982939080513150258174523773529510165296934562786122241150783587755373348372764439838082000667214740034466322776918936967612878983488942094688102308427036452854504966759697318836044496702853190637396916357980928865719935397723495486787180416401415281489443785036291071517805285857583987711145474240156416477194116391354935466755593592608849200546384685403028080936417250583653368093407225310820844723570226809826951426162451204040711501448747856199922814664565893938488028643822313849852328452360667045805113679663751039248163336173274547275775636810977344539275827560597425160705468689657794530521602315939865780974801515414987097778078705357058008472376892422189750312758527140173117621279898744958406199843913365680297721208751934988504499713914285158032324823021340630312586072624541637765234505522051086318285359658520708173392709566445011404055106579055037417780393351658360904543047721422281816832539613634982525215232257690920254216409657452618066051777901592902884240599998882753691957540116954696152270401280857579766154722192925655963991820948894642657512288766330302133746367449217449351637104725732980832812726468187759356584218383594702792013663907689741738962252575782663990809792647011407580367850599381887184560094695833270775126181282015391041773950918244137561999937819240362469558235924171478702779448443108751901807414110290370706052085162975798361754251041642244867577350756338018895379263183389855955956527857227926155524494739363665533904528656215464288343162282921123290451842212532888101415884061619939195042230059898349966569463580186816717074818823215848647734386780911564660755175385552224428524049468033692299989300783900020690121517740696428573930196910500988278523053797637940257968953295112436166778910585557213381789089945453947915927374958600268237844486872037243488834616856290097850532497036933361942439802882364323553808208003875741710969289725499878566253048867033095150518452126944989251596392079421452606508516052325614861938282489838000815085351564642761700832096483117944401971780149213345335903336672376719229722069970766055482452247416927774637522135201716231722137632445699154022395494158227418930589911746931773776518735850032318014432883916374243795854695691221774098948611515564046609565094538115520921863711518684562543275047870530006998423140180169421109105925493596116719457630962328831271268328501760321771680400249657674186927113215573270049935709942324416387089242427584407651215572676037924765341808984312676941110313165951429479377670698881249643421933287404390485538222160837088907598277390184204138197811025854537088586701450623578513960109987476052535450100439353062072439709976445146790993381448994644609780957731953604938734950026860564555693224229691815630293922487606470873431166384205442489628760213650246991893040112513103835085621908060270866604873585849001704200923929789193938125116798421788115209259130435572321635660895603514383883939018953166274355609970015699780289236362349895374653428746875
bool Or(bool a,bool b){return(~-((~-(a)*~-(b)))*~-((~-(a)*~-(b))));}bool And (bool a,bool b){return(~-((~-(a)*~-(a)))*~-((~-(b)*~-(b))));}bool Xor(bool a ,bool b){return(~-((~-((~-((~-((~-(a)*~-(a)))*~-((~-(b)*~-(b)))))*~-((~-(a)* ~-(b)))))*~-((~-((~-((~-(a)*~-(a)))*~-((~-(b)*~-(b)))))*~-((~-(a)*~-(b)))))) )*~-((~-((~-((~-((~-(a)*~-(a)))*~-((~-(b)*~-(b)))))*~-((~-(a)*~-(b)))))*~-(( ~-((~-((~-(a)*~-(a)))*~-((~-(b)*~-(b)))))*~-((~-(a)*~-(b))))))));}
1 − bool Or ( bool a, bool b ){ return a ? a : b; }
2 − bool And ( bool a, bool b ){ return a ? b : false; }
3 − bool Xor ( bool a, bool b ){ return And(a,b) ? false: Or(a,b); }
1 + bool Or(bool a,bool b){return(~-((~-(a)*~-(b)))*~-((~-(a)*~-(b))));}bool And
2 + (bool a,bool b){return(~-((~-(a)*~-(a)))*~-((~-(b)*~-(b))));}bool Xor(bool a
3 + ,bool b){return(~-((~-((~-((~-((~-(a)*~-(a)))*~-((~-(b)*~-(b)))))*~-((~-(a)*
4 + ~-(b)))))*~-((~-((~-((~-(a)*~-(a)))*~-((~-(b)*~-(b)))))*~-((~-(a)*~-(b))))))
5 + )*~-((~-((~-((~-((~-(a)*~-(a)))*~-((~-(b)*~-(b)))))*~-((~-(a)*~-(b)))))*~-((
6 + ~-((~-((~-(a)*~-(a)))*~-((~-(b)*~-(b)))))*~-((~-(a)*~-(b))))))));}
Found the product function in 2.6.
from itertools import product def prod(numbers): return len([*product(*map(range, numbers))]) if numbers else 0
1 + from itertools import product
2 + 1 1 def prod(numbers):
2 − if numbers == []: return 0
3 − product = 1
4 − for number in numbers:
5 − product *= number
6 − return product
4 + return len([*product(*map(range, numbers))]) if numbers else 0
# TODO Write tests import solution # or from solution import example # test.assert_equals(actual, expected, [optional] message) @test.describe("Simple tests") def test_group(): @test.it("Short lists") def test_case(): test.assert_equals(prod([1,1]), 1) test.assert_equals(prod([]), 0) test.assert_equals(prod(range(1,10)), 362880)
1 − import codewars_test as test
1 + 2 2 # TODO Write tests
3 3 import solution # or from solution import example
4 4 5 5 # test.assert_equals(actual, expected, [optional] message)
6 6 @test.describe("Simple tests")
… Expand 7 7 def test_group():
8 8 @test.it("Short lists")
9 9 def test_case():
10 10 test.assert_equals(prod([1,1]), 1)
11 11 test.assert_equals(prod([]), 0)
12 12 test.assert_equals(prod(range(1,10)), 362880)