diff --git a/src/13/enput.txt b/src/13/enput.txt new file mode 100644 index 0000000..a3ae39e --- /dev/null +++ b/src/13/enput.txt @@ -0,0 +1,2 @@ +125,142,37,59,126,54,23,233,152,29,146,110 +ef07ab06a32bdaddfee1fa7255a401c1f4053a1cc10a4d136042515688ab9fb721170bb6eb3fd2077926ec7d904a2673c79b137322f73006f519b282b3b1d2fa88aa8a38db5a497feea649ba0ed2da81a358e1ac26b51ab69379e3f89236693714dc9b4c8acc910c3f1ea1281d03a68e6b52cf72b3fb926dfaf8ecdb735f96afeb54855857708c47c10aa1e70786062f139f29f5a054cfe9f69e337ffa9d792c19a60fa77c46eb4aebee328cda10a2943f76a406dbb2d57d1fdf72ee174b154a670139b77a92233488d7d52e8e2bb7b9c1a068be38d6e5df30fb42bb9ebc34985842f28fe98f9df180955e28dd7fd64b785ac5d34941b9a9983b9af1de7a84e48970f84ab10767ef57267f8291d5e95e48de92a8c4a1efef0faa0c269a50c0278d7707a53a67c7f666f9a88dcc4c9cfae406291f4f99d05d7a3e2268e806a2d385fc4b7b3fe104c00e550a201027af8c3023be56eb6bd43618434c8cfb1073fcd4d2e9355623f892e752cfd948922ae5c73049d87ed8e63f6bddf6e4a6486a7f168c114370013731abffbf3c96f850cac60c075ae44233dce22639f195edbd5963b05f84532820d4463510560478d24471ed6deb9e171ebb3948a9fbd5f6c2aa34f198a2251b3a2ff63c64ec888528fd9bddad361e48b17cf53a8dc0884bea51a54068d93670175621dfa32bd04d39140ab024d0e6e96b35ff5e437bbc4f388143690146168c88f5703b46348e89714fb7fb4d29343dd1dda2093f3ca4cde25d5a7166eef65b2ed5c176cec1690c64e837ca7c06c39048c207f4d902a0e4d513ad53550b7cac59f305421d0dd8a1966e10d9174667bc5f7d3a7142c78ce7f84e6efe362f2ccfa6b72dcab105ad40b45faea19eb9949b1ed9e575e9a1f0e3f2bb387f022512176278372d0f1f31ce552d9b0034fbfa6443d73bf3cf7f50029d02ee27d3e99f9e05573cc08aaaafe55df243d86d550985adf07ab34bc9da4c60d7c26b5ec93c19493c68f3829054caddc927ca63775be55a3ca9979e1956d951f9e23d27991ce689dbf9d7019641744f7ed3f53d6dba9d615c43c43f942357870cc8c13ef55758e68400b2fd787f657837d9e888058088dc753e1b40f68894d4e603c9f2630d6396632d28a02253b2aaeced10841f8a351fc44381a18f28cc8e7bc48c2758a375d51fbb88825e3ad878da590b638cd40bda5f4731cc108833c59e13ed03739aa2988bfaa7d9a4b32ae27d2ad25bf4b3209c2d97d0a371de321b754e7c22dc0f7cdc3c7217838504cd10a392437bbec40a58e31067e0ad67ea11a35fb67b30bdee1994bf68b06a38ea00cd900ab38fba977f99194751072e5c1114bc45c238c13fa31a42d35a7f45ef73eb3362ed87077f00ba4f3d8c6f3e9cb7a0d396184dbe5f89edb93bc70c42686daba3c821706a36e75112c1654d79e12f92e6c1f792b8edb5e26b7d84403367ce037caeeeda1931dafa729e3d908dec867b7af6ab1c678bd193a57b48c7fd5fb1d0a8f58ef6fcc73573b345f59d024493930cb75266e23eda7e2ab19bbfa5d1a3caceb8745bb0ed569a9ecc70dbfaa5282df77579c83107410edca00922abb82248416985bf686aff87a2833c2f8841ed9c0a9bdd85367154e69a91b948261f4af5da2ce0c3bb8ad9ff30ddbc1385fd3fc04838a38ee2a482a4e1c715360f658884cd7506775967d414285f8442b37e438d7e3fb879861e2827961b68a1aadb78c696ccc927102a52b0e9e1991c2597aaf642964b1c26e3672f001ad8c9ba65e02748d666a07e62e790111474c6bcf7cec41084f0b06e94df71472023bee271022957152e00315a2c1beffd5a191f3c9f06c99ffa5fb98476b2d8ba715261ff2434ff2e1e7a8364be5a35f4d8360fedaaa02794170b8392e2b3b38deebc9afd6c87b3e29479da811d3346524a42079ed36133435a0cf61f0a82985d244d105c8f394dda0776fda66a16d646abb18dc3cb749e714e8394d254ca2af41b85265236257cb7b904557772982d356a6eadf4b8542d7c7f86806ff1268486598732122afe590edf86ec621af1f3050789ec6e1bfdac534e457214d0059c4c91c8a689afedcbc09c5101aeffe4f195d2d8257e2bb7128d6887ceda20ee99f86624b5e1505fc0a5af27758d638f609d997aaf9c3efbcef055553c60be43cb01fb6f33724a5c69a0cee1f55d5ce4638e2a73809c41f56e0a79ad586b97deb2a1ed2330259eaf56c2241a8d006eae2b87a5a82364730a7ce627ea15e985c52f02c46e7f813b36a5e30f976cc9ef56d73772ad4300f8513c717ada913299d209d92c3b86e6b34174f55ff5b37fc00b541da66de7c05c6571f029e663621dda8057f24c87d14b949e5a73146f0b77b56e2224e7959406fbffd3e86e951c4eee5747c9f13809184326baa08ca4697156e81ca68d6c707b58464bd47c18a35eb945314ac067d8c3114ebf36da619074c284c5a745d05680bdb3bb4d8c5b02ce08db21fec7c35d0262968f9842507407c31b23789ee578ce4d05a0daf9cb0035692e7704132b5d98a8abbfa9b27c9486cd041d2b672802023833b60945fdb7379059fd8e7cba9fb32df0bf7fc7376a7dff4e3ebc8211726202125a2f5584d7fecadaccac0cd34c70523cf5c2a70136220f82609f618716f61cae4392e9f1189bbaf233414cb29425ec21c6db8de52c8578424d0ea838e8a356a32f8083793825b6164ad6bf4f0fc639dfffeffdeef106ba6136f3f196800be3272b29872fee4237ee07db081611d4788085ada24dabde07a1a90703f85d2c99e579c1ebbfdd6142dc842d732024445d6695e3bc843f7766371845e369d67a128cc16ca9634628e08c0c2964239946a88130f51e5cfcdef33e406fbe7db9e047ac101cb7150ea06a77061f2f0a09cc65466d7aaa8afd7fa2bcf4a12bbdfdc5163fcc05f6d3862f58c1221853e4263fc0f441bec6ec00d5b1f2140e884f281c4b848b47a405e9cf6574782732868b3136495fe007a126c618c7c988ee9eb11024ec88b188862c062429f2de0e37f72b0a9adba586f01385b1b5f41d86f347180929df9ff0b04bf73c57a9b10f90e7fd18c367ca4b7ea8a2c9759fda599f50da22d10b32f2819483c21f695012bc8a4e96892ed96145d423ee1b78788b45363c960e8e303ad5e985334643048d2455f41169d239227f887b30e8064e1bf5a478101fdb5e8e34c668e944b3b4d69edd631df0303ad24c439fbedf1f7f479f47357741b7ce2c65a0d90ddbb7ce57b46675abdbc531d09a2196baadcb686d6984fe88e4169de9873b61c1e8c98a8ba02278874d43092f979daf4c849ab36ffb3f599610598dcfcebbf7b13527c598c5b8bff06711b58b62baa4806823770c2299b9afb2be8e972202aa3f95f1e43593a753865fd7897735e3d532ef853419238ba658598d5a0249715f914bbf0f89ce2adea7cedb02b1d14a53c728c9ca48049cd8990a3c178a896d3ead9f755404612fb48ccfb24fe114ddf38f974fc389f6da344d241b40e612a9098bbe4ec4fea77cca3d707c8f32d16e321b8a04642167542c5472afd1f1c96a7dd77e85cf432c7cc99c93677a5e922abd74715af30aeef066f9a60de343f6f37ffb6753796306fb07c741fff594af398b03c8e2696f72906f4d89fcfa03ac1426a949968b2052b41bded8a44b5f8b33989a1af654447b8d798bb3d7be0a40a8f11dfa4c63c1d4fb99be6758e99c41af1e226293491795ce872b7cfd4f6df73cdbfe7c100ac1f0b930bb47c2f02ccb76cd3f8aea534ab6240b28affaac1d519eca11ae7c4845fcdb151b17aff3e011aa81a877c57cd70b1fdf1f12c379d1ef745d314cdd5617a4473f6b4009d0d2e2a0e638cbbf0ef1ae1b7e765e8a13c2143a14c84f26ccff7c8cdc55d1526241a9a39b3d301b6501b7a157f5c8c6585000815126aca665d37389bf798ce541ff3801d950035c3e79919ec5386eb0defcd70af2c9d0b933c1aa8fe7d29f8627dda69a758d95c61f30cfc976c3ed278a56a2bc55a67ca14cac850788fed211de746670c7dab58d78b2645220ca2291172c8d9a0dde9fea19b015a0c5126e6209369fa85c15318fb9d2264b59ee41456b6689d1fde1347967ade2cda9be24853b07ea35b4ab37edfc37d99b4ba79608c21d42fa2350494b99dd580b5ea765a19144a2ec55c7b216ce24e267977787d3598702fc49ed12f67530450df2074bc0d52009d31b2e29ae82454d2a9a6742ebbcd0219f3df2407e11e0a2207f775d8ae139baf3d6cdad9f600b228b041d4a6d81a56c60147e3ec279441c295e7c7c06468f34ff84fd949e2795ee68a317bea9b594b4d7636612bdcd534b3f389e7fb54055b9663133d31d0851323f83926d808e0c02c853f8129fd5a7a64c7d3430e77048092d08108857a67f65b8b78f99afeb9f59169d6feb5fe3e39ce6f21bc71abc70276da832f60083d25b07249ee102440d5ac7f7cdd0a1bbefcb7de47621ed8c7bdd60ee4921ba6a99255b196c72341930412acac8f35e032a27924af6dfba3c1a623a3ab6c5fce2ecf27c4305165002c51446767ee8ff445a7bbe1191c520dc9955fd99dc2af2ebff6bbcb5378028114f3f3710450b17c3f0a2b42516eccaddd09ea5596c68721c22726161361f1aceeb59e78d560bfa0e53d5574985bb001b895d78d2b60fbe3d57faaf11c5d0ae31ad40881d6a37c981544edb4ab631a65522f084db6992258c3c1726214fb325744747f815bf8b5976a9dfa6a4be39f4b6b502c9603e4d5ad66f33495bdc06a89bff606238611d52bd7a04e9067d6ca91e8083994f3c5b981d7f8c944e09448a9465325149282dd5b75b891c924cbbae3db3a9994853f7f452aad4c94b9aa90ab20b31c520fe4ce5b086e7611e6ec4c58a8b0a88e1f7c972be536a5d6c2d9761e17bbea63d41425b030602301a92d693bc8f135c20db4b8543020ecdff463c59380227167b43aa7ff9d34686ef216c7f9cb85eac76e7012f5920d6fa9256622f2ab1bb8ca453609935c3a0ee2a0d9b8a08e05bd0941792cd8b2d09412aeb24da52fe15c5f992fbcca73c293234b14c52e01c451f61433f3054e2dead8b20bf14ca14a4e7b01555668f7706dbd57f13a675648b39e99b074f68b625b42dc50451bd508d82c89c2e9260d36868045115fc75d7ab6307af31c047951370fcb2241f151a54102e17ec8f17477fdb26c98a953ce66e16dd7b27a4d69e575351122265f5d853457c0e802f466d32753178dbea08af46aa32c75d753c93ec2dbc3d616f60981cd077a9a431f8fac4a020ba8a108a11ac7cac5b6a0076698710f8dba9ec33a4572a5d658ad25dcb1aee7b49d22896525186eb9af77cb0aa1f946d7aadfc2d0a84197ba71ce9b2a9cafe758f2aa07052d690bf605c23b85b9f5c5aaf5301befc895a7c5dacbd41ef97e9fd3e23e116b6e6f6a5b067af9162ded930e04c9232fbc8dfb23886f458a88814b4e993c84bdb9fc900f24251e0e6e3a516aa0661abfad5c6c35822015e3cf0b9504ecf8df057d94fad6f87d2b4090d41d663b1508f26babbe6ef7a8eb3680362aff216c5b7ee989e4c1e36ab0a97e27a6ce92b9c81728a2f109915dbed9905dd6d7b8cbe7f3b62bd93b04ce29fe68f43b2318287e6ed70ebe3d3236c17e5ea6bfe0982019954a6c52c8e08e6e915d7535e4501d495ae94db0eb81c406d83899969a55eabfa2a99f708ab0208a1af8a601681c82a1c1734c4c44a502f218baf3c6c9894989788b987c232ac494e36ed25d7d6bf559ca734fbdf01be491d601cbe7e29f949d846ac174bb2377f25cc8187e052b65c9344345c481b13fb87679e5d72b937decabadbcb194d0cdec665f0abceb89bea2fd473f5545033a1b3396f4d503af0d4c78a14a92a18b6a6b80b24c70ed7f9b4b68281f972a04f7a910eee0a8e246bb1b946890b7ec264e4b5f0865c9634aeec4ab9738e8e2a132822234e9faba102b5caaa43684794e07525c6972f21d3c7d9a31a32b6398d60d3e9abb29d89f7cf1339b473b21bb2bb1cbf8ad0184ca5abb3aea638f52275b9f9dc3f376f5b3201ec052a96c6bb254274fb03096f29cd83c4ec5b09c47a3b7ea1cb4e6807e61f65d23525fa8731276df3b2c4c8f066a4b7d8c6ca339528c70e6c83b4f33b5c2e55db0e352caa893b8f63f022ffe59cfc70d17deff4a9b4945e95ef0ebdd5a09823ccb31b0b0150403501fdccda72df95676d23b2897b40975800f14f889a92c851ff73037a3cbba3af2dbbe97d03284ca58111a525c9b194d5c78544dc4231f380444a77d56d5c33ec31317a6644c11de3c8d5e63e5a91180672de752bbdc27862f51a2cf914fc0d95aea527d380ca000a0e81e2a2a9fe2f5233f7a708c2d0fa4bcd957962b6666e563251928762c6f04fe0e3f3b781405de216b2dfd3dec87cb39a620268b0089d2e36b61850d836c6864c2c23be0d8d2111735f94c8ad3444d4ffa363279393cbed740a99e247c8d0e029cda0fa305204b7c87d5314611ba4d9d725a57c15a1c071e3862c72fba628912e77a8fc4ebcf8bdda9a0c9f5d161b92bd9c86e899eb6a4fddcb871864e884731496db1f8cbc684cad67eae0984b103ea28d1645f8519e0495897df4683e111fca8dc2fe53c9ccd84cac12994908afc5394d1872aaed314fa8b1eb41ef0b9ac9bcf0731f262040249a15cb8d6701220222a8105dfb7b2bfe60886a413ee6f72415e670f834512f0c42b25fc2f19f7e3df561b36eebe0177e3aa68f7fbe72ce79b85221a7649dd204b2527024b16e5782fb8d5a5127210e176576bad4500f3de29a331314062cbf59dcbedc51f26073c129e8ed6db2919d5d24c0a490383443c87ac0f138bbe37b2a8fc764834bf8b4701ac960b868ee9b4c794e10091b8b329edf6b8a096ea7759bb8540f4f38bae39a5ee548b7d495b559b3eab2554f05649538738ce9aede6991a9c7b96404308a42ebe4524961ad8b01531be2ab9344836935b9fde86be9a14c4d264d3b2b914d44d4ad444fd386202473f9c7d6abfa5a5ef931302643b0746512eff7d50771371db72e54ef7251c4dfee3441fd7f398ec20f1a1d179d621d891c4c6aa999e44012e60537fad0fa0db6176055af2fbc35226da969aa5ea6458b6c13bd68a17242a3ff58c2f32aa2b4c93f9ce8fb24804f213ae9fffe4c89e45de28c972acf05dc5f30b1b0dd1c188899d01d00b0e08f4099ee3772b8d6f02edddf381ce9933d859e2ab8cb330f5e6a8f839e0eb8ea8716ffd3e2002cdd8c91200b7fcc5630e2a91fcacb961ae64050fa6f6ee8d9e0d8b0adffc8a7133a5958a1617c79da62eb82cd885fe253ad3a48a9b4472ea585a83c80e87ba755d598c90a744dab544f84fc1457fd559c719215c7350e0f6c9e95f637926f2878d74097d894f2d828fa83d15bf5a6a339f8b93078c56415710a1cbd9a55310d11e1d73cb0052aa9a52c69a3ef86068ef7b3f666a4372ad09ed0341be53af4923ade0005302d1e30d01e60411681e8d958185c381fccdbe06ff6d52611c108e51112c3c0a583f84bf579eb37aa334c08dfe0fd7bb45872a7f101ca3166e4e7a27c07312ea0091b0cb6a39089797e01e1bd22e69a6480d59aa74c01a1845f5a194be9b1921974e92563f8b88bcbae3e16db8bf13e9db3892ec4f537010911d4839215599f289d452ab79562ec7cd56a2421356f16bc3dff93a50be3e5256528113806a54287e9fd36080df697c23348788cda1f66875c3c3010a1842696ce762cbdadac16a9eed236fd63ba0baec7a57fd8db195b958bafb442918956c704c869ccbc656c6669a4388ea5519af00d28b5c55234b29768d93055f76c01a55eafe5a877d79be341eaa0b13cdac61b5b9e8188a359c6d91d0c5ea52fb5cf0611b4205797c647a85c26f3fcb045f446641dd6f1d8bdf2791e4905f2ad51ab3c20a9c0148bd3fc0706774be27ff514eed54447e241d671c312e58e7c7aafc7f1c55db75bc9c3efbd5a6ce3a2c0561c381f0089b4c5b7ae86a41523a92b326f8ddcec2c5787d4c2b669d4d36a0dad63f8c9d0c3f901e2c8b41f01f6ccd03eb88e8a482fd936b8a38beb28484a69dd4911826da58bf9ecbd99179c730c4ac37ee35daa79f8f9a5b0dd31742663b7fa2bd64b5953fca9e47b05c6260c2223046086b914b37675555f61968b6ab71faa316f8122299e0e7ededb659ccea74e7109cff7c1407e6e2135e4ca95691b3eb0ddfcece78c818838da97992472abc3dc2b5e69e2d8431bd120e57484871946d23404d7d775fa3ed9a7c6e56312b7d131d437d5f994840f0584d3bde96f4b497ddd8385ec7999b95e6ec405ef182045bf0c52ec0e79063a57a660c8a60a578f211fe1281a21cce43d8ebe8bd44469c59564d62b44fa776df5f9503fbb3d5829f9df1c2e20e1aac287ec54bc0779841cd671d51c0df35191eb8c587821efd058c3eda79d08dc05b56c17f98afe1b4d95b78f02c9bea4ff652459b7c480618687bce7a3e2cff5d808f5a0645f72e77e4020a12aee646adc88e2f06a8ffa0c11274300cea4014927432f46ecdd15ebbc266c180cb2b76e14f0ceb7a03492335489a3d4eece262a912e43ed9de3a87eb0f688de7960843e18b703bca838b7deb16f480c42bd7ca69fb0b36811f1d62f6094f7232243bf4374bfea9001ed695480f6aed17c18cae798eb583317638440bfdd3f509d9570655da32d9c7894d0312d92d99135340d4264ef2188d40c4caab1eacea31c0c690c2c7b20dede5984ca76380cee5448f2fea1173da230ef0166d626f85bf4a8c4fcde83e0d9bb302a0ec65ea03e16f1564bd29f089b42ea4916d26ea24acc8ea884534d819ec8c3302f3edc9a0202c040dc2791982772135a62dcedcf9c3dbe2e1951054891866bd1c65b03a6c6b803b05653c463a35331499c86c95dce2cade69811ac3250be0d5ef8de279d66cb92fa5a153ab058b1095b428b5cfbbaa0bc85ba69e7cff10cc39b6d7b17cf372e5710101d8a09a8985a6b601ed67f008c35511f4f6e9e82fc907cabd31df8edfb45e2e157419c8cf7e585bfa734f02e74bdaa25f34e191bc025677bc7cc7da01810c2be85547d0d9f89bb27edb94711a3a28d6f617116e1ec0005992e50199a5066eaa38e765a3ca3ffd02f333bdd54dcfea2b67b0858fadb45ebb1dca9a5f59cf85e24820b755baa684ed8de35e489490abfa1c5d4bceef30f1d0cd68a9c101ff4fe04cab627fc582de138bf02641d3a22f340427230dd90708d90762bb73117d3e6f59a006d747aa1a11ae497c4479586ecde48ed10b49201e727cf7f0a4021b32843855c1da47f263acded6c9fde6e64a8e20070bd2a598abc348f2bd9055437b1bddce9ed410a76474939a0d025a2bb6311a4355a4a3f8b4135fb2ac8cd0ef719f2a5975bb2cd7f3cb4691750642286686b1341a01432590a639a776168c54b4be14bbbd2603cc008e5a89adcb3011d0ed39892edb22428da1169a825162e808cd3b3fae3973cb82f508f4c0bd9e794b3d4ecbb40af471ca404001c272e82352afbf57bc9c0ccd61ec3c8cade192cb031d65fd0bafe65f6a29c64111b305c78bfe646062c5e1a7b67fdd9e61901ad55ca897f10e4bbe91ec00063f0e7c9a5858902bb9d59dc4efd1fd30ad49f1b3aa6e5c5cdf1ce8fe5100393fec2a811d36d07539eab6bef2b4cf7b6c50e9d0ab3031d87df403cff529ceb5517bc2712f47e2e1f0069d52e8c8669c07ed9576261a54204b103523f375f7b0a9fdc226480803bbac2493c12da754d69d73d166912156caf3f02fbe41825aaa55917eb1cf3a5d0b4d7d4be589d6678e0a5aa212946edb75167c86ebe6cbe97500fd79ab8c607feb1e179161ce61af8b6de6d1dc3f870eb70a8f44083d9cf91bd496025856b5e964ef18cefc3333362cac472061b1d64d27a1265c7255a3275b777b5277d573f0f218c277065f31720cab04b4b6700bb890222e1e2fade229b029566143b21da6a20f850edd5ee1619e2448c1ea4a58d8e1e9225c91f3bbe56a8022adf1d62a2009be03dedb12f54f232cdb2692c41a1c624326c84dd8e76b46fe9e180660a46ab470aa43edbffd7fdcb801e9edcb243199d44c5c3bf576a597b4493c156c7027a2a4e952bc760a9568b2f7f066bd1ae64f219383d0c688d080177f0d323895912df837d8bc3cd5b2268a15410a2d1eeadd38b2a56a5333ad2d8273bbed621926895f63a7e7ba104b4c349cc8dd65d984785a22365d3e8863e58c3e7a5a7e3606998b1610d2ef24eb2993c31a6428dcbeeb70da87b9257611f4bf5da733b0f1902754effab78541239725d223ce286e3103cf3e9e3791cba849f36229142095fe842edd9ab07fbbbeabea23d15e51957c93880ab18726a6b9105c690f12f05e3b0e22a9806e9d96692936759f83e40e88453bb128e38a5bdd460329c93c813246b1c8ddf9dc17bcf7761d845674942fd2265f24451605855b560f0ed0a98c8f009cb978bf72058090f5f35e166721ff7c0b12402eb605de7e0958138637620ed92e854f69b16b0fb068923b6751643d5a463696ea06dd75320f611831b5fde6531cbb707115ac7892e797da3a5d3544bf1ab727597698df0f05ca1f49d2c2dbf25ff69c2cc299b26c6ce49981e9f63524a5d25c837634afed91db6df492e6c9d7abd89f534eb85c188cf0900e5953e84ff17e995d3c8049b1e635e3219735b6407fca5f7be452a85dda4e88cdbd5a9d2890d9923f6f4aa41f999c1eadafbe0aa6cc06956b14fa218d99bae6384992e65116aadb46507dfb6818cc2a6a3b02ed3563ab06ec699a04b4bf3dfb8def78e61d44960be135ef306c9c554bd907a2dc07be33c2c84d4d1ebe6a413b4139c431da4ac5ceaeca133d78d46fc742229372ea1784acb756b09e880e2ceb73cfd3e23c673e5eb6812f64cebfabf6119a2937e988804fdbb30de70fe9b34618f52b3935dca31b9723fa777828b4a01eac759dcf93efca60d95c007889b9d1ed6c1c3d0614c652b55acefc938cbea675b8e3b5f5b6804a45f7b34265ce546ef4f80e60ce9977a7113cf8ff82b90ab6d81094724190db16856257eec7ca35e31b25123d60a58562cb3e3fef8d6c25ea00480b3b073cf0d5bf4b1775682804425ec3590239076de103266698bd41f67ee08a6d539529c01fad00447bad647416e31ee3f8a691953ed1b79c59f34bd8d21388e3a1304981c036fd466c992cafe6192ea367a12a412d3641d2db04eeb025e26fd91244547e3bccefebc2d265d2790de7d44313abe5fa7ab6850f5ff03514fb542a37106fca5308640ab87718c6e4421ed9a38605dd659231ad6e93236c256bd4739a4bf478501112395b713dd89e89f2897d4a1b3ab94bd48688128868400894a138cab6332208d92f1bcd4d41be271077705834322a5b65bc54a909f4d2e1420ccc0ff3b5de3bdd835ff5bbdc19c487533fcabe66f082706ea68856627c526e58b95c90fc9f464931ce5cff1e7a152df7bd39c5396c8145785d9b2649d4f7e374bac0c0a2ec002ee6ffad60e841d8e8f6494a82b0a8f2acb1dc7f998a5f0272bfd74a63bf0d73b134058b78e7b8047ac021f9c86f02b92ff1d01199423545115e35d8e06dbd10c4e8e9f85db5afada347366c9f95b4004b9f77d4b30082de222306c9cbd29f57de93c3e5ceefe3128b36fa95f9410c38233fa194cd78980935d5aaed4c1c702c1290c76f5272b5d2f136cfe9b9d73ff699b517d934bf60977830d8d24929d95bea29e992fbd58c891a9a8056bc2e0bbfe0c400fb23b42a105fb1af7700029e9e2f808ac47d8b2de197c8d90939789e2a844e996c208fcdbae95a1bfb3af03896d8bc23ace2af1e1e3719ad0a58b87ff3b1022d6133fb16b2e2bb1f936587d6b3c3c738db99963ca609587b91d94f8632de4dec5a3b2d59fb526acf89ac561e50edc84c1fb4119d22fa210a25dd39b9f9a80d13d8d80fa0830068116d09584dfc33fafc11d6ba098da390dbbe45810011b79aad1abc4ac78aea9fd9d010d180846e10f4318f7dc26dec1a01894fd5505256a2a3b6cdbde45248e5ec71fcff077ed02f5b3b10b794a920bc666278492abaef62b8eecb2aa8b7ec30d376a780d00983e3e084a3b8e70f7b1b6e7c7cc0e29c9920c175154ee17a1fc4db68d68c71520536594993faa68fac7b39dd24aafdf293442ed80042f1ea3f5e4441e1b4f0cd896874798d04f5a291ccd2a507c4441d120ce6bd02ea9d02b4e3850c373784f32608880dff56254c1eb215bff4c56faa49fdd42e25f963c84dadc64cea4d65dd66398ac93b0a29597be80f26db47c348ef7e7c59ccb5b3e8c5115b461f6f402f68a45f40860380a5333e47274e89f12ac933bc09a9f9537fcd9a712201aa1cf73ae0caa936c97ff7ed4147860827677f0b9fdb44998e94cd8ab3087377721ae6922cccce1829e3a52565fb038c4c63339107fa7876e9d4804904e5b2ada6219f6e0f215e5824f1748ab9873164fd8895420f4e653551d6c46a675823ab3591f296c05780cccb15fbb76aaf19a05276c1a6c269e39e40ba1120ba227f17b0ff9614349db9f2f54a034aa4c91cffe19a4081e2e6deedbc1a3a7143539f92b48893c2628bcfe3478336302b68d46d4879f827b976470033a41e9216173a103fd70fc888766306b781d84830135c8a66cd9a381ee58af2731814af947c74817b8ebde84202c7a3a708db736d48448e432c5c2e1c9eb9344a2882366f89cb7fbf9ad3473c324d1d1faf3769293f5dc3879d8cadf3871bb68554ec90df12718f5325ff94c242302bde1d33330cb8ac55660fa391db3736699d5c03c930900112cacf4658004e3c0aea5b65893a1f5cc330d3672646bca8d2b21f150f938b2a93163564ca91a62855b77470d6a5d0132483f1084df36b94f76229ae94b6c357c070998b0147365354c416567931649fbf48f6e436da883bdda50da0c0b28e768a5754bfd1fe800847e18f5677424a71ab806a276d1f77f25efcdadcc4eb153dfa6d2473df48709a02675c48a88329283c566d2af244c18f2309703ca3801f59346187d6508f707bc6a3fa6ae39e51d2ea1758b1f31a7fbfbe248a854b9d17200e50930762035769e9e3034cc3310541947bd366dc0b183bd5eca820e953501fb32b49f0b7113678be2360906fd15ae119a3b91bc6d40fb1bff5495ae2d9187994c9369651f8e38305155ee2fc3ae54c41c7b20e07452b112635a747adeb4d198d7469e64949408813a1bc50b3cb240ee81ddf4e616530e08b5936e939ba9a75ae02eef793978d6ca123ad5ab7793ac23792a1e26732c63b3056bd9792de5f2b41a54ba3504c459f0778e9feecf166aa38a2e30c38663964122513b42831d6c8ac80990f496e4cd2fe21ae3da3620717f9653de386b66fe51b78d629d67aa27d05c2ebe39328d75653577db5379b3c52c2b6ac098756f7e5711227d5c803c9a52b07fab97dcc108a2ba21c5d598ea7e32862ce601bba37915b98cd3748bf78250b3c5798613fd1c11b2561892af4b0aba12d0db7d8d1d47c9751df46d6ae2c4ce3b840e5ed3f4c51b630c2a164396fdfdccbb6bff374125f0d27a6b124471dfd97d53099883e4c78e5b6430617dedb4d0aaade818b3bed39364af8aeb2695c2ac7a6c4a6d0e47769aed14083cc9cfba9da0f539af84f3edb3898fc4c26189fb8d4110af78d940c679c9d7727a8d1e21281514877c2ee2d5c33979694806e78c8126064f45145bd860a2d9b2470783f607e42c799176f03716edb9f2dbc97ac47efd955c7222a4339423c9e1fbc9355a098a260325a61f5792523c3f4f07f0d3bc5504ebbc5af41653c030689ac42e3ece73931e86ada90cb93a32e6fe48e424fde3d111db32a9d07d40bd25f4338ab57be4990311946892fd14038d34ed3467f648884fe0cd420df2d6f502f2b461d1de35e0b5e6d9fe202fbd3736ebb3da5b143fd4045192ca0c7d2d6fc18ec3a8ed81c7c71906dce126389ec611b4fe70f3d70f2462c7804cbe6b2688f6736753e65b53ee0db46c2f07bc7bc392c0be076a978e3ebfadfa354de5fc3cc2e083e3a4a11ad1e6cd24dea6bf7a6140d8a3822e70a490fbbac1c478cba1c50c826c5d25ef3179561d19577ca7f0aaafd056816d3ea489740b2fd7a1bb66881ce23f1ed3f2c8e0d319f564ba281d82591ede048abf1b94e91a28bd7f74e5cc8632ca9655cf862bb2a7e922d17c8dc4eb9461c6190bc121c8793ba2aaf1f4a594ed9e6b7e282e5d7d7585f784f6197986c52999ca221e67117ccc26f35921d4f2ba9398f4e8d2cbf4332979993315dc977629fe5caedd2524e8a4f73369a7a5cac9357e3184920a3704560fbd9e17435ce36ae235b0e98cfc4458f5a956b6172286409701727db2f089aaa230ed917c5ee5fa50056c50dc26fd5ededa9940e61f7058cc5eb9b6b4a4d7cb8098a6834b215fed702512f3ac49162d6d0f304c80bf5b12dd199c6874625fdbf7ae59116a318b1a95015b0708fae905d9b1912551e9fd8964a562b3cad1cde6a7566b06ca443448dd7d6cb5288145d1a217767c2e4a60d7519fcb741da8847edf44cf5316e6cf112bf75079fdedaf3fe9d243186b6cb7f8d28d4c4debbe677ea94725b3723192aa88388ad3163954a4f3674fa477cd7c50efe613c6c5a31daddff88d3c71d3f1626ce1d9b607127606b1e5dcee6bee9c1059f5f49940e413f4080d65fd3f3df444fa62c0979c38851d5d32b687e97787bbc99cc67b55c347a9eb2e95b9638396caf463d72e4094f95f42d6135a6c8c2dc699b1faf6c620ba87487dde089e0bcccb9f16c809940727bc1850d464a1bee8e25dccbedb38a9c4dec5822088eb682ac6853e9ada2863f736c3e157f7dd83cb11c9b32a94f7467a2c109b3dd112339a88e415ebfbce83cac6d9451fa6190c3e275de2360d6e8ee735d713be54477a5da4b3e5c11459231d4c6073507932f1da81cc19c8ad940cacaa30c9c4c52ad3fe9d18fa8a8e7161af7b839cc8386d75be4717f1d18d1ff3ecc299b1f42d991c9216f5b3ab4dab24cc66462cb3862ede59cadb450813e396a4ed021b5aa2b9b34571cd34f347ec6670bc829011ee3bd528a63a741b3e1f85cea6d1a942efb41185c2a4ff387ee13f2b8988583129fdc6e3883973601a77905beaaec0e892b435c3bd9cdea68aa82d482d836c66b9f0eb6e18c1950d41a4ef4f405f446833dc5f51ebca54effd4f7df0946bb406a07ae1a7e14f37150fe83ff5def82ca7a348a3b3ee43c9f48c0d94df183d2583717a43c3446c0de49085a7520897c67f1a14cf5d5e79f405aab9c55adb91287172c5f595181064877acd7b4ee943eef23493979cb3d6c49e36d1f8af6680fb84e1f6345103a202d8866f5ee546dea3c7b3d9d60db2774477f692ae7498bf7ffbecf9856f55efafe7e2c772a6b755de8416b5cb9d46dc65ff145ceca8f0283b0a03d2d2826d86d349e09a63b3413a22ab1a30e91200ade3cfd1adfc7ae56fb1980656a7b5fe0f7f271ae700520ba7ae9e878e59002350141efc2841a16609f92ddf10f291923987b87729f82009c9b884e23a1fa4ec64d27445c7744b344642c6878bbda42a90f87d42406e4e08d59aadacd84326642393d930976dec6982e344479853f5696f388e28097765ceae6c463223793307da070d637ef775edec7bd86a435a429036c3a7ad154215bc1421956165a88b266dc1948897dd2d08883eba5d60a02eceb6ea1edca5032c316f4d45f4279051a2b333353d5dfbf136ca8493fa90dd3fb49ff950e9b1ec6359a19a51863ca7190e6fa118e2123c2703a4f0759252ea658dbb8caca4b38c7eef45de3feb27bda50b390a8ca04da1b2e244cb9f322a8f02ff81cd4825b3c65577683db087fa749310866184ccd41ab65d70b6b4b3fd14fc5058ce8dc07b50f80c91d416f76166a0b25dd48b91b1823f55de3e2b4ff8d4366b6ba9edf737dbc30a0c40daa83bfc1f9599230117d97c144e6d3933aac44c266b84415431aee72d18bcebf23b2a47a3f9fccd09663af0fc634fae5f4cbfd1f098c3311a2bb1bdae0a3d85be52ab47c53f9ec7fd2c662aaf2e0a558fb8ecbc4589eb525cd07070f8223dee4742ceb4197ca6803c523acd50e6075799ea8c4735f4fcaeea3a8a856ff5e291b49c687f0c4018de02ffddea48dee6fbbfba677dd9900fbd578f71177cf671700e8370e6d567ddb4f889ac97fa289a88538a83f8e1ebbd8b49963179817c0bd661a98078caaecc5dc319a1f5eab4846b844f69f48b32532dcd6b75517f1153f9f5b96439d3ee49b196c9792a2fdbb5e397f28bf42b853ad79ef1b289a7fcf98e28ab59a02e7b0c294aac973e2a2d47b5c93dee652ca2c5c5a3a05ed0e00e339cdd98602322f3d54115552589e7c976165f6c708dabcb8496f1f1304cad8d2aadc6368c72c914dd220b22d387098f613f99b500fa2ca33d5aa6345a69eab213fc158e1ba47c9b49c5aeee092be70709652ef9826602f60e4358ceb1793eb8aeddf9b68e11d679fe0544147e3b1693ddb3f3997180c4ffbe74f31b8f48b33a61591f2f0a79fd57a2bf7eae182e80eed83cce277735ac9991d029d7564cefb6c9e6d1d805a97c56e807fdcb9e4c333bfb082dbfef1fd9ebac1e10e470c37ca27a6def45c0b92c7419a36d1f2957d38a9b072a8175296b7c4b89c1275c4e9e418bb0ef04309fc5d228f16e2c67ceabba976dba145f5e2508c158c368664371e9a21cadfeaee082d42a10c171750557dcdcced242b8fc3841256dcaab51d273227c7783a5a152a6fb96264791eca73a4da885711235b150ef30d30d2abaf20706e0233c56929b73b318371e5328ebac2c90be5001cc994d5867c4906334ca94ed6b56ab4fadf2d348e4d2bd3f5aed2533ed8e6a44f9645a4179c3b42a2427667f6a1c5d47561fe2dcc0c6e787240b6820661c3894636928af50008bc3457559aa6e485073413d1060050e79fa43b20c7366f3f3738e6c54a51ecec110949b7a9c1b31b54fcaa340b5d5d6a7e8a4969023192902b1862f3663fc3860e1496c62e51ca224fb0719f5b0536ccfa2c0ec70ec8258f0a567be2ff63098bca75070efe3597a744853ed964518bf5b6b7f5b1b61e3277d483da92a5e681e1f428ce1628c7ca302fc9182aaf801a465b99ac56495d2559fecd0b7c7df7d51130a9f3957c6c74208b06b0bbe21d050a9b81e26779f8b48f1dc5984ab00688def71b436fe7c5bb1a80f19986f00e6c5f4ec4f52ac63293479669048b16cc4820b35f2cafeb47690d34437b721b94ed76d3c4fa8f38f515914443be545f8d86d88ca66871096e9fcce0168bfaae594f8fc2fe8142bb250682e29a6c0210878c6b36eaf2b3f488bb063b5176a9bcecf24cf878cd4b156b3ba1b0e7c253244b98c7db348527de86fff90f7ea28ed05c7a284a9aaba4c308c2b495bfed568568945e4467af7305e1fc3108099cfde8048675c20b1294183688d5c06066b4bacb1c8fa43096787fe881dcd6ab5501a71b1ad8aae7812f7567b544aebd9fe0ac48a86e63c7a368d7a58e24e8db24555243a20d8a9ba282236984e27bf7977cd44a52803ca7e860e57f1d28d54db3dab70f3ccd0806a3f7927fcf322dbc3dfe5150e2c4c930040ea33279b6817452ba1f29a3587d57a5ef4569df6a6edffb3a2348de7d00fc2d81230382817cc3a627d115290fedcda353d8f3c064ffa0ef2c48d497f666bdeffc7e77e410a6eb590e5b71ac8105ae82af4032feae86aee91c0ede96e66b60e52a3affe88d3c4252a4f4b6b55bbbb880975b00df547e8974b62c40056fd0498d7d91a3e655a9008e2b5939391714572a21495ace5ca371041c10419afd8731cfd9c4ea046cd0be6b78f3dc30f9a6fcbc0e79f9d44728e83ef5fb42ffd64b3a1b7adf52b2242d67321f820619bf26565ca6ace5a83b1c3887c8dec7bec8e9547ab8f2746a721a46c110bb56e40eefc25a771f7e5243d71f27acf52c0870038ffcb59fd6f4224ea4225d0b7959601937ff8eed5db230a781281a3b6af0e3d2a004e9f6775ec8644ae0f9f509fc158fee4f30dcb425d609896d131104f6e3c40c8b02f58b987ff7027f5b467d7ce60f7ed0ca5716c52273987818521f4691a1ebfaabeac7f98972b5b938edc2bcf25a41be2836a269818789e4102aa4f08fbd9a12d95c322f2dce6d4a838694699e4cd8bb14c14f56e42632cd945dacbb74edaed3672f836c60653be9e331ea34e66be10410b5168f7747d4d853e8c897ecf7c62af097949220581bdf44eee1a4181b0218cea647deed3387331a17b4b45b24ecabbe9b97f92593af57ae878106c214e0b7f89b8b72efd4a189b2989f8cdda37039edfad52495c6f751464bf96098ae988f3fe05fff44ea67f66534ca1d433448f7cb554ba314de22102f3ba35a8f4018b0877173f69377ac21e90d3f13019d947d1a77bbed7258a3834f809583471af6d1ceb9e22daa2d4968f0a0095aa2f1aa1a266abb2b2cbdde98c6481601084f5d0ac8af7d33d2b8819c7c26e74763babff1425e0adbf8a98fa9058fc7a220e549802968bf22dedcc22b30bbc7bf3e4e7447e205b11e28e8095159978e705458562b284d2ef033f9e8355b244f4cbd5f0c4e0a6c166e0b8b114e8d8eb6ce0d352c79c834d94af819f29c7a8f24c54f3702864fd1a28cedf2a340e4324dd3ddb2209db2ba0ff907e0e866339367ab8b998f2bf9b6e87038826f6a9f3bfacdfc39d7fa6c7ebf95de63b668c75f96026299bed743cc7e108abcf4da0ebaf90cfd6e13687d95e58bc06965a729f784cfc5c9acf95cefdf80e331da45fb1f44ea8d34f2ae90ac2419eb66755149d10840fc1eba9b029ccfac49aabcb86379721d5e686f6170883722e48bde3b308d7a6326c26d1d4c47152b04111bae5e70db3083501638da284c05a8e8572a0fb3297e4f5c2364eeb96a5c9c8e4463b9d584c05bbb546da744d95bd51ee674f06299c562a4ede9b01f37f489abb31d3761d90c92442d5249358988af9c50955ef5aa29b69f1d712aee0b09efa71e0f6b3f696852b062a8d8fed40a8fefd9183d871176c0e2b77b89428fb418b7dfe96d07dc2b7ef47cb15e3c6eda0f199dd346ad914c19a07752b75fc6f51595a39ab5972ac34c66954b16dfc30995ca45368cb2c9e315d0895ebfef4af8d109b96f5bdd4c38120c71eb3c5f9c906b545aacfda210dac2c5963c3fb9482743ce9418e1aff85498b5606a123443784117a45e5829b3800b1a6a5f332afd7a878be99cf197517d8a2eb7c04a4c73da427bf8f293dc3b5ab9cf2fd089425d21b2755a44963791bcf770f012ededbc59c1a734da7116dbbcd4e24a2269b80d3fc058af2592447daa861a4fe4e7aa4ba75423e392d22d92ce50dc7d948ba2de2e17268708288104e2e7589176c27b600f67d9d1fdc0dc9254fb9e8cf38cbc952a4fe097753272a270eb03c3c827973007ab19e452309c9ec3047677035f2bd0d603cc0eed47c845aa9daaee5693a818fc808e7b032ce4c80b6b08c02f1a2ea4071b3e52c6e9fb24fe7308dfa7d982e60bfac5b6efa96f6ca1ed81688288fac301ae8136b8aa907d049d11b94b8a93a1e537c7eb8ee8fc16e09ae80d0f8a69feff7368705004f563ebdf59edb2816775f649949cf9339e41031d281bfb80f16f69efa14e456ac4e56a4fd77a3fe0b1b63d1ab8fd068105f53ecfb1dd2b0bc8c01387e064a9d50d09d79d9de9023a8093efd7a9b511c5f9c258700bfc93da4f244c7c88feeb229b2403da6c53ca28e6ca4299bcb1ad5fbf91a9af992b774d7c7f69329e213986388e43fa1497424c3eadbfdfeb467719905a4dd4b9414c1123ce004fa2d2b8429f6d478c7a944fc08c12a38821591bed583587cd3dc6f692354d05633283e768db0fbab5ea4f54d47174b9ba835bf2a8ce87152f9b8cdd230b1751c356df6dc5cc0585bf131ec3e755a777db51b60dc27a1d9dc6de6a7ea02a23bc119c4509e126664bb24b3645cf567fbab0d853eac334b2082736f8c7f18579fcd5fdb44cb608810f5c9772775ce8b6fc9b1cf24bb1db5d28d90745a23435a9578ff34e7d3764b242676442b678f5fe6626cad9bb58bc072e051afca7293be91fe28ebbe6fb19cd1bc699abeb18be58ed93f1d12c51ed126dd04d26fd7c3131b336fb4ef03862bf0e066127a0e1349672b59fc73a53f9649797f22d0b5c068840afa4d674ec43f917eca5f9e22cf21157783962f706ed30a6f33cfdf59fe1a47495cf642bff99d7cb6c095f12cf8d8fdc4d2fee77091a2aa5279c5c778da2b3436bb553e27ec6808113f0cba16e7eb60020d60e9ab84c7509fe25804abc4cbfb0f7faec7c841ec5fa57112913a0e5e92711ef3457c87dc92fd7bddadba2dbb1c7d4b9054fa44159e5737b22ba967deab673898f7b5db38a00505bdbdc720a3a0e74dbb1e2e525de1cf80f603e379301a94bbadb0f73bac3783b82460aec58a6c4fcee6bcbb9d052a57c91c62745f5a31ae405a462b5fa75691a8754dd89f23ca61d994654e5f9bcfee7ab00293f8c48d7f022c39e88c9d73dde8282d96da6e8c028757427d80722b46d00149900d0fa40a23e31e082b6790d1eefc816d358acf413577aa43668b09be27ceadc648ab461541a6b243d80461e7a7f9c388a2efdabf4eac2455b1496433433fabc317e9f173cb19206e689f2167a9f60e18a5230d8845b16d7f45b09185d0e85b5ff3d33cb4753ac780e8735b53927b889384191d27dc533b3c4c0d1def2fdd91df54c10a1fa35b3e3a66354dd0e2395ff3ae649cbdf0d2dbd9554c0eeea0298f9ad66ae5b9707ea98ffd2c08efc2984fc30e17be46642bebe82cf3a80c447186fccdeee2b50411886dd44a531c5d479fba7b64813ac96ba063e2578e3c5bfad0af7045f60bc5a28bc547e06d67aa49cb522cd5bcf2570216663580d4dccf619f8ecb85526cbf5751f05764bac9ddb24b7714ecae548741e0744dda54cafae5d0efa076ebe3aa89bd47c37625e75e23f8280d395e815515d6444a223fab93550575299884e95c6aa0678d6206ac1382ec384bce916fa0cb544e60fdf39c0f9763897dbe49f27814c7c13a7e6e8bd02b9cf6f856e3f76fab089866aa963628cc7df0b7ff82ce30e37ca8e2358032f949704dcfb86f876f9d86b68e115c972feee99dad4c424268fd4896277cd8e5160da585388d79d91c0f0a41765dc6196c1905e417b655d26110f52160736d9a69e43c2054ed3ce53ccb8831570bd30126c2cdbad09e20ad0ed5f323490f610dac3db83084a1f353bd99ce15575f1411475af4e18098577d67d898524bb6dcbd9f68f8954299bc748c22408473c7f3359d458c5b6f5463b449e2124fb21da0f5c6c6bc109e85335c79165beb18879b1dde343bf941e5c916f116336f2f57c9e4cb61e7d522409c1e21520e62370bdcccbce97f2441ce1369911a09bb1ac3edaed967bd20cc24f4da4a81c561fda276e74451bff1ed381aafda9b5092bdae49d38471e20fab37698ca713e3d583edf421cf5518fb19d37e5e2f11cacddd703ff8c31a421b33c6f1343374ab019ca58e88928cea33c8e7127f9c5c185dbcbbdc0ad4643f7d21ade96e245b74621f64b02918dd1829659c795c7de708caa9ce03c48f1c743daed77e6b18d6eaa86f5d1f3081ca0eeefad0641e9de084b594089f4e54aeed2df4a2b45d6de08d28ce8f78a2f2facf94aa3427b8dc68af4f76b18d24ebe8767ac58eaed4444cf19658a1be76a12e22080037c46ca19d482c96a275ce10e1f2c8cc4ae69d2fa29e7c38e0a45241634ec67aa9d1c812b37e75779525bc7ff16dd69ab0b086b62438c364d34abbb706aeb89f101144e2c3ea99ebe221ee7e11214eb428355774f3710bdb70b189c55317421348d72f64fe8a99b1fe022652bd05b93cc33061de523238d36b648a54e31a4f31ffaa1836de13bb1753c4c551f5edbdb4a047c41553a0625f6cdb3179776b7c4e0de6b4fc843335d7bfc81b2e859ee2599c8a3980aff5b30429beb8437f39644f5ed5004b7dab0d2eb1f742d6e8a075a2c80f70f24a46ba9f2d256939f1503e62cf7c4d0258635fcd18f1730b15c72b7c329a8a49ab26440a0a40538ad3a72410914d9bcf9cf23ac9e5e6ca51635daa627050e0db8177cdd0b7879bfdef64ebac7d6b970a06d9ef330fab9ce13f7ac486e71652134670952c7a516fedcad57324a95f147e96a66bf66d7bb9c4ca45c1674f1416ec830790cd8a59a4aa450743c48025c6d10b03f5f10f8ec047798f1c1ccbc7f91c9ceb316c8717e1c6dd1c25a4cb820e4ab35eb5f541d33995c12a10f07e25599684acadc37f5a34c7d78d1ca93e47e7f3daf8fd3f7bdfe310da7572b94df8b97d3a3a0c96af12dce238c598a5c18116f0d5e4401e219ac76200e2569e299727e458b20171b1cda5fa1a3cfaf6de752cac8ce40a87df5ba546ea0d6be66b03a0dc90c0071f8fe966374c35877294d19e9c9c16b8c819f83fefd9607ac4d8fda6e994ca8ab4ada7eb3495a69f5747a839b4008a21d01113b598b61b7307c18dc86a6ca3d39ea308164d58065a66fed8af41713b966ed2582dca1b81748489610812f98e93ca2c43bf22e9a6adf19d1dc02f7f9cddeb4e82f53edc8b81618e5892515ab6cd1ef1e45d0d5ba65ad7389bb61acc08a5e39547adc88f1b899ad46c0c3b7a4b42f590374ac7b5e2124f313c456f8465ac8d7df17cb62a21f0d68af2b4dd03fb2db8724f0daaaa92e997032b3765d226293d5a916b1e694d06c6561432549138dd44e1879e741c4f392d2cd674db0c6dbffd31c93a73d24049c399942a19c85590c8621981d08f614a1566a4cf5a261775bd53c22dbf4dc6e58382d2f2e99f9dd966819589e8188bd5e3335311f4abcc8d4c49248b922155f03163939d51561835608815a32e999b759b631a9e19b52548eb3427d122939f2729bb40aa48dae3d71662b888ef5aac6d402b1e37901658c7e2c26e319bcd73e3b822d6c95c0bc506f1199e30dd89572430af53bb7e92f57702fc58d87fbd678c870df7180bcd4558ef4b7de1954ca110fd68932b67d038092df89f74f313c4ee89992718073324d693d87f9ddbcfaff86a5cf9d2294df610de9ab2c0f0fa2809124ed4e2d636ad216f3e093e76cc43e806ee8c17668eec0bd1432ec75d3e4d1731385717ad5d775d0757e548be1c623a08327b66f9851538665288901394d6bd0b2fb2d46bddd96f7f108941709b5a0011dd88905d6ed65f357d23a5ccaea517c2083fd2fb609b18faa2f4fee6568effcb9029d8c879e28d18e0eaa62eaa7db27fb659963f25630a46f527533115088a10ae9a8b6010ad1a3e27f727b541508dfd0c9447298d3190862419205511611f6722c3cd07cb4cfd4faa50bda04a2a8864c18e1ba275bc14ba331900142693eea89592c01b2b6f79ab9bea35a78861a88ef8dfb7fc3c50c928bf9a06ae59f21169609819450d02b06de36676754decb3e8873acc8054325e0859363ad096efb5eff281949bc66a606403dfedc96c829a0d0d23d57745d5e5d5f75d429a0e32e16bb9db4bab9707648af6b517de3c2576203de5d0cc7e1d0533ef07e6cde02ae66e6de3f927b978f40192e0a4a9c72abbfacc5e79859ef89323c00a4b5bcf7abdb8d421ae86df365ccd76f1fcdff330fd598169ee7628da854a1d85d11f4ff85bf581fffbc3b3d4a9404848002bc460cbae05f4715b858fc900019e46037a4c3b0a4191e6fb53adc5558b90cf415ca63f69120311ebe44f76270790c13ac1d342eb892957e95433ecc1ce0c145460fd8c6f3aeb976b2e6396d5f624326967e972044129a37dfbbb1c3d0bd6dff43157a499542944b5615b9f8972956c3c344240214b2e03efac09bd34bed130064703dacc9efd283daabef594c183cb20443f3d7146f957fca2aa24efddab3f6e7e6d05131ac2cfd6e6d6a4aea816be71ea5a282bfd8e918d5e020bc8cfdbc45e3bfd3aea79ccf4ab4f656863da4313f5a50457a26140665c770bd6bba14f8fb9349372c88526e485b0ff15fb36786d4f6e356e44ba115b8e2affd7e9ee83ffb5387451ce7a5c4593dff52b7179cea89aa60bfe39ba1e8a23c1f0a940201a386752864d2568a06026ad8fcae14cb73066de5618b3f3b3b3cb16fc826899b1ab367ac68b9a52fa9819653fa9840df018f0e60f3f7230210bfd4cc1a0887a1d22888700595c6eb2253ec5df19eed99d4234b383b383619abb96e71021f1d63475fc998708ccb24635e047d2f3bb40073ea21abbff08d86f3aeda2316632fb8151e3aa1eaa0ed5eb9d9788ffbd9345abd64865f98799849d6a6ce4a6cd65f3e782ee14c0761f84f27e577cd0a57ef96c85acb41792f7f064b98cbda6c8aa38624e5a82fb53761b2e8d3b89686c6a306cf15308446eb862d9c5b2c2d0e31c7fb01908d223c0cdfca1207e74d14174d724820040601853f11dc78e0f0a2cf1d710d8c2feead952f64b23b56ea01c2033b43ef01ba803d7c229b1bfc2323077c4a9573a2fca493952da783b302b2a0b9ae5ed6360a1c5e31c8bc874c7e9827853b13933a91a88f010ccde675719d77d32b4fec90e99597c2536b9332b25a4251b70df779f5b04bc83e29b350477cca096c2893d14575d3d4054e5bfc692d90cd673cc16907aee6f40a0423ac00b58d2a334b4ddedfc7e4a80ac6ec80496a79858ee4048ee6d269b490c6956728a129484e6794d9dfa05ae5431cf7f3a615bde752e1f21973692249b8a5cc9e12fafd5702f6f3eb6f4f12cbf333e5befbb090ce99d984b59196a981a86ecd536feb7103a1e084794b12e73a4972d52438d75cc279918f395e780645ddd56829a55492e29bf6172320a338fe2117d99a0133ff9a9192d41836b8a4abd39ecb4594f1fb873dd377d8a83c1931b4eb43581240090ed012d512a0ef4b3b80955e6075869bd4c69dd7fd45761e84ecfa5ad241b555393cf0d09e7b5d1b8449efa84251d0b3983f50b143178684b698141b27d198cd129c686b7be97c181054d429175866d35841c554c1ec068a7f5d61bdc6bf615e932a65961b65086494c8396ee17372a04a058f3c39362e165579298e23caf5fb0517d25d446806af23834e9f48708387ebebe4fcffd2d1e5b8646dd01a745a7374b5418b5274e8b9a6de24b4b0489a4424b0b84b02c7cbba6d88410aa15bfffb30c805084d92c1dbf7a544f6ad9085d863f8f06b29fb356dbad11bed5fab503fea67e2ee9ab655d177666ab9dafe4006451c275d931a085449839e792131c43db06b9df433612825bb49818aaa7eada86f2dcd1b7f7ec065850120d2119b6b08c6054f4922ebc875e6c26114479e7448cdd9058f741d8086d17bb60c72733be31a06a0321dcecccc9b56bef777c8d6f8e0700262f278efa3d99ebb2510fe044854a03f03f1339712b526ec102cbd1b8830125cbbcf125974d1dedb5d6a5624183b8bdc66b65c07f10ad4d202f446460cb7d76855ec88ab0b95f8c6123b543dc12f9a23dca255a3b42212a884bc13976679c0f3640156ee3dcc8303f0babc08fb852778c12d9a2be2372c0852372f0c94d2023c6fa34cc34720ac5b5d14172c28cea5da14025ff52b39374742009c2a3885fd43d9551e9773a2ee4e8b544940ce8349dd7015785a896380885eec5603fdbddb16426e147c9ca45b5dc971f3e516b0b03173ba03852a4e18c6597294c467da6b0df61b2cec71a92827660afd0b2bd65d06515e305cd752e0db930ee56ee30a9c5e4470ae7e975f9fd183268371c53bdc91e6ba4700a0a635317ac01acb2eb38c924f292ae1196d0f42fa311b131df6b2aabb4ccd59d317623782e0f6e5d69ae50b9f13ff243de14b044a26afdb9f6b366bb8cf96799a47eddf8f6a2aa9f1d51b99ec9d3c6d45dd3352787415126747ed65b7fc920b2b66f8e8be81b41a8f8216596b950f232b41c5ad948fe0f3e2113583c752bd306dcaa39bd33a8b34ebb6c6ce151eb36ca09c840f908316755ede65ff4220b8eea1487881ea9a193594e7c753ed232eef90a92d6f9b27c77fc72fa5e29123ddb7575af013c17c694b86ef030ed0538a8242fee3b8d89d94b288305c4ed3b39f99f654959ad1f1988a9d04d65e4762227607e82f0885b43d1d0c228e7e8f591c69b3e7b83fe38ad9e61c568474b56c0f67fa3b26c6c13a5adcb730ad0946b48603d0561789c3a16739081f7d399d4461f6937a9ac2dbf87dc2c881ea6933681588d5d3440847a29fb98e0408c869831cbcdbabadb8395305c53e4a6de23d58d3c86be1ba175dea9dc4cfddca5312434877da9f78130f9359d80d578a6ed5f1862caf56aabd62635d76050b78dc16d85a881a8f87a77a0ebd9bff0492fefe7a57a5ac2435ac3fbb595828e89f37806b33c5c7439c2c624613bc00caa1193724c1a41a71eab0d93fc3bd21ed8dea61af352b83b4233ee244573150665646d1e142f4bf12250239fff40fc045172d7a4516969003faa7597b9176b953610ca10e28f4cbc8dcd566ad7d4cd52ee2cfd1a08974a489c352f157ab9e3e7407e96e6b5a00430404d056b6ba1d2135040f95014c9442d09bb1c3c12dc2ce3e03c797b12d17fe93ed6710160387f130bd965c8ec265f387dc5da5a8bb0a072d684faeafba217ae1dc04354f6b6430d33aba3af66f9070138f1c18b737df44d1db276cc756bacdeefa1ad2212c0e76cc5223e727a4ba1b678242d0a632d1f5290b658de5de7f53a81ee49542371645bc51d1321bcf2c0f9e150257b8a51662c4c3c8d5b38074e1241f936e97b1a61603a7a5acd529730d3a935d3751ef3fd5e88f63bcb8f1a3449c7fe2b2d4d30dc24fcff1b2ce82be1f40ef02a712c74a13b021bba36162cc717684ca0fe7b81b613990ae820cf0fad8d08b44236de9d5f32c6cf0ac8dba15a95b8ee34d1f545c730e30511d182a508b942c4b97429a58330e781acb59298c6f1dda963be8ef863f1587cb39c5bf683e33dcf223d83de93b25971f86dae4d200e0fa22c59a7f89616e534b91677dab4b97796693951fbb2a068c9f1178fe0c5d81e6eefea067826649d2329cfa07828062f2e0957acac23cb21e6011a126512757c6f532a1b96051f4bdeb622bcac59a55f7d77b779897b7660b74906757f6eb74426079ad627401fba1557bf02795ade9bc222cccc624faeb854e12c757a02d8e7bc0b045b91b5d4e68a168357c67da8f664c8a8c6ab738e110287e44628e903f4b5a8c842a5733688b937d8aaafaaf9dc8367fd4778061b4d661c0681d0cb13f4b048cdeb3fd5aa2f395674018b91216b9b68815f7374300df371668577a338ec13d9843db8a06999fbf319384d267d5629e993fe9e78ef7cd58d2530af3f1b762855286f259a1ce2ae4fe06ea833e13d5e1620ffe0bddb995e8785f3b4d976e36bab8a081c9106415534df347ffb57fe7dc16f52881f8ad97caf973dcfcaae074d9c2811bfe903f840a938e0f878d5673c0b2281e97037718ebf2420a5257cb956a603f8df7c3825837643035cfb2f598f2a40216e4161f323c6151417137c6017c51df3e6e899bdeb46cd49f8fc52f22b143aa8a76234885a2b1da376b0b7c2178d8c326a2bd021bb6d5af72820063c10ddc3408442dc43e641882d3595614925d1bd3096e1b3c0a15843dd9c1e8816436bc43f8406ccb3d1f4a86fe139df034da197043ede1461fafd0b454147d866d3c5ade61205317f45483c1f42492f574fbe5c93d0f3f3d6a3df4361f63f566e036e47cbb3e1e1d6a14832e96e80678acb3970e214ab8683119dbfe5f395e2488132ca8b040598f290dd028adf356c353bb1c629797a8b05ab32ee5820398fb32d83811d9c161a2b4b7ca637365d0926cfcff6e9a32dc99fe7cf3151dd2468ef9e19ff1fdae09b7287885792c068f17503d3fbc93804e36c37c124565ac90372a21c9c68ca11d80c565775ef8859a171845456e55bb919c6e05d6487ee117d95e9ac5a2111c6e21dd3cbf64c3b290c3994b825fcce3899f7341a819076e4e8055c6ff50fba028a491b447db890bc3a66ff7663524d2f4b733759b559e070c8344a39263e7ade65b626d99a6b3a9d57b61a699f51437aede92002a361c0a0ad772a0120268a05c5f99130326a2265050f690a1d9430016610628cf72e59125eca71e624220bc966bc1c5d3ba55c24a688bb15f6f8b62b93ceded38d1f0c4362a30933b0dbb08fe7eba7aaeb945c93fd49000de3c27630b89ddfe63e4b519d9d323ded3b0a81babd47d1fa1cdb3cbaeabdd31a853f1d5dbc0b5a56ee50e52ce418fbde0b2f9324f13f90afd21744c20862a1f84a1c03cbf3749405559087ede6f02ea1be6985cc24c3ee450aaceac94e1ae792d28f3b3a79bf7026d2dea7999e4f016ef486d3efa04e47eb6da36651be50f4d8f5f96b29ee0b1472777ab64ea6da3ea3f4b4de1719322ed74dac40869f7916740c1aa880cc4e347565b2647999a87994797796b83de7b20da41288e3c8e42ab571c9cf7bae8a8787d008b05f36940c5d0ce2c9ed6815c189047d0c7021c25fd57559c9d3c1da52ba29239cbde2b270c7a93a01be44f5e9f978530d64dc86f103a23e20ba1e037f68bbfd34981dbe0b8870547438ec9a0bdb4bb668d7d59c6f12aaf8c737e5ce00e533fc6208e07b6e485dbe62c1a15f0cb5d5d48cce320371a0b770d44ce9841f962da4ef1adad7df10da12b3f7d3011425d7d7f2dd67585bfd4cf6627b985f55b92ad69f64b5759fd9995d1c3981a3b8c4e34fecbe9ffed45207c44eb0a380277182ae92b869bb643110fc9b95ce549f28919f427376a5c69316360f91b66f371897470192bad5b2cfe1dd45c549dea0cca6a3cc6d2dbac472bf88403537a9aa92647e772c725fdb7848102981cda85c0a07a63d27876f642db6d7ae7d44c47b6c79d111985ae49d66d2974aa4e097d593a396fecaae7f55a56cbce4877d6f1d6737794dbc7eff590c24c4616b245c02795dd07ce36f0221be2ec8c046c76cbebf1b365c779236355292fb024a0e1de19ca998cbe41c05354960bf0a81411c0e4632e01603239ee82bceb41f5153df95b6b3e34639762fe294bc0a230847c1376db68bd53cee6409b94421729efc5c128604defc104f5a9eb5371ac1b10c292037441e5d9469cd9bcb96ca06f5ef8efafcdcf5798e55092ddd41fc3ee12e0fb7825912b8f77bd01b686cee278298a41c549039dcc15409cfd258950cbbfad2c78a5032703ad59b0b58ecfa8f595949eaa50904994502cf5c5a03754e9fa5ec696929407ac4152f305e4be43ce744ce6592f7b66ca05cb29621aecb3b8bca48c996e7a08b4a21115679406ecf3760c5f84de4732e10d3997f367f85807ca2f98aaf1f6426dea20c011283cab5b84b55b998414f2eb919c3069a5e6a5e1b9c6ceb7ec0f9944cb61d482d77134535c811e982b5c5ee7f6c7e0ca73797b58a6fcd5794dddc1a62500535b3531f8f5990d5e93b5aaa8bd20bfdf676afa5b8808b0d0d964a4a768908616e8fe9a9662cccd737e6e3ea123e \ No newline at end of file diff --git a/src/13/input.test.ts b/src/13/input.test.ts new file mode 100644 index 0000000..1441fef --- /dev/null +++ b/src/13/input.test.ts @@ -0,0 +1,14 @@ +import { assertEquals } from "@std/assert"; +import { main } from "./main.ts"; + +const target = "input"; + +Deno.test(`correct minimum tokens for ${target}`, async () => { + const result = await main(target); + assertEquals(result.minimumTokens, 36838); +}); + +Deno.test(`correct minimum big tokens for ${target}`, async () => { + const result = await main(target); + assertEquals(result.minimumBigTokens, 83029436920891); +}); diff --git a/src/13/main.ts b/src/13/main.ts new file mode 100644 index 0000000..b9397e5 --- /dev/null +++ b/src/13/main.ts @@ -0,0 +1,96 @@ +// { minimumTokens: 36838, minimumBigTokens: 83029436920891 } +// Elapsed: 2ms + +// Solving the system of equations: +// a * aX + b * bX = pX +// a * aY + b * bY = pY +// +// a = (pX - b * bX) / aX +// +// (pX - b * bX) / aX * aY + b * bY = pY +// pX * aY - b * bX * aY + b * bY * aX = pY * aX +// - b * bX * aY + b * bY * aX = pY * aX - pX * aY +// b * (bY * aX - bX * aY) = pY * aX - pX * aY +// b = (pY * aX - pX * aY) / (bY * aX - bX * aY) + +type ButtonType = "A" | "B"; + +interface Button { + type: Type; + x: number; + y: number; +} + +interface ClawMachine { + A: Button<"A">; + B: Button<"B">; + prize: { x: number; y: number }; +} + +const big = 10000000000000; + +export async function main(target = "input") { + const dirpath = new URL(".", import.meta.url).pathname; + const text = await Deno.readTextFile(`${dirpath}${target}.txt`); + + const { machines } = text.split("\n").reduce((agg, line) => { + const matchButton = line.match(/^Button ([AB]): X\+(\d+), Y\+(\d+)$/); + if (matchButton) { + const type = matchButton[1] as ButtonType; + agg.pending[type] = { + type, + x: Number(matchButton[2]), + y: Number(matchButton[3]), + } as any; + return agg; + } + + const matchPrize = line.match(/^Prize: X=(\d+), Y=(\d+)$/); + if (matchPrize) { + agg.machines.push({ + ...agg.pending as Pick, + prize: { + x: Number(matchPrize[1]), + y: Number(matchPrize[2]), + }, + }); + agg.pending = {}; + return agg; + } + + return agg; + }, { + pending: {} as Partial>, + machines: [] as ClawMachine[], + }); + + return machines.reduce( + (agg, { A, B, prize }) => { + const b = (prize.y * A.x - prize.x * A.y) / (B.y * A.x - B.x * A.y); + if (Math.floor(b) === b) { + const a = (prize.x - b * B.x) / A.x; + if (Math.floor(a) === a) { + agg.minimumTokens += a * 3 + b; + } + } + + const bigB = ((big + prize.y) * A.x - (big + prize.x) * A.y) / + (B.y * A.x - B.x * A.y); + if (Math.floor(bigB) === bigB) { + const bigA = ((big + prize.x) - bigB * B.x) / A.x; + if (Math.floor(bigA) === bigA) { + agg.minimumBigTokens += bigA * 3 + bigB; + } + } + + return agg; + }, + { minimumTokens: 0, minimumBigTokens: 0 }, + ); +} + +if (import.meta.main) { + const startTime = performance.now(); + console.log(await main()); + console.log(`Elapsed: ${Math.round(performance.now() - startTime)}ms`); +} diff --git a/src/13/sample.txt b/src/13/sample.txt new file mode 100644 index 0000000..912f482 --- /dev/null +++ b/src/13/sample.txt @@ -0,0 +1,15 @@ +Button A: X+94, Y+34 +Button B: X+22, Y+67 +Prize: X=8400, Y=5400 + +Button A: X+26, Y+66 +Button B: X+67, Y+21 +Prize: X=12748, Y=12176 + +Button A: X+17, Y+86 +Button B: X+84, Y+37 +Prize: X=7870, Y=6450 + +Button A: X+69, Y+23 +Button B: X+27, Y+71 +Prize: X=18641, Y=10279 diff --git a/src/13/test.ts b/src/13/test.ts new file mode 100644 index 0000000..b04edd4 --- /dev/null +++ b/src/13/test.ts @@ -0,0 +1,14 @@ +import { assertEquals } from "@std/assert"; +import { main } from "./main.ts"; + +const target = "sample"; + +Deno.test(`correct minimum tokens for ${target}`, async () => { + const result = await main(target); + assertEquals(result.minimumTokens, 480); +}); + +Deno.test(`correct minimum big tokens for ${target}`, async () => { + const result = await main(target); + assertEquals(result.minimumBigTokens, 875318608908); +});