安全研究
CVE-2023-7028 GitLab 账户接管:密码重置邮件双收漏洞剖析
Thinking
2024-03-14
3 分钟阅读
研究档案
#漏洞分析#代码审计#Web安全
GitLab 密码重置流程允许一次请求发送邮件到多个邮箱,攻击者把目标账户的重置链接发到自己的邮箱,从而接管任意账户。
Unlock to view this content.
ad8d9422966c73fee42096dad808c6448a272095349f41facc28f3d18d1ee66a0726fb5aaffd9271b6702e0ae53f6961031443030e63d37842b7356b4a67d1f44b648f709f84d99b1640e6f7a87a3d44129b61502fc0c5c728a88c67798e6cfb7bcb30fe880464fad1a2cf9635735fbd6e964b402ea4ed27e494f7c87c72f1c586b333a47062292625ea7240d146fb061f3975a6253d117e97272d7df5aa897fb9fe2c09034f658aae2645a68076992d7d9de07ae63e2fac88f85e475412988dfbc9247682cf882278cabe69247dd5bc261f71950024d3a51510c0b4f52ca583f8861d2322c5b5196f01865790f0b5db59875dca8b59ba239ea83b4c9609044847db28f4c8aa5be4891259452635987f509da38887134932fd48b84270ff0998e5fb9e34cb5ab066f420b297b2bdf6f38f4b9f9cd15e89b48e9c6cb386286730eb7afca2e3193b992489abce4fc155ca53383c69bb5a41203adeb903318541c5baed15d4f4b6bccc2f9d8f3d8a8a989ed6bed071f4373d11798121106cfdae7c483bddfd75dcda794afd2d8c1bb7d64688aea24024a231e086801a179316eb9d6c4d45a1fa7a4bcc1415976be705fa47b92a63aafa5cab63ac3a7d2735267c010317287561b294ddb40d4516e7ce443044ec19a4366e2db5da6b7d87144a0384d3a4b47223d99e0d345cb608a3c36e6342c9c7a9a64278c99cfbeb3a71e19f0995670a19ec849c3b5717b3aebb9b644b693f603fcfd0e4101be97ddbbdfc54385c782934f3cff9ed549e2ab5763a8b9c1806c46526894d2f64d1b7474dee94bf34571748e799c5d0e396aa198a7f974b265cd152bb24f0c1b25002037a554d91ba258d6f45cae6fe67955f8ae65aca509cb1c0109a811774645d8687fdcc9c444a698f12f43bd0b60bdc93198c58a6188985df4c92162573e9d687a11d88fab963532aa1281eca08476c76d8e298af5e1c845b2c3d2b630915636e3a4bed87d7269dac176cfee8e004f86c1d384ee91976ba0be71d906920e7ef5baacdb6965ceea04f2d15518932feccd4449bee8444494b8ad13cd22518b275e8d0c0f2b0eec9eb6be8d5e49fc0301d6650686bb9ef80a7792638395b90b4761917fb42350d05916709f624eaa2f59b14d57384e5eaa5b749a674926e01c97ec71c8501fe0c4739314f4d7d137afa24f7de8722c4cdc74aec981f27407ad14701223bea97c5110b645b1c8c101b2c5a54291efd95bb9e447a01129c3a50d092d61586d43135d8d3ca40ceb7ed7c5db2414fa4756973ed37188278a0d1b6aab0e15102d0b18bfcca2f71a3b88db8a439746bc8004304dcb0e7b7293b70a630c16fc7f1e4b862d4be6b294b8539000dcffe5242f391ce5a253fa79e33343760e5bb25eaf555f1144d6c2210c510ddf55152c4e9d28d418f23308af8ec7943b1898b5a32d7e5990f087172e75690b6bf94f1b2cbac81d2a2bef1fa02e370de652490bb8b4c61a3249da017d5f87dc536380a3139838abe42176c806950f48ee41bdcd8e51d8e02d9f6b199b4a8ed3773ea9946942e25342d0a069bf2ae96a5fd90578f4703d56cef768ece9bdbe56625dd6bf35c7e47f4f5a15ffbeef51c7d507fcad720f81ec64acfc578eb6e5472fbd416777678c2b8cec5be98aebb09e52d51bb5dc6c4e92649b4e7112c5f7e732b9fda893833971302faa37948adb1e11dbc79b22f23e9f60267cb4c797cc066597ff5046195c56b7f91226a1a2a5af694620bd33ed94564f78f6917b3b018e825ead2e92ae702535fd49df5f16788d528eddc823206283445069d0c89875334d7616645b0ebec2fc88eaa2c8dba3beaf148ac7da3e64c8e4c844c3e859533b03a2358b45cfec66099f7abf0c14dac0530cdbd70f162a79b5b56ebca74e2d37053f8cd0d9146d712199236b5609a58a398cc48048e92d483e7a0906f652caa08ed6e48aa206bec80b30a414c1c8ce1dac3b070b7c48142e8569590710c6e1c082c5513117c20f021ed9774c7d66737ca1632d998c724ba652792f33d9d648ef526f37e73945efde2dab909722889248182dfcdbcd09d1d22e3c437f14b2c0e260bbbbae704602c7866d0578f2f5db017a7ff061d4500fe3cc0cecc4089872766c7d8da98351ce26f949cd997a4e3244c946ddf852101ecd19b3ff51e1b75f6012109cd46f83b9e12706e937e29b6889ee250d4c4095245722f3627715af34bee13ef9ad1d1032997653aea20c1a3d13f33106fe34f6e4f403a21d5a99b6d47557943334a64c1d5135673549f8dd23d9d326007690fe2943a1598ac45fd27040c8c7b4f4717c3b4b9b02a4e1b59cde71756d3b7d0a7c8ed36f1cf954cdb319f6b4acc4eff1712808e485ef7d9241054535791aaa380e206c3196eef0f2017cd9191fa3091bf441e274bc4ad5445766313570ff378fd5d3203673be504cd6c0c52fa26a33c7e7dd074a65a69c78699f7a2658443e25bb3e1366ff1848baa4f57a29369c4753bea96b3add7b200718f6ca5a0b9191ab07b94aba798d96bbefbe42020d351b407586cb32ebf4923e58990e2df2a1ab1d3fcb7f279c590e794ba5c361109acf7f022a6334963149d1f5b37fb7cf01429e4951848b1754589dda1aff75f68283805997e02ae3db850694da339b679bc88d24cf43d7bf1d1a0cf89c77def0d3e2a7935d831f26821008335005c0aff4dc5606d07e8d0ad40ef0b1d36ee51340577ebb90a6ad72e32946112279ec882e4947c04d24b8253fe34c8948e14ae4a86630f6d0eb640a18ce62998f6197788d0a8691ffda36f4e0a3f4eab924faf1ece041e90330e43666627ac8de2df6ea7bb637ec2fa7fd5995148f48871814511aeb9af550989d492f4f9ec00d67d1e32404829af8f72b656d639ea00c74dd24162ff0a2c00481cca6094cf126c95bec9b380a56eb6b6c280e1e3133726e8afd6a3d63605ca00888011e215be5a76bf85b7c0f32c8efd2541a6072dfed6117c02bd032f36ab7b3af38c908f3ba4a761af2986573b5b7a1ddca0bdeba19a0206a270665f8f2c1cb550765432a4be26f5ed5d95ae00ec6b48802aa65fe3519b0c4d9c178ebb019f0a5dab18bdf4a2d83f0d9ae543a7a90b8dbd63c753c74bd768a2444fdf4c48dcfa6a98c4bb166e75813f24966017d4c13694ba5693ad742239b694f1277841a20ffbb627009251c8dcb7fba69b435f0848c0d6c3a741919f2ce870da48a4ed77376478d4f10348e105e0a9a090f8989ec7f1c76c1064c062389d0c4be66bdf7aac51896e2cfb15741835b9eaeaedd805aaedc3192b1efabc345aa814a40f2e4145a921cf6557d49475038fde833962940cd02c2147c72e0c3ef1fa0d5c27d7a87e006adaa805cb7299a1caba3f10b450e128700b50aedad8950c67786e4c9fbec019790353c2c42393a1d8e0d29dc8b111296e0fbe4f6f29dc1f7a88b3f10a48c6f057ee05ea32093b14fb7f289fa47e0683be347cfd6b232661d607099fc28b1ed962b575aaf5ee44518a4f56962c2f949a05476e6bb5d1ce7fa93ce2ac0637dac6a123f2a49c0f96f9c8cbb79f8ae3e08335b09c565a80e6432d3412292f603ccaeef3bda9e8730881342200bd7cfde9a4575a9ba6fc22bec2ece1e31f0d3a6227dc55e1626c39cc21205bb226ffe2020eb3fb84fce24c45bd4fb3d3e9d37ebb0358e640d164e372ef3b66c52276d183b0e8696429c73bcc94914993148f978d6d1e5a66b35440f657f3447794c073973b754ce75a1c41590dd4e7b3894fe6aba6373a3443fdf983ebbfcba104abff443788a778f83b63ba694e4c470588352ac64d4df81ac1a5d6fe8c9abf2b42823c71b06dfbf1e314488317506bc706715e77b0f3c24656296daca8f3f32c98c5d8bcf4018d1ad70c4c340849ef8082a56389e0bdea4c484a6f3f5dab7e6211458b317a1ca95c8b777a719bf6fff0a1849fbd0bce9793f4b1388c6490a3dd77cebdfbe20fa829b8ce1b3bbe329a15f7abaa9e885ef02c6e80aa69f96c255fc5d3025ea7c73865a78d0c8374a77209612fc010bb2f37dab16a8bcb3bd1ddc6f295fc6ef23d94748e99de14a938431d5440228b9f14fa31b0dc7a783abe77a4df332c4f6f2e5409f70e2b89143333e8324210c1b54ef9110f54cc75ce9b52c175c8a3264eae4da04edce9b547f6442e731ed4d9182d268c8af3620e0222265f5534c5be44b2f4b82ac4429ebbddfc25c55309559a95019d807dd7d2e4757885e3dbc55bb1f9d6edddb6469183dd560df73bf2a400c6a5348c1e8e2ba6e32d5e523e80ade4b41b4a4d9caad2e19e292440ab153a0ea81103797117cdfec2e6cec05f03df26cc9ef154960de4b3eb68dffab05deb3068f7a5cdf79bda83f5f933f0210f75944da1560b589985a136770f9ca0303d3549af285ec352fb5dc641f6250e125a9f80f1f142eaaadb1fdf7e1ade0c1772946627225765575a1d6b6be98bb29a17217807256baf2e015c83415b66dbc5d4f0c3f27550c98f62f678a62091844606984e89bc7de894908098adfa5eca5911f5b41f8f983633575cfd29c9ea301e119d78a05f509a2ef47cfacbbb6ab073db17497a5f114fb6c0c04964c9abafa06b29f8e3a811c6eafcd0dc35caa1651ac8591d898a8188905fa0b1a0788c536c483a4c4a70c7aae32950fc55a1d1c480384c6753c7d86eb7c739608916579c368358c2e2b7ac99ea57ee9cc991a6b9dbdf11f78df58f9d7e873b2d8eb9e9aeaac5c660e402ce8046a29a746b242be8dfc87d42c02e7ea9ddcae6cc20f74ff5e48c4992503d5aef6773cf8bedcbdbf5eb59bb7048a17789ff8e7b758f96456cf23e4353db8934e0721acb39428105fdee23c28fb17de9d652353d33de02336d5cb282cf448bbf0fe7f1d0526db7cd576cfe12e2e1a94bf6a523e3d160fea7ca3697c39d9c2e148866c6d0e1d19f024b12f1722b420163784f7fc924f7c311a05723db0241821f32a818609d7bd4c40fa8f4e1effdd4d8edadc29ea2db6344ee2338d21a112e08139cf2cc7f8be949ba190ef65e09904b4c058a25d85d1c2e4cbf80898eb95048eb6dc7a25fab586d8b94ecd93e48b1898f3493ca40365d1c1603b886a3860e38531224b8d929c0920f73066c758c28bfe92de0da5e57177665643df6149edfdd9a7cbe5ad58b6080109737cab40cae32642b3920e3f35243e50e91e3339b7aa6154a9d59759532d8ce8a26d043563e069fc33503d4ae62f5028e0fe7b8601a1a3c41635bef0cfca9ccac5363a3d16d2f1f4ed9e9439c5f719f4edc646be13ab104569bfc8ee4b361d9e7403ba44af828520d0d5a9c845a2cdd5266e28f50f0477d20f39c654d2e7a3ed8da0cc88a7a05213d207de4c3a5fbe6715a447275e811c14b5af209567375cad8c350dcf065ae8b6f6fe2f05dc689fa0bda3803ceb1a830695adb983f697c9341045ef3fe9078ae7a0770ac3461917e879539c1055cd74ebc70bf076965ca6eb83be5d1a9ccaf68dfd1a4cbb46058a5a467d3fddfeaa6bf85a5c2d7ed569ff3589b09729df91f097d1d44d469a9815f99675d7d41336e214e867433eef8621f19192797938151e74eedcb827942e5cc299d454f40fb06a59fda392bb5eba2dcff7a665090a07148a7cf4d251fe0f14a234eee9ec576217e59591f5a51750af0ba9db3932066cb17443cdc49acb48cedb9245e0a32e8dcf7a8643b23398b2ad6d72ad0cc6d299db4d5bb296abd1cb2dcfdb4c3d0dd12f8202ef5746faa6cd692aa26f9f70188422ee259d9fea5d9ee7c1e69a2d4f0950b5a79ea831b279725625612f1f06f83b79b3bca3e87c80ac99c50a18f9e96994e7ceb29df81f7f389a19a1f8c0c1fcbc4d296407e5ebfc17db18e56cc7018481d90b3187ff489de5e39eee2aa616b6c4be2df2c8c2eca1cf41fb077dab41c41746706034b4a8e379454dfb0017284d9b096c37ac109a53f35615d2d88b60ef979e22708d54c31516e1208f45ef0dce499e1e0fde66cf6fc6a5c6dd70549e949187a48b864f9ddc694c15e723b4a9c96026b22956837377efe69fe11c5884cff44dfb2218b16d618239f2527345f6a0baa0beac348f1dae7b7cac560214aa52c3eb553bf33b82f8ec2c55c9d4d5c42ad90f4c85b069b292ae5cdd91f7105d08861b58f7e8eafcc911dcba25a8411629aa87e5aaef18b9b05ba522a378ab39762a001b84b59c7bbfecb7e00b19b9fdb4935230500e08228a08afc6f4fe2609b89d65fbe1ba497f5806e97410b70366b89f01f881c5bf97bdfaf2ed7fe3b9ec1adea81bd93fa6ead0accf0eba18105c3434c4456690424c0d1d69153d53486e0477d06b5eaf560696dabcf53a80feafacee28cfc40c3ca10d1381aeda55c7f69560a9726de8b0ff25ae2527f58d8a6454022cca68c28cd88c9da4fe56e4ea0f6411a9bef7d958552684107998a6dfbcd8642e8d30a1f39a7c4e9e7cd4b231cc1200c0934dd14321e0fe629bdc781f14f083cc6dfa5c4bd68905f8d8b471dc0ce53b9fbe8d814a15b29e95d60958e7e8fe27f0f1381a4677808ebca3b3e0d10d702e164299964875142fa67153ef804d16da01224baac72ea12dd448c153f401018fefaa6c07c757a2d938aaa0ad76dffd1b30078424bd961b22b8c8934ddb6b6c724c7841c871da126f1d4dcf12a859ddf0ccb9a581d9193249cff3228c0bcadba84eb14fc891d5ed5753a540687ebe7e4896dd984125f33a00302ced5fb5e83831287642e80fdce93c9a67f4b37c789a58823597abfe2bcb2f1f7b4602b74b9189de6e69021e466166f2f824f7cfddc3b55def07ef82c946cab8d925a3037031df13400e6237a2525a3bb408a934553d612a685cd62cfc95c4c44bf3b3609299ec3d9d52a369da36ce2175d37da1b534c10d34c1ed09cbc0fe322e1ec09f2ae071aba35852d25dbae4e240cdfb462c3d8074e16731d49b1a670d648520c827f27ca6209c70e39f730b0debd11c29ec66c98ffb06cd4c53961e9fb8afe79f51597a04ced174b08df3832eda24ecae53584a79b56266ef0bb8fe66cc172d883241eb55fb461d8893a7359ce05ea2dd563713655d5ea3262452e44f9ae84a8946c4d58012cdb6908f2052497a2894e090730883afb21507bcff3d209e3c59b3815c97641c144b8790e5bd0ec0ce2bfcfaf8569264c34e0f1f7273f74ac63b57b950136449f5a3a050a3653dfa8cebff8fa5640e03a57b935ad6fc5b3c485326e63e75d7eaf86c066483233782878206b28737803c3c077dc6ca4dc05f1db1a507394227642515c3627dbf6c669aa9a276f784116fe7fdd655349d706b46b5087e35987bb79c06b59d6917bde468d161908de871b18ee3e150932ba537d8204992ca11da7f5ae0719285c4c83cbd8a483ff8513cd8c98c48fd662c16a2bc900d4216303a82deac35ac9359ee9c049ff64f63850d44ec6bafc5ea7e444105f8003e9633c759164efa174d0df276646eccbcd37e14d83cde7d21b63d643e43dced643fc02c34c0d9e6ca09217026372f5c0d0e45c8f681efc0c932511d3cc7181629c82f74c15eae9938ea0cc6a1f1da28eed46746bf89d0d74e904c5de3994cc7cb5d9308676e3bff3845f5e81144695869dbd6bfc824b0d8c83cb69895d8ec1b8a4da243139ea2503dfc2767c5cf1b699d8dff855b13bba540a6732e0a799d22b6825cef276208d901c9c6e79cd642dd33a3b059902c04220af16f8907a8233b57d455b239f103b13e7873c846ca98c83e856695aa1d2e76220f7d23eb0e9e19b6d9d3b0f31a89ea80a52580e538074040cd0a29914968bec44bcca67cf6469e17eb8d999e0f0fed60300be0c43526fb7175d9afb7d2acf95394a77690cdfaa164bdb5eb43fb2bcdc79d9c20fd496762e4a6c2f63a3cf731293a5a98143ddd54c7d64346cf8d87aabf66aa47bcc45b5f937b9a8e98c930f6736ee5f14dd709cd7fae64e12e2753153d55839f2fc2ae3a0ef5beeb76967eb6d69222f39f6a6fc5471543b7c68691247e2741fa2a74792e78d38947e0c901dcbc0c6a2fa0eb03c7655dac085dff1d724a873b0afa0a24d6a007a29a687c633d2d3b408bbcc27d3e1debf01124ad55d60271ceee2abccede06e6badf70269af3bbc17bebac9356912f57b6dbf10bf738261db7932c3e3e112835c0140179109c1e932307c85889947fbe232843819be16f23a9e8b403c7471ad11e3739d04a671b2d0c281bcd383237468d9aea278a0c1b9b66b4a0c38b5b2ad3da25e8aea289d92c697a288fcc8e921f409756aadc7caed17662854d93eb4a4b3ea9b9b25f04b642ae01d429309fd8f7830fd116e92bf8146e57dd9f0c8ca19cc0a472d0b3cf549e28711da382ea5a0e213ca0bb9e76cfb76bbef08c1a1f0c8d8a883b4350b4c908ee2ffe515d03a378a641789f882bdd27deb64bd1cf6a290f556f922dbf2d4cf74eff6c537fcec05b58e6742581540803004d7ac9366a8b84616f9c37fab07f30c25f066e94c666dbfd9a520cd5944063e16e163e2f54e45b14beed8bcb66fca83b0cde8e552c85d079062d341369419f352cc917971f0d9e71b87514aee18054dd9b06916d08aebd02eb2323a29bfdd466ba3e26cff1ee8fda5b8bd07b5cf48b5098f3d92f900cb23545a1fbe1136ea0d23a3ce6e9f9bb804f3bd2193dcda992402bfa6b8e284278b5f8553e0e6f610374ab55d0c658b106fec6d34df6107f3430de773f9b4ee18a9e3f5de6e59cbe419c7407d8f5d679e62913e1e32080d81949769e7100e006f5e2210e0ffbfece87d5495a4722107fba0092a972be9785d0c92cf926aff27a30732ead6af43d775fa270cf6c3c4fb012f50a7aafe7c4be3def1b44972537d08f50370d55331137885e04c28432fe7fefe33be19554d1213a3b4c8427371f36f669e27bc53ba7035b8c891d4fa67f50e351bbf893f9c27203848f5a408bec5af0b10b3a293bbe56e642b4148caeccd2c337d96b1e584f4ef7bc057ba99a6b3a9f669b90beb113f472ae8bbd89047b952b5ffc2c63c9414381aebe9282623d83be3920969b7edcc8a15d2e59bb1f99a0da4ff2551238d22d6f23e057e6f7a39c8f00105c6fc02e64b9cdd2e3c582a4cac82fbf541f33659ff2e981aa998d1b73ba73d3504c0048d6c8442f4a2c26a9c4143cc5d5a1d8244026cd8defebc809b2efcf3a767b828e0ebe84cb6bac6d093f6a7760985e0fad2b491f16324afbdc96c3333073356e6f45d1a8ec091cb532f727e2b4c05dec7d196cb158fbd3aadf3580dac47999f4f0c19275a5c60ae973d0d20c97fc9f714506d7d22faf8830ab5a45fe655e248b8e8377da3854fb2347f065e078d07010b02949d007e5d35ef1cffe0ee47564472c85a6bad8e6f930c09a3827c2fdd2fb7f766c9ba3d10a72251c70b7a6f3d55c516f8e0ffffd514dd6c829798fe2bd1b375196bc3e838995b319ea14a28a00eebd688603ec402e739dc9bf55b0a668668a563b1e4a5f0ad3972ec7fcce40f2ad13811a13038d861c2950fdd8037fc7089598b521f1310213726d5c0e7c91f4adbb01329f86a3192c1d308814d218f4be23f4abf98ac4127a1cf408b5de08931721b5e3005983580ebbc4abcd1093af81b419e959d75ba2ef780e275585bfa44b25b95322f0a59cccdf02f16bd131740acd642d7609aaee7691c546e617a627c2984db3a3935e19f895a0b718b7222f36c4ad9c9fb20f3a0923e16c3520fd6757c5a51fd8cec617c92976685db28a1d9a7b0b40978dde397394edc1605ed02d6e230ed2d5f49025fbe9e9612f429ab682a17a8bfd7918cbeb20cd44f60b4fe8a971aca6d30d8b52c819ecaa5aa4e1a203696252116d3b9712b6cc14bae5fdedf7c1135de7c63dba18b2c5ac896e8f0c673c6ebe3a35511002678cd6348477cff5eb71dca8cd1a06a4eb768c6b66f77634ef531e295a7dc1b31cc3eaffb5ca7bfe2436a3296d645c2b1c2068df5f4230edf8fde583030f0442be9164bfdab9950a3a8377be25d093232dab52ea155eb70732664b57d2e6532c36050360a0dfb9fd31500881d830a57cecb59105a3c2265853aad940e18b67da8af256dbe5240b1b4906cedfbf90a59771253695df28f6785c863622fa8e08ecface7a9f512b72f15b9a051545aa92aa3a15729fce7b393d68ff119a2379d4f602db232ebcd3e6d28de661fd0204f22772743748ac20a523f45fa84d1399f8757fbcb50fddb04dc19722166ae1d78d2b43e19cc0f1c7e499c007b1f12819ae6828c50cb4fabe0fb5d9403e63625ce53518379004aa20b0a60b3459d99634a736f1cb7977c3cd30ef79369115eb676fc80c90291cf108ce7cf5903576839aeca5092f42eb1fb55e2a943bf9f77dae9428efc40d1283d097a08cf63e8b7daaa680d863c02d64ae05b9fa5bc06c34e705559f8e45e98affc5b0ee28bb840548d31bcb654d27b625b38f47d1bdf296ed1970f1ace85caa5f846e7ba0a02de186662ae504e1e3dc4619ae6ee41852f0aae1f649e79afa209cb9ef8a8fe9e3e47507e9b46a9bd670a5466c466526fe47f9bfdd7bc18d047c0d177925d962962db7d5c80da6ddf84878ab1cd7979a07b86b088d69cad7c5acf285f233fa61f3920cd0affc14f87669bc47810bb878151bcfda7313844abfc43772f0398a844bc3e4873e662e4ef319a070fc765a4bd47273e1cb488b7d3380ef06614105c22b253095ebf933e60012bca58d5237c25aea60a30045650f838e5171b246e00a9be0be5effe870339efd78e1ed6be5a652d3f07bafe26efb2bd924c88fb4fa351d11fcef24e905a905ec97a87c4eee3f56348ff220424aa55607304c0c0ef2d50d479ca9568302d24978fab7d5d16c2f9900fd2691da348c7f11953139b0b1392d909be02d465002e4beb8a696106371f12d9959122ae39e06891d4839a6d84028552f12a64d2f45818676eb149f5eb121d030335d2d73363fbd9233be2820216bf7ea04fab0a39b88cbf135fd4973009e8c33e1d4906946762b9390b6b6803255612683339b54348286a2af88813a2a1727d069c5a40beed6e0b3462c07277ed48a0fe9744b5775acb1437f8b5b802b5d54fd70c23d31aff1e7cd98e3be511845edb1e2228a8230e28d0eb3211c9a2ee4e110bc06fbb880ec6d5233c6fc3f8ede1a054423317b14d4748f79ef80b95afe57ab95c31a0e956d0f9b2d786dfccbe6954383dffcc4f8af36ba82e2759ff4d6821ae8d1f7a2a25df50bfb0b8094ae090b4c3540b10a0791406b592713f08cb555d6e30bb97cad4a7630d161595a3d615428454f85ed2084724933508bd45901063619f38bb496e1925b62f1daaad97ee58221b73a418ba0fd1335fe56e59b0794d15cf21d16ec8902003c806fad2d593f7a7c24ab75b3a65756d71b3e3813ff517ff029cab3022f71c69bc36cede5bb0fdd636c7a85984f5432508e72acab54c1d3f2272be29623b9dcc92f6352c7cabe40f05ee2f39770322636c68a9aad1276f971f7c87d1f905270a04ad1c64c97f6efde1e813d3048b00adf217b679a19db1c4540ae3e149ededaf9a4dbab76cff2be3dcdcd842887cde733a92ca01859290c3c277be26d951770d9746a95ac4b99a5ab9653a086efe83756c52cfea55aa125aa0271f280b940dcbc7203d8d6c231e86eb15c321f52f324326bbac1e2c2a038fdfbce187241aac7a32b412ea8de37062ea7a0c10f056d696b347e4dcf67559b31fa3aa9d07ee2456c97a3236009a93e88dcb8c897599850f0d1429f9adb8567136cf07a8f50106f825bb274d86fda88a7a6af96c3079a805bb94d7c259a59aaf4685e24d42b08771ead9e3f4852949ade686e5b0ad2e9f154c51cb4c8bbcbacdfbb7ef76fc97ebe3e4ff93c0c47fe1b2fc30134be7f8976dbd8129544746d3435097a782146734a5ee5485c5cd1879e68ef2a5e4400a79046a73f42e3b0719fbacad6537d8459bae621dfdd5a104444d592532b103266cdebf79f34c98aa3e860934dc4f35c54143e4c7e4206d40d2e11ef5543a0f2a0bb08d52b1f75e1878a86d9da08c9b361a26a362b7d53bfe8b963819ce216c01dd094caabae6181fc5f7acfb0de68477395ab7c78e1d62cc67d04d3c756006c85cb55b948767e85bf2b5acfa4cc76c3d5cb6d7b3a8891314746a11777246e3992e6679391f321173b48868ac726aa51e76d722287a01af052c9112bca7aa68093bfbe0e82385ab483ffdfc2a32577cee8291bcb21a8a92fc873780bb803f85670cd43c637a241c7ec069e1dde461957f89ed3bb753031d1452a456da8b68e9772b7a9c4ba57e85951b26f3abb0cf196596e017aaf5f6683e827b708b72ded2b3e1bda4f741ac2f2f7e47eb15c61feef2acb4c11b39757e60fde8c6297a42a0639e8566b3862a49e849a946d3e7f195bc29d474655af6d81572dd5c2e4303bf693b79c316426f26224555c9ed2cede337dfa2f9aab5af8cef7f829565d3dac9ce8f7b09f5b3eeeb74cebae61bbbb3b080f43f3f7a2856c15ce9cdacd9fcedada5f081b1ebbb853788cd3bd5802433e9514d39ccd73e71e9dcd78554b83c9868c885d55418cb92cff42f69da866d8cfed0e1b2c9a9da73973df0b94583c66fd354bb9ed13e61927271032d094a1e709673a31f2dd36fccad3cec3983ce02784a03c74ef14fcffe88e23c23876da215c78477160d5cdad4c64e65d7cffbc2766ffb17786c59fe1e73966d6e35b979041f702ea15ca4ba570997428c1e41b6e24ce6b5c43ce5028ff7e94bc41f5d63c43aeef23e40f82c304afa1721ecc437dd67cbade6aab381ef26b4852cadc59ee60b81cbe7218fcf1855101c4f05c5464636c08b14ae6f74fe17e06526d80e96b907a35aab0662083c66008342ad1ff54ef4e9277e20ec21a90e61f41e80ad816b4622c311470137230cc23bd43e3143c8549ba4c8cdfa8774698e18934c11219502b88e3b03be172fec8b690cb0b2194af957f490