This commit is contained in:
nora 2024-12-26 18:39:34 +01:00
parent 7f4d9bce74
commit 4da0b11cab
33 changed files with 2480 additions and 0 deletions

37
2024/Cargo.lock generated
View file

@ -198,6 +198,15 @@ dependencies = [
"nom",
]
[[package]]
name = "day10"
version = "0.1.0"
dependencies = [
"divan",
"helper",
"nom",
]
[[package]]
name = "day11"
version = "0.1.0"
@ -208,6 +217,34 @@ dependencies = [
"rustc-hash",
]
[[package]]
name = "day12"
version = "0.1.0"
dependencies = [
"divan",
"helper",
"nom",
"rustc-hash",
]
[[package]]
name = "day13"
version = "0.1.0"
dependencies = [
"divan",
"helper",
"nom",
]
[[package]]
name = "day24"
version = "0.1.0"
dependencies = [
"divan",
"helper",
"nom",
]
[[package]]
name = "divan"
version = "0.1.16"

15
2024/day10/Cargo.toml Normal file
View file

@ -0,0 +1,15 @@
[package]
name = "day10"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
nom.workspace = true
helper.workspace = true
divan.workspace = true
[[bench]]
name = "benches"
harness = false

View file

@ -0,0 +1,3 @@
fn main() {
day10::bench();
}

53
2024/day10/input.txt Normal file
View file

@ -0,0 +1,53 @@
65456780121098450187634569763232345103213014321223456
56565097632787543296323478890141234234102125630310767
67874198545601612345610165765650105145693496543407898
32923238723432709654326543034789076008786587854343210
41010129610549878723017832129878989019895674963210349
03498034534698965014898901038965432123107895674310478
12567012345787854198743230123453219654256456789321565
01698107659834723085650134562104508723340349876459874
98787238543225610176590121875698698812451210145960123
07456549850110765203485430984788767904322109236871234
12349654763234894312176534983109456765012218347120105
45898763120125234523054325672112309876544367898034876
36765812034576127654369010766043218987432458765565989
29876903107681038923478001897652345898901089014877856
10945789218996987610569123078901236754321198123966987
89032654309345678510787430121230109865120567001855496
70121023498210709425698945230381210778034056532743345
63210110567601812334321876545496321689765123443412210
54216787014503956745430965496587434509894329856301101
09105496923212345866787634987676543213456018763456932
18012387836781078975898523432345232122347890345367873
27601078745896769784309410541230143021038901276216784
34587669654305854693210305670321056523427987689105698
03490548741214903543211234781987897012310094576543567
12321239230903212650106521892016798987454123467612430
12332102107812121786787430752105678901960013438900421
01489237876543080695890124567234787017871012543321530
90574323965012891234301233208943296323702387654487651
87665010121026700343210120112350185410213498703599341
96556901212345619656903234013461234554396569812678210
03467832303434328743874105684570789689487876101432387
12346345694540345012565106799688778776536964566501498
01653210789691236522210239888799669890123453677890567
18764101988780987121329845677234550187652122989108906
89765001877101071030456776540112341290343001010267210
67896982769612132549105689432101032301234578981354310
78767853458743247678014988654312121000225665432458981
69656765432658958976529812763243029810116767898567652
30345899891067867789438701890156710723209852101438943
21230014780890986290105610981260823654367643067324321
10101423634761870121234327876501994569498543458015100
45672344543052765436543234566782987678534412109176211
34985495652143781287430110545093456767623303678989321
43856784743430690398710325432112129865414510510076450
32981012892121589459621234521001036772301623423165569
01670143345023498764560149693456345681066739654234678
12365294256510107643498238782347652397659848765985589
03454385107898212532567345601098701498943707678876432
12763476543789123431052101598709876510232110569845001
29854307630076034521043015691612389323101023454032132
38765218921165087654321126780543432134569878998108941
47894356712234198765230105621234567023878565089237650
21012349803343289890121234310123498012967432176546321

View file

48
2024/day10/src/lib.rs Normal file
View file

@ -0,0 +1,48 @@
use helper::{Day, Variants};
pub fn main() {
helper::main::<Day10>(include_str!("../input.txt"));
}
struct Day10;
helper::define_variants! {
day => crate::Day10;
part1 {
basic => crate::part1;
}
part2 {
basic => crate::part2;
}
}
impl Day for Day10 {
fn part1() -> Variants {
part1_variants!(construct_variants)
}
fn part2() -> Variants {
part2_variants!(construct_variants)
}
}
fn part1(_input: &str) -> u64 {
0
}
fn part2(_input: &str) -> u64 {
0
}
helper::tests! {
day10 Day10;
part1 {
small => 0;
default => 0;
}
part2 {
small => 0;
default => 0;
}
}
helper::benchmarks! {}

3
2024/day10/src/main.rs Normal file
View file

@ -0,0 +1,3 @@
fn main() {
day10::main();
}

16
2024/day12/Cargo.toml Normal file
View file

@ -0,0 +1,16 @@
[package]
name = "day12"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
nom.workspace = true
helper.workspace = true
divan.workspace = true
rustc-hash = "2.1.0"
[[bench]]
name = "benches"
harness = false

View file

@ -0,0 +1,3 @@
fn main() {
day12::bench();
}

140
2024/day12/input.txt Normal file
View file

@ -0,0 +1,140 @@
UUUKKKKZZZZZZEEEEEEEEEEEEEEEOOOOOOOOOOOOOOHHHHYYYYYYYYYYYYYEYYOOMNNMUUUUUUUUUYGYYYYYGGGGGZSSSSSSSSOOOOOOOOOOOOOOOODDDDDDDDDDAAAAAAJJJJJJJJJJ
UUKKKKKZZZZZZEEEEEEEEEEEEEEEOOOOOOOOOOOOOOOHHHYYYYYYYYYYYYYYYYOOMMMMUUUUUUUUUYYYYYYYGGGGZZZSSSSSSSOOOOOOOOOOOOOOOWDDDDDDDDDAAAAAAAJJJJJJJJJJ
UUKKKKKKKZZZZZEEEEEJEEEEEEEOOOOOOOOOOOOOOOHHYYYYYYYYYYYYYYYYYYMMMMMMMUUUUUUUUYYYYYYYYZZZZZZZSSSSSSOOOOOOOOOOOOOOODDDDDDDDDAAAAAAAHJJJHJJJJJJ
UUKKKKKKKKKZZZEEEEJJEEEETTEOOOOOOOOOOOOOOOHHYYYYYYYYYYYYYYYKYYYMMMMMUUUUUUUUUUUYYYYYYDDZZZZZZSSSSSOCOOOOOOOOOOOOOTDDFFFDDUAAAAAAHHHJHHJJJJJJ
KKKKKKKKKKKKZEEEEEJEEJEETTTOOOOOOOOOOOOPORYHYYYYYYYYYYYYYQKKKKMMMMMMMUUUUUUUUUUYYYYYDDZZZZZZZZSSOOOOOOOOOOOOOOOOOODDFFFFAAAAAAAHHHHJHHHJJJJJ
KKKKKKKKKKKKZZEEEJJJJJJJTTTOOOOOOOOOOOPPPYYYYYYYYYYYYYKYUKKKKMMMMMMMMMUDDDUDDDDDDDYDDZZZZZZZZZSSOOOOKOOOOOOOFOOOOOOFFFFFAAAAAHHHHHHHHHJJJJJJ
KKKKKKKKKKZZZZEEEEJJJJJJTTTOOOOOOOOOOOOPPPPPPPPPYYYYYYKKKKKKXXMMMMMMMMUDDDDDDDDDDDDDDZZZZZZZZSSSSOOOOOOOOOOOFOOOOOFFFFFAAGAAHHHHHHHHHHHJJJJJ
NNKKKKKKKZZZZZEEZJJJJJJJJTOOOOOOOOOOOOOPPPPPPPPPPPYYYKKKKKKKKMMMMMMMMMUDDDDDDDDDDDDNZZJJJZZZZZZZZOOOOOTTOOOOFFFAOOFFFFFAGGGAGHHHHHHHHHJJJJJJ
NNKKKKKKYZZZZZZZZJJJJJJJJJJOOOOOOOOOGGXPPPPPPPPPPYYYYKKKKKKKMMMMMMMMMUUDDDDDDDDDDDMMMMJJJZZZZOOOOOOOOOETOOFFFFFFFFFFFFVVVGGGGHHHHHHHHHHHJJJJ
NNNNKKKKYZZZZZZZJJJJJJJJJJJMDDOOOOOOOXXPPPPPPPPPPPPPYYKKKKKKKOMMMMMMMUUDDDDDDDDDDDDMMMMJJZZOOOOOOOOODDTTTTTFFFFFFFFFFFVVGGGGHHHHHHHHHJJJJJJJ
NNNNNNKYYYZYZZZJJJJJJJJJJJMMMDDOODXXXXXXPPPPPPPKKKKKKKKKKKKGGGMMMMMMUUDDDDDDDDDDDDDMMMQQJJZOOOOOOOOONDTTTTTTFFFFFFFFFFVVGGGGHHGHHHHJJJJJJJJJ
NNNNNNNYYYYYZZZZZJJJJJJJJJMMDDDDDDXXXXXXXXPPPPPKKKKKKKKKKKGGGGUMUUUMUUUDDDDDDDDDDDDBBBQQAAAAOOOOOONNNDDTTTTTFFFFFFFFFNNNNNNNNGGGHKHJJJJJJJJJ
NNNNNNYYYYYYYZZZJJJJJJJJJJMDDDDDDDXXXXXXXXXXXPPKKKKKKKKKKKKUGUUUUUUUUDDDDDCCDDCCDCDBBQQQAAAAQQOONNNNNDDTTTDTFFFFFNNNNNNNNNNNNGGGGYHYJYYJJJYY
NNNNNNYYYYYYZZYZZJJJJJJJJJDDDDDDDDDDXXXXXXXXXXXKKKKKKKKKKKKUUUUUUUUUDDDDDCCCCCCCCCCQQQQQAAAAAAONNNNNNDDTDDDDFFFFNNNNNNNNNNNNNGGGGYNYYYYYYYYY
NNNNNYYYYYYYYYYYJJJJJJJJJDDDDDDDDDDQXXXXXXXXXXXXKKKKKKKKKKKKKUUUUUUUUDDDDDCCCCCCCCCCCQQQAAAAAAOONNNNNDDDDDDDDDDFNNNNNNNNNNNNNGGGGYNYYYYYYYYY
NNNNYYYYYYYYYYSYYJJJJDDDDDDDDDDDDDDQQXXXXXXXXXXXXXKKKKKKKKKKUUUUUUUUUTTTTCCCCCCCCCCCCQQQQQQAAAQOONNNDDDDDDDDDDDDNNNNNNNNNNNNNGGGYYNNYYYYYYYY
NNNNNNYYYYYYYYYYYJJJJJJDDDDDDDDDDDDQQXXXXXXXXXXXXKKKKKKKKKKKKMLLLLULLLTCCCCCCCCCCCCCCCQQQQQAAAQQOONNDDDDDDDEDDDDNNNNNNNNNNNNNGGGYYYYYYYYYYYY
NNNNNYYYYYYYYYYYYJJJJJDDDDDDDDDDIIDQXXXXXXXXXXXXXKKDKKKUKKKKKMMMLLLLLLLCCUUUUCCCCCCQQQQQQQQAAAQOOOONNDDDEEEEEDNNNNNNNNNNNNNNNGGGYYYMYYYYYYYY
NNNNNYYYYYYYYYYYYJJJDDDDDDDDDDDDDDDDXXXXXXXXXXXXXDDDDKKKKKKKKEEELLLLLLLLELCCCCCQCCCCQQQQQQQQZZZOODDDDDDEEEEEEXNNNNNNNNNNNNNNNSGGYYMMYYYYYYYY
NNNNNNYYYYYYYYYYYYZZZZDDDDDDDDDDDDDDDXFFXXXFFXFXXFFFDKKKEEEEKEEELLLLLLLLLLJJJJCCCCCCQQQQQQQQZZZZDDDDDDEEEEEEEENNNNNNNNNNXXXGGSSSSMMYYYYYYYYY
NNNNNNNNYYYYYYYYYZZZZZDZDZDDDDDDDDDFFFFFXFFFFXFFFFFFFKEEEEEEEEEEEELLLLLLLLJJJJJQQQQQQQQQQQQQZZZZZZDDDDEEEEEEEENNNNNNNNNNXXXGGGSSSMMYYYYYYYYY
NNNNNNNYYYYYYYYYYZZZZZZZZZZZDDDDDDDFFFFFFFFFFFFFFFFFKKEEEEEEEEEEEEEELLLLLLJJJJJJQQQQQQQQQQZZZZZZZZZZZLLLEEELEENNNNNNNNNNXGGGSSKSSSMYYYYYYYYY
NNNNNNNNYYYYYYHHZZZZZZZZZZZZDDDHBBDDFFFFFFFFFFFFFFFFFKEEEEEEEEEEEEEEELLLLLJJJJJJQQQQZQQQQQQZZZZZZZZLLLLLLLELEENNNNNNNNNNNNNGSSKSSSMMYYYYYYYY
NNNNNNNNNYYYRHHHZZZZZZZZZZZDDDDHBBBBBFFFFFFFFFFFFFFFFEEEEEEEEEEEEEELLLLLJCCJJJJJJQQQZQQQQQZSZZZZZZZLLLLLLLLLEENNNNNNNNNNNNNSSSSSSSMMYYYYYYYY
NNNNNNNNYYTTHHHHHHHHZZZZSSZZZDPBBBBBBBFFFFFFFFFFFFKKEEEEEEEEEEEEEEEELLLLJJJJJJJJQQZZZQQQQQZZZZZZZZZZLLLLLLLLEYNNNNNNNNNNNNSSSSSSSMMYYYYYYYYY
NNNNNNNNNNTTHHHHHHHZHZZZSSSSZDPBBBBBBBAAFFFFFFFFFFFFEEEEBBEBBEEEEEEELLLLLJJJJJJZZZZZQQQQQQQZZZZZZZZZLLLLLLRLEYNNNNNNNNNNNNASSSSSSMMMYAYYYYYS
NNNNNNNNNNTTHHHHHHHHHHHZSSYSSDPBBBBBBBBAAFFFMFFFMFIIIEEEEBBBBEBEEEELLLLLLJJJJJJZZZZZQQQQQZZZZZZZZZZYZLLLRRRYYYQNNNNNNNNNNQQQSSSSSMMMSSSYYYSS
NNNNNNNNNNNHHHHHHHHHHHHZHSSSSPPPBBBBOBBAFFFFMMMMMFIIIEEEBBBBBBBEELLLLLLLLJJJJZJZZZZZZZZZZHYZZZZZZZZZZZLLRRYYYYYNNNNNNNNNNQSSSSSSSSSSSSSYYYSS
LNNNNNNWWWNWHHHHHHHHHHHHHSSSSPPPBBJBOBBBMFFFMMMMFFIIIEEEBBBBBBBBBBLLLLJJJJJJJZZZZZZZZZZZHHHZZZZZZZZZLLLLYYYYYYYYQQQQQQQQQQQSSSSSSSGSSSSSSYSS
LLLNNNNWWWWWHWHHHHHHHHHHHSKKKKKKKJJJMMMMMMFMMMMMEFIIYPEBBBBBBBBBBBBLLLLJJJJJZZZZZZZZZZZZHHZZZZZZZZZYYYYYYYYYYYQQQQQQQQQQQQSSSSSSSSSSSSSSSSSS
LLLLWWNWWWWHHWHHHHHHHHHHSSKKKKKKJJJJMMMMMMMMMMMMMMIYYYYYBBBBBBBBBBBLLLLJJJJLLZZZZZZZZZZXXXZZZQQVVZZYYYYYYYYYYYQQQQQQQQQQQSSSSSSSSSSSSSSSSSSS
LLLLWWWWWWWHWWHHHHHHHHSHSSKKKKKKJJJJJMMMMMMMMMMMMMYYYXBBBBBBBJJBBBFFLLAJJJJTLZZZZZZZZZZUUULQQQQVYYYYYYYYYYYYYYYQQQQQQQQSSSSSTSSSSSSSSSSSSSSS
LLLLLWWWWNWWWWSHHHHHHSSSSSKBKKKKKKJJMMMMMMMMMMMMMMMMMXBBBBBBBJJBBBBFBAATTDDTTZZZZZZZZZZUUUUQQQVVYYYYYYYYYYYYYYYYQQQQQQQQSSQSTTSSSSSSSSSSSSSS
LLLLLLWWWNNWNSSSHSHSSSSSSSKKKKKKKDMMMMMMMMMMMMMMXXXXXXXBBXBBJJJBBBBBBTTTTTTTTZZZZZZZZUUUUUUUUQVYYYYYYYYYYYYYYYYYQQQQQQQQQQQQFTSSSSSSSSSSSSSS
LLLLLLWWWNNNNSSSSSSSSSSSKKKKKKKKKKMZZMMMMMMMMMMMXXXXXXXXXXBJJJBBBBBBYTTTTTTTTVZZZNZZZUUUUUUUUVVVVYYYYYYYYYNYYYNSSSQQQQQQQQQFFTFSSSSSSSSSSSSS
LXXGWWWWNNNNNSSSSSSSSSSSKKKKKKKPFOFFZZMMMMMMMMMMMXXXXXXXXXBBBBBBBBYYYTTTTTTTVVNZNNNZZZUUUUUUUVVVYYYYYYYYYYNNNNNNSSQQQQQQFQFFFFFSSSSSSSSSSSSS
XXXGWWWNNNNNNNNSSSSSSSSSKKKKSFFFFFFFFFMMMMMMMMMMMMXXXXXXXXBBBBBBCBFYTTTTTTDDNNNNNNJZZZIUUUUUUWWWHYYYYYYYNNNNNNNNNSSQQGQFFFFFFFFSSSSFSSSSSSSS
AXXGWWWWYYNNNNNNSSSSSZSSKSKSSSFFFFFFFFMMMMMMMMMMMXXXXXXXFFFFFFFBFFFTTTTTTTNDNNNNNNJJZZUUUUUUWWWWWWYYYYYYNNNNNNNNNQQQQGQQQQFFFFFSSSSFSSSSSSSS
AXGGGSSYYYNNNNNNNSSSSZZSSSSSSFFFFFFFFFFMMMMUMMMMMMNXXXXFKFFFFFFFFFFPTTTTTTNNNNNNNJJJZJUUUUUWWWWWWWYYYYYNNNNNNNNNNQQQQQQQQQQQFFFFSSSFFSSSSSUU
SSSSSSTNNNNNNNZNNZSSSZZSSSSSSFFFFFFFFFFFMMUUAANNMNNFFFXFFFFFFFFFFFFTTTTNNNNNNNNNJJJJJJUQUUUMMWWWWWWWWYYNNNNNNNQQNNNQQQQQQQQQQQFFFFUUFSUSUUUU
SSSSSSTNNNNNNNZNNZZZZZZZSSSFFFFFFFFFFFFFMUUUAANNNNTFFFFFFFFFFFFFFFFQQTTTQNNNNNNNJJJJJJJMMMMMMMWWWWWWWYFNNNNNNNNQQQQQQQQQQQQQQQFFFFUUUFUUUUUU
SSSSSNNNNNNNNNZNNZZZZZZZSSSFFFFFFFFFFWFFMUUUUAAAAATTTFFFFFFFFFFFFFFQQQQQQQQQQQNNJJJJJQQMMMMMMMWWWWWWWFFFYNNNNNNQFQQQQQQQQQQQQQQFFFFUUUUUUUUU
PSSSSSSNNNNNNNZZNZZZZZZZZZSFFFFFFFFFFFFFFUUUUUAAAATTTZZZFFFFFFFFFFFFQQQQQQQQQNNJJJJQQQMMMMMMMMWWWWWFWWFFYNNNNNNFFQQQQQQQQQQQQQFFFUUUUUUUUUUU
SSSSSNNNNNNNNNNZZZZZZZZZZRRFFFFFFFFFUFFFFUUUUAAAATTTTZZZZFFFFFFFFFFFQQQQQQQQQWNNJJJQQQMMMMMMMMWWWWWFWWWFNNNNFFFFFQFFFQQQQQQQFFFUUUUUUUUUUUUU
SSSSSSNNCCCCCCCCCCZZZZZZRRFFFFFFFFFFUUUUUUUUUAAAATTTTZZZZFFFFFFFFFFFQQQQQQQQQJJOOOOOOOMMMMMMMMWWWWWFFFFFNNFFFFFFFFFFFQQQQQQQQFFFUUUUUUUUUUUU
SSSSSSSFCCCCCCCCCCCZZZZZRRFFFFFFFFFFUUUUUUUUUAAATTTTTTZZZFFFFFFFFFQQQQQQQQQRJJJOOOOOOOJMMLLLMMMMMWFFFFFFFNFFFFFFFFFFGFFUCQQAQFHFUUUUUUUUUUUU
SSSSSSSSCCCCCCCCCCCZZZZZRRFFFFFFFFFFUUUUUUUUUAAAAZZTZZZZZFFFFFFFQQQQQXQQJJJJJJJOOOOOOOJLLLOOOOLMMWWJFFFFFFFFFFFFFFFFFFUUCCQAAHHHUUUUUUUUUUUU
ESSSSSSECCCCCCCCCCCZZZZZRFFFFFFFRFFUUUUUUUUUUAAAAAZZZVVVVFFFAFFFFQQQQXQQQJJJJJJOOOOOOOLLLLOOOOLMMJJJFFFFFFFFFFFFFFFFFUUUCCCHAAHHUUUUUUUUUUUU
EESSSCCCCCCCCCCCCCCZZZZRRRRRFFRFRRFUUUUUUUUUUUAAAUZZZVVVVVVFFVVVFQQQXXXQQQAJJJJOOOOOOOLLLLOOOOLMMJJJJJFFFFFFFFFFXFFFFUUUHHHHHHHHHHCUHUHUUUUU
EEEEECCCCCCCCCCCCCCZRRRRRRRRFFRRRRRUUUUUUUUUUUUUUUZZXXXVVVVVVVVVVQQQQXXXQQQQQTTOOOOOOOLLLNOOOOJJJJJJJJJFFFFFFMMFFFFFFUUUHHHHHHHHHHHHHHHHHUUU
CCCCCCCCCCCCCCCCCCCZRRRRRRRRFFRRRUUUUUUUUUUUUUUUUZZZXXXXXVVVVVVVVVVQXXXXQQQQQTTOOOOOOOLENNOOOOZZZJJJJJFFFFFFFMMFFFFFFUUUHHHHHHHHHHHHHHHHUUUU
CCCCCCCCCCCEECCCCCCZRRRRRRRRRRRRRRUUUUUUUUUUUUUUUUXXXXXXXVVVVVVVVVVVXXXOOOOOOOOOOOOOOOOOOOOOOOZZZJJJJJJJFJJJMMMMFFFFUUUHHHHHHHHHHHHHHHUUUUUU
CCCCCCCCCCCCCCCCCCCRRRRRRRRRRRRHHRHUUUHHHUUUUUUCUXXXXXXXVVVVVVVVVVVVVTTOOOOOOOOOOOOOOOOOOOOOOOZZZZJJJJJJJJMMMMMUUFUUUUUUUHHHHHHHHHUUUUUUUUUU
EEEEECCCCCCCCCCCCCCRRRRRRRRRHRRHHHHHHHHHHUUUUUUCCXXXXXXXXVVVVVVKKKKVVTTOOOOOOOOOOOOOOOOOOOOOOOZZJJJJJJJJJJMMMMMUUUUUUUUUUHHHHHHHHHHUUUUUUUUU
EEPPPCCCCCCCCCCRZRZRRRRRRRRHHHHHHHHHHHHHHHHUUUCCCCXXXXXXXVVVVVVKKKKKKTTOOOOOOOOOTTTTTOOOOOOOOOZZJJIIJJJJMJMMMMMMMUUUUUUUUHHHHHHHHHTTTUUUUUUU
RPPPPCCCCCCCCCCRRRRRRRRRRRRRHHHHHHHHHHHHHUUUCUCFFXXXXXXXXVVVVVVVKKKKKTTOOOOOOOOOTTTTNOOOOOOOZZZZIIIJJJMMMMMMMMMMUUUUUUUUHHHHHHHHHTTWTTWWWUUU
PPPPPCCCCCCCCCCARRRRRRRRRRRRROHHHHHHHHHHHHHHFFCFFQQXXXXXVVVVVVVKKKKKKKTTTTTTTTTTTTTNNOOOOOOOEZZZIIIIJMMMMMMMMMMMMUUUUUCCCCHHHHHHHHHWWWWWWWWU
PPPPPPPPEECCCCCARRRRRRRRRRRRROHHHHHHHHHHHHFFFFFFFFQQXXVXVVVVVKKKKKKKKKKTTPTPPTTTTTTNNOOOOOOOEZEIIIIIISSMMMMMMMMMMUUUUCCCKCMHHHHHHRWWWWWWWDDD
PPPPPPPPJJCCCCCUZZZRRURRRRRRRRHHHHHHHHHHHHFFFFFFFFFFFVVVVVVVVKKKKKKKKKKKKPPPPPPTTTTTNTOOOOOOEEEIIIIIIIIMMMMMMMMMMMMMCCCCCCHHHHHHHWWWWWWWWWDD
PPPPPPRJJJCCCCCUZZRRUURRRURUUUUHHHHHHHHHHFFFFFFFFFFFFVVVVVVVTTDKKKKKKKKKKUPPPPPPPTTTTTOOOOOOEEIIIIIIIIIMMMMMMMMMMCCCCCCCCCHYYYHHHWWWWWWWWDDD
PPPPPPRRJUCCCCCUZZZUURRRRUUUUUUHHHHHHHHHKFFFFFFFFFFFVVVVVVVTTTKKKKKKKKKKKKKPPPPPPPPTKKOOOOOOEEIIIISIIIIZMMMMMMMMMCCCCCCCCCYYYYYYHWWWWWWWWWDD
PRRPRRRRRRUUUUZZZZZUUUUUUUUUUUUUHHJHHHHHFFFFFFFFFFFVVVVVVVVTTTTKTTKKKKKKKXXPPPPPPPPCCKOOOOOOEIIIIISUUIUMMMMMVMMTMCCCCCCCCDYYYYYYWWWWNWWWWWDD
ERRRRRRRRUUUUUUUZZUUUUUUUUUUUUUUHSSSHHHHFFFFFFFFFFFVVVVVVVVTTTTTTTKKKKKKKXXPPPPPPPPKKKOOOOOOESISISSUUUUUMMMMMMMTMCCCCCCCCCCCCCCDDWWDWWWWWDDD
EERRRRRRJUUUUUUUZZZZUUUUUUUUUUUSSSSSSHHFFFFFFFFRFFFVVVVVZTTTTTTTTTKKKKKKXXXPPPPPPPPKKKKBEEESSSSSSSSSUUUUMMMMMMMTDCCCCCCCCCCCCCCDDDDDDDDDDDDD
EERRRRRRRUUUUUUUZZZZZUUUUUUUUUUSSSSGSHHHFFFFFFFFFFVVVVVVZTTTTTTTTTKKKKKKKXXPPPPPPPXKKKKBBEEESSSSSSSSSSUUUUMMMMMMDCCCCCCCCCCCCCCDDDDDDDDDDDDD
EERRRRRRRRUUUUUUUZZUUUUUUUUUUUUSSSSGGGGHDFFFFFFFFFMMVVVRTTTTTTTTTTKRRKKKXXXXPMPPPPXXKBBBQDEVSNSSSSSSSUUUUUUUUUUJDDDDDDCCCCCCCCCHHDDDDDDDDDDD
ERRRRRRRRRUUUAAAAAZZUUTUWUUUUUUUSSGGGGFFFFFFFFFFFFVVVVRRRRRRTDTTTTTRTXXXXXXXXPPPPXXQMQBQQQVVSSSSSSSSSUUUUUUUUUUDDDDDDDCCCCCCCCCHHHDDDDDDDDDD
EERRRRRRRRRUAAAAAAAAAATTWWUUUUUUSSGGGGGFFFFFFFFFFRRRVVRRRRRRRTTTTTTTTXEXXXXXXXXXXXXQQQQQQQQVSSSSSSSSSUUUUUUUUUUDDDDDDDCCCCCCCCCHHDDDDDDDDDDD
VVARRRRURRUUUAAAAAAAAWWWWWWUUUUUSFGGGGGFFFFFFFFFFRRRRRRRRRRRTTTTTTTTTEEXXXXXXXXXXXQQQQQQQQQSSSSSSSSSUUUUUUUUUUUDDDDDDDCCCCCCCCCHHHDDDDDDDDDD
VVVKRRUUUUUUUAAJAAAAAWWWWWWUUUUUFFGGGGFFFFFFFFFFJRRRRRRRRRRRRRRTTTTEEEEXXXJXXXXXXXQQQQQQQQQRRSSSSSSSUUUUUUUUUUUUDDDDDDCCCCCCCCCHHHHDDDDDDDDD
VDVKRRUUUUUUUAAAAAAAWWWWWWZUUUUFFFFGGGFFGFFFTTFJJJRFRRRRRRRRRRSTTTEEEEEEJJJJJXJXXXXQQQQQQQSSSSSSSSSUUUUUUUUUUUUUUDDDDCCCCCCCCCCHHUUHDDDDDDDD
VDVVRUUUUUUUUAUAWAAAWWWWWWWWUUFFFFFFGGGGGFGGGJJJJJRRRRRRRRRREEEEEEEEEEEJJJJJJJJXXXXQQQQQQQQQSSSSSSSSUUUUUUUUUUUUGDDDDCCCCCCCCCCHHHHHDDDDDDDD
VVVVUUUUUUUUUUUWWAAAWWWWWWWWUUUUFFFFFFGGGGGGGGJJJJRRRRRRRREEEEEEEEEEEEEJJJJJJJJXXXXQQQQQQQQQQSSSSSSSSUUUUAUUUUUGGGDDDCCCCCCHHHHHHHHHDHDDDDDD
VVVVUUUVUDUUDDDDWWAWWWWWWWWWUUUFFFFFZZFGGGGGGGGJJJRRRRRRRRREEEEEEEEEEEEJJJJJJJJJJJQQQYYYYYZQQSSSSSSUUUUAUAUUUUGGGGDDDCCCCCCHHHHHHHHHHHDDDDDD
VVVVUVUVUDDDDDDDWWWWWWWWWWWWUUUFFFFFZFFGFFGGGGGJJJJRRRRRRRRESEEEEEEEEEEJJJJJJJJJJJJJJYYYYYYYYSSSSSSUSUAAAAAUUUGGEGDDDCCCCCCHHHHHHHHHHHDDDDDD
VVVVVVVVDDDDDDDDWWWWWWWWWWWWUUFFFFFFFFFFFFFGGGGGJJJJRRRRRRREEEEEEEEEEEEEJJJJJJJJJJJJJYYYYYYYYYSSSSSSSUAAAAAUUGGGGGDDDCCCCCCHHHHHHHHHHHHHDDDD
VVVVVVDVDDDDDDDDWWWWWKKKWWWWWGTFFFFFFFFFFFFFFFGJJJJJRRRRREEEEEEEEEEEEEEJJJJJJJJJJJJJJJYYYYYYYYYYSCSCSUAAAAUUGGGGGGGGDCCCCCCHHHHHHHHHHHHHPDDD
VVVVVVVDDDDDDDDDWWKWWKKKWWWWWGFFFFFFFFFFFFFFFFJJJJJJHLHRRQEEEEEEEEEEEEEJJJJJJJJJJJJJJYYYYYYYYYYYYCCCCKKKAAUUUUGGGGDDDCCCCCCHHPKHHHHHHHHHHDVD
VVVVMVVMDDDDDDDDKKKKKKKKKKWKGGGFFFFFFFFFFFFFGFJJJJJHHHHRRQEEEEEEEEEEEEJJJJJJJJJJJJXJJYYYYYYYYYYYYCCCCKKKDUUUUUGGGGGDDDCCCCPPYPPHHHQHQQVHHDDD
VVVMMVMMMDDDDDDDDKKKKKKKKKKKKGGFFFFFFFZZZZVGGGJJJJJHHHHHZHEEPEEEMMEMMJJJJJJJJJJJJJJJJYYYYYYYYYYCCCCCCCKKDDCUUUGGGGGDDDCCCCPPPPPPQFQQQVVVDDID
VMMMMMMMMDDDDDDDDKKKKKKKKKKKGGGGGGGFFFVVVVVGGGJJJJHHHHHHHHHEPEEEIMMMMYYYJJJJJJJJJQJJJYYYYYYYYYYYCCCCCCKKCCCUUUUGYGGDDDCCCCPPPPPPQFQQQQVQIIII
VMMMMMMNDDDDDDDDKKKKKKKKKKKKKGGGGGGFZZVVVVVVBGJJJHHHHHHHHHHHPPPEMMMQMMMMPJJJXJJJJJJWWYYYYYYYYYYYYCCCCCCKCCCCCCCYYGYDNNNNNNPPPPPOQQQQQQQQIIII
MMMMNNNNDDDDDDDDDNKKKKKKKKKKKKGGGGGGGVVVVVVVBBBBBBHHHHHHHHHHPPMMMMMMMMMMMMMJJHHHHHJJWYYYYYYYYYYYYCCCCICCCCCCCCCYYYYLNNNOOPPPPPOOQQQQQQQQQQII
MMMMMNNNNNDDDDDDDDKKKKKKKKKKKKGGGGGGGPUVVVVBBBBBBBBHHHHHHHHHHMMMMMMMMMMMMMMJHHHHHHHHHYYYYYYYYYYYCCCCIICCCCCCCCLLLLLLNNNOOKXXKKQQQQQQQQQQQIII
MMMNNNNNNNNDDDDDDKKKKKKKKKKKKKGGGGGRRUUVVVBBBBBBBBBHHHHHHHHHMMMMMMMMMMMMMMUUUUUUUUKHKYYYYYYYYYTYCIIIIICCCCCCCCLLLILOOOOOOXXOXKKKQQQQQQQQQIII
MMNNNNNNNNNNDDDDDKDJKKKKKKKEKGGGGGUUUUUQVVBBBBBBBBBBHHHHHHHHHMMMMMMMMMMMUUUUUUUUUUKKKYYYYYYYTTTTIILIIIIICCCCCILOOILOOOOOQXXXXXXQQQQQQQQQIIII
MMNNNNNNNNNDDDDDDDDDYKKKPKPZZZGGGUUUUUUBBVBKBBBBBBBBHHHHHHHHHHEMMMMMMMMMMUUUUUUUUUKKKYYYYTTTTTTTIIIIIIIIICCIIIIOOOLOOOOOQQXXXXXXQQQQQQQIIIII
MMNNNNNNNNNNDDDDDDDDDEKPPPPZZGGGGUUUUUUUBBBBBBBBBBBBHHHHHHHHEEEDDDDDDDMMMUUUUUUUQUKKKQYYYTTTTTTIIIIIIIIIINCIOIOOOOOOOOOOQOXXXXXXMQRRQQQIIIII
NNNNNNNNNNDDDDDDDDDDDXPPPPPZZZGGUUUUUUUUUBBBBBBBBBOOHHHHHHHHHEEDDDDDDDMMMMUUUUUUQUKQRQFYTTTTTTTTTIIIIIIIIIIIOOOOOOOOOOOOOOOXXXXXQQXQQQQILIII
NNNNNNNNNRRRDDIDDDDDDXXXXXXZZZZZUUUUUUUUUBBBBBBBBBOHHHHHHHHDDDDDDDDDDDMMMMUUUUUUQQZQQQQYTYYTTTTTTTIIIIIIIIIIOOOOOOOOOOOOOOXXXXXXXXXXQQQQLLII
NNNNNNNNRRRRRRDZDDXXXXXXXXEZZZZZZXZUUUUUUUUBBBBOBOOOHHHHHHHDDDDDDDDDDDMMMUUUUUUUQQQQQQOYYYYYTTTTTTJJJJJJJJIIIIUIIOOOOOOOOOOXXXXXXLLLLQLLLLLU
MMMNNNNNNRRRRDDDDDXXXXXXXXEZZZZZZZZUUUUUUUUUUUUOOOOOHHHHHHHDDDDDDDDDDDMMUUUUUUUUQQQQQQOYYYYYYTYTIIJJJJJJJJIIIIIIIOOOOOOOOOOOXXXXLLLNLLLLLLLU
NNNNNNNNNRRRRRRLDOOOXXXXXXEZZZZZZZZQQUUUUUUUUUUUUVVVEEEHHHEDDDDDDDDDDDMUUUUUUUUUUUQQQQQYYYYYYYYTTTJJJJJJJJIIIIIIIOOOOOOOOXXXXXXXLLLLLLLLLLLU
PNNNNNNNRRRRRRRLOOOOOXXXXXZZZZZZZZZZQUUUUUUUUUUUUUVEEEEEHHEDDDDDDDDDDDMUUUUUUUQQQQQQQQQYYYYYYYYYTIJJJJJJJJIEIIIIIOKOOOGKKXXXXXXXXLLLLLLLLUUU
PNNNNNNNRRRRRODOOOOOOXXXXXIZZZZZZZZQQUJZUUUUUUUUUVVVVEEEEEEDDDDDDDDDDDUUUUUPUQQFFQQQQQQYYYYYYYYYYYJJJJJJJJIIIIIIOOKKKKKKKBBXXIXXXLLLLLLLLUUS
PZNNNNNRRRRRNOOROOOOOXXXXIIIIZZZZZZQQQZZUUUUUUUUUUVVVEEEEEEDDDDDGGGGUUUUUUUUUUUHHQHHQYYYYYYYYYYYYYJJJJJJJJJJWWWWIKKKKKKKNKXXXIXLLLLLLLLLLSUS
PZDNNNNZZZZZOOOOOOOOOOXXIIIIIZZZZZZQQZZZUUUUUUUUUUMBBEEEBBEDDDDDHHHHUUUUUUUUUUUHHHHHQYYYYYYYYYYYWWJJJJJJJJJJWWWWWKKKKKKKKKKXOXXGGGZLLLLLLSSS
ZZDDNNNZZZZZOOOOOOOOOOOXXIIIQZZZZZZQZZZZZZZZRUUUUUUBBBBBBEEDDDDDHHHHHHHGUUUUUHHHHHHHQYYYYYYYYYYYWWWWWIIIIJJJWWWWWKKKKKKKKKKOOXGGGGZLZZSSSSSS
ZZZZZZZZZZZZZOOOOOOOOOOTOOIIQZZZQQQQQQQZZZZZZZUUUWWBBBBBBEEEEEEHHHHHHUHHOOHHHHHHHHHHYYYYYYYYYYYYWWWWWIIIIJJJWWWWWKKKKKKKMMKOOOMGGZZZZZSSSSSS
GZZOZZZZZZZZOIOZOOOOYOOOOOOQQQQQQQQQQQZZZZZZZZUUUWBBBBOBBEEEHEEEHHHHXHUOOOOOHHHHHHHHYYYYYYYYYYYUXXWWWIIIIIJJWWWWWWKKKKKQQMMMMMMMZZZZZZSSSSSS
ZZZZZZZZZZZOOOOOAOOYYOMMMMQQQQQQQQQZZZZZZZZZZJJJWWWOOOOOBEHEHHHHHHHHHHHOOOOHHHHHHHHHHHYYYYYYYYYYXXXXXXXXXXJJWWWWWWWWKKQQMMMMMMMZZZZZZTSOSSSS
ZZZZZZZZZZZOOOOOOXOOOOMMMMMQQQQQQQQZKZZZZZZZJJJJJJWWOOOOEEHHHHHHHHOOHHOOOOOHHHHHHHHHHHYYDDYYYNYFXXXXXXXXXXJJWWWWWWNNRRNNNMMMMMMMZZZZZZSSSSSS
ZZZZZZZZZZPOOOORRMMJOMMMMMQQQQQQQQQQZZZZZZJZJJJJJJJWOOOOOHHHHHHHHHOOOOOOOOYHHHHHHHHHHHHDDDYYYYFFXXXXXXXXXXXXWWWWNWNNNNNNMMMMMMMZZZZZZUSSSHSS
ZZZZZZZZZZZDDDOOOMMMMMMQQQQQQQQQQQQQXXZZJJJJJJJJJJJWOOOOOHHHHHHHHHHHOOOOOOOHHHHHHHHHLHDDDDYYYWXXXXXXXXXXXXXXWWWWNNNNNNNNMMMMMMZZZZZZZZSHHHHH
ZZZZZZZZZZDDDDDMMMMMMMMQQMPPQQQQQQQFQQAAJJJJJJJJJJOOOOOOHHHHHHHHHHHHOOOOOOVHHHHHHHHHHDDDDDYWWWAXXAXXXXXXXXXXWWWWWNNNNNNLMMMMMMMZZZZZZPSHHHHH
ZZZZZZZZZDDDDDDDMMMMMMMMMMMMQQQQQQQQQAAAJJJJJJJJJJUUOOOOHHHHHHHHHHHHOOOOOOVHHHHHHHHHHHHDDDAAAAAAAAXXXXXXXXXXXXWWWNNNNNNLMMMMMMMZDZZZZSSSHHHH
ZZZZZZZZTZZZDDDMMMMMMMMMMMMTQQQQQQQQQAAAJJJJJUJJUUUUOOOOAHHHHHHHHHHHOOOOOOVVHHHHHHHHHEEEDDDAAAAAAAXXXXXXXXXXXXWWWWWNNNNWMMMMMMWDDDZZZZHHHHHH
ZZZZZZZZZZZZDDDMMMMMMMMMMMMMQQQQQQQQQNAAJJUUUUUUUUUUOOOHHHHHHHHHWWWWWWOOOOOOHHHHHHHEEEEEDAAAAAAAAAXXXXXXXDEXXXWWWWWWWWWWWMMFDDDDDDYZDDDDHHHH
ZZZZZZZZZZDDDDDMMMMMMMMMMMJRRQQQQQQQQNNNJUUUUUUTUUTOOOOHHHHHHHHHWWWWWWOOOOOHHHHEEEEEEEEEDDDAAAAAAAXXXXXXDDDWWWWWWWWWRWWWWFFFDDDDDDYDDDDHHHHH
ZZZZZZZZZZZDMMDMMMMJJJJJJMJRRRQQBBBBQCNNJJUUUUTTTTTOOOTHHHWHHHHHWWWWWWOOOOOHHEEEEEEEEEEEDDDAAAASAAXXXDXXDDWWWWWWWWWWRRWFFFFFFDDDDDDDDDDHHHHH
ZZZZZZZZZZZMMMMMMMMMKJJJJMJQQQQQBBBNNNNNNNUUUUTTTTTOBTTTHWWQHHHHWWWWWWOJJOJJEEEEEEEEEEEECCCAASASXXXXXDDDDDDWWDWWWWWRRRFFFFDFDDDDDDDDDDDDHHHH
ZZZZZZZZQQQQQEQMMMMJJJJJJJJJKBBBBBNNNNNNNNNUUUTTTTTBBBTTTQQQNHNHWWWWWWXXJJJJJJJJEEEEEEEEECCASSSSSSSXIDDDDDDDDDWWWRWWRRRFFFDDDDDDDDDDDDDAHHHH
ZZZZZZZZRQQQQQQZZZZJOJJJJJJJJJJBBBNNNNNNNNNTTTTTTTTTBBBTTQQQNNNWWWWWWWNXXXJJXXXXXEEEEEECCCCASSSSSSTTDNDDDDDDDDWWWRRWRRRRRFDDDDDDDDDDDDDAHHHH
ZZZZZZZRRQQQQQQZZZZJJJJJJBBBBBBBBBBBNNNNNNNTTTTTTTTTTTTTTTQQNNNWWWWWWWNXXXXXXXXXXXEECCCCCCCCCCCSSSDDDDDDDDDDDDDWRRRRRRRFFFDDDDDDDDDDDDDDTTHH
UUUZZUQQQQQQQQQZZZZJJJJJJBBBBBBBBMBNNNNNNNNTTTTTTTTTTTTTTQQQNNNWWWWWWWNNXXXXXXXXEEEEECCCCCCCCCCRSSDDDDDDDDDDDDDDRRRRRRRRRFDDDDDDDDDDDDTTTTTH
UUUUUUSQQQQQQQQZBZZJJJJJBBBBBBBBMMMNNNNNNNNTTTDDTTTTTTTTTTQQQNQWWWWWWWXXXXXMMMMMMMEEEERCCCCCCSRRKDDDDDDDDDDDDDDDRRRRRRRFFFFDDDDDDDDDDTTTTTTT
UUUUUSSQQQQQQQYBBZBBYYJBBBBBBBBMMMMNNNNNNNNDDDDTTTYTTTTTTTQQQQQQQQQQIIXXXXXMMMMMMMEEERRCCCCCCSRKKKGGDDDDDDDDDDRRRRRRRRRRRRFFDDDDDDDDDDTTTTTT
UUUUSSSQQQQQQQBBBBBBBBBBBBBBBBMMMMMMNNNNNDDDDDDDDDTTTTTTTTQQQQQQQQQIIIXXMMMMMMMMMMEERRRRCCCCSSSKKKGKDKVDDDDDDCCRRRRRRRRRRRRFDUDDDDDDDDTTTTTT
UUSSSSSQQQQQQQQBBEBBBBBBBBBBBBBMMMMMMMNNNTTTDDDSSSGGTSTTTQQQQQQQQQQIBBXXMMMMMMMMMMEERRRCCCSSSSSWKKKKKKVVDDDCDCCRRRRRRRRRRRFFFDDDNNNNDDDTTOOO
UUSSSSQQQQQQQQQQBBBBBBBBBBBJJMMMMMMMMMTTTTTTTDDDSSSSSSSTTSSSQQQQQQQIIXXXMMMMMMMMMMWERRRCCCSSSSSWKSKKKKVVVDVCCCCCRRRERRRRFFFFFFDNNNNNDDTTOOOO
SSSSSSQQQQQQQQQQBQQBBBBBBBBJJJJMMMMKMTTTTTTTTTDDSSSSSSSSSSSEEQQQQQIIIXXXMMMMMMMMMMWERERCCCCSSSSSKSKKKVVVVVVCCCCRRRRRRRRFFFFFFNNNNNNNNNOOOOOO
SSSSSSSSQQQQQQQQQQQBBBBBBBBJJJJMMMMMMMTTTTTTTTDDSSSSSSSSSSSEEEQQQIIIIIXXMMMMMMMMMMEEEECCCCSSSSSSSSSSKKVVVVVVVCRRRRRRJJRFFFFNNNNNNNNNNNHOOOOO
SSSSSSSSQQQQQQQQQQZBBBBBRRJJJJJJJJMMPPTTTSSSSSODSSSSSSSSSSSEEEQQQJEEIIXXMMMMMMMMMMEEEECCCCSSSSSSSSSKKKVVVVVVCCCCCRJJJJJFFFFFFFNNWNNNNNNNOOOP
SSSSSSSSQQQUUQQQQQQBRRRRRRJJJJJJJJJMPPTTSSSSSSOOOSSSSSSSSEEEEQQQQEEMMMMMMMMMMMMMMEEEECCCCSSSSSSSSSSKKVVVVVSVDDDDDAJJJJJFFFFFFNNNNNNNNNNHHHHP
SSSSSSSQQQUUUUUUQQQQRRRRRRJJJJVJVVJJPTTTTSSSSSOOSSSSSSSSSSEEEEEQEEEMMMMMMMMMMMMMEEEEEECEESESSSSSSKKKKKKVDDDSSDDDDDDJJJJFFFFFFMANNNNNNNHHHHHP
SSSSSSSQUUUUUUURRQRRRRRRRJJJJJVVVVVVTTTSSSSSOOOOOOSSSSSSSEEEEEEEEEEMMMMMMMMMMMMMEEEEEEEEEEESSSSSKKKKKKKDDDDDDDDDDDJJJJJFFMMFMMMDMMMMNNUHHHHH
SSSSSSSAAUUUUUURRRRRRRRRRJJJJJJVVVVVTTTTSSSSSOOOOOOKSSSSEEEEEEEEEEEMMMMMMMMMMMMMIEEEEEEEEEESYSKSSKKKKKKDDDDDDDDDDDJJJJFFFMMMMMMMMMMMHHHHHHHH
SSSSSSAAAUUURRRRRRRRRRRRJJJJJVVVVVVVSVTSSSSSOOOOOOOKKSSOOEEEEEEEEEEMMMMMMMMMMMMMIIYEEEYYEEESHHKSKKKKKKKKKDDDDDDDDGGGGGMMMMMMMMMMMMMMHHHHHHHH
SSSSSSSSAAAURERRRRRDDRRRRRRRJRVVVVVVVVVVSSSOOOOOOOOKKSOOOOOEEEEEEEEMMMMMMMMMMMMMIYYEEEYYEEEEHHHKKKKKKKKDDDDDDDDDDGGGGGMIMMMMMMMMMMMMHEHHHHHH
SSSSSSSEAAAAEEEERRRDDDRDDDRRRRVVVVVVVVVVVSOOOOOOOOKKKKKKKOOBBEEEEEEMMMMMMMMMMMMMYYYYYYYYEEEHHHHHKKKHKKDDDDDDDDDDDDGGGMMMMMMMMMMMMMMMMHHHHHHH
SSSSSSSEAEEAEEEEDDDDDDDDDRRRRRRVVVVVVVVVVVOOOOOOOOKKKKKKKBJBBEEEPEEMMMMMMMMIIYYYYYYYYYYYEEEHHHHHHHHHKKDDDDDDDDDDDDDDGGGGMMMMMMMMMMMMHHHHHHHH
SSSSESSEEEEEEEVVDDDDDDDDDDRRRRRVVVVVVVVVVVOOOOOOKKKKKKBBBBBBEEEPPPIIIIIIIIIIIYYYYYYYYJJJEEHHHHHHHHHHHHDDDDDDDDDDDDDGGGMMMMMMMMMMMMMRHHHHHHHH
SSEEEEEEEEEEEEDDDDDDDDDDDDDRVRVVVVVVVVVVVVMOMOMMMKKKBBBBBBBBEJEPPPIIIVIIIIIIIIYYYYYGYYYJJJHHHHHHHHHHHHDDDDDDDDDDDDDGCCCCMMMMMMMMMMMMHHHHHHHH
SSSSEEEEEEEEEEWDDDDDDDDDDDDVVVVVVVVVVVVVVVMMMMMMKKKBBBBBBBBBBJJJPPJJIIIJIIIIJJYYYYYYYJJJJJHHHHHFHHHHDDDDPDDDDDDDDDDGCCCCSMMMMMMMMMHHHHHHHHHH
SSSSEEEEEEEEEEWWDDDDDDDDDLDDYYYVVVVVVVVVVVMMMMMMKFHHBBBBBBBBZJJJJJXJIJJJJIIIJJYYYYYQYJJJJJJJZZZZZHHZZZDZDDDDZDDDCGGGCCCCSMMMMMMMMMHHHHHHHHHH
SSSSSEEEEEEEEDDDDDDDDDDDDDYYYYYYVVVVVVVVVVMMMMMFFFHFBBNBBBBBJJJJJJJJJJJJJIIJJJYYJYYYJJJJJJJJZZZZZZZZZZZZZZDZZDAACCCCCCCCMMMMMMMHMMHHHHHHHHHH
SSSSEEEEEEEEEEDDDDDDDDDDDYYYYYYVVVVVVVVXVVMMMMMMFFFFFBBBBBBJJJJJJJJJJJJJIIIJJJYJJJJJJJJJJJJJJZZZZZZZZZZZZZZZZZCCCCCCCCCCCMMMMMHHHHHHHHHHHHHH
SSSEEEEEEEEEEEVDDDDDDDDDDYYYYYYYYVVVVVVVVVMMMMMMMFFFFFFFFFBJJJJJJJJJVJJJJIIIIJJJJJJJJJJJJJJZZZZZZZZZZZZZZZZZZZCZZCCCCCCCCCCMHMHHHHHHHHHHHHHH
SSEEEEEEEWEEEEVVDDDDDDDYDYYYYYYYVVVVMMVVVMMMMMMMMMFFFFFFFFJJJJJJJJJJJJJJJJIIIJJJJJJJJJJJJJJJJZZZZZZZZZZZZZZZZZZZZCYCCCCCCCCCHHHHHHHHHHHHHHHH
SSSEEEEEEWWWEVVVVVDDDDYYYYYYYYYYYVEVVMMMMMMMMMMMMMMFFFFFFFJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJZZZZZZZZZZZZZZZZZZZCYCCCCCCCCCCHHHHHHHHHHHHHHH

View file

@ -0,0 +1,4 @@
AAAA
BBCD
BBCC
EEEC

View file

@ -0,0 +1,5 @@
OOOOO
OXOXO
OOOOO
OXOXO
OOOOO

View file

@ -0,0 +1,10 @@
RRRRIICCFF
RRRRIICCCF
VVRRRCCFFF
VVRCCCJFFF
VVVVCJJCFE
VVIVCCJJEE
VVIIICJJEE
MIIIIIJJEE
MIIISIJEEE
MMMISSJEEE

240
2024/day12/src/lib.rs Normal file
View file

@ -0,0 +1,240 @@
use std::u32;
use helper::{Day, Variants};
use rustc_hash::FxHashSet;
pub fn main() {
helper::main::<Day12>(include_str!("../input.txt"));
}
struct Day12;
helper::define_variants! {
day => crate::Day12;
part1 {
basic => crate::part1,sample_count=1000;
}
part2 {
basic => crate::part2;
}
}
impl Day for Day12 {
fn part1() -> Variants {
part1_variants!(construct_variants)
}
fn part2() -> Variants {
part2_variants!(construct_variants)
}
}
fn part1(input: &str) -> u64 {
let width = input.bytes().position(|b| b == b'\n').unwrap() + 1;
let mut regions = Vec::<FxHashSet<usize>>::new();
let mut tile_exterior_edges = vec![None::<u32>; input.len()];
let mut id = 0;
for (i, c) in input.bytes().enumerate() {
if c == b'\n' || tile_exterior_edges[i].is_some() {
continue;
}
let region_id = id;
id += 1;
regions.push(FxHashSet::default());
fn propagate(
tile_exterior_edges: &mut [Option<u32>],
regions: &mut Vec<FxHashSet<usize>>,
input: &[u8],
id: u32,
i: usize,
width: usize,
) {
if tile_exterior_edges[i].is_some() {
return;
}
tile_exterior_edges[i] = Some(u32::MAX);
let mut exterior_edges = 0;
regions[id as usize].insert(i);
let c = input[i];
if input.get(i + 1) == Some(&c) {
propagate(tile_exterior_edges, regions, input, id, i + 1, width);
} else {
exterior_edges += 1;
}
if i > 0 && input[i - 1] == c {
propagate(tile_exterior_edges, regions, input, id, i - 1, width);
} else {
exterior_edges += 1;
}
if input.get(i + width) == Some(&c) {
propagate(tile_exterior_edges, regions, input, id, i + width, width);
} else {
exterior_edges += 1;
}
if i >= width && input[i - width] == c {
propagate(tile_exterior_edges, regions, input, id, i - width, width);
} else {
exterior_edges += 1;
}
tile_exterior_edges[i] = Some(exterior_edges);
}
propagate(
&mut tile_exterior_edges,
&mut regions,
input.as_bytes(),
region_id,
i,
width,
);
}
let mut total = 0;
for region in regions {
let area = region.len() as u64;
let mut perimeter = 0;
// To count the total perimeter, we just count all the non-interior edges of every tile.
for tile in &region {
perimeter += tile_exterior_edges[*tile].unwrap() as u64;
}
total += area * perimeter;
}
total
}
fn part2(input: &str) -> u64 {
struct DontCount {
top: bool,
right: bool,
bottom: bool,
left: bool,
}
let width = input.bytes().position(|b| b == b'\n').unwrap() + 1;
let mut regions = Vec::<FxHashSet<usize>>::new();
let mut tile_exterior_edges = vec![None::<u32>; input.len()];
let mut id = 0;
for (i, c) in input.bytes().enumerate() {
if c == b'\n' || tile_exterior_edges[i].is_some() {
continue;
}
let region_id = id;
id += 1;
regions.push(FxHashSet::default());
fn propagate(
tile_exterior_edges: &mut [Option<u32>],
regions: &mut Vec<FxHashSet<usize>>,
input: &[u8],
id: u32,
i: usize,
width: usize,
dont_count: DontCount,
) {
if tile_exterior_edges[i].is_some() {
return;
}
tile_exterior_edges[i] = Some(u32::MAX);
let mut exterior_edges = 0;
regions[id as usize].insert(i);
let c = input[i];
let no_edge_top = i >= width && input[i - width] == c;
let no_edge_right = input.get(i + 1) == Some(&c);
let no_edge_bottom = input.get(i + width) == Some(&c);
let no_edge_left = i > 0 && input[i - 1] == c;
if no_edge_top {
propagate(tile_exterior_edges, regions, input, id, i + 1, width, DontCount {
top: false,
bottom: false,
});
} else {
exterior_edges += 1;
}
if no_edge_left {
propagate(tile_exterior_edges, regions, input, id, i - 1, width);
} else {
exterior_edges += 1;
}
if no_edge_bottom {
propagate(tile_exterior_edges, regions, input, id, i + width, width);
} else {
exterior_edges += 1;
}
if no_edge_top {
propagate(tile_exterior_edges, regions, input, id, i - width, width);
} else {
exterior_edges += 1;
}
tile_exterior_edges[i] = Some(exterior_edges);
}
propagate(
&mut tile_exterior_edges,
&mut regions,
input.as_bytes(),
region_id,
i,
width,
DontCount {
top: false,
right: false,
bottom: false,
left: false,
},
);
}
let mut total = 0;
for region in regions {
let area = region.len() as u64;
let mut perimeter = 0;
// To count the total perimeter, we just count all the non-interior edges of every tile.
for tile in &region {
perimeter += tile_exterior_edges[*tile].unwrap() as u64;
}
total += area * perimeter;
}
total
}
helper::tests! {
day12 Day12;
part1 {
"../input_small.txt" => 140;
"../input_small2.txt" => 772;
"../input_small3.txt" => 1930;
"../input.txt" => 0;
}
part2 {
"../input_small.txt" => 80;
"../input_small2.txt" => 436;
"../input_small3.txt" => 1206;
"../input.txt" => 0;
}
}
helper::benchmarks! {}

3
2024/day12/src/main.rs Normal file
View file

@ -0,0 +1,3 @@
fn main() {
day12::main();
}

15
2024/day13/Cargo.toml Normal file
View file

@ -0,0 +1,15 @@
[package]
name = "day13"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
nom.workspace = true
helper.workspace = true
divan.workspace = true
[[bench]]
name = "benches"
harness = false

View file

@ -0,0 +1,3 @@
fn main() {
day13::bench();
}

1279
2024/day13/input.txt Normal file

File diff suppressed because it is too large Load diff

View file

48
2024/day13/src/lib.rs Normal file
View file

@ -0,0 +1,48 @@
use helper::{Day, Variants};
pub fn main() {
helper::main::<Day13>(include_str!("../input.txt"));
}
struct Day13;
helper::define_variants! {
day => crate::Day13;
part1 {
basic => crate::part1;
}
part2 {
basic => crate::part2;
}
}
impl Day for Day13 {
fn part1() -> Variants {
part1_variants!(construct_variants)
}
fn part2() -> Variants {
part2_variants!(construct_variants)
}
}
fn part1(_input: &str) -> u64 {
0
}
fn part2(_input: &str) -> u64 {
0
}
helper::tests! {
day13 Day13;
part1 {
small => 0;
default => 0;
}
part2 {
small => 0;
default => 0;
}
}
helper::benchmarks! {}

3
2024/day13/src/main.rs Normal file
View file

@ -0,0 +1,3 @@
fn main() {
day13::main();
}

15
2024/day24/Cargo.toml Normal file
View file

@ -0,0 +1,15 @@
[package]
name = "day24"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
nom.workspace = true
helper.workspace = true
divan.workspace = true
[[bench]]
name = "benches"
harness = false

View file

@ -0,0 +1,3 @@
fn main() {
day24::bench();
}

View file

@ -0,0 +1,15 @@
[package]
name = "day24"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
nom.workspace = true
helper.workspace = true
divan.workspace = true
[[bench]]
name = "benches"
harness = false

View file

@ -0,0 +1,3 @@
fn main() {
day24::bench();
}

View file

View file

View file

@ -0,0 +1,48 @@
use helper::{Day, Variants};
pub fn main() {
helper::main::<Day24>(include_str!("../input.txt"));
}
struct Day24;
helper::define_variants! {
day => crate::Day24;
part1 {
basic => crate::part1;
}
part2 {
basic => crate::part2;
}
}
impl Day for Day24 {
fn part1() -> Variants {
part1_variants!(construct_variants)
}
fn part2() -> Variants {
part2_variants!(construct_variants)
}
}
fn part1(_input: &str) -> u64 {
0
}
fn part2(_input: &str) -> u64 {
0
}
helper::tests! {
day24 Day24;
part1 {
small => 0;
default => 0;
}
part2 {
small => 0;
default => 0;
}
}
helper::benchmarks! {}

View file

@ -0,0 +1,3 @@
fn main() {
day24::main();
}

313
2024/day24/input.txt Normal file
View file

@ -0,0 +1,313 @@
x00: 1
x01: 1
x02: 1
x03: 1
x04: 0
x05: 1
x06: 0
x07: 1
x08: 0
x09: 1
x10: 1
x11: 1
x12: 1
x13: 0
x14: 1
x15: 0
x16: 0
x17: 1
x18: 0
x19: 1
x20: 0
x21: 0
x22: 0
x23: 1
x24: 0
x25: 0
x26: 1
x27: 1
x28: 0
x29: 0
x30: 1
x31: 1
x32: 1
x33: 1
x34: 1
x35: 0
x36: 1
x37: 0
x38: 1
x39: 1
x40: 0
x41: 0
x42: 0
x43: 0
x44: 1
y00: 1
y01: 1
y02: 1
y03: 1
y04: 1
y05: 0
y06: 0
y07: 0
y08: 0
y09: 0
y10: 1
y11: 0
y12: 0
y13: 0
y14: 1
y15: 1
y16: 0
y17: 1
y18: 0
y19: 1
y20: 0
y21: 0
y22: 0
y23: 0
y24: 1
y25: 1
y26: 0
y27: 1
y28: 0
y29: 1
y30: 1
y31: 1
y32: 1
y33: 0
y34: 1
y35: 1
y36: 1
y37: 1
y38: 0
y39: 1
y40: 0
y41: 0
y42: 1
y43: 0
y44: 1
sjd XOR mcr -> mvb
phj OR mhq -> kdf
bbb OR rrh -> qhk
x30 AND y30 -> gjm
pbd XOR vvt -> z36
pqv XOR nws -> z19
bdd OR jjf -> fmk
x18 AND y18 -> z18
y13 XOR x13 -> nfq
rtb AND tnr -> qtg
scd XOR mgv -> z28
bwk OR tdq -> wfr
y33 XOR x33 -> hhg
y04 XOR x04 -> tcf
y22 AND x22 -> hmb
rqd XOR dpg -> z30
x41 XOR y41 -> qhh
x37 XOR y37 -> hrn
mfk XOR fmm -> wss
x26 XOR y26 -> pjf
rkf AND mgk -> kmj
pvk XOR kdf -> z10
scs AND rds -> dcv
x17 XOR y17 -> vhf
pbd AND vvt -> jrj
hmt OR pdq -> scs
x08 XOR y08 -> mcr
y13 AND x13 -> pdq
bvv XOR tkf -> z31
wwr OR jvw -> fmj
jvg AND fgc -> kpt
gtd XOR qpn -> z20
tsg XOR cnb -> z15
cnb AND tsg -> rrh
y16 XOR x16 -> cvn
x23 AND y23 -> fwj
hqb OR nwd -> sgh
x40 AND y40 -> fpf
cvn XOR qhk -> z16
bvv AND tkf -> dkm
gcv OR bvj -> mvj
x35 XOR y35 -> fpq
pjf AND vhm -> npv
x35 AND y35 -> prf
y26 AND x26 -> cdf
nfq AND fmk -> hmt
y20 XOR x20 -> gtd
wwn OR pwv -> wch
y19 XOR x19 -> pqv
x38 AND y38 -> wwn
mvk XOR shr -> z32
mgv AND scd -> tdq
fwj OR vsq -> z23
y16 AND x16 -> fgn
y12 AND x12 -> bdd
y27 AND x27 -> grd
sfr AND scr -> cws
jrj OR qtk -> jrs
shw OR wss -> nws
y18 XOR x18 -> fmm
y24 AND x24 -> fmp
rbp AND snr -> jjf
y12 XOR x12 -> rbp
bmn AND wqk -> jwd
qgd AND hjm -> tgn
x03 AND y03 -> nmn
hjm XOR qgd -> z06
y21 AND x21 -> rjm
y19 AND x19 -> rmp
y11 AND x11 -> rpw
y33 AND x33 -> dpb
mvf AND jbg -> snp
y27 XOR x27 -> mvf
mvj XOR tsw -> z43
x34 XOR y34 -> ggn
smq XOR ggn -> z34
x14 AND y14 -> rds
cws OR fpf -> rmb
y36 AND x36 -> qtk
y42 XOR x42 -> ssh
cdv OR prf -> vvt
x24 XOR y24 -> wqk
ggn AND smq -> wng
msq AND fmj -> vvf
fmp OR jwd -> jvg
scs XOR rds -> z14
y17 AND x17 -> vmq
nfw OR kmj -> rwp
dkm OR hgm -> shr
x31 AND y31 -> hgm
tht OR mtg -> rqd
x02 AND y02 -> wwr
qfj AND rcg -> bck
vrk OR nhn -> z45
x28 AND y28 -> bwk
pvc XOR sgh -> z44
x29 XOR y29 -> gqk
qmd XOR bpr -> bmn
x36 XOR y36 -> pbd
y08 AND x08 -> wdc
y41 AND x41 -> mgc
prv XOR fpq -> z35
cjw OR mcv -> qfj
msq XOR fmj -> z03
mqw OR rpw -> snr
kqp OR hrw -> mqb
y43 XOR x43 -> tsw
wch XOR brj -> z39
y40 XOR x40 -> scr
y02 XOR x02 -> kfr
y31 XOR x31 -> tkf
x14 XOR y14 -> jss
jrp OR wrk -> rcq
rmp OR npb -> qpn
x30 XOR y30 -> dpg
y15 XOR x15 -> cnb
snp OR grd -> mgv
x07 AND y07 -> qtw
fmk XOR nfq -> z13
x22 XOR y22 -> qns
ngc AND rcq -> mqw
bmn XOR wqk -> z24
x28 XOR y28 -> scd
y00 AND x00 -> mgk
fgn OR cpm -> qfp
qtg OR qtw -> sjd
bpr AND qmd -> vsq
x06 AND y06 -> shf
pqv AND nws -> npb
pjf XOR vhm -> z26
y09 XOR x09 -> rpg
wfr AND gqk -> mtg
rpg XOR ggm -> z09
x25 XOR y25 -> fgc
qns XOR qtq -> z22
x42 AND y42 -> gcv
shr AND mvk -> hrw
jrs XOR hrn -> z37
ssh AND vcr -> bvj
mvb OR wdc -> ggm
qtq AND qns -> ksj
mgc OR fgh -> vcr
qfj XOR rcg -> z05
mcr AND sjd -> z08
y32 AND x32 -> kqp
mqb AND hhg -> bwc
tsw AND mvj -> nwd
x01 AND y01 -> nfw
gkw XOR mhv -> z21
vvf OR nmn -> ncp
y05 XOR x05 -> rcg
mqb XOR hhg -> z33
qhk AND cvn -> cpm
kdv OR kdk -> chf
scr XOR sfr -> z40
djs XOR chf -> z38
ncp AND tcf -> cjw
pvk AND kdf -> jrp
y10 XOR x10 -> pvk
cdf OR npv -> jbg
rkf XOR mgk -> z01
y44 XOR x44 -> pvc
rtb XOR tnr -> z07
ksj OR hmb -> bpr
hrn AND jrs -> kdv
x07 XOR y07 -> rtb
qhh AND rmb -> fgh
y38 XOR x38 -> djs
y34 AND x34 -> qmr
x01 XOR y01 -> rkf
djs AND chf -> pwv
jvg XOR fgc -> z25
kfr AND rwp -> jvw
rwp XOR kfr -> z02
qpn AND gtd -> qgt
sgh AND pvc -> vrk
y11 XOR x11 -> ngc
kpt OR tqk -> vhm
wng OR qmr -> prv
shf OR tgn -> tnr
x23 XOR y23 -> qmd
y03 XOR x03 -> msq
bck OR qtn -> hjm
gkw AND mhv -> dvk
y37 AND x37 -> kdk
y43 AND x43 -> hqb
y09 AND x09 -> phj
rmb XOR qhh -> z41
x44 AND y44 -> nhn
phf OR qgt -> gkw
vmq OR jvq -> mfk
ggm AND rpg -> mhq
y05 AND x05 -> qtn
bwc OR dpb -> smq
y20 AND x20 -> phf
rqd AND dpg -> pps
wch AND brj -> mwm
x04 AND y04 -> mcv
mfk AND fmm -> shw
ssh XOR vcr -> z42
dcv OR jss -> tsg
pps OR gjm -> bvv
gqk XOR wfr -> z29
snr XOR rbp -> z12
x29 AND y29 -> tht
y10 AND x10 -> wrk
x00 XOR y00 -> z00
qfp XOR vhf -> z17
tcf XOR ncp -> z04
vhf AND qfp -> jvq
dvk OR rjm -> qtq
mvf XOR jbg -> z27
ngc XOR rcq -> z11
x06 XOR y06 -> qgd
fpq AND prv -> cdv
x15 AND y15 -> bbb
x25 AND y25 -> tqk
x32 XOR y32 -> mvk
y39 AND x39 -> dpd
y39 XOR x39 -> brj
x21 XOR y21 -> mhv
dpd OR mwm -> sfr

View file

@ -0,0 +1,10 @@
x00: 1
x01: 1
x02: 1
y00: 0
y01: 1
y02: 0
x00 AND y00 -> z00
x01 XOR y01 -> z01
x02 OR y02 -> z02

139
2024/day24/src/lib.rs Normal file
View file

@ -0,0 +1,139 @@
use std::collections::HashMap;
use helper::{Day, IteratorExt, Variants};
pub fn main() {
helper::main::<Day24>(include_str!("../input.txt"));
}
struct Day24;
helper::define_variants! {
day => crate::Day24;
part1 {
basic => crate::part1;
}
part2 {
basic => crate::part2;
}
}
impl Day for Day24 {
fn part1() -> Variants {
part1_variants!(construct_variants)
}
fn part2() -> Variants {
part2_variants!(construct_variants)
}
}
fn part1(input: &str) -> u64 {
#[derive(Debug, Clone, Copy)]
enum Value {
None,
Known(bool),
Op(Op, usize, usize),
}
#[derive(Debug, Clone, Copy)]
enum Op {
And,
Or,
Xor,
}
let mut wires = Vec::new();
let mut wire_by_name = HashMap::new();
fn intern<'i>(
wires: &mut Vec<Value>,
wire_by_name: &mut HashMap<&'i str, usize>,
name: &'i str,
) -> usize {
*wire_by_name.entry(name).or_insert_with(|| {
let idx = wires.len();
wires.push(Value::None);
idx
})
}
let (start, gates) = input.split_once("\n\n").unwrap();
for initial in start.lines() {
let (wire, value) = initial.split_once(": ").unwrap();
let value = value.parse::<u8>().unwrap() == 1;
let wire = intern(&mut wires, &mut wire_by_name, wire);
wires[wire] = Value::Known(value);
}
for computed in gates.lines() {
let (expr, wire) = computed.split_once(" -> ").unwrap();
let [lhs, op, rhs] = expr.split(' ').collect_array().unwrap();
let wire = intern(&mut wires, &mut wire_by_name, wire);
let lhs = intern(&mut wires, &mut wire_by_name, lhs);
let rhs = intern(&mut wires, &mut wire_by_name, rhs);
let op = match op {
"AND" => Op::And,
"OR" => Op::Or,
"XOR" => Op::Xor,
_ => panic!("Invalid op: {op}"),
};
wires[wire] = Value::Op(op, lhs, rhs);
}
fn eval(wires: &mut Vec<Value>, wire: usize) -> Option<bool> {
match wires[wire] {
Value::None => None,
Value::Known(v) => Some(v),
Value::Op(op, lhs, rhs) => {
let lhs = eval(wires, lhs)?;
let rhs = eval(wires, rhs)?;
let result = match op {
Op::And => lhs & rhs,
Op::Or => lhs | rhs,
Op::Xor => lhs ^ rhs,
};
wires[wire] = Value::Known(result);
Some(result)
}
}
}
let mut result = 0;
for (wire_name, wire) in wire_by_name {
let Some(bit_number) = wire_name.strip_prefix("z") else {
continue;
};
let bit_number = bit_number.parse::<u32>().unwrap();
let value = eval(&mut wires, wire).unwrap();
result |= (value as u64) << bit_number;
}
result
}
fn part2(_input: &str) -> u64 {
0
}
helper::tests! {
day24 Day24;
part1 {
small => 4;
default => 41324968993486;
}
part2 {
small => 0;
default => 0;
}
}
helper::benchmarks! {}

3
2024/day24/src/main.rs Normal file
View file

@ -0,0 +1,3 @@
fn main() {
day24::main();
}