ETH Price: $2,683.03 (+4.51%)

Transaction Decoder

Block:
18990701 at Jan-12-2024 12:05:11 PM +UTC
Transaction Fee:
0.04014492549276543 ETH $107.71
Gas Used:
1,843,454 Gas / 21.777015045 Gwei

Emitted Events:

249 TransparentUpgradeableProxy.0x5e3c1311ea442664e8b1611bfabef659120ea7a0a2cfc0667700bebc69cbffe1( 0x5e3c1311ea442664e8b1611bfabef659120ea7a0a2cfc0667700bebc69cbffe1, 0x00000000000000000000000000000000000000000000000000000000001426b7, 0x8f013ed04e9616030f2d4486b3c8981bb9f52596223c16c1cd49bc6bbd3b011a, 0000000000000000000000001c479675ad559dc151f6ec7ed3fbf8cee79582b6, 000000000000000000000000000000000000000000000000000000000000000d, 000000000000000000000000c1b634853cb333d3ad8663715b08f41a3aec47cc, 428b79721719a60839a088c05e888b742dae3ecc4292c991a8cbbd5905f4996b, 000000000000000000000000000000000000000000000000000000050f07f085, 0000000000000000000000000000000000000000000000000000000065a12af7 )
250 TransparentUpgradeableProxy.0xff64905f73a67fb594e0f940a8075a860db489ad991e032f48c81123eb52d60b( 0xff64905f73a67fb594e0f940a8075a860db489ad991e032f48c81123eb52d60b, 0x00000000000000000000000000000000000000000000000000000000001426b7, 0000000000000000000000000000000000000000000000000000000000000020, 0000000000000000000000000000000000000000000000000000000000000094, 0000000000000000000000000000000000000000000000000000000065a12af7, c1b634853cb333d3ad8663715b08f41a3aec47cc354bb3e5df3608401b98f041, b8cf8c82272dd7df329785277c324b1048668d13000000000000000000000000, 00000000000000000000000000000000000790f1000000000000000000000000, 000000000000000000000000000000050f07f085000000000000000000000000 )
251 TransparentUpgradeableProxy.0x7394f4a19a13c7b92b5bb71033245305946ef78452f7b4986ac1390b5df4ebd7( 0x7394f4a19a13c7b92b5bb71033245305946ef78452f7b4986ac1390b5df4ebd7, 0x00000000000000000000000000000000000000000000000000000000000790f1, 0xb060e2406a260e2fed65f9c77630c42f3c2bb38b5cf5d85da03e1a22f910f52a, 0x1d0f3787976fa7030126e3af5c5ccfe51dec2d6487ee6bf15e3419f22e226b1b, 8f9e78fbd0a589efa52b7d17d12664163b84e1d90c5cd21229585b92aab4a7a2, 00000000000000000000000000000000000000000000000000000000001426a8, 00000000000000000000000000000000000000000000000000000000659fd977, 0000000000000000000000000000000000000000000000000000000065a13907, 000000000000000000000000000000000000000000000000000000000121afed, 000000000000000000000000000000000000000000000000000000000121c679, 0000000000000000000000000000000000000000000000000000000000000000 )
252 GasRefunder.RefundedGasCosts( refundee=[Sender] 0xc1b634853cb333d3ad8663715b08f41a3aec47cc, contractAddress=[Receiver] TransparentUpgradeableProxy, success=True, gas=1837852, gasPrice=21777015045, amountPaid=40022930654483340 )

Account State Difference:

  Address   Before After State Difference Code
2.219525345134680588 Eth2.219617517834680588 Eth0.0000921727
0x8315177a...4DBd7ed3a
(Arbitrum: Bridge)
0xC1b63485...A3Aec47cc
(Arbitrum: Batch Submitter)
4.640262612424291896 Eth
Nonce: 444643
4.640140617586009806 Eth
Nonce: 444644
0.00012199483828209
0xe64a54E2...80E2E4eb5 469.064655504587101498 Eth469.024632573932618158 Eth0.04002293065448334

Execution Trace

TransparentUpgradeableProxy.8f111f3c( )
  • SequencerInbox.addSequencerL2BatchFromOrigin( sequenceNumber=495857, data=0x005BE6ED34996EF311D44E80A2366BEBBE85AD60DB34EAF56690D02A7C7F822311B69CD472D8F8AF0E7822E20F6B06D5F79A2A226B84D4AA56E3D0381AAE87401822002484C0204E04B4699A0EBDF0F0BEFAD0F1FD849D5FBF343C6B3CE1CD6B53FF5F04B8E31577A7FC797E6E7FCEBDF7BDBD6D8C8D1EE943B001A1CDFF0746D50C308932F2C9281303DA18612661CD0CAC9CD97C1DC29779DBF4F7763A7D152884A6BB215A47EC9620221BA06BDE7F1FAC0572490BC082BFBCB095972F2DADBCA4C52DAF25ACBC6A896B80AEF9D15CD612B5880B5CD4D202BD6A193FE1A67F015A474B2A9A995399D019533AE97AD03459C9FEFFEF7D31E3EE92005DBF1CD52F26F2FFDFBB37E61D6FACDFC20596710489649E50D6C9BABE57CDAEF8A04081AAA1E490246F0A334EF14AC8F80065F34B0EE0845ACA21B30A9A504BEE8A9F1FC22C482A40D2048DE6C0E0246BB29CE9C079786805825022A92982945D14874E7424470E92E5180072A2A84D49C0DFC0844D49535B93617C103525B1E8C41AE26B6890E0EC665681DC04481B2869C3840D8E5163E7D3A6DBE6DB1E6FF64DDE18CE9B6FF994E2CDDEE371AF54CB64FFA7419000CE79BCF195DF051948611DA4C3F38DCD3FFC1C68003B209CB85CEE1D09AEEE1792DF95E5C939EE1287DD138F94F32EFAF7E17FF60ABF9484EF4DFA51286554066DB4417814E60540870B88C560A6C0547CE1F7BFA6FE4BD378100EE047A9FAA94AEBCE88DC9D2576EA2A1D0552EFE6A4B2C0C0409BEDA654C01B665F3F2888BBA4F8BFB4EA42DEEB2BE9CDC8E99E4780BB9C8300B3C8B294D316B540F9E699B7451220FE9B35357AF244B7B627D601F42CC31F404D8E2990F87BEAF9BB00492138EC5B816A269BD95C6A899A067F45A1A83E3CBA55EFFDE8CE6CFFD76AAEB3B7CE6C6660202A2A2860074402414A4D8822458150AA65CBD16FDAEFD0A5A2A426045A248A072210513D7922F20BC913F86FFA7EDE332A9AA57728CA24E70D533C83C01B645031C586291E4698FFFFCAC152BCDC9753E149554AA7D176C5AC19B1B06808ED88460796034041B62DF80D30682D9F1D59D61809D18C42C0D445FFA8F80318FAB4CC6530CB26CFFD5AE72D5BBC1BCA3EAEA6C7C7FCA0821BA3F96BEBCD560712C317AC9631001424886C046EBF20545C74DEBDFBBDA358FF4EE24144A41CEBDF108061C8C3FFADCC79420000AAC2FB82EABEA9055D44BA64C49457F096ADEA76B9CA47AFFEB1F61DA04B1497E4C96AF21DC7A4D1053F6372BF3D51E7DC2B1CEBB06D998A3FB56107D9780E1B32DDA783C1608F8F25DB74CCF4E1B861AA50926AB93ED5C3F19C49A93B6B48C6CB941B1B5C1B6A51EA1E1F75FAE474E2C17B6FE6237B3D5F5E96DD4AF87796D18B70669CC660887E8DA0C3F9386583ACA48EC75B5F23A8057E65B0859683DA17F450B6142DD5EBCC8449CB6795520BA36DB1BBE798E6FC40C50EF24823BDA67DB7178731D8D4535C2604292B88B34B0EC5E680DDDE1C4E62B76CFEA73DF97E117D7B7D91D248582E31F79A172C0329163B63DE93AC9A648C63BAF35769973165D082D24C16EFD4C063613904B997EE960C6DE2E16D719715AAC6D94AFA125A6DDC521C8263DBE113CDE5575D547752B862B26CA1A9383D7D72585D9D17698192E5AA2FBDF7A30DFE41C0B0DD17084AD9B1B48165BD575876ED956EA768CEEA40DFE7350813E9055262CB3B35367A8DD0844EE6F973BAC9F1BBFF937D63BC680FA592FBA3BE73259B4F1C66A594E36310D47DCF9A50EF913F627987F2A2E2F3D24BC655389CA82A6799F16D1EE15EB6E1D76F4653FDBACE4B16647E682DB363A4FC1038ABEAEF9E88E223A40D2EA79B696B0294636749836D2EFC47A48BDC926A4D7F2B90395C283B2AB1B24D3B22B1729E96B33ABCAE5FFC067A4F3E047FB8E83757B99E500D1E6D496CC2573A93347E507C8181ACB818B121612BD216A1196B5AB5AD5D6B42188FE82E12C29138984DACC62E27A2F1506411D1D3C928D73DEED9724E8234059A0459E16BDCEE68C4AF8D6BC8BE0408D6BB8FC711C5FF4747DF7EE21EB153DD3C66CC597D378836DCE6745379AE219097A8BA205F96C619F52F8051A32E82ACF29812330E12EC13F97D950DA6BD1733DA0DC1898098421442E7118A110F1D1E06DE7D9B92F7D6AAEF264C1E64AA55E8FCCD4DEF0F6F39DC9A8B605BFF2F93DF0D216E1154E3466FB822747149CC3E1FF74ECB046CAC305DFB395DC11C16D76D638D4027ADAD06925999F77147154D55E5E88603D43E8F730D30927D87E559B434A4C2F5697906291CE8C8AFEF4D143BAEE1CA97A860B6C2FB62DC99D6EB8189D5C2E017B5B3BA2AF4463698C11FDE47DCCD07B4AE33010BFCDAC3ADD50B58570339EBF5C130FF54EFD712DFEE4E320DD9F559CAFB4A14486431431B0000A005803CC62401BCE9D338B021E00470F78883144A9E6DE9F22A1DAEEFA24C942C21C1C54200800EC0F655671F40EEF19B0E8806FA765F53ABCB5CEC04B71D7432511D29000C333D1063B6760BB89FD978AA004E1FA95136174D37DADFEFEE48FDBBA16C36D94F3AE286D50855F7B2284EF28E5E5F796C3F501B3BC772C2F471CAB31510B5C324816D4EA2A464DCCAA46891019FDE7F7B7D3BE86FB251579492929943BA9DC259F51D646EA47E4BE76DCDDBAC418746642271FDAFFE45FE5C55BCF24B819188BBD9F33180E787C9CA61D05A59536459230E3C1A8DF63F3C1AC2FB173FA360C5FD6A9974BC3B3EE6B7016A4EA92D8CE7701FDE81AC6861A8CF7AAA72EE3DA5A1CFC1C57F632EEDCF03BBBE7173DFA48586018CAFA9DB9807F67E3370808209D2EC3CDCED8A83EF6320A0686767C74F46409EF17A9FB8657B3267EC0E429206E9D399874F9BCB78993E1AF1F874383A18B1B4CD3F8ABC86654D865DCB878318EBD61DED6F93F5BEA0F629ACB8BF16239102DF4D7A78205C73BC6AF17ABAA52F17061668F93B728125F2F3EE062A7704DA3DA8FAD4DB96DC3A4573BDA79E3CC95B0FE279EFE883FBEC0EAD74EEE088C6562C462E80090AA833221EEF4C075AF8371FDCF98051B6D73FF776B51F0E90FF00A701D85F9B66CCE7FFCF5F7A37E5EEC05B4D07D6B548D4249F1C6C8B19DB299CDE09C8A2F0DC173EC4F1773E2747DC303F62631723B44ED428774F94106861E0D0B20C9115032880926364FF5D8D5BBF61946B7396B1D72B0AAAE1F4ED3DAF7B7E870D880B3D7D017F6B1FE3C50353659A084AF901B2686300B40E4615051F9CFDC60020D7BA7467F489CD8D7739254E42408364D1563F458BFB47671125A5E1C31F5EDE28AEF6BC6200A3478E7F41B11B9D3455A69CC88FF9BB1B50DCDF5AF4B3030A1E606B8460EECB339B813D88EEC80FC66C2F8A8A0A3127DAC76B08E2D33B0CBEDD72CAD5B54D22C15B53A9E18D785C320379ACB94E6BA017D085ED617F9827AB7A5FC8186B57DC55053CBDB3263DFFD64FEDE6CBAC77A2198891006EA81D3D52FF03F5C8BB1F0266EA245CEB052E5D46236C8498A207361DC79C7D091C572FB2FEDE67005C1BF10C0615744D23973BF57726DA0CB07153C3CF22B775D20C0FCF8C2648C96C0D8BFC3B2010A0FC529908835A6223CB1A65E0D128E85FFBA3906F42D34C8EA0EE6F63F6AC39326EBE6024E8F04FBC7D8C8CFDB64F730D07241304A45DC9138E2FAB525F6FC19B66E7674DDA699F7758539312C0153FAA7ED010080499DED1AA175F08A0624BBFF1A6F6BEEBBAE2FCEBEA2457761A9D9599B2DCA5408B9F36E6C3A096D991658D510453B1D18837CF81346599D87BC020CF37C990AAC5B5218E6FAB857E1FBEEF9011338C813B1BC62144DB1BE86E69C2FBE1E0BF6B8DBCD6633AA3618C0D97E11581F15797DBC0E256175B582DCC6FC5C35E15E4E8B92FC2460FC6A4C627EDBD43EC4C21D0C41AC9B7E40E153AE891A1A16D6B684F0318B1AC882C6BE4F6875309B5EB63462AFB5EAA3C29051E6C5FC1F87FA42EB85B68A70C2F3325AD32E53F1DCB18CB2EC719517A8ED14C2337C4E6541B53672CDD0F0189B5DD839FFD3D3483E29A7748159FA27F60D00BAFA29034990F389BECF0A99E8216F586E4FCD4A105968E0D7405F11FBE90B51070C5628FE4CBBC9EC92D39FF36EA80EA01AC962847E2F244E3E3CD0006E7B5B18C161EF33889EE078F17B4E98F65528E0549344FDCC11D90DD37F2527587A872D694E15C26EA6BC41379B18D9A86EBB12561E47467AAB9051D96CF50C9EC0808515E266FEE1EC66934BA308B59A7E3EED21B290060465590099B3C03A2EA90943D2AF2A109C83B3D993D9806573A323A529D8DB07BED00F55CECF009EEF7D6A81F95F86DE1DA36C57451109518102C303216351C891178AAC1C98E6EBCFA51615417EA236C387BE3E21D99552D010614117C429A77FFB32F982D6DAA2FB0F6AFD0459CBFF3BFCD7F1ACAFD62F8C7F24804482532D5E14FDC266E3CFB448A67C3A3917D8CA5A3C8367F66246513BE94735DD76D384678F1AE0B2A76858C49C1DB6D8D37494B45A35ADA5627C283D667EF1C372AB7F0B7072B4996F0A39FDE2E7F0FD1C3A62C2D75C2FF920235C987560432FADA2A2F5607920E75AB21A1A11AF532826596ECDB209916C8F3B18FCA4AB30B516C449D7ABADEAF9BBF2C1A67563078CD57A3127E1DB08CEF4B199F35CA5DCED68598BFC8917F42C650FCD94A31AAC92C1C894BAD563FBDAEB8E9B73D01CA4FA66FB266FA586E497ABAE5955DB06005F4C44D675DAC534BE5B05D161D90C09E29F0F084E097FDA5C2560E172CB45FF3012D3EA3B54222E25D3DCAB6FA578849DD9EB5E4A98FC786C79CCFAB199AE93167FCC0398CB4A8BA5845D29E54AE420DCC5EBD33318B43243C355D3069EA8046BF18ABC66576819B626B7CF0E673A54B3BFD5BF29212C638BEBA7F2BC35794B49122D6E928E98DBFC7A3A59280BB516A0DC4C3E2251766FB385A40E472B84A5F22029CF6FADE6099E6CBA60BAB09E18032516875BDE995A6D8E9A59C99D1BFD457280CD6DDF8EB5137010B918880E8C53A0086EA8C0FB67FD4FAFFF9A9E1346E0C51A6B27BC7B06DEF67F0F5A5C9CA9AEC2CC6787CCB2260741BBD9F48324037961A9A3B39326E649566F8AD7F8D26C03FC773474D930BCD821856682D4B8E74F1185975D1FF0E0206DF91A98C08FC71464AA31762AB0DBB450F728C36410B126E78E1A12ACEF95087D16572C3B5CE5B1A802021747AE6516100A1513F043462D87988C54F69FFCD4A3FF68DC3FF42076253EC93C7DE3467FF39A2E05F9B278870AE272B79BF52F9AD4C5AD6E6835F34056F5E4C717C8795CF8F033BCBF4BF4C8032258F412D6BDFE1419F8EA371B74B81DF5ADD0C437C80EC88507E0CFD6C6B51336FCD1441504DC941FD64005E26F167F8214484F96FDD5167EA4BC0160915E33BAC3B2ED53DC985F4856D7C754C29336DB1688305109E0F003B9FD355AE9FA825805EC3EF585C3F17AC20D89F57848CFFA1D60C8853B708FA358F16DD668C6D6E8BC0A9CBD87D2661F461B64285206325CD3E7D3E65CB5AEB89E1497BF9343C72823A3C8BE4B8F8DA64E0A84F8BF5CB04FDB6007005992A6DF20823A383C51BE9FE8CBCF48095A75D08695E743EBAC497014F40DA2250E0691B28E0DF27A75831EA97DE5114C37B2DEFDB8CFA992BB0E1A3C938EC6698B286412D2BFD6F6BB09168080FC77922069656A0B79A74860F2653F65EAFA58C530A3677AF18E18A270AD53B7851B45BFF5B3DFBF619D5F9D802B25FF37367421FA3B7A0103E9A2245BD1F02F2BC2CBAEF592B0D592A72EF93774BFB0C118D23DEFCABF82E19C58F9DF7D40A15A453E1AA2ED8915431F0DEC7BAEF0AABC62C09A92C8C35C75E125C8B8384CF3C75E26A001CC7C20C63EC378B82412E87B8262BE03523436F2956235EBFA2D57D97ED1367353627528F2D19BC0361C8B1873328DE036700884E2046F5A9672A364AD77A580D49DF163F809864BD73621E39532D5E3C7E425ACD94F8BF079902A7AF4EFCEEFB51114FF0EA5C04B6ECB1527B35FBB7114B0FB77500325FC9688F4E5F3C40753B20B9D007CC8854FE8F186EECC80564F0B9A8B8824DF95108BABE19BE61260F9AE3CDF308A69CAE8D2FDCCA72FDC565F00E0883F029B108C0380A1518AF1DDE00814734BE07517AB2090E417E9CD525E85692E675FFCCF661BA09AC3F73529761466225C499A9700A4B50873CE86A7E73B7CBFC350B336576316BC4358DBFC4160EB97CCDB273110A8DB689D9BB96DD95CEF9A23FAB899F9CF2F435049C25F441B0202EC5AFA2CB4407D53D3AFD1030DBE35B234FA01D227599581A17586816158117DC6DAB983E445D2CA08C118B041A607F40EB6575E1E1CAE6CA42F7C93D2019615B32C33AE3AF41E95ED28BD16E6CEF84DE97472AFFC70F8E4325F6F4EDF3C6893468CF70B056F666F75B7521429B3A557A43AFBD8D9AF0525170BB9A1FB933393FB9839B19133B2B3923B9D39FEC69E3E8BED185D609EE2921A3547B9A38B847CBC6FA0FF6B4B6F0F631F0F270B0F27173B2725BCA5A421ED00F06A89437275FE99A449DB87FB8B6FC3A77A24E20200E5E2971D6FFF247CEF254EC026C915FD415B4FB2EC18FBF79987F6319F035F97BEFE1786E813FBC59D1DD49FF179EEA0304C8CF095D73CED47DB36084409AA7DA5A95CAC5A5A7EB1F275A7EBE3FB80F57AC03CC6F4D2CB62E36FA02E9B09B42E459C4489838B638FBD70200813D472F9EB043F8A5B43BA6AC65504B564CF2530944D629FACC850548C33788976048F0DCCAB8F31C1123B6AD1A3B7F4BD192274C448D3109AF871792E9D98CA3A0A236A2B54778741260F15F2DB36D9EA5A00125105F877E08589145CEFB1DBBE24D9C70ABBE329E946DB89CF155D65F586EE402EDF795FB382950F2F9BD49D2E7F1484B7AF4D6EFD57F1DE4CCA99BAF66053E1F45C794F67718AC620FF48339993E22EFCCA08043B26C05B50FF9459F199B69DA1C2E4B6515E75F3C3FABD013CF977A65D7941500616E3FBFBC0D74D120F8A0153D40197632B34F4A64EAFAFD9D2A31D942C2CF207EF978371DB363A25969AD0B27F6D8272AF64A4BE745A721F3EC966F20900EAD17FBE4602EDE6D4EE4C604323B52B444EE467BB4CF203BF9398FD5873FBAD3990B3D1EEF419A53DDCC31CDAF7706AFF025701C6B60063DD37F90A205A3A347DEFEFAC5E51B6EBD92412D4BB76F5E685625402CAA07A0C5096ADC6ECC1800B23C2C6D81104D690867DB374B72AF8E07E85138791FD13283F649ECD5EE6F72F5196737FF0734720975518150A4521D2D844C65F44251E8125E6DEAE64D8CA7450024F1D874FC033D0A7325C48271CF5A21B7A73899328A558B30CCC8603A368BC7DC6A6DAEB005A05230C5E327AD1B655119FCD8FD34C3FB1D760ED112259B90A629AA567252FD95B5BE1FBB47D8EEBF20FD8B639D0324A2BC8764BCA49B889F8F735973584E160A60410C8802BFEA61E01300BE33C0B7CCFC8D9A8CDE485C3D40B16041812ED23229B4459BD9C16CC82CBDDCAEA5B9E8EFEC37D4A59C135ED963EBE17D1C99F47308BB24DBD13E5E339E1FF57F47EE893ABCDBAFE95C18C06E03D819C09670726D1A7127ED9716BE6FEDF29C41C54CBFB1FBBEA959C85E7196A9B3D12FB4F1EB52BCEB5A2879234F435B6202F08F1274AE4432C4F08DFC18F3D4A6D91168DFDE28A913FE0877615DA192301B975E814A2BC5701ABA0DFD03C1B6569CFB696C943564A359816A14C5CAFC655266BBBA923DABA663FBC596D1363535D9F65B4DA1AC785E09F1B269ED077F591000B9E8EFEE2C48A89EEF7639CE0C65DFFA5194170B949D207C5E722BEFADB5D499DDCA9A4F8AF82742F2F062168D130D37123C1A6FF6C1B86420B2B4B541091EA5CEDB7EBAA1FFFCE52454B94B4E0BCFF3EA0BCF65142A8D114DA19491148FD8975F4BD95AA0C452FC3962A846118D1B8ADBA905183E8E2FF99DDC656A77DC09EEEE396553606E1C9D22A2EA6E0CB06F7F0952B564B6A86D68D022AF4BE5304F883C48911757A4D0316A7830E1A0ABC60FE6BF857DE1AD33DF6C2BD2FAE1E0E2C8469DB0B1798EBC18FE46940D0774A7463BE7789F2748FD15FEB04B498B0C42AC1D0E6F161BD7C41522285706D183D7FE590377969617ACB735AB202929C4E2C0F88B81D7E26DCA7F220255BCA58D46CCF23EA3B8E8778D6BF2F4233D9D45407997EAB05CF5CD0EBC0312AD148B688134CB922C2134ADF3EB2C5E2A73DCA369A0532A000D419427A95AAFDF89780EA14A766DF9CF8E8C0B2FA998E01D9C080F775F1F016E00F61439D69ADE0F07F717B85BE75465B08E13563B7714A9C4FA09809C04F33AE5A455E6D7E147B43510F9141BE3A3760E06173347B98AD3B50C9341EC6A96EAF9E0450F6A68F043785F07D1B1714528117E494CA910E65AA4C5D4FE703A23C47134D6D9F691D6F8EEE3F1361DF16B5F1C75657C81711DFBD5873C9C0E186C6796D6525E3064618D3175DBF65E3A878A545F289C14F02FAA9CFB65BBF9E351313CBD946FA9AB5BFA3747791B888B2139A32A222AA3AFAB8EC67745A7092352D4F52A16CBF9FEBC5CA101A4B2485386277306E00D337DE7F54DBA1FC030241030586462CB0A93595AC44D4E23434733FB7B5E18070B182649017449A746FFB3B49A36DBFBEB47AEB5FB5E9CDA2C4C0F39090D1159D0BAE0B4B865FDB87934F67A839E6C6593E6B301F4331B41C164D2583F58FCB10B37BAB1B7ADD9F38FE93E796968142F9F1D85C55C3DFA5385A8F44029E888F372C6BD052A1680614ECE726B2A9EC46C6768D77FCD8F461152DAA32F21380FA8474FAA556B6FEE85B0EF694EFC86A2A991BA17402AA2EE11CA10E07254ED380AB2A12D163F1735E17171A42C9A837760ED66887AA8A2582B857F8943A5B3EC22906E778FE95F606F2AFF72D8BC2D80BAA48D2302C1CD2F01CC2FCA4F34E7591B22AA92D191D19391C8184153268600C988DF8F630464640AC8F23A58293BBC9421E0DE64887E8384D92099476B6E3DC04FF1961BEDFAF65BA1DE504CACA3ABD4C4C83DD3F6DE84E2C38D24B5E853214AD321531342639A4F24A5658200C816088A2D124399F89AA586DE16E9BA99B8C365FF7B6B6FDC4358C7EDECC7185135D169CCC2D94E178BAEAAF3805655FCCF111385EBA4A61689C2DDC106ED4FBECE4F0BB2B23955F1828A436BD56F02CFD9CC090D71F032F7F715C36EA81E19C7D8A78CD2F5C35AD2CD4571BE33219B42FF26C12322FED1A31CEB22B55AA0416231AB11A1713558688E7E8703C4EFC0B4BF13D2612A93AFD05CC0DC332293908C597157D2DB41D36EC7C3D4ACF953FEB5AE61DF93C52B16068BCF64FDAB1D935C6B5EDAFFF2730C269C29E2DE1C804ED228F4814D9660C89F297C9817B356BFA4B8EC3B8492FA095D9F6C1E3F8A33FA41E3C7320EAC7A5B704170FAB2135CBBD22BFA01D15184F254D04B71EE732223C6BA48A5DF22993925CF6D721E5CEAB6D5FC0FBAE9DA8330BEFB80E361B9BDF2E79CAA7C71BBDE5E974D0EFB24368F52BF88B5372CA85957E93A0CAFFE2B470CF24024339A31F11AA296366F2F160ECD0F4F4291C9C301811C45CE88B8860F3D64C2146465FB393887B896C6BEF126BD8A5500DDCB660CE1ABE652A62536ECF444300288CDB64C066AC2B7FCBAD9328DF9BB9D87844A52B34D5568DF5B1AE8BFA45D51ED1E6121C6DC2FAB8C1270FFD52279B451732F649757431323AE2C6A43B6A98D55455A8BBE173311787B9A56B9C3BB0336AAFDF077A0948742437D9D9C27D9D7BABAD9BE935EF8E68ABB04C68A25A04587CF0B323B1122087E0842339C4AFA49B448C588CED00DADA5DB3AFBD93DB115A9BF20DF6E4EFED3D8E5C1F98BADC4DA1DDA5FDB7AF5E377F3D268FC633763D45EA75E27EBE3F807AF538BEBA6444D26FAE5DF4D20AD8EA9C91542147696CE749F8766AE689FFCA06A0645CDE7FF9F66DC1939DE5A2BF49BB9FAB09ED4FE9ED539691D2AD5B4AC25F7180A43580AD9FD39BE9A21995763D1F04E3D4CF43BD1BE724C40064E628EC3AF5A4FE3221A6BA70D8AA54F6308EFF6103D428D9517B15F0B61C41FCD934D9B8F277AA817FD70F03C8672EAF4E6ACF3BEF9925CA4D0B16DD0EE6F8E54E3D365BFD17E848902930B88A31CD054D9CC14834031F0FBE79D75ECE1B20A6F9D37DB4232B6D20A86586F24A69432A865E3F576A1A1B23F8B7AA5D4078619BF9E9DDB3A9A5D03F0C64A50C16C7F1AE4D567D51B08C6FE08B6FFA8CA11CA23FFD10247C1FDC77D3F1CBCA0536233D1C7D7CAFF3775E4384AD5C5F6E824AAA8FE49B3573731A9F52FAF26288FCAFDACB6BE6F381A425FFAEF9A67DBDC9DF46765CE6585E455E397330783AE928543A1354C9CDB71EBB22CFF013934BCCBC2B1EA3DEB5F08418D47D639EF22387EE9E49364A22164E708B798CE6CD19BE2D90A78C12B1D5EFD2F4921ED0A32E6853ADBAA29D53ABF4C560707E252D68E31637BF60F97157CDEFABF2A2F71589A7943150AC6A520CC64F03100B61FA4741EEB95E9BFE7141B4C767072FC12243142F9A5C0D28BCF81B1CA9BED130348628D3D6EF214BF144A74502B90B9984844A051F34CE35226D2BAE4CFE8CD7F0531DC1F6FB97D5360FA2CA3F0A9AC7D4ECB18111C5A38D6FEB2A1FDCEBB56F4F6DD97622EA57478BB2D45B789198A93BADC966E3F6F327CDF43F561887BF3C9F4DA924319E585AFC4693AFFF4FFCD83BEDD2526BFFE05FAD42ECEAE2D68876B2F09933797F75B622D0D2814927E37290FD0715AC1442AD414B9413CDE906CEA552AEE06BEE3AECD1E66BE8519919163B563225ABDA80592833ED30E34CD2BC6C79C0CBB4F88C2B54D8E16CBFD011C0ED5CC5E6A4DD6E3CEE4E9B6F83EF3D7EBB7A6FC4EC4E2A438540F8FA2CFDC8054D9DFF6B08FEDEFCDE388E87F737A450569940835EC0E290440CC892C3FE53BD38EBD7D0752567647786CA668A52D19B66E34A6BFAA5E2ED4CE888FA2E76E8D80286788CD29D3D2EFEC955E9AE8B859DD7AAD2EE3BBAD6C4B990E671C7ECEA45750CF92520DEEFF78780742B4919D0C232119840624398AE50E65562A13BD5440C381F53504AB8731CE3D2CB2606F10576E9AA29F59668576F29642461D2543759C65DA65647EBDA961D952EB3D02EC7CAA4F39B8063C55202AA5B38AB45A08F0503267213E7A3F1F9AD23DBAA409A5ED49D01FDE55B67BBBB8C68CC77D296E09B04C9336DF7CEBAA8EA3534858C61AB177E83603234D34AD2706548905EDF47722E762A994920FB7BF22D7645B6777E92A4D4449325BA0BC4B91A5E73305793C9CCA0F533974FBBADB042732C57FCD454AABBF7E6AFE53932B6C870ABC1E86BBDCCFA096DD91658D24F9AD05368F65647AC5066F97AF42CCEFE2F2EB2FDDC39D58252E3A5FCEBEA1E04B6A8F55F4E53ED026F43A6142D09B23972F8350338DB33D3634C18FBE519BFB21B87CB753EA1A308F53761A2B07091F6C0F04D7D163A1B16AE7B6FF9F2227DE3BAC54929E6AC4E1D711C60C1177B2E5C339C01E38B4A8D8478B6864662C20150552AF3388430557FF3093BD5D7DB3C4FD36D2FA6307ED620ABC0356C6C8150C61D6C0E7E6108E48DFEA9DAD41E9B7458EB7535BD1DF7A9BD701D912720934B2232E4858E8487AA4A0E3AFD5DA09C97D9232B093969BE5A36B5184C607712EAB02169A0C410F56A98F4F6D1BDBF775C10FF6A733E74D04D190E2803FB8CFEABDAF1017C53320C6F7000DDEE03C2A1D61191C90CAC5A966B90CA5C00DCFD5F4AD0414575600DBD9A778A010980E9A2AF2F3AA577D2032D0B8B23F1928240E65D027AB387519F9AFE5FEC3DB75ACEAC3CCB2798D32E45FEA962C88CDDDBAF3B707B5975B36D4D4A38FCDD0F7F9D8A0E6FE9EA76E3F34A1D8B9225E6972AFDB471A8EFA7FBDA9C4A4DDCABFC5F26E0863C4D92AEC096FE1627C09114667F0D83CB747209BCB989E1E6AFD06DA7C236013B3650F23BE1FE339BA342079647CB5AAFC51A310BE87C9A24FA416D9787300BA0BB14FB86B22CA735540B33502DD192535D98524146E263AEC9F59F56C9C4EA827A5F5FD294246214C413EBE78228A70EDA9453443EA4462739AD2A4CC4FB328C16B6854FAAD39D24D63D0E1EA61D21CB74F06A828DCEC3EA1D3551DA6E7C831319ABF0193AEBF26FBE1A0E6136997CA4C3EBB4138A8EF102C7A221754F6EB9A2E3DAE8B63B3B6E466FD0EB02AF6204FAD5791472F92F935CEBE925BAA3EC09407EBA591426308463C0E735734AC24500813CB20D3B1BDE506FD247386C585D052C3CBA4CA5A2946C84D986102D48DF943DDCFA2A96B3392B6995B49268F5851B2DDEB76CB79AFB5484EA1E9BD0C47467D12A25B397025E4094D982AB865E86F08E677E5A93909913A471F64F4D24B85B2D7CD6CCE08CC237A7B6149C024FA42A412C0FBD3ABC394CCB7D10A7C9352079F9CE2F4FD4F3D257ACC0E77C67E79A5A0FD9CB5FCF67E765C5078FB1548BA864349A152B389295EA8E94CB3FB127436B66FFCD93EA5497223E464EC36C858F7ECFFEFEA9FBFA3AADEC69F67160F834FFC3854B47E3F2951EBB26ED85B4FC556876C866523EF7D3FAC10A6594FB79C2A4DEC268905D673AA19896B630E9B53A01C520057F93AC070F1A2A2C0C56BCCBB12CB98D1000BDD7CBFE7B23BF0D4DEE9A23A4999152AB383F59E9D5648D52F013BE3CB4FF6B11A07A76BE9962A35E5839D6E24E74156E7068A86ABFCDBA94825C445F6AFE1ACDEB755FABF8B5CEA060E2E19AA2A75BD0DA78E53D47F18202D5BDA4DF32A3B8DE432A41DDFD6316E2AE7EF6572B991FB43B9D2471D369C6FD8D95085F1710988C65F2F2FFAEB03821483A39A04ABEE3FB0CE8FFE292B242EF73DB437E5CB1B723D4419AB484B3CF200ED1AF726AE92F5DCB9AF5EFB83D57617A27C69BE321DAE7711F5ABC42D3EDDAA3C8D732DEC017F45321C44237DF487477DCE8267D84B2CE447A0B2BEFDE7F77200571D22446C111B867740180298ACBAC39F21A6BDD5A8997619B09AEBD1737CF9AB39E5578E1DEF271B7BA45F29CAC72B3C1452644DBEC9713F92B68A43D87E5770DBB229EDD648C9C7C9C95C7966DC04A508B91151C22CE55FA361F88AA707A838A1501A5B192918AA3B4620014FAC4F40FED0A3AF5486328C21A23DCDCEB32332D320D8036589C4E5B528A288EB8FC10A820E958E32935D18B1D2CB9045C9A4715E85C89BEC8FD48897235801896FF10482D7B945B76680513127D720BD4516488B2D6466031155D50DBB2015E628B20BBA05D2EC3DC683C837374B1805D39E51C09ED2658D2F49EBFCEA3E33F482FE8CA09AFEA7B1EBD1E058259D98EF9518F45F3EE6A32CF99CAE231456AF67410C9C0E3B10ACE3DE997EB097AF51C824F54957134482CA92EB15D01E6DD490F7A19C4F94CA7DCA4D4C2132977FFC4A9959B924ED591026C6235540B04FB16EAAB517DE164B41BE1C8B448A8CF9C7D7F4F5A3F7D648DF9DB5072E1B030648C768B6F797EC515DC98FCD3BB2D30BFADDFEBC35BCCFC454F0314536019588584C39C8A096BDA7AF89482846A562710D5F329C5BA1C8E97B27EC3E66C753139CCC27124F4B26BA228D9D8E2875E51617D40F0739F6E9337FA4C9D5FF83882085377D583330189918F880C9A247AA5D1EFAD91E07A46F64B42ED013976976735257927FA95567B03120ED3AFA9468A1164898F247985A74A8762044DD0DC2F741CC758CCA60AC917CD1D957428A984208F9ADB866E9EDA4FC8B475F36462C2E0F016837B17EF8393AA48A106A6B00E4FD8780C862C950A83D949E15F5CDC1EB61741B4601920199F8ECB85F066951BE341477D7DCD3F727785186552B38319C41B1FBF26ECDCF3CC49CBB474FF6CAA98A10AE76287476C032C01FB34897547241452005B1B86479893AFA69C928A6BB381E49B521F4C3C1774BECE7F44C273AC11FD77BD793D50EEFD8ED54BA8E304711461BDE895F59A281825CDFCAEF1B90B29BBD1DCCE3BFF75600FF1ADE4A179156351AD65EBF3CF8A44C5A531ABB4F891C4F8C465A19EC8F42DF88CB08461919A4CBEEAF5F513F96D8C0C52215F4AAD683E740684820FC6F33BF946BF5E3234DBDFEB6A3F7960E73F6F0B73A90BABC2C5356F05FF9D7AA419CA51ECBB59C592B3AEE968FB87BBA7314E820A4B0B7D5B7FEFAEDE77C7CB7F589BD62D9E66F2C957195C97A969BE6CC9A18C9ED2F1B82D80933A0D7B5D5961DD26424A6A651A79A2311AE0BB46054B2D921071EAEE8C4568688AC200092D194F7428E77F171DCD63B8B1F266EE4A7996D7D8EE60518E52551869E724CF2DC531E8B8E30597350DD6FD75BA943B92722DB6A3368647A3E7910F705132799EE5FAA3B1F6372FF981B809F3C82AD6F068E8C3F3F60637D8C5F98087BFB9F65B3BD2961268E64C32FC20D0EA43E72D1514C83F00B28342318D4C5F1DBBC1D2DCDE14FA36540D0A58D50C945710954DD37BE4B03F950DB5E336374F6463D79BB2ACDEE20A8288C46EF8453A899D1ACED92B9338F3B10E275A12525B67D88FCBD23C3DB6F449AA0E3D0AACEBB75EC76962FB884FD8145D028AB1F49E6DEE057325A8B744A378E19E68525508B064EDA1ECF94DB2DD16186B765BCB39D7E508B64FF6404959774E23B62E466CBBEE127FEBA19E43F14D5BD45FB03CDC64DC478DEAE5C547772A440B80965EE51B6FBD1E2BB33D0F49997B9FD18EB8783FCA88564FFAC27F98D1B4DAB16A842D6875ADFEA9CCCF651BFDD593B35AF203106D53AD093FC3077CC08C92CCBFC6C57DE54676D66D53C17FC89F65AEE45449EBEEB5C2B48831D875DE2DD8F5FFBC3D7E03501C14EA1860BC2D37164D2911782460903E34703E9C4B95336D4EDFB5CA4A0B38378105BC653FFB38F4500344AAC7862E516F74EED2E76039E6DC93EDAFF8D568A7CC6D4D61F554E6D9FA6E451103914E70D2105470005D9AA0AC7825F15C0ADD3489E09DF7A5437EA021C2C3EDABCE212E43673B331689DDE7BC9DA005943690EDE64D7D00DDD51DE3F3C017C46A39CAB76DFA3C37D0748F8E7CA69E4EF489406BE751C52A7C58D0FAB173743CB27DD1580706A29E1C2A351CEABE151E28BFB192D261C2B39AEBC4762494AA81F534EB1821A3F8AC03B906027D18FEDAE601D2A32333964C0C3C377D9C4E4E6D8AF31F861B4A6123FA0340AC8CB882CC291BF4BEE6D58F389378B29968A3542427FA45D11AA724A91719F7FF3233087DCA97357826BFD8EA3829DA2C4E588E0808E6EABDEC24BB3E378A9432D5963C2B54F8AAC0515DD081A149095D6499872036250E3052560A55702E1B25A0D3112D4B964D080475BA45FAF910D423B39E2D8393DA326D9220C418C25B40564A3C3FB63E77EB56463CFF20D8CA12D0691C5DC99CBAC03459FD7C8E0A45670CE3A2282CE5B5971EC9837D61C5200923953F2BF1E8BB246D1FB00DC1406DDF7EFA02203CA2512C8687DFE20D3D44713CA9132E78106B6789761FFF465F3A0A7D876B79DE2E8F3E2DE58286FB9030424777D80ACD3F180201DCECABC9D1B1FB9B0F4DAB269F9CF735F439F78E9837A522F55E71A3187CB97E27F24160128CEEEF5931F059702DDC180E71BC86A52928AC87F9ACA73EEA3D9F6EED153A61E708EDB80921187C272CAE213223993D05BF9D3BC3B4035AF68E6E476F40F72240428C7430CB8CE776D8118193FB3CB91EA6F1EB02FFF7A6A9B53E2BCA5CE69BA661EA9BB4F2073E52F97059C59386D79F15DE3C0F40E10A6E3924781451DCE848243FE2072E4F172C072A5FAA321EE3DCD822655EE84691946EA0D0C4710727E02C0D6FA59D7A3190100B76AA2BAAB8E3FDB26F2911DDF0F9A7CFC3318FFD877FAE4B466A6B695A3B1CDF26675550AE7819D84BC3700A4E2FE352D1CF3D84FFAEFD7E793D32426CC79A6DF35E45D5DAADA9BB53E411F3B3A10BB01EAE04F56DF2B216FEBA44677638401E00EDEA23F7F0F3C01F4C34E605DA9B2B715BF635379534AB8CD30283BF1821A2548DBD4FAC39154E6B4C3F33D1F10882DBCCBB1CE80703D2257B39733542F8314B2358690411934E95771AD8A95EED1B20E7992044F0A7CD71F737AF6D38C9344ECF0FFA2FFCCC21F1B3258771CDEB50A20ECC643551A525DBA5380761D14483750CF0D188B8391292B05A604DEBA117C913D2A60260398CE4220BE9B6A978144DBF05B7A41765E54E32C9D909D56E70F64392FD85C4FACEFE01A824F56965131AAF9F6C56F1DB04511AAC3618F498034AA5A13A0EDCD04954FDC0F075BF91C55A6431150BA783A2A46DC2BE86BB44B5ABBEB267F5A4DE031392BB55D04030943D3BD7CF120A99657A149CAB8D91E9F4389426F23387A9A60DDFA9C66AB67C660BD4A13EF2756BBD68AC44E11936AE6CC53DC47868CEB373CDEE266A25634F2E6FEFC37D19AD36907878E3DAB6040A5237D0CF2E44F4B68830DE5EF05E3C74A919A84BFCB199CCBCBAC9132387A1D90CF56C283F5DFB9FFC3E345FDC82D7D21046D575F5A151C1BB6DBBCAFA40ED26EF15FFE4EB491120919E8D0B16B2B3EC50F800219E619F9520EB93D53B52B29F09EC0CFFFF855A37352F15490A6676A256793110A9F771B85E57F145DCBABE190847916F194A7703DCB3FEAD244F7E421BEAF32411F498D44F00DD860B12388480AAF87EC844FA76AD60A8FF625309098420B8647AE00C18E93165931D2DB37EB9BEBC3BE8628B5A4C925215A1C4D6D4E2AC2883822481D887900F58A4A8EED171689CB408BEF36E56D8D9E776811475ADEFA50F8BFDE783376960B433D8AAB5DD2DD781EBBD54DE30E88F3793F37BA6F4F37BF84419D57EB54F9C6A1FD70D0015F0B548D7E3764F86BFCB4485C5112CFF9C7576EB25F5F9FF944330AECF9864157C96991EE5F7E1ED7F11A187E9F8EFD5F102ACC393B52D87654AE27B0EF84319367789F9902ED51A5377790A66B5EDFFE05C04907FEFC66A1B8AFFEFCDE8299519DCE869A41924E002A2FE9C4775E615B66D1BCFF783A9FA1F607FF21FBC5C1A16A5BFF2A73093BA60DB61E7C2795CBEC06D21B8F9DE38966AD8110F71C30C4ECA743F0ED9A616EA4F52496C278170BD9527A9EE69F1F13071AADCE74E103780CF1B0FB1868348A9118704B9415DA3D6DF2DFA51CCB6DF02B3E57B92EFD57011C7D1747C5DB12906DA3943F61FBD9408527250902CAEEBF50A1706CF10933445AABFA3681BA3ED7E64653173507D02381C9F607BE2EE1CEB3F3637A7692E0B7EE48E330777D5E62692DE73D040E28B47830178BA89F1851B2512C9DF774466B4B4B04DE0191D7A956A72B761B874EBB025D880D7C2487B5C802BD4401A5DE92172EB0BE5F9A6B31A420A607E6FEBE36BE25EAE47B76218EFD635292A0B757C232D7D5847E48914CB3FDFCCE3189BBACD8F7C9C56218A5A35E4961766C0C8E6BFA66202D7B3D48539CE65B47E66F89B15B65D530EA7687E0BAC291DFA2BD76ACF80FDF60D39DDB983C00219838213C7247E8F03EC46899941A3372D5F732BE03E0043C034382C63000937C79377FF375C2DB35C4A0A6B57C50AE080472B96CE31115AE96C32AFF60BB2BE4BB0BB8A59A881FA3A13E1135BD9EF0AE9CAA9C1928F79018D84A8CAF9FEC8780D59FFC7DF402557748907692A8D3860C5D722D1B6BF47CF6B5628EBDFE607463806F4966FE0D13ABE012878F915B7928EB48B228636147B9FC54373FFECF33CF5764C01AB361F7C9919843D1C87D65F0288E91AD8C422BF26F010618D5C8CEC16AEDFE1BF47EEE2CA3F024EE589133571FAC3A2ED3ADACA3C2F3EA9099112F4ECD132749AEC8E025CF4E135E5D0E66297615B32AF7BF95BC2D3B0545C4BC0CBE3D636A39539DA56C6E70D19B37FF34EE0F440ADA4FDED09D1B7BFEAB4938628EB38DB66650340B534D34FD2D8E178EED2995E07CF150BBD306FB3119556F90263F8FDCE1A4A0B53713A547BAB2BF991D13C51199A8D1164DB2B2020D50F504F6E3D69B4A9B8596D10C7B079FB0E725B2532431FD78972A3B93D6B22048488B8D54522EA0DC15D12F1D23FD19FC11A5B06C0672D01ECD274F9D574D7B49304D1AFE01B502931B1146B1C60D70FE5E1FCB2A664AE75DFD51B89D92778A8A83DF82713E5FC370A1A96B7B1FEBD118C0646657A45CA1D725FA986030ABFBCEE2ABEBA186A3D2888E9D92A8AA0DCC4279CC65ECBE380AE6E8162DCE67094F3F7FF6E6B357BEA796FFEAF91141DB43E0CC9A90DE756906DEA6272819CA8D6C72E40731B0A907BCD12100F8421A00B4C52338428702AA23A401987492B04EF433F6355FC8192D6507284F03F5A661495F277AFCA21785FD627C48936F72139E5E8240DCB00997E43575982A4B426280C6FD0366671895CC7FB5C9519C9E6776A586580852ADBA380A92161A8D2CA8251D25810A64A75EFCCEBE208223593E6119AE41E7FC26A2D6360DCF86201244574045D1098281822702E4210405ADB4B20B4F95080C624EB744F24CC96CFB8A3F14FBF4056B0D42C79A122DB128CFE3C24A418AE07F7CE58DD87501D1F85D86CD0D89D917DED2E30392D3B273E8DF79F4051D3B08A0872251411C9C1C099DA98377F4BAC5260106AB4DE78C1719182EDC90C24C88FC5822536BCF40D701F7F351EEF2B15D9F8400A9786B3B40834DA8F3BF393DB9B34F876C1D44DA290BAFB9D8F56908EB3450107716C1800FF5A75DCF3BD02DF8172C962D2E3684DD43FDD8B2E01465239C86261DD525427E42A1D31D17DB4AD535402F7A284E6D46F9FB365A692016DA66FA4721021EB11FCF2FDEEFA422185FC34573F975F0BEC4217AFD0500D6A9BFEDC2E04645C2EAAE943E2B1A7F3E9E5600182803EBBEC74D7175DE6E52F3BBEBA93E45FCAFA3DCA829D59DD59B42A76026F78E18A438E62014D794494697D76954A8CCF1E08AED60AED1A9397FD4D7E50ED1B27AFE55CDFD1C437163D2FE9E30E0E97D73CBF74A54D7E3C85319CF8B972856928FB5A20148B64440685FD7E0F789D4FB1F871E4D6430A791C8A3F68BCD7FD6B55DBA686541ED59C69962D2D729D7FD0AB745F9F3D6CC75FB3049E62BBE57CFFEC7BBF94F7BAA42EEBF40380C5D9E71DFEC525D7F93F5ABC925723A35EF97E8A81757726805F2326634B1516F1FB6706C5FF977647676B95D10B64652A4243FEBFD2FDBA4F0DED73F561B28CDEAD8852D9F5CEE1C5DFE2FC2962AB04F8738B0E555C61629681F57D85EB74F95D6AF8796D397DFD32BEC32ACC50F67C46FC535BC9340B31825B3E6DC2C0CD9623C8DC11A3E4C3F611FB1DD8BE6D577981EC5532AF06F7D274D90DD4236E24970656F1BCEE295213811517ED0EC7AFFF58B306D5F582D6961DA5B264AE690DE71371CA61A3BA6503B53ED165D2702DCD71D2B41271CD518575C25AF97A4AABB6180BFF5EDAAB2B6FB65B3A1AE2F37D14F22F30FBB392A64572F86CB36D306E3AA3DAA90A510BABA2E0DB4B9B15735FFF48C6B6115881D3FD0E8C5300F0E87F4CA8BA0D7AD71E1A58F69DDF37CE1E01A3F2B70E0883A12F6258D6088A37D72B93CAF1708AC44260CD150C750D3E248E87D6B54EA6E66D8F986584A8E9CD437A1340221031AE91C942EF07AD138B3B68CA34AF9A75F88FA8CFA8D69439FF4C3C33EB49D1CF16FEE04FEDAE791D529BD2326517EA93186EB8739DCEABBD386D99556CA6C777E28463429DE9DC4FD26625856BE714C3FC060698455836F0B90B5288E2041DEBCA97D2F32D66EC1E77039C1EE56A49884A89776E9578C6773297A14168E94BC5B65BF2D11BF30B96BBC3D1320857F5C3AEE93922B8BD9C8920DB1DDA6B60A35BF0451756A623E29C18D0A18C2934C96F4F7D1FA45997BB40B6197971F0B5BEDDE3FC21E39C137410F39B327B3C13456CEDC7FF1350E834C1B0D7F0F6BD87D80A473845ACD9183CFA25FA5BDB4FCCBCEC57F4D91C704792A0E9F6C64C9D87CD5D1BBC6FCF3E7CA4D7809FC06BCFF01E9730B8147FBBA531695091E3EBA9EFCF4B809AF30CD4C5173BA23EC4F545C54B682AB70540E982FCCF9FB3310E1670421820A421E4BFADCC4423FFD1F85C544B7EC189C66D85B02833B193C15FC13D1DF0B4B5A0DDEC2D6B4609DDE4A04362A6623BDEC1CE66A388885A1F0053FFD9468708A42AD7C304CCAA57D24CAA6754A71CF25A1722474DA3BFFFD7AD3402256ACA0A45CF0A15275B94612FF444E756B454A9FC37FB2876B3BDFEE5D6CED6659743F0494BE55EAFCAE1EF99CA4867EC65679685B1E9DE66954FB6BA2693DE9A26FB0101934703169229AC9FE5969330D0920525BDF72FBF8F8FB816466674C4F94624BF82D1E0BBD0D7BA07351B18F96353C4C39F036BAC909AA08B6F29BD6126281C2557A75EF9CDEC58FD8C7BE5DBAB122B5CEFE1B4920AAF94D8460D0E68AF39EDE5715904381246D31C8B407A6159013398D8A2148FC57AA3381D8D6646D3276C8039EF052995CB773F08702A0642E65C0E907F002ABB8A703C0D4AB75947C85E60CB9E2D20A27AB8C7CB1D4762228A0623EB0D2312F694D083A40059E2D9C4E812D162382789AED0BC12466F0F1A17A5B6A94BC74CDB97C72712B223FA56CD24F90FFD8B8487FB5E64D440EE72305475F3DC9E7546052F594EBD2F8F9818E77484D075A5865EE6D0F9AF9EF6972A22D8AB78F1BF0F9A20801FD078B2FA80B105083D022233D17590547FB9F1F1B7ECC6754EB8BD0147B2AF2CBE9065F448EFFD5A087C6EB8739CFD7EF8065E6A74D3452B8560A56207D29B335B2306372B5A2350BC2E40FC7CB976B2989508BE57DB1CCA8503610DE81EA5816DBA12431D95D9B636B0A021D12F317C4FA53318768A04E6A7C5F5FA58D8670EF2BE62887A0A9A66091B9AE504EAB3B83B71297E9F2509813509B1D13E4D8704C2A8C1C51BFB6C38A01C46622BEF0B482366B2F14906F1CEB789B792619758F0CD35F8540B233679FD0638D3DAE85D1FD45C041F2CA0227465100B1A2D1DAE4DFC9E8DB35F8A608720EF9062F002830910233E5233818D4F393EA4B3E1B150C8E80150AF2918AAAF949CC91C108A0094CE9F5C763ABEFEEE4E36FE569C0473F8E086424639A4AEF1B53AFAB59B70A7D798435071D7C02CF3F2BC392D119A48B6886BC4A1240206BEE56654C714B06490ADE890A4796243D277AF2D399A98D38D9F055336940EE5F96011CC2218757F3C89D22EA209D04D9D9BE2F19DC5A26B9BF403B88D2C8ACF717DF48512BE396AF4E25BD0797416AC88292EE1B6684D5DF4DF7ED087EE6990ABF17DCF8E177E228CECCAF9D3EEC1DB0718036B62697F448A84930C289DAEEE777E05CEA8C03234A705D7F4388050FBA1AC854BBC9565E62F6773611315E8A4A7F2AE5F375DA8AD35BE1279C2978015D287FAD6876A1AA9CAFB5DFF6A9E15A8987C1717E42DFD46F1A2C6A7F2C55BCC8AB9E16F6804A9110EA2FD6B82E517A19BEBDFE965A7F7A7E7371BCE1BC50F790628EE96C87B7EF72D5E9F900F2500B5A6AF8BCBF70DAEBB0E37C0367AFC75B821D4DBC8D268A10EAA082D445C5F8F1DB5351F5C39963A4C47095BCE5A8C27E5F98DF49F969E137D12CDCD79D3D1BFA33FFDA13C4322650D2E188DB4DB9CC2207D67CCF0A38AF62629C10081C455A94EC4902D93BFE1D9E6E69AE950F297E238F79AFB2A0B33CA86F1AEE3B88F00BA295D2BD54F4603CC2EDB74CCF0F8AB55BA0C92872887298C02913848544169267EE257124DA371B4CC2367E77EDE3B2E955492963C94347C0F65E46619E61669AEF66BFEB56CA7F728F422B56387AA516CD732822DE0BECA50C0343DD870856E1BC0BAF39569B5E024B7156806E35A454EC51174E6CA3EFD67F05311CD65AF6A7991E031DCE2F480C646D410B68CA471F361F38790243666508C577338B740DFD957CEB78AAFEA9164CE243EEDACAC27ED6C4B9230F85A288F7B6230CFD21B6296DE63BBB115D2DCABB4996831736CE0B90BD6E9DF15728D7B412C92EDF67499BAEC89A1AFD6A6D34238258D863E9BC2322852309CD16063A3C1AC91693238A7CC823A38FEEFC22BCFBE73153F2555C59D10D7DC29CA4741CF4DC4D51C3D3A17D179760F28D320454B835E3754C3379B9D2BAAFCCD74DF0E258FE79FE98094FCE2A8F6CB3427A70251811A424A5C9D5E2265760AF5D8D302138F2A45A1448D0D358B95FE8EE8F23D4631C07EA0A2EF30516D5FA5424920ED88236FC9C04F8E78F13460437BD9561DC1B683204986A64CE1FB24FB6FC6B8CD24ECAB7DD05841360B548A7D15ABCDC4CDA3CB0E2D5A7B3EFE46FD3B727F8ED48DA7707D464DE6520EE23FDA66DAAA235AA5E109ED440A595F92D35565F5A60A9F52900261E4960111A5253A386F69E9C038B105228C71717E2C2B916436C3A54438E2940DBD7603725ACD294EC3486074EBEB58215CF3D457AC4E262F237615E250B47FF0184585071B21C3D452D297F77316C91AD677320EFCFF23CAD156D841028FF3CDDDED9A51CE2D06D47CA9544534EDA6540389D47343CA3EF378D93355348B09A6AA284DF574EF237A66FCD8B9B238BBBE2B2417C18BB2AAD665F7B1585C03EB5E0FED4D5819D7E8D209C56647C58B474D3695302F27C24F332532979E7A83DF126DF37056EA631251510AB3148D1444CDE89FC91B70326843BC644D8033A45D27C0901CCB10119EFDC0578070416AE76F5C1ADB0CAC476B0BAA84FCEAD1AB2FFAC065FE9A81C3F4C9DA01DB7BA14539446F1435D08F477B448ABFE4CD663E2AD285B0D2B6970CB73782351D037D3F7CA52571FCDECA3275681373FC4FE9EE91FC5DA8078E54844FF54B6F655C6810E9B8F84B83F3004023B92ED6FA30741E385E71B198477220354B6989F77FF8EDD8A2FCCC3FC129B7775C99282C34A1D7902D8C3EE77224523217A49476151BCD87046EC419CEC0A5D496A98C9FE9B6C58ECDB9E149AA894E38BC474683973EE05F643E8CD76DF6FBB4A27586E4645DF7CDD66A29EE50BC7D0854FAACB28D47F3AE90305B0D0343FEFA7DBC60A3A8DF92EA56A885920454A4950678C315F2659AB28BBFD87A89BFA6C887DB432AD5F6BFDCAD689220EBD439F7A501AA8C46844946C2A4046DE04AEA0E7E154F7A42773247A254FFCE6A2F88F992A16EFB684A84A67C29B3EF9665C330FC323BD0DDF0D93B3F3C23A6665104DD9C0C7B07F51BAB051556FB96F2E21F9E3FDB23786020FD177E4ABB438995F2D0484079803A6F070B156911FC603B2740A07FFCB769225E6673AC74E6035745602360DF569DDDFA3DC51CA4BFE4BB7A9D8488FB26A4E05C4E8074323D47E5CDBFEEB5C60700CD57D2AAB31F739D85F0E887F51176EB1DB388BEA5A2F63F5517E0415ED6CD1367AF5D7F9E13FE7A80C500E567337F5640D1283F886D107BC61F6959D10D87D80FD41C89B5188D12B0E2A8E493494E37F7D46D71972F3211E1E73FDF4F69F76666F066B26BC8FF0AF2598C44CB8FDF5C2CCDC9D9A66295A58B0511BAFC9020D6840B09306BB7E70B42CCE13574D8B07885BC5B37897A6D08C065AF4179FD2BA0440B034846E953008DB827670680F407B387400E01F10C2A5A1D356E90A3D68A0573FF4B58401000C02CB60180CC2101A1802C2706918B90563E0450F13FA21D212A600654A995EA24B5C49846410664BC3DCAD32AF2C2C523194B4920EE9665822C17211569A204B575697EC92570A4A21149A60BD1ED69B61831E364A603442A9AE6C82AD126C03D826C176809D46D825C21E13ECD79743A51CAA7470D45C8EC131331CD7C371339C94E08C08678C705684F326B8A487AB50AEC34D1DDC36973BE57E79088F4478622AE6F2B2BC86773AF86086CF127C13E187A9FC849F26F8A5875A805A09EAC5F05710A581EC100ECB04601B2A2CA3E04F4926BF419DAA09E4F78063F2AAA16A775AC3EB43C623CDAC98ABEE7CF7C6D2D0CB18B47CF10ACC20987D5F0D67D6FA57B256BEEEE36BCDD3A9952ECA8FCA38D76802F9F26C975CEB9106FC364DE5AFFFFC06D64E2FF95FD0F4D0E533EB2E9BAE22A978BE54FE1D9011C52BBED61C1C3EFD37E75C1D991F0BCBE78A41C3A75686FB002FA0F5DEF7D1EFF2B54616B35445DB72757BBF050B1DE54D812236B270BFFEDDB4B316BF669AA9ACBED317757E3FA9BF2432326146299A36CBF81E7E2A232B87CFAC42D9F857E72197041F504ABFB06B9CA7CB5C12447FA73260E9E17CA27DEAE41CD7C0DF47759545A0F93D6B9AA90DE5CE338DDB33E87A54FC7FF35D23D0A91E2FBF98033625ED9B8C5C5D642D01D7A9CB55E773D9CA79C1FFB10C1B5839E323BFCAB9495B397F532EB65B542B5D886987ACBAF0B9FC8EC5D244393BF1F79A298CA1A5C79A825241005CFD58FEB26A216C045585183245A52F40F19A2596FC2FFFF1E1920314A877A722E8F1DCE6C991A6343B59180D3069A841FC46167DA9B38E96CF4734D30A95AA697BAD059B1822315FF57DA0DCAFE5850892D7AF2605C220708E47BC27FF95B49B5267D181ACC52C5F72750D9D01E08CA897A33336D6E5E7921FA8F519511541294366979555ADE809CDA0BFD8F9E03FF3AA4B82C8D993E8F6454740305318F2C77850D9A3EB31D587259831C6A87B411DA0C9B55D92A764D2A66E6D55E61AEF09A101E34E649CFFE61611C4F300219A126A05F93E5CE719F3877A956B19FD730037B43B576F2A103A6C33342E14011CAADA95414FDC6F1DD82CA6A09937B2BF18309DBB9AE3B36BC43B91BD2CBA198407CD3453290A505262FD0A77D4EBFBEE52A25EAD93159F83EDAE2E42569A97DF45619DAA73F79B7FE42900DCB32D596950D8BB86A9CA05656922DC421A806B4D2A79A4B5345ED5AF41D97F637DAA4625B8E74E558543B94F0763CD11AA0F42ECFD6C3B95F4ED58AA94EAD1947E8DAB7FB13451627FC89FA46940B79B99A0B34FB2D2AE6A37E3FFBE5C1BD8D7F4B61F95548CA154C005AD7A2604E97482850448F3BFAC49E89A25D5B9C77E2350E089867BF711F3700EC269E8E37771C105940BD46EDECA0E524574D9B4E0BE736ACF4A6199AA9628532CC77EF05580DFDCD92BFD08886398D2ADCF6ADDBD6527FD8AA668E7901004E28FFB0882EC4F34D21CF32E9723DE9D899F6A09C681B6BBF49F955D92C8AA1BE5A3DC517AF229087C9460D20F81B7E282CA3667A6B82C35A025B5DBFD0B0D502DE773D9CA0908D5A61174AEAE7425BBA2D5D79E25B343F2BF5E4DFE4A0DC30580361C6B0A05FB01284E438782A86A26ED9A11AD011DACDB3E319EC8C6B8A7AE1EA7E36B426B3D5FECB5BAEB0999FA2EAEE52A2E0128A98DA94AEA32494DBB5A7E67AEC142691A91197E19C1688FAEA7D27A5A073CB42D376810CD8AA93AD2FC943F5C6BA6797DA87AF337B71AC64C7116E557BFF7BF32738D40E9347EECE3272D8A5410F02512B22EBFF6C1CF65B8C497F84EFE761C439BD7A05745C4BD3970AD9702D13A7F0179A567381AD96ED66A71061DAEDDEF052D513FE03A94E440B4E2411DBE78630E7F0D999199A270A34693B59F11D85B3EC1AAEFB36719CFDE0F1E88CBB0A56BA00E541D28F179C145DA54B53217BD702181A77C87FF17F72251310DA4CDDC9BB433ECA0CA7B723D27D32B958CF7DBE733E97B8606326FB1D5C9E103C896B4FFA7FB7223E14EE73B875E8CDF2E4B3B1BEBDD4FA1EA63BE1184FD3F67253275712DBAD67B08F1F87F06DB139A05ECF54A0A41FF6C64D0B77DF0AD4BB46FAA04642C43B85FF9D15E6DE2A29DAF2A1819754B6A370B2A98ABD77414510965EAC554B51C22A25B1ADF88393FB9868053F88533999874BB445E17469067FF78FE1E1EEEDB28E35F4DA042517A9D157954C9EBBCCE940AECC394793855F7E79A6950A1DAED79A5051D76B568525E2AF286741D7073D018B395735247B39C4D30A5FA047859A8A19DDB442665D2B6FCE7ACD6AF165EACF4253E16477BACD75BC073F843B9A86A69C1385D91805B8586FEACDDBED9806C1CC5B59E87A64ED9F9FF05E97FD1D5FA26CABD6E0317B42D5BB879CAE4BFD6EFCC370DC0B9D0B89E3DC2F185E6FBC99B7CA6ED55AA615F2C26E71CA392D67219CDAD84D3F0CFAB2DFF490ED2BCBBD98448D569E40CC8E259B951E123E9CDC32FD51ABACE1574AC6A87BA6DBC2ABE173523B4BD9108CF6B00A09810C405EEB88ACFA41DBA142974898E0530F2587B1A5091CAF186EB51AD33F9EF65BE41C9F9FE136FF7A7206857AE3E79094A7F6DCA2908015D02D10D5440AAE8F7DBD6EF7DF836190EAE9BB817FD7F0B005793F175E6CA1F30D4ABE1C215246853AC25178E6829CEB934298F954946303EBCAC5FDCBC5CB0AB183DA5D497FDFC6A2AE3C7D0DC739042B93354EB676C9C62992A75667D374EA2271D9CF95EBE5DFA70705CFE120FA42E7BBA7FF82390CB08A69E3D23153969C36322F1E86495FB91C011B494A0F3984EDD7AD38ACF8433085BB8DECB8ACCCD77D2A0BD73EACDD0808C5682CD9BBF09DE3318DD0CB345A1BC87A777B2AA2DA49DD00535DDC8CD6D4E73E0D7FDDD4AD0744C5368B1E636B356AAEAEA56B6DB6855485DD181287DF13E15876C8AB7E6B6EC7A262384F39712634FBFA804FD95B77FF439F47EFA0C5D660A9A0BDA77234798CF10A7AEB9BB4EA864E3ECD328F557D8D5E25AC1C38458262BDDC86C6DF59DD2A113CCD8CB2383590BB4A9CABCE31A803D5D186AF70010D43DF359FE498AB00F925DCFFCBEEE77F202484A40C63265EBA2FC98ED72257AD78432D857D2CD398C2AC5E8FB7B26ED722ADDEF3183FB0B1D02471B6E79E457361AE8E88D1E25273D8D0E454F9EB7913577D216AE099DF246EB7E06E84CAE01DDB0EBCA72FD16CDF54BE5F99DDA3197EA604ED027DA816F338CC099B7E69E799FF2425D0DF5F3516D435D05B057CC8AC4AEF60E5B5C5A9CA16FCEA515E1ACDFD9CA3ECFB81674A7B90876D5424D126DCA53F60331A501F202CEE40F29A51AA28665C29D7A04931F699758F0D80DCC468DA36B729F2BFDAA3CA6CDE3AFC58227F28CB1D0CB27A585B6AC71F17A51267B00A4AA042BC9629D5503A6709C400D720D8CD0E499F8DCD1D5021E5A8645AE4C15A42C7287366F9D954D7959BC5D51C857E4C0AB495AB2D0E5C9721A65EB69005DBA91E3ECB4385DAA23FFD6A43DB490E8583AAF49B1336584FEADE5A1CEDC487EAE26E2117ABF716D220CE829BE7A3B5088DBFF4D46BF58532D1B7377932BDAFF534480A4EECF5CE88E45D2A7BB8396BD0CA5F42F4BEF2724EEAB7BEBCE7903BA3A9F8166299BFA58559BDFEA0DD776EC9CDEE70C187CBCFD5466A085E22FA9D1204A772EB971863D94DF88A16DD471136BE8FCA89F73C77275DA44E641A95B7AE7CFCA61A870494226FBBD9C52C5BD32E549DB45F92066E217FE8C0B353EDEBB203F85257BA9735CB82E73B7C3361E4CCF38E749598BD9C7724DA9EC47F063DCABF2795C6B78FC61DD13D1578D9F72B36206D42CD760D58C46BFCF1D5D2DE0A1E50B9F07B6FCC9225F9FC856129FF10C2DBE1E2D5668FA6A02279CADBBF7975CAD19D0ED1BF94375FF6965B74519B1C569D4C34C3DDA62FA4AB2B5726AE01F7DAB5AA1EE21B0FADDF8071AD42ABA1009257773F10F4A6CE72A262F79FD739F3782B83D109279227A959F3B306DD9530C12D1DBDC776ECD52D35DD7F2BC6F69BB2CD57789D870A329CB08E7A07339A4F39C232493AF655E831CCE08A6F3BFA4E1CE259C7711803A5759187C7F65AB292045D78511A5D6CA63E59B93FE5E6F59254E6330E5B10C09D18EFD1BA6B8A27A17985293F4B4B3BAC7F3465AC54734D7E4CCA4646653D2B222C69766012294E8B12569DC141975ADB561E7F0CF6A622CB129CEA5A5090EA219900BC97E99C0B12BB87437BF9DABF4257E66D788698BBCF9FB9CB62072AD7F57E5E58263EAE83CF2212ED08D7634EE5738287A94E97B20942E340662A62FDFD891EF326EA01E7533BC9C6BF3ACF07735DFB04BFF27FD22585802875E644C0E6FE09B5B556ECA857A36BA704C0BCF08572953A706EED21BD42BBA70A219C8ACF84B1374B85CA7C7D8DDCDCD0E7D3AB86AA05E5FEAAA642FC96D67978C99DC19992D41BA8B28BCAF73FEFE5A9F984253A137E428AF6F793DF02576695921F31AD94B2353D50A75861D255C77714B34B4CAA377025DE435D30A7DAA6B330988D0C6FB449BE8D5233493CE9EDDFC2DF0C95583BA1C20185A5C3E8386371751EDEF50DE414BC9DAD94B3EA0BF6893E38D40FE1BA13A33419FEDD3C8F6A64ED8A95D4FE32A62C56BD2162AE1E4F075909386B4ACA851C67EF914879E9ACA88C134C60193D23D7AF2C5F399A335924ECB4A5271F1AE3408654CDE7BB9A12E36935719B3061C14E9067A1D639E220EC207155307DC14094DA89BB1F6224867857FAFEAB1A57444D0E428E3D55A43FA65AA7279C949AEEE396F5C71F6AA808781C84EBE49BDD8A4735D26CE50EC1295AF49A23FA507A49F3913D1B6442BDD389271948D536F0FCA4920E48FCA1FE4A24C94BF3614172C1F653E0C276D03E6D2999148237E2AA56FD627FAC4EECA349439CADC6D1AA0600AC363FA7CB7D3B330C25702C19B0B658E9BB8EDB0CF9D20E14F41B777B8F11E850772AA2672881E6CE82FB3E1F89FD3E1EEDF636A230E828312CC6B9C9CB48AAA363F54E17C2EF2ADC3F301433F565B7C781003A049BC74C72C65661E949EB5989529EAC4D306D8D3126826685A95C5C9C0017B307E3DC7A1AB4DADDD1E690B229BD245F9B176CA73994A0655902CA12B91054759E24B52EB87F5E8B1AA96A87A4D18FC3AE80487D377F2786E88404940C674974794D7988031FFF0BE95A2EE6770A1CF31166882086AD2F7D8763F8169A1169A516DF125BF7EB93181535B7D0FAD2EBC0F5F82A3ECB1E59369212CCADD550393A57676FE12C2B9EC2264AD4A2C6949F8EFD59B104B040EC3806647F9216AF1EF4A17D676C530F1F7E9E3979CE9EA9E2EB927B05A0E218144B01F299876677DA0D9B53BD1F89407A038973C343D7425297BBDF0574D4AE8A2843C8F592C66E21CEF11BD8CD9A0AFD834A0AC8D6E529F16023F9483A40C54D2B2A1D6DAB8AD7EE003C4A6B144D46FA89C9112D780B24599CC9982BC37948C7181B3B75D020D2088BFEBD4CE9FFE6FE4AD2BC30535DFC842B0045BE8264281665AA3521E1D61441ADDEAC7BAF8E2287B3651F0DB491B0F942FCD87A105B4DFD284B9F201B5A5194C216B9D11659445655BC0F2A937298D2FEB90265DBF3A309BF8649B1B8E16E49AF014E71CFEB99EAB84A5370F4347D16D160540280C7F4D02621637691B28E7EFB3E98CF8BB461BEFA6CB3DEE00AF489926DCD2C750C74965FFB1896D4D01BB8116C792F88057891952FA57B52A5E79CEDC6C14638E566B934F59AA31219CCBC70E5AA2EE72A0A551268F97433364AAB270A4714ED223DAA374B5301E0626AB3AC65565D5968F9131F74E4D7A671A3F1D98BB7B50A34B930BD42B1C1DEDFFACA29CA8B2460DA937346B0B46C0A3EF0F144C6F0DFC2B134557B0B641BEFB29241A42275BF7E8E69F445C4D1CB96E3A1069EA3A9F0CBA1D6FC788858D4804480A0C520945054AF59CC55C534C6997E5021ACDD5C47E9B36114EBB05BA0F4F706FD6A050C4CD2FFE5A0BB344993719DB8B544D52FB5CCDDD3A4F29199C871DB3A696FEDCA693364EA76EBF099D3A43D301BDCB5C5D6C9D17BD811EE62186FD8E7F65683FE0E9B934FD44CFB96790BADEC68616E78D8006E199823C9C34CF2E5492EA194F3E9BAF689F5567E8E79113CB525C73E22526D3C521897A28C639257440603B89467FC221A7598371AD74FB5EA305CDC21F6E03C1A2E27D32E87538AAE8310FD19DD720FF88E356CAD41F36E950B825F8292939BE54CB8858244EC91D1C64440D8E6A7F7BC9F13E0ACFEEB32E0A0277C9457692F54B717DCDB3F5AA0C5ECDF76C3D69D10350CE9B29241351AFBFEDBCFEAA72C5705C66AE65401B2BD7FCFF8BFEFCBCA39C47BB2FC088256E5B2C3F0AB457C662C52FD86EB9752B31EA5D2D0A5D90551A92836C1CDDD81ACAD2DE27F80CB0D84335B7B42A57F47DDA9B31BCF4DF288C961CE7F8772A856BEE99EBC82F2DED1C40FD20BC8F61E3B3F6E4D073C5F3D6B40B6E8A1188EE7B140A2F56DA3FEF78AF1C3A60BAAEE31C5BC36AEA8D01EF5870E8259AAD85ADAE19BFDD356AE87F465CF3583F5CABE1FE8506E78E4EC03BA0D18D7230353F84F448220639D44018C472A12085D03BBCC70E2F516A9C1C91E1BAE989EAD3EFA6AE893B0119B881A1ECBFC28B56E9C552A94F2B87075BD4B729058B9AD86CB3FF84F7436AFA3255CF208A305546A1CEC7C3ABE1D4E48320359B6AF572146DDD2840FF73D094F91319CF64A6CBFCCC160BF1FFD41F6B36D1EAC452AD83957CA4F95F3DF093F69829A0023ECD2A941D74BDEE31A3A871E7D5D52E22076A0FAC0B8A3F0847720DC901BF883BC899E0E2E6771EE94F21D90C876753768EDF73BB961B37B927B4E83D292CF306C13F6C8F7192CA4EF5C9AEB897D0977FB04548170F23AFEEE0F7E9AF296265F6D3666DF1A2D4C4B50FCB1BA532D6A5797A1C085FAFA40F147BF4A8ABD0A268AE414B7A97FBEC3029CBFFB2776A4C7F0866B0E42D30CA91DEF209B938C75AB3A406523DB71EDB1E34F3F2192B5E5CE9DF3CB006431E824B318686D10AC1BBDFE4A91E688C1A98BF229959F06678B17910E15F02BBD3E3EFA7EC24B272A4DD40638BCF0E04C35985D63E074E78B6157BD10CA8E1A3A1A149B7B50F0A5CD40E2EE60B251B2ADF9EB9CC9667A3F5E67DE1ED94935C896FF1AF03650F8DDAF69D4D3AFACA6A7FA508A11F0EFEB96A98F9B74FFFC5FD268E49B7B8F67871D6C3B14A8C29E9D9CA05B13DD09D11C409D5D877577A9D42D4763D32D28B7C7CF2FA21C18BEFBAE1D94C3453412D2ED581F0753C4A433BA26272FCAABD23C35BE73F182FE9CA73B9368FC9E8B156C0F883DFB03E4040D12AF9027AE0DA63E3B4F6EE05DD0924E90C6067B60A4852F01E8AB1F630A11414A2B4B3D127C1CCB9E8F271B1CC3D08239BD45F8571EF7F8ED898FDE395519002C222AC99003B1B7F9725A07212958E2295657177B7A1ED43A53D04AF3A270D2A6CDAED444D76CF1E6929D43BB1EB68E271203998E2604ACFE743D2FDF19FB50CC023F29F885B4AC9AF7E08488C7DDFB845547F2384405B2438E7908312236400FBFF47E3EDAF23397CE36C2B2013DDFCB72D337FF0E3285287D563D84FD55035C19296AE55718938D591069BABF159D9FB1740A99E779AF1CC16EE2349FC2DF3A3D067D432AEEADE2BB6838C5AB53895ACB5CC1C1E6DABEB35B988C0382E5F08B1D829B347C5278015000098FC08426F4B50004000D87F426E44F0F02BA5E3FF54C463FE495F2FA494B0377CE384C0559E1CE964637718547BB8CD6CB7E2415F984324759CBD6504D727B835427B9BED213E7E6713EA3C01C1EAC7B0320A5697198DA69B3933A475CB65CFDACB4B3CAED5165C1E4171C5C810B4403B6D062FCBE820D94024AC1C209CBD78BCA9C6F1384C73A75222B0EDF9B1D91C9ADB42F88790DF343A839849FB21A69B787087CF6438F5FBFDCBEBB55855F0E8BB52CD444D50D405171CFEFA3EC8763C119AB4C262F3CFB1764D5A8253130373EA9B32A9BDA1771921EB997AB2A03CB86A810413AF28D0B8ED8EA1D3B2444117170F4F952EA27ED297DDF14D5A2E1A96BD5A691D89058BBBB0737F4B6456DDAAC6D8DA4EB1C7A2B6710DE1D1107FEB79EE097E2B956204E23DC723C4BECE72B192B7C990B5463C9828550DB177EDBB5593E8F704FD12323B90C277B07ADC6EB632DBB2383F0B9E41ED4DC51979EBE031A50106191B4DA326F31592B0836E3BDC788C7156C174CD8E4B5994B41B627E96F32AD64EBCA49365C853C73426521A7CE541DBF2FB979E87F8FFEB02A18DD6C90D00FB099345EDFB5FCE9E79931869B1FE0FB69F5734DB14A18DB258DFB82EC7FE6F57073A96FFD9FEB8EE721254AC3560FCBCCA0F4CB8AC75F2AF53D695DD28A254FF2A0FD5D09C47FC581D2570296557AF1B0978971BFDB641DF93CF2B59250E99EC452519802F1C0BD6DE26D0E59ED5548B6816B40C00521F7C6D4BFF0EC9807A8BD5ECD8BF3BC4B2A08A27B26B39EC6D1756D254E44ED88CF91F4409C393DDF414AFEE02C874135434ECCAD6FAE2B57B7CE574A4AB971ADDBDF79FDAB58CFDA1B35C3EB98232A7171CFC773D55FF46E1F0CF85F4E007C69F4D855C1276489DA001E5A4CD9C4EDAC78FDDAF3E1CB6C9FE929E38093A12E313177F1D27BF4EAE3DEE83C4A0DB578E42D4B88FF617C8E8E251C91639362B1AF13D7957604D5E476CED8EF6C4DA3D2BB003D8AE493DCE68ECA089737A94A8E1E4A4B9539570E22F340746BF0283B2236DAD4891EF109325F34928977E88B276A4F0A7FC2F0F8604F6F50D767E578E7D41915E3D794BCBC9F2EA80EE38DE28199066DD286F321C4AE40EFA745E5F4438ACBAA7AD47D8861B12C730F7E3603C77EE1F215B3F2FFB770A810BF5687D52AE09B394A26D29008D3E4DAA40067F01B0CCEBB7A658622540FD08EF8783BA1BAEECF942C4BE193F143F636BF3169FC9916806ABDA0B737F7127D793861982023119EA5AFC469E38242607741AFCA2DBDAD5E8C1E622AFC36B66B2EA2958CC81FD8892047B40E7284800E378CFC09F70F0B7BF5BD247E5C72307ABDF8451DD41314BAF82292C1D63F684A49CCE340AA14DB6F08F11E8231F01C765A3E1DF5149AF00723F06AA9EDFDD96F15C93939D8CB44455E5CC01314D3F3D74CF5605C0C0AC04C1BFDAC716C958CA62A9C35AB3F44A95B592F4CCD8BF32FA4587A41231D3334505B13A1C2551CBB5301A7BE7005806307503BB63782565521A029179E63E68D129C2F4573FAA2A631B8D749CAF5AD89AB50B2883F4F708295D5E97B5EFCEA99482A0BCD93B569D8E7BD148F6E27C8B1C4A631AB38584437433FBC84206F1D61005A0923F72E3A84C4634DC0F7A53B99ADD1CE5C10F42269E45B735010E260FD15D7F61C5C82F0D9D525FD18F244B888CD0C7F555C01C6EEBDD3A76E0E40521CD3189B7B00B8319F45CC7EDFF117AE387A825EC966FA4317214A4F3D9ACEEA81EA69C48EB4AEF91ABA6B722AFAD6FE5103A603571E4A0CD421B3349D983DD92F0FFBB1D46B101E62AD84F6FAA13B231F5ACFBB8506E2E7C31AF6137ACF8C4C0F09A329A6ED685587002FF4B5E3FC5D23BC731A525E8FDEE642581CC59E87EAB1E5B63B47E8BDB171790A3D8ADD3ACA737F0C8FC8FECE87A3431BC4B48527766A124B7D1E9B73EA2B42534380AB9421C352EC8C552608E658C410EBD23E84917C2C8949B8FC1191E8BD1E86BCDD120A7590411B804D40990B0DA3424D7A9AAA6C7EAC1C7CE3F8B4A40853B2094608F726DA5D26ADA3C519BBBEEF3F0769E36F682F634AB73B547D49F77B9DD86C3BE28168A3A724CA77A7C888D549B52CB7D2BFC5E505E31F3F7967218184E9C655D389FA6476C1EF0270DB51B692A724A6B42FB0D4F9C465AA1B011C2D0D54FEF4070838412272DC0E5974458EBAFCF31BBB53692FAAC486AA49F8A384B9EEF34421115F1D966FECAA000962EC83EA72EA53404525555610E4C75F0FE3EB631CF28A6E26C658BA55181215C2CDC00624ED974BF0DEA2E4712E0C82170DAA0181FD633B8978FF423A0283199F2E0B11253F319D4923DA142E4DF094B97131595D8BE414D634C5A00C03A644B4567D72C11E0530125C834361C53DCC2BFA6999361C1FA84F77F8BEA9E2D7C13347FB8E6A23DBF6736B91AA508FD9B6EDF02AA1665167F13FFB665CA26F6CBA3F340A32FF298042BA98FE29C31C6CD97BB5CFF6C4FB9D6468082CF5B6FF1FF16C2EFBDC9C5563626716610112674EC1F9CE81FF22F7D807C74BC328A963BB87A3E865E64E6227C5FCFA588D11455FE05E2451CA7AF7D7EECBA54ABBBE62B2D664C413CF78F55821AFE41C7789E959C58048D73F82530178C8422EF438A50AA13E08E977EB6D86D04C4C7240296385D8910C445E0B211ED8509C11EDDB9CFCB1BAE76B15636054724A52AB34E2A795D9A653FBEF3A7AF6B1247168078B71C389C24640CD6D616234C3998CB632D305CE9DB2FCCC56394EE49B4D491ED194086A2ECD29FB60D983E8FC69E02D040731EE5B47752ECA809707086E3F7BBBB71F07EC0D574F113294986D21F9D6623AA5695F7F61F139A437E92826E01A71D6A52125A1F8764DEDEC90FC7C72149E41241F8BD525CDB1B0C3BCA70AFF4774734BD2624A4EDF94746BA7C91F8E27400CE37EF3ECAD4731CBACC4F7A31F56AE0C33B20B8513D420FC0720079A8474A4DE4D52100827CDB72570166121CA25407E022FC50CA649A4E3DA057A9D1D120EB0AD3A3541500803F7D784E302D227FE093BFA035C48BDCC619BF70291EC9132AC3BE2FFF6710208048D003725D50E2850E014A109404184102C094001C0FC01360D840A73C7149961BD7EC909F5A54C23C5EE1B5992F986D6798904ED7AED6B59D6FEE80D52F8149533FDFD11DA0DCA5B11B6BBB9EC22674A3B85B4B93E32A90E434BB3A2B3E9441DD733718291CDA9E84A154784A730497872FDCCC05D0F60C2911FBE847960267ED7C5A7831B39FEB326AB8FA9A44ADAE8A7EC16061E89CA08D013F4C43E64C2CFCC7259DCF7F7BFCBB9935A1BEC0F87C0CDD2A87C23E94598861F6384B528968BFF4A0CCC86678BF11C3483C1AA8D2590897E27608CBACBFC2538BE3BC0E09218B728E4E59126AEC87837986578EAA2249CBACDD4A5D3547625DD8FA1F1CE24494557E57AFBCFA1FF31E83FC3C734329755CCCF6DBF2D74CC6AD65DC0C4917F17C8DEE1F040FA2C850E8734304D1FA660C915087F1781A662A616D1E739B369A3EB77002C7483267BA049993606C341797C01A411855D0399F74FBA4A9F792B1A8E7ACACF43AD66EBC542AEBD90E37F9A7E3C4496564DF8F4DFEF693904225BE989E4A6FE0F6D04CB94E9C9283F18CF21FD9ECB8686597B675087249F903885E4FD76AF756ED615EE372512E6D200A1BB5E7BC234ADAA8D36B10966856867F6C61BFFA9CB8886E723131B4B9305F642676B00782924214E9027145B45F426381940DD21AB776131787C34BFD8E88B14B9995284C264B2EFF2FC8AD9CBFE55D418A57CE8F842032DE6F6E3B8B6E4DAAFAA0251C238BADF4723E3C8833A30EE36AA921D646B8FA8FC3DB2EE23ADD86DCE65E5851E0BAD52A4F524325AE6ABD72E7F6CFCB5AB4C5E2DD39ED20E23C0E4A3BE1313A5F57865178AE6BE5C03A896CB755D3600F14FEE510B7BEAF033273ACD5F80E7395DC6DDA3E6E7F75985E0DA64E4E51FAA0D64B5ABB9B0AB9DA454B757A63442466EB6F25D71F85CF96BEE2E8BBF61B98CAE322055B49A3455DF9921B6591FC9D08296296C3BA8114AA4B17B7340AF25A0B665D8731F60BF3E419FCC9495ABFF92F90E4BEB69191924A40AA54E7DB25F65E36127536C204C337BAD6A257653EFCC46889A815ED797F7E1ABFBE1C575D26D65C98067271352B29AB274C4EE094F8299A6DBDAF95F1B4A4B20F2CCAFB3EC1E1DE68DCAFD0BE660F75F4BEFD77578E073075BA401E60BBB851BFB3558E7C8697CF2898D26C40C649FD544A759549D4FE6DFFC53FD04D5C11D4CACDDF3F198CDB5B9C015A20EA5D6E6D078BB358910E73F8E548C4B1709FBFEF80844E64DDD4FBB84808D5D0D57E7C9918C18CACE1F13352F555AFD32912A5ACFA2D9495CCDF1A711FC9C7FB60C0B43BF0AFC4D35DB300CAB846FD34B110DDF6C3CFE5A886CE9BA471B605054AD41795DA15C8E6D711DA76917FDC9CDC128D22F6D1CF7077C0BBEEB7CBA1D6B34B994567C5C6E57AEF809E40629A531C82D454EFC8777FF624DA73EEBDE01BDB7FAD63425C5937F885A8189668EBCB726F9C30A460F4FEDB20121C74CAA9A70C7ED2A2F66220E54EFC43D05DC05F85092E7805E78C140B83DF401989CF23BAE651089AED91EC3F9DF6F8342CCF06AEDFCEA2E6D1B8B292E6DEF97620F5054566CE05F6C06147222C869282FD2012D3FBA39AC3BB5D8121D732C891A1C31E6E681212E0E4FFA440A040C9924DDA5F709EC926004D195E87D42B2AF37B1F299B9CA07741216525E7A0111D362CC8F6AB3480C5593E4DE8734D726950C2B3FBCB2D2A6FB710A4B5732EF04EE5BFDAF9EA28EFD433856F123D394058211D4CE01B81AD5FC43D434B66158E98852E2AF445D083F2385B7A557B2C09B1A6934FB2B250E30B68934B91E82CD1D26A2365587FEF16B4D3EF9FF6B811C43286F18E3EFC450C860D6A97E907FF2164930F31C6B6FAE557ABF0E2354BEE98984541230B118F1752D6E293BE24D58B5317C3607D037E637069103EC96622527BA82E0A0DA18C2A22B873A99F0029F2DEACBE2B034F119050888ADFAA7AF76DA910462CCE29747D581D201C979F09A0B89AFB1D4AEF9054B8DE374A3DFEF1136153D3956031A6B2701AC04598C92650A0F223C9435D3B874DBD3B5699CB1D880EA0E0B924A74B68C91BA2C9E30D1D350A15A601C8BB23C8FD7E92A0EDBB489BAEF21404D5EDACC14B3BAE1FB91558848F8CD4DEBF5FE74D0EE24F2C12018E04706C3F93C4D33DBBF659211345BA5A9E7BD40B54F14ED2AEE1E26BD8F330208663E3EE2B6B7ADDB915596DB031B7D3BAE275B4131A56E0504253167FFE82990358B58AA21092C34A478241A3FB86FCA7BA51F55F266817E9D57F39E0A96BBD4161B1D7DD954B662D1D3207905E1730509F61819A4114FD00AC21010AB673E6EC15DC40A4CEDB6EDC6DF92172D4151D1D89502475BB63BB7C27EC605C5D6368C622D452E453E026606DA3BB4B716CFB618B05ECDE135F08B8F4D1B630F9B7DF7480903BD8D516A7CFCED18EA8DBB48B96CC105E1B11E4DEA3A8B501948F492FB13EE4A07A12B2D00F063C335A0D7BFE63B5B3ACC967A18D58C0DAD7660E146E7410EA063EAE17636E0C0174DD072BF4DB408B43CF7C3D66CEEA0D9B67AE7DA4B58B15272F299D2321581D6E330EF23E3A1406777FA99E11759A9F465A1EBF6BD85B2654EC140E4A5275FAAF37F9E070212AD08E30F7B95F831514B31D1F20E1FEE7B53527F735C11B74000B8B25F382FB3B5DFA0172E80C30E15661153B4D55706C2B91BF57CA37CBF0B31115B1A1FA4F524B70A43A65E5961B7FDBD0FBF8D0D24654B3CA72E3F0A635637B7CFACB9F4CE69462EC04195B832E72FFE4160D37321ADECBC99757849AFD4D8CEA410A8CE9F805E999276DB4F2B1EA08E29C33021162437DEEB5F4558A29C08136B2CA7A9F62FB50108635F8D9ABC744442AA840A8D8D59356EC56A776CD101FC73C4B401119EA6A5C7B4CD170ADFB7289232052D16862BB39006A943F3F969743BE337E7F0E3CEA07F13150081401E0211028FA0662B86BF452E14AF7821FDBF710354917FD9C2AB4271E7E1A5C146EDABDB35427AE061F6C0BBD59A83A5728077C903D92895702A03C4251301B06C95745A87159BB2073537742D87103BDCC2B11C6098471AC132352360BA6BF437299F648031EE62A6D52E502B420C54020933966CA33B44C10E9D50D85875AE4589BAB4086089CDC3732BE06996B2F7BFF0C089EABB65334AD49BCD26826B8F769C7A98630119730B4BAC1B0C35373E55FF42E6C14A43732111089D9F7CF591B5569A8F5500776C6A0BAB73A8E1A512D990861444CB02B3672CA79C4C84E7FFA1737B31AD5E8C64564E8F117E68C3E6908E14A6E4861100645CDE90703C6BE9761E65262392988AA6FD97BFD91F96FDD39CCB4C7D1969DAD54A7AEF7BA018FE7C151C438E10A4AF880F0E39388C43F1C9BF9C737161EDBE955354B1866599D1071804235AA77C9ECC9C922C1D54171AF2027FFFFBC491A9EDCD8768A80E00EE66B23D4E59F865CD043A59C781AB07DB9C5ECD242B278B643D87FD97663AF08A908532FF47F165C98B90A3A9D1A24DB00EC5BAD73E6362CE9977820FF3B575CEC491D1ED669491A6F68863B4764E7E80DC4306FFCFDACA16CD62EAE160D63C6D238B1C6CB72612A315DDC108D28370D81D2BD2A8362F6ADE124513CE952400D01080D2227FF5BA541FCD4B9CC1898EEC96762EFBFBB2AE31FBE2BD57AF3BBAD65456B31004A09612AA904555F8210C889244631CE139FC02C93A4C44ED14C7ADD00F851D6C95F8203FB3F42823FF83F26CA4F5B345F094391950E87993AE90F070BC278CE3E62C7429C491EE08F0E0A08B3A158D6F5DD4E640BEEE40E871B3EEF353CE4A3BFF43E6708AF4A81DBCACFB2C63AE2A053C1F4D71F33528629E2B028B16F33B2EBB016FE95A731C582804D24E5C378DA818EF76C2C7286D994798DBFB751895D0737492DBC52550BA51DB85F22DF159E35FD2A6473D031A767667A6F0BD32F17CF1DBF321B8B10C8158AC5AE2C9420BFE45C8CE10F5B7D7D4FF5F7B7517ABC2B2068D11CA6254FF9591C4B8F9F5EBA8C7179C67D9FC475C6A600A66B1E8AF32657E5F32C5C96474183B819F0E8601692637025B10C29FBD2D1310035915BC435B2F70F4495E4B4A020A4089894BFB4B6109943D5EE6A98932E72D5F4E5648782A6BFF5A058FB4FE7269C339A1D06AFE90AA3A5C53B8E9EE05F705C11F3DECF77FC98F7D80ED23A28CCB9F3D8CBC54502FDD5FD7F40893C4D91A5B5BD89E61FB94D790477033C4B658C1440F88C856EF1FED56DAE588A1270DD333844455BF0D82AC65947FFC57771EB625F1225D2E5C2165B3EE9907B9480772B66ECA445D093E0F3543034D4D6524CE7C73BBBF205AA5F332C9D248A30CCBF325E5B96271991B26C2E8C160F7FAD5640AC3BC4F5CE1EFA7F58AA93797DDE18B337FC24FB06515B5A1115E6EDA2CBBDC63B6B38A64A2F45994F836A38DE5690FAF409C7C6A9F2E04CB34D536A3F1FA80AEF590BE6546213889BA3690304BFDE2CFE5BD080D85271FCFAFB3527AFBE652E85FFCE999CB334DF0962DFEEBBBEF997B2FF66879EF7372529837EF53F4610ADC442467F7C72BEB96065EBD0BF91296B5B38641057F33D3B89878071C8C795277D115C901C904159102FF67CC8978DBE45895C4E6F5D5E57BDFDD07A2EA0DE1651A32638D9535C0C97F5634323F17CBCE45C105FFFF48499ADFA28C469FC6839F88B5399316B06D2322CF4E4FFEE37A961DC69F2210A4BDC0ADAFE1748AB6B06CA954BBDFF4B9E78065F01EDB6217F4C38417C5C48890463E035C87D528E85ABF449B11684B140FC38083361BF24B7B4FFEDCE56B6AC6D05D29CBD413A80239A4D0AB62C00DFFFF6B47CCB790536750A90AE22598BD749DF063225E3F883E75A5B0FB97566A0DD9BAA05B355FEFD416C93A47D04A779984FDA368538AC290EA6C7265E50A549BC63AF0A7A0DF5E806E9F3CCA1B42CAA950C4E2E19D427C81B91B2366F08DACFD7F6F2771B5A9677D5244BB0504466BA03932C445513B4AFA7B6E41F5663C7D2B5E61A6EE8253B487F6F6BA70C587BCA7AAC9D51250FEAB3047AA54D9091FA2F6E65193E9B7137FC8846CDD346A8D42BD72063652E268CDFDF5D76B25D79CD5A5235FE3EFF50021D472D5EE14BF007CD9D5304AB3AC499B94964081DC265D356EDC2F72FE96C874F6DE5CE138EC15B08883E4DF9A822EC2762B8E473600811E56F5C9FB325D009CEB608EE097AB23CA8D7EC19663EB32A42C882105525D2B6F18C46EB23447942E68EFB61D0EFCF412615181A951A341E532106EDBAE5DDC7C753324E824C115624DA32DF12D30B253AE4AA71C6B8257681019D3A03D564EA29509DA7E413E2FBEC4777BA68BC0BB19E9EE52A0387CC2E5CCCBF644F1102CD284E0D12FD12C512B2CE0E7E44FCEBB76B4865BB14E1D41E481C4AD60A6BCFC5044217EA99352E8CB19881AF3348929A54FA8EB83AE798A1F3743384C59904AEAD1848327F9BF64B501C4FB04ADECD490F6843787B7232C87C6170C54D0CE29F96823D0A95E35B49B61395D92086BBFE25B07C5AFAE15FBBF01B808682CE0D3831483A2E9F69DAF59F58A1D8C1026B85FBB9160A522490CCC53A6F2C41335F23F4091E7B192114E4C8404490E59B9C3537D36C14E4E4F9B7388B6CA62B9EE5C820F9B851C6BBCB3A9393E6FDCCDE25E3A97A0A1118201BA72CF4781E9112C1569D5611E8E9AA16DA2A67D062AE2B9CFC2DD4FE7FBDAD1C8134778DF597F53F217C06F0C47A91113046FF5A9DFF6A9EC4ACBAE1862C09212E97C74895DDF839C5B299F38A1F2DE84CB2AB7B79E9B7FED1B01A61DE4F88E62D5BB4707043903D563CC26BB81AD5E3CC4ECF01014C5ADAA2695120FBFAEE7ED9AA844FEF1ADF8B61287849C7A3BBDD831CD62C9EA19389A70D2335EF36FCFF7FA1113DCE1FA41CF3B4C648A5EFCBD9591677D49CCA5E681DE917C8ADE4F756E493010FAAAAE534036BF8B9E1162B52903B1AD0CEAC1C26C7EA69CBE459CF83BDA11B90D420F71CAA1A3F60F0F1C76544CAE9A196EF70FDC4C7017942E6604BC9E73E528FC1AB45642C45296EAE7C0D623E22DD4F7DC6AAE09EE33F7052B9C06634EDD8027D9ED589803881053B4E1FC12BFB812445811A734A918BFD84A848158A5B31856252FC26A32F87EF0DF2AA143F62BF31553A749778F874D83ADA1147C91CE42DD13502B1EC55A2CE19CB7B2E30E99202BD8906FA0E611E03570515A97ACD59A99182B8F06EB5BB00C2CA67F08992446D824F79EC716FF6F398C1BA16E47D8236E3C9C016999A5A1B690BC739F56CDF730AE81766C70D3E3E9FA5FD034619BA359D85A809030288D631ECCED3A48487D0AA6AAD5331E6F515EC03906F7B190FD5E0AFCA8E532C53548A97FFA8BD067683FC9C1EAF4DC8EC6AAFE275E915B06C17CF3B46A30EF29F99D76BD3D2C3ABE872FCDE3CEA025125BF4604C4E2A9132BCCDBDA364244502518E90C71D7B0230C0578438319E915C1E175DECA3D16DFA88FE6EF0FA701901CF424A892018541DD00B2DB55E05DA054081E004690EE811401F001A3A13C0C5200201C7202102D642A98DD005F21F5830D046903B61D2206A472E88B00C63724A3694109DD5236066549CA01D8787F8671D89D048008DE16020370356464880F404E92A4821594A3217483FB093104C407600F4A836041D0829380C40BC1609443427086FA3EE4F08BDC1B541314227EE10B5C027E06CC17F0AD9006016D419CC1C0C502012E0E0870F140804B00025C2210E00240800B02012E049C88C2854B2AA9E4924B29A5D4524B2BADF4D2CB28A3CC324B73701C7FA0104EE72FF4AFF4E3F278D2935A9D60EB3073792A6DF0D8A58B186A80DD808C26851D01C5E2E6B72F316AB8115510D4A62B8352C4745BA7F6815654327F4366794ACC181FE457EE757597D6790E717A80922458A04BC6CD27990F4F1F2B2416164E184A2CB1696632436BD34544278FB22091FDAACC7954B39E5C9424D6FF9F655B3A05239C51EDB3AA89D7D5590E57C5DF6B5F36DC3D01FF970C1DA8981ACA7A2367E1FED040406DD02F5B561CA38FEE5439F22AE3B01BF347E8DDBB9C5AF9161B74F4ADBBAC88EADD98583ABCAE5B796295675D57BFAB723DD2D5D54043C459DD4632B131E54E6D7C6BB96B9FF95C6FC41A86D2E6A286F2BFD785111D32F2F978DCA0306334E4296AF2BCF22F3CE175BD2E10DC69503633C4E37D1A6F53BB656647DBC528FB9000DD9CDAF1951154E4E22FFE8B4381E0D226426ECC306E3462AD5F600161CC90C985D3FA9508F711BA08AFAB0A666F3603A509FF024292B9B4AA59F7B6DE77EDCF6CAB3EBF61E148B16C4E3C267C9ED60F98A6D12BE117F3B02D55432E7A47530BDA9FD4663CBD973690947AF0BAD6AF6C7917E73B57646C4D0E84F672B808B084969C904E610DC28F1B5E7E37A33A4AB3AA308479319A61245C3EB8DDD7790ECE02B0A44A5889048A5A1B1EB0DBF07EEAC5D1EDEE7572FF47B17088ED8B3F6E71D94814194369A6C04B3F5AFF0B49C128697A08F57242DD54139BB4EFC1F07A3ACAFFF5E321600AB3991EE27419AD6892005ED7D59DEDA43EB96A7274B393BA2F7E1225D9E9E8AB0738854B650C599AC1804B5553E1002120DA02ECCBE78B46240C3364418A0C4E7273ECFC66BF552E97FAF539785DFBC9184C641AA6304BF1F1DBD903FE99674A1C9BE230CA204CC5676A239F1E20D929D4A067A72821B5B13BE61555C24CDEA05AF1AAED523E714B582777A106A30BEFA774E5ACB56C1B56671C1D11F12E014309F5A7083D89AC9EBF6080B50679841998FEA6AE9789E1AB13D7F8F3F78CBFD00C5C29493D45998F582A3BBA7304D16DBE04F07E421E9357AA8D2D5A62DA50903FFC6E5DFD86303FC51FF0A5761694F4B0217014E3BA82961C8C70F1D759350B6CCED565937AE8CD96801975A1DC386A566D6E232484D7B5BD0F29E01B52495F85C700179AC6F22D4B5E57368D09414500E648DCEA77B2AC5F3F50FAFBDB204F8F67F3D684663A645831E272DD409CBB4E620A291893000D5ED742A4AD271DC2D5B3F3AE7188FE60BC5BC759483E13BEAEE37992C917F0B6C76B9197CC2D492CFE7DB01DFFB05477C3E60F3473B345C22EAAD3F1B5E55FAAFDE5F47E225E1FD8822AD7612ED6A7CE39B43BFF4B804F2C7B8744F7014D7CF782A35AA1956D8933F9CEB7CD9FE33F19E7A31AD2BE203FF3F820F411E9DD19C8BBD7D1B64008AF6F938A5001C4308EFBDB95A491762678BC7E4792010A9546EF8BB4FD712FEE5F6DC9B744A4FF3BE81EB25A1116913572BAD5C590BF836EA580BCC7E905D764754A7A5B5F8F06F16F91CB34921551FD99E8E3FFA8A3AA2F496527CEFB8CD99D65A0F4E104FC48F88042F615FA9EDBB8C5EA5124D272E7AFDD51A60679FE1B84CE7BC082D735EB0E33CDBA8532DBFDEFA38345B3101AA7529AC45AC72809AE5C98AFB8290AC41E52D55A9AE6A0F63F8973B04834C386A9323B4D974F422BAF268A332EB198025ED7855226F6B30C25B20CE7A8E5DBB86A7768CBACD004AE23BFA5EA8A65B238576C1CA57746B6B87FC8CD689FD51F986B2E49FBFE1F1E695744ABEC77A32AF4A56BC1FBF921A053AA673416ECFB8BFD226385E322FA9753675955901EC45B988571157D00D8FB0AE4C1ECAE86008663B0D8F70A306702F4CC98A7EAA20005AB685AFBE03C01BCAE64B0C072678C99D0E11B8AE03FADF5ACED2D4498F59210B2A7758ABE4ACC4E3D48B6E73B82BA5D9666BFE3A7091BC7D9CA8FF4734826D44DAD4B485BC77F67E7F07E1A6E750E76E689D9FFED862941F783D31E299B260736B0DF66E81AFF8016A2A45170E94D916F0EB555DA36659E1BBF704CBFD4684E89F8B6536D18887BE175B84808AF6F365BE5FB4BF8D0472A194439196C1B46ED82C5F022FC65C620B98CDF7DAD6D8B72315365C2DCBAD4F9F2D6097580D742508763E3E40D914DCD717E223631C1E185C0DBCAD1ED7D9D6502C71D1419400133C923C17A512E4B399C2AD1C54F6E9D7A76054D6579C63FEECF0456A2E4B9C7AA2281F4D802DFCE0F0F1488EBD1B7A5414C08AFEB205D5E5E927DE66913A31E2476F94F83BC9A55FBB418F3A07BFC0FE25805D64B2EC9FA4F6691F7FEEE668B8A986E1FE814E4C8A22BD8CF851FA90E759EBB11C7F0BA1259A0AF3EAB3ADC4196074C29F493E85F2FECC1F5F1B83BB1EF28FC72879E43A5E9403AEE26429E2E24B0C7CC2F65FA4BE8622574794DDC730BFA562150C8A506AFEBE62D8C689D86B3DAB794974C1D3E194F1B9C72018A79FB728039A78384213995E377D6BBF5BFEAB4295A16F5D2EE765C85CCC5940B6B8F4A3B2C8F71B3216451783F9FDA1A26ACC2AA58ADD3941264E553AEDC1F7AC34A5395028B3DD84A76444A23755093043034D0A6596ACD178696E63F5A0ACF151EEA5D724C0A764D56D96F0A08E0FDF44F9352C0A46406CF4DD1CB220F203B34F19836C23BD2C626E7E5BFFC39030313FC61BC8059277076F28F784517433E654E06D238BD2102DE9E24A71CA653193205BCAE9E37D80B05FFA30FF373BD6D02C4075E0643603EFE22B8D1FE051325B7EDF65446F287BB6E428059BAEA40FCCC29CB4122DC816F21F23744ECEB0C789BE0367510BCAE6A12ED3536F863768C68BFBA89960C4C96ED605F6202DD4D7364479D5BA39282DD434A52049B95F3C017AC5236ECF0E23A6D82200EAFFEFEAD2440BA30A9447480D715ECFC90DAC5C978C74C8F4DF85E39C98C8DDF214A5F847A8A08DEBF9F49AE4B3D08E7CD1F71D89EA09E564F33FF81E6EA13071EDD909E64413DD56F34848B76A985D7158634CE82D7FFFCED7BD587C4453BE9EEBF50B231DECCE9C8AFECD19E32AB72670F2117A386BF3A150176F8BF25316B6812FEF691A104F298312F32408F6C6537C0EB6A0CAF33828CE03E393BB82662ED46676D817E90226E383E213660EB426DD021401713EDE811A04EB9529FB7B1E3C823BB7FFD74B30E65558AAF91CF32A9E9DD2CBCAE9515887BCC21B4DA11FB7EDE06354FB21E1ED32D67DC81579C26104D6E47FD9E785DF372FA969C01F7623575F669B1742C679BE964BF59E5CFA6F93828454F26D8E61209A493757D37E5E9FF83921A531E9A57D1BB2412AFD92ABF992603CE7125D2EF02B9C78DFAB6FA7F21E9A00AAC2AADC13AF65065CF4E10AB34AA0E39ABBA7E83F5C104011A8D72ACC9425A3BC35C6D1ABD6F1EE192BD4A5793FEA9B0BE581661D1C90EE301BE07921704E147659F157D1DAFA242E624976295E623ED9EBFB62ED9FA6B5C9A5E9996B4C11E4833A2D5E0160AC546569A6E5F98E84F7BC58DE85F4E838CD1E3F75AA5D898910F3F39BB4CAE3AC1E58BFA703E04464E873E67799193BF3535C1C1ADCB5DBAF8C6F3BA1D45F6523BE3F5C122FB92C4F832A63EE5385EE045C503199014F42083ECF58BE51186FE6115A67E3DFB299EBD7E233DD313E14635B208EADF0ACDEC1430A17892F3B14CBA97E537E8320005B97C13AA16B4F680855FE9B33028C87B0519F2076B1665814F07B95FD98EFE423DD99FE3213D35A2987A5116E30D37A4B107869A9340BCC982E2C37831C8E023A1E1845B29D4DACEA729369FF60032AD63B300BE58F922D4737B545BD7854D24AE79E3612D958CBC59EDC6509D50EFD1939452D709378031943E20253BCD543E02FB819D22098FF06951A02C425E8C8F9B8E1423625FACF980BDA13770479EF53F1E04FA2B9AAE689C9F5F8C1D30A2A26307E1734B5E60A13F1D667578D82C6DB9F09CDAFE35057D1C0BB03C02135D9F8FB671E02F938BF1751C5383C89D5422DBA7F7B312AFDD1348FB1DCDC377C15C446F88F5CC5A7E5660CD5804478D3D62E6401F453E94CEA4FDCC35C02CC56EDC2088A5243E76F2DABDF2B5F5BA16BF3DC08CCBF3D0FF08FF084080BAC8E640418285F449B1054869D6761319AF4C7D713A9CBB32B4A088E6B2B88912DD8FBE2156504F62802C0952DAD4CF6489BF92149EC9481CE14712698F9CD499E28539DE6F6FCE4658802A0EB63AD4C8BF9FFB3CE3987F7F2024F19A12D16615C96676D5542DF2BCADE174340377BC1121298036A987A8E7C829F714EC0BB46F631312D7636815E70CE551B4C72F71475891CBB4069F4F736E6D7D127617073BD00F0F5CB677B51B43BCDCCF7D861942A118CBB07C93A605303DF500A2EDDE74BBD71C423BDC7EA5A1237733165705854C48BA000BACD67A8547E9F40F2022D157C34C4E765C8F5887D16EC0272C991B258D0A35042FC205C724554048BD48EBB7A7643C086D636861F665D469619A9067629DFCA61D96E236D368BA255B391B0270FC166129B287E594AC93FB2F7747B1348A9D9831F2466041354469D05BC321CA512D078370ECB0A13F5B1127505B4438501BBC136FF80391F0E6264914B249C1F5FD0D76126301B4AFCB724427755AC546E9DDFFD6035B4B5EC971818067D752A3BB15258E171D007EFB0EBCFDFCBF39A2C51778FDCFA0BF13CE8F07DC27831E38799A720FFF72FFE88462B90554685754345636DBDB37E2D9E145C17849479EBBD5A904C1C65F5F0B953FF80FD90F46692AED11638D41CD14ABF8D12D6693B38A1A7BB8FDACC255C33610BC0AED01C2A35476933E371F7F7742474D7484752DC6F75EA0C240B0E61699643ACCD457BED3CCEF610FC4394A57F967C24B1CF3D322608263DB49066FC98DDC54DB87FE8B02F9EF4810F74F98AB420E6DC2878C44E653DED24DC78C3CA441FF0DA5BCDA136F6D5A369676D8FD3555436A09578398291B9F1E71E33CE40A611E81F19F8121B2BDC6630D3B7023125550E2BF3D3CFC8277413A86C7F358E261BC30B0E1EB74A4A4FD3E0E74108BBF8C8232C42945032C4B3D6C2FDC3DA2C2DEF687BE04161080B31DA088D6B45CA4111616FEFF819199403DB7C6FE84856F60406F70AB4A898A7D2F0B411058F7AF783DD5B6D0D1E764E38F549235C3FBBD418D61EBC4CC772601DA835820F8565F24FAB89EC1F2DCA9D91BCA8790079A32C02BB9AAA7B20A2DCBFA22E21A30DBB3E12B1FB47EDA9050FC351249DF59941A14593318F2E55184EBCBBE21F80322D44223B4294F139B5A9E581BCFBB4160E3BAED9C3DB5F08FC695B8F5BF416844F52CD72CFB7E5EB523DCF60BC1302F5B42DCB97EC042306495B2DE29503A008C18CD12CB58BCFB4CB86607E199E49494F80DBD1E58F3D92DBEAE2F52531F673AB280FB0ECDF69E6E2E91CC8F427B4A4C33996CDDA65DB9BCA8CF5454FB56EEF94926F8306EE102471DEF035B2BFAC18019278C814C5EA517640B765513D4B596B5B41EDBA7EB97A8010989F2E6BD452B80A19F518BB21046904EE76F7456B611494660384D0CCF8550B8F2C4EE8513778FD3356D3E60E98BC81071B418084909D3D6F40D716C592FE7937F5AD1BEFD5FD0B269434A8C83A0E4B9B0C413778231ECE968598264640670B38B243E9C68DC2FC42DDA92E12727DC5AB17B466F104CE571FEF1FE39866C1300C55524F42EF5D2200B2B027A0109D867763E7972DC917BC743A26A3679361C9B3FFD60C0019D2B1595F8668580161661BDDA2F7700029AD7FC75D04F6FF1F1FAE380A31C50DFCE3358C4A83C5F5552ADCC26EAF8ED87307CF787F3ACFDA63EB395F30950EE84DE4E2684D1FC309A991105FD2E13A24EA3B2FC25044A85085D67A42D1A16211D2771E11D544CD815596FDCB469C657C23B1018D20473463F35D079E1859E0CF001C0815A41849EAC6E7DCF0C9E945CB9328E559DA070DED01DBF50C456C758F534F6A994B89B27B8AACCE738D714C6CC17F22C2032E1648D30C1014A70AF51C42CE99F011869253AFCE564516C5D3435F667A7D0045948CBDFB4B98053D029396B07D70B1A0538354CE449934A74587AA4903F3F0FEE5134900B872ED413FD198E1DBED1FD3E42FCE184AE01258789653F7E5AB6E7273AAD0D991637E6A60876023B890524D07A0302E6E187ADFFA805464C7EDBBB0411A41DCDC1C0E50784257A2CA26902F43EF872DECD5BEA3504CC7126E1342C638BC352E8E83620BF86D479C20BAE984E94D1B4B0105508393BE4D886AA498CF5882DAF84A4AF09BD40143536DC7D47F2CFCB11A81222E6743497AE740302C827D337163D386CA01E6398A97541E6FE8492DA68C4831237800D444381C200350440A8B4287E369C59A60A8936753E0A7E9876D21224B44AE2249F77789E4052B3E787CF27C1F3B8BD292799F733939B4FF4662683DCB3DB3FB9CCC9685AE81F549552F0C4857D430BBAC9D6AC036E9DA888227F01EBAC3DFB5B9C4A16FD793C6D399AD77CAD906990368F85BB0E772ED5BFE1D5C2E2E373FAA3FA31BCDFF9C56F2FDC4473CD2D868FCDFBAD6208AE7939306663A6BCBE5A86101C06402882AC2806C598CBEFF1B5820647CD3EF51F909F86CA6002CB7A25FA94893C0D1EA10D54D0BA1E339875C48B1113938FD4D57190BFB8F0CDF699107EBC2ABBEBF193322B48DC748B87A685EAA4EF75E9F0A79B8B1C13CDC75100F7FE1D972704910321D34591708B6DE9CD7B82CB58D56DD202C66E5AD1D1A3085AF66B9E0089999B45CAB204DF2188276C4D45D3AA5E69A80E70B608F30E9FFFDFACDC6484B3AFB10477C22C1120D08FACDA31E3D21A5130AA768D75F95B5C68AE7C22201D1607B60FFEAD36CF4960A77F646B9A8B25249434AADD4C1E0215DA0F3A71F2525B0E57FB10A96069A51DB427DBCC407EEA8C55EB0F3808D4777D06DA8A8099821A6B69AD6111C4F056013D31F08DB25326EE775BCA0C2A32562D57AEF1EA95BC9BAE7FE896F5FA7BCC575DD69810793B1DBD95D3B08D31C2E1A54B95AE66F0FE8D1F655855001CB7D1656438C75C2C3D3B8807CEA4556ABD463B6EDEB267EADF39122EEC28ACFDE398994A56EADCA89696E4396E6A2D2B2E8B9F8D4975FBE9D71C91618C66E3729798554F65BA692BEAD87CDC921142C68D5CC62F40120D9402803697AE7DFC6110AB61DC13ACD3C1BC10965555161AA109875555CB96CF9F6B65AFE78489019AE71672735E50901817DA2CAD1581A03A9DB86D696405CB6038FBD52D7B7B962D837F96603AC81E44B2D1F63A58E211C9693425B97F91F3F4A6425E9A6A4356FEFC431399D7ABB91FFDB2120584D10C3953A63E443E6475D0862AB374A5A00B576DA30B99D76E286763E4B3FA21C6D9BD715A62465BE787CC7066B06381D8C6B3996BF9D9AC85998CD70DB210F53FDD55175AAD3788679ADEF2A21EB9942055193396BCBA074F6205BF37FDE5984065F3A3A327A9FDC69C5D2023B62A83E9C612F1C6C987F84167E3607C2D61728EFF2E7C58F647541F3BA5058C8B27888CA1910787DD3A82643BE82A19BA1B65F95A147763F3903BDFF658B174C2F9C66B84A242AED931000390C579DC5969B2184BF47A768B89AF45968D3EF3F7C6DFBA0E7CBED20CC994EDAEE751BB242EC6A955599125E5B4ADFC1DAA9DA66119D4C89D2A58BAB834DBF41A82F2A78466B0B2476DCF5A363F224BFE89573D455304F660220EE8C2A39C877EE626473BF3B0DDA20D2A9FF895F137323BC1C89C404756E9E07D9D56E5C1DFBC119A23A43D20C510D916016C7FDFBCE946EDD466781188442AF6B09EC5379418B86F0277FD9BB94E474EF8A11160EFBD5532A11E2400BF3BDE46CDD3A6A7B60DC33BE4847ADD32CF7B7E9B54AF032D9D37FD10B3293A2D3D15CB27B195D649097A8AA45A448AACC0DADC06D7CDCF6B9131AB887CCA81AC606946719BF5AC54D4C25809744E19796D7C6FE8ED20E3C47D6F66FF1BB186AE6EDB8A97B9A3FFC353CC0A50AD31BB58E289E0E561C5DC8CD1A89713CD6E16AE4B76362741F2DAD192DB9B9504083A1222F36CB054F1924960F2CCDC7F97346FF7FEB37557169C531B65CBF0E3770DF946B167562822C8B96FF5C209BCC6DC310C6A4A842D3D4F23A5F2984C987359D14D46B687B9D555CE1E11FC6F44373573C77F687ECEF3568A43CCFD9A0B717A54FAB7E10FF0520455FF80306F587178EBA774C68514124555DEFE623A74404D1FEAC7BC2585AA65C47095AA4D436D12B894DE3CBB6437C96CA0AE0F5AE8F872BDE5AA5CD4CD088E4D54F57713E9963693064FA6ECF581A4276BF5794E4433CFA070B04F9790A6964B78E9C8E88B267C5E673F8A9F36BF7A9B8BE5D891F0D1ED558B5F09E0E41BDBA9A2FC79F2B5D0DE98F2B4B12714C043596457587D535375C16E8954417ADA1393D5EE4EB4C218089E1901AC4E8A9FC394AD799E5F7C6DE12A0246025F7A51C87FF75A90E100D9A7FB315E9927951060CE8C3B11C1D71073A7D1F8B888FF777DAA0F539E7668AB1DA04350DDB7AFAB90C3FECFA1FE13F6AF218C94061CCBEDCF56E8BA6F2AB763FCFD4CA99C379B14C23C213142C3D1EADFA32FFB897A18ADB92F605EB9CFEB0BE94806CA40F016E874044096E1D8DCA416C4C86D008B3A0A52DB4CD1E57936BC0984917273989DF0CB89D85E50402825D1661DF0C9738D7D9CECB5925EE005035F1C756F057D61069116D29F019866B692F35EA144E4209A23875473538FE8F32D9BCBC66E8ABDB9054D98B6884804487B2868F1AA0C36EA0831B31F0EE7841A8F7EFFCF2409A3F0831060D05B83D0AA86BC6212701A8CE341C71D0B75888AB35BA20B1DCA1DD5E6C4B371B5ED161EB0F303ACAECB18620255D5787570464A56AD9D5E9133AAC63EB0912944C4119FCEF5679D883400A56AC60A93C0DE4FE2ED5556ECDBB4772F6027CF93CB3E86FBBDE7D9A4F7E3B63D1AE11B28F515FEDEBD336D9F999D938A88E01D0A0C5B2DBA493F69FDBC35F40992D4837CE3D2B5FAEF73901270B1DE34CBEE8EDB0E60FD88FB54D5655B02C67732ED7DC1F66FA84089FFF2F9A051DE2C2294F4B4054AF454047326BA1F3AC3EF3953323D9A3CD1F325AB50A7B29681E16A787F83266C28ECF24FFE258953783BAA19BE3B078E8025D7FAC02B6E8204859DF6BC0D3B100C8CD22D2975418C2BC84AFB63FC25B9566B782A4A66E79B9E045ED99299351725E6B8DEF064FE9FF4E2FA8CFC9415B41EDA90D81C2CF9612FE120134E2ABFCB6B93FC8DB228EFC752378F45AF2692F8C7105D3B324E1F2AE2279F448D369340975DFA49C14F27CBAF11A6235D1264590B6D9C4FFD493040372AE2F8DD8A56EDE387EE17177B2A93B2E91286C41F87ACF444CEBCF1AAE2A0DF8AEE43DA5F7F91D7D3C2F95406E9F4BE73E0B3FAD3148EB3F8B70CD184BFAFC6CF1EF3F107D6261EE1AF3D56B1934D65B17B71C249AFE2A3DC5BAE992252AD94E33108E7AA9BBDB2175C1F5548F891F7C3C1006F5725A3133D695A73228053A3622D8FDDE92F52C6F6DCF817E3AC994383ABE07EB8CE8A42DB0FBF7F7292419CBADE094D389793C3E037093F79C0945D16A1497AFE506DF14357E1425B44E16C7D6EFAC82B9F8E45FEF63C8BC1069D0001C3EE4912055157326D9737BFCB9A9F89F6CC81301F5BA2EF12A6E37726145ACEC4BDB0ECB820AD2A9B7E6E6C3686D7B3474452055D5E41618F62BB7971D3EB01A1C73472B6FD0B4A4D160C90921DA25721CAF0A672209DEFA23E779DB207D3DF04113E1E9E93C7E490814986B66504464B7E41308215F18EA7BF8AE7FFBFC9675B0F5946EAA326666151B664EE30B0915F0C0A50A9CBD82473B855DCA2FA52D0F96D6A310C88CF6F9EC5DB5C67954654FCA7DF62CF59F16F8732916B58E8DF5AB72CE04D981BC17DB5DC1DF885C7AA9786D608498627D32EF60C498DA2A7CF8F615D5983E357DD45CECAF6AD72DFD711829B5917A8685FD7E2C412186671B8883E34CCB9C9430A06D5DD596CDC31E7B8CA67E5E45AA21658BAD4FAEF50F61EBA5BE3198819B7625E839CE833F712314B0B2F3FDF2EA7F1D249FB8381B570691BB400EEC900CA1753030A52A33EAD8087BA2C469CA51E2CD4D0969A52304495ADBFAF6AEBB91FC123E9D47A073C55FD958834AF68FBECC6E529C4DECEBB13D60BA0B77F4C6CD99499DAD26A59C199287E503968596E272EB666ED789C8685D4C4B66DBD12098224617B8D269A03B71C79DED43C819A849546B8D35026CE8BA4C5B7D07AC968C89A650340BA734A73B184217634EF0FAD027C9C08FC81ACA1327599368C4D384D7F2FED0DC691CCD18F248922CD26A3424CFB0E61CA23D25D369D6C76D38D0DEC91805566FDA022A00C86179FB420095AC25A6421481F1A79529663A195B48DAA8FB69BFE1EE2154A6D5D7C898D85DA2F334663940F0975792A4A952CB15EFB34FA2754ACEC5E2C1CA264B7C953E7C578A8CE0FE09978A2569FCBFC8E50E5D6A6885ED8D37F3306B0C4C0FB6FB115D92E38AD35414A09E5859A491EE1F39F83A568A0B526231825B2FAD61E720D9005F19E62BB32C81B0762ED7DEE468AD84A22FBBE0BC9CB0C04850BD7E4E4C8C9205D27C6FC52978D2037A122927A501894C520E8B7C717FBDA2E669EA3288ED8491B589B82D81DACA74662A7CE2C03D63F1330593D40AC09150EC87E399470AE81FE9DCE4005A5C74A6959848F2BF80BD1F9A680A01295ED4F0CF71B94E116B32525871C1D7A8A9CEB38F85E0B0EAE2550DD6F3B6FD5066C0173BAED5AA25FD1614526FD8F74B5841F09F277862CA4235E6896A5EB62F69C6F5077A96FFD8F1701FF8526EB5F2D312C3B6BF9EEC177D30D5D62730CBA22B6563C9E45E2B8A7F9A382F97F2934DBD006CA4E7FFAFE275AA6998D0BF9498E0526CD3FEEC334884B36E57A4CFC87CF1B5DDF5CDB8C5873B1CDDE8A78EECBCFDBA3F24CA629F7F115EFEB04AF4DCF7A169612E1BEBF814B9BE205190817A01DF75E58FB92C94658DA5A762AA2141257BA2426921B5ECB35AB96539F700AA9500F2DAE169357FA477F0ED4F161C00C9E7D5D86E5389C2A08615DD7E9EC10E0FF08E4B52B05C3C0A8350E194439D348D994C6F727ABCE67FBEB66C7ED72545A4CFD64C81597C55FBB113E07A758B04D886D3754615A0E5B1400B5B3E44EC4F2B2BF39D21E84288716D2F59FC2C9F88A5B49E87CDD80DFE3F1DCD41283683A49753D0188562B4D73FB9446FA9BD71AE33137657B48D7895C97E02A25D52CACAA5909F48EC0B64252BE31CBC4E2D0B30A7D936468D7C11591903825DBB201FACF2D92F79D0532D95770512FF4EDAF2B2C95D42E66AC08F86EADC32537D8E4E48C08AD26D5A596D4333EADC397EC453BD7A4240E0A6A907C282726B026CD1AF4CA8F096F54676CA2D9558C0C2BD59449106E298A10088BAC2B3867886B19B6D45A061806F4057AB825E6D85597781B6612B65E756C689F0BE6AB11C5DB4B6EC6B2B28AFBF7832D6AD93C274258BE6E72D9D644D3766E5DBE6466C1B01AD710A2D7127F1BE3385D690777C26CF50EEF09B6237C991E742C6772F9E0AB6A8CCDB77FF5BD005B96DD099512CD0D855362CB21CBFC7503D5979B2F1F6A2C5DED85CE6142DDD135C0CD21124C98DD563229C948313AF0FDA28FC6533DD0104683E2C7E786D14415C78D82533B97FADC815466A24C7668A8BCF411F44864D7E8B0845FCD39363254EBCE42559B13864648E648F352860106925408801554807AC08FEA5A7F1BA2F4B18F29579018874790C845E2E4F7479873799693468A36D3A4D7BC98326032C82925DE80A3F5E8568620C29F865C2EAC2DD047467CB3B9B46DDCA9BAA33441F85AB2782125166E1605BDCDAB46DB6C7CC3F233CD1B9C46994DA6A48C316E9BE67FC5F6FE384C99557027D456F0BDBE3624FE2F50080DC20D7F600CA4D00C04AD570EAF8AE0B104739DFD19F9F27FCDE1B3E1F7641407B9FD7C7D4AA3F50D82CA1E2FD1D62E4D157CE6BE1F93BE92935A28B7CE916023890735A24614BD32400FE7A70ED873B0F2F681923AA3FD978EDDDB8FF043308DBE54364D6CE82F3196530E0C26DA8E977D8A07B5BFC0043535A2D2C57D5AAE38FA0B2F7461C9D14788D8E071B08BB3F0EAB4869E80E11A9CDC129F84C64EAF22910E5ED1AAEB27A2DC352C9753F3241D58CAFC0C1443F9B7FEC26FFF18386E17D2DF213105567C96774EF063BA0F516846DEF091D43F66022FBCEA9A3E2E876ED319F8EF8FFF8570E5070F552B30C94B733AFD675FB5B882FD13018F3FBA6969F306307E33EBCF09B53F8310156554071477297F0E36C82688F85771FFFE0DFF6CD4903C1F3802FCBA9BBDC3717A7C2FA98C4E1FEBBFF51A242151ECFF111EA7AA170D35261891D0ECD7A280C5114C338E3B4F179773B4F8835C7CE899D95FB5DA4F209E68BA5E08A1A88B2AFF22CF1C3FF6D7A11145FDB0EF0703B8EC8D9258D171717566339410487DAC00E58350CFE948CC0D7F744B487243901133B4BB56092790B312BF1BBDA26529F219F463A73FFEBB936BD75A9EC2DEE7054E3907127A9F1C5ADAE8181C8E8CE6351606E7AE985660B0F578B4DBB239FF5F9AD45AC67407986A43362BF89D5BA0B3FB9D0FC4C9B696DA818B401DA5A006986CFE0CFDCCC5E335E0151F931774E787D31C9AE3CDBBE160DB5B502EA94C2E4164ABC0FB3D56FD9ED40903131244CEF43CA5F34D61FFDCEE5ACC079F7C6EF9A2AED730AC159614F03614E5BFDBD34878BE43690FA1699A2C8A01B865D9C59D62F3CE6D56FBCB3EDA3DB890F38B29338E04047FA6AC087A2DB3E06425D50CFBDEA192BCC7FA975E6DB92BE756FAE8A9B4135296B7B09A2E12AF22E9A90E4680C1E3D3DE7AA65AA2277D7933C2EFAF55B352E63ED8A395767C17BE29225584722778019010D064A676C211C64D20B26AB3D6B6B56B137DC1FE1F6419E419254138F92252823AA3BCD32CD86B53DA0C6245C73AAE9F34883199FAB1FE622DF9D1E00A6CFDE38454BB20BD202BDDA0F5404413CB1633DF4EAD8BE76D30335DA39C58A8A5EBABFBF19D0AB864C610469F6EE99411905BDF8238E0F35BFE1E9E9597A1900AB96070C7A0C54EC8B524ABD05FE87A411864C2149AD1BCA54CD4BBA130444B1CCD6BF6597759E909EFFCE5B42433AA1F45E649719FD42BCE64D5B14A31F9809E1903D5603B24B7EBF315367A74C0FBFC8E3CE87DFE7C7CA1BC2C51B0C9A695DEC9747FB0860F3D764CFB95EE17039124AA6A77DFE6FB02B71D3BF3877D26B814769CD9F0316B4AB975623F18E0A9C3D525D8FFDFBEBBE931B3F72822905253977E0FFF5838A3D7954833D59C14308D5186F67DA3A49CD9E91327AC6CF9B086744964E3F2DEEBFC8089C997F49E976EB27DC9C08157980A0D3D2F03AAE9D472363CCE03827606BEA24F3072BD0058F00135101067668C19FB104F6FC78222E6C1A9A1212470E4AA23DAF1381C9C3CEF1EA0A38C27BA4D5985CB560FFD5CD538410A1C4DADB68AC87823A84AA360E4BF8321CB80AEFFEFD0FA1A79BF5C08FE4B0EF8CB7CEB33E3B9AD52EA3994354C0E25C1EC6ADBA9C04624809CF51F458894928EAB49FAB0111F6D309B2AE75621DC9755488C9A1150BD8BA0E75D3B945E3D99913383CCC4243213048E0C556B9F83FF1C4D8C1F814FAFF187A3BA2F0EB32239856DDB81D115241E0AE494104EFEBFAE008306E1EA5A0959C77F931D0E8DDFB5F8CF72BA9051B7D7CACAEB67AAC77BF0A5575D33837E946308273CC206174C7544C92FE3DBA1F85DD25D6654108D3AA6B64B7EE80D92643FFA804125B3292BE4C7DF3C4ACE64336BFD1DFD0823DA61A25FA67A281B8CB78C000BD7B37E2D13E8F2710E56CC39438FAEEA3856F4E165383B23FB542B54CD6FCDD0414F4D6B08CE9ED771ED556952A11F69A881B8B458C3FBE67B4688ECD7DE3547CA4BD6950DC5764019B924FF1EC5B0092BA950C83CC3749783EFB5A4D2E554CDA7AE9C01B4742B87DFD891D989556B318D9CF16BAA5E4A40C893F51ED56DDFF0073F0F066193D51067C12AED518B0D38B7AE4931B00251CF0D235CA51D309F6FA6570A86A748E9864D14DAB6282AD546306EAF338D4337B1EEF7262DF6BDA54F2B90C22EB46431CD3B2F9CC62556FA1641D6635DE7E13CF6C516EE4999A8A6C1D3C9C6250069E6DA8B5522106F23B43919BDACD235C9E6F73707CAAF0F7E50613BC4D922BA132AD9BE266150924767E5FA182D1F126DF45E18B1F5759AADBA1EAEBA3CC7E91001180146F9CC21419FC4526F4E63642BB370BE94DA6511C85E3DE75357E9C6CAA287AB335898BAF7CEAA463BA5EFE034E7B5DD1F0C70B116E5879E481324BFF3A37B2033DE338D53A7F1A4F4377F8D97B0F5C54B4D01909D4C2308955A4E4AAF5D16EB6A34ABE382FED0314D261B31B3A354DC520446A08EA2A76065AF14096273F8543FBA54B2CE6AD54DE56356E4A8C5CFFAB83C364C392368FCAC2F6FD25DC03EDC4E4722D3397D67CEB827F28D3F9667EBC9F47F9FAEE2A8CE9B1F01A6C3F312D9FB3F749EE3F53933930F91DFD6324CF9300C48E4593B2869AA2EFDECB007B1FB2979855F263004806CD3646B54B73B91F9926BD88C834DA99693C86986E0F0927D522942C0103B9E523DEC0E8E4775B91E4ABE74407A934B65209899FC75FA2975A7C4ED12E083628BF03CBD51833ABD03760DD6E5E80223910842F8603375F89DC6A9CF623AD1C80EDC306E3E8C9B4D614A69351B958259D284E61535053FB31C6B12C5B69FE8D648DDF6A3C7823B116D47A222484F1C1339C89A43FB658B046823DEA6DC2F03A0BC0C7D5EDDEB0FD89A9BEE9E9F0F95AB8BFEEF1C082AAB3FA7DF9EB2D6B136A22007A73CADBD38B32937B68217EF1D69EE0CB25B34CE75402416DBDAEBAF9B5294B9C34F6BAE8C652E88928090467B64D322E399A91DCB7F0DC44BE92B8D7844C21F83C50670EDAC4BE4DCE4F61ADB5A59E026A97B2308A3BC20763816D670D404DD620636D941FA376BD48D695F4D270D8A421599596EE75F9E8F318EAE739810DB8A7039374AC316428BF33362EBFB603BAF3536E1056399B7429000F1FA4A2A4945F0D259C2C483308418D77CB189E8752547AE2F398BC61EBDC6EE409D230D99422959372075ECF1B4729D638F1DB834EF9638C95DAF4A5570460F062746B341945794E4CB31E1E712E43BB74B4107A6C45A90B8DDBC944B5B81E228AD701BF0C9E92D95BEBFC4193C91F77D533EB05B76375CDB666AEF343C92099704414FD72F86218462AB36F73AD407A1186F6284E61C54A6B180FDEA8D2173F46AA9F7296CBE4A35F3C9508697C80D91A4C85250D6EA9EEE24226F9C8575F076992B05C3A8ACC10E314A70A7349BCE2113709691A92F2BD4C2D79EECB4DEA692EAB1BE8886E7F829C492227038FB7BCCF756D0CCC1E00742CFE21A9D5C69E4C751AF473E19906A797EFFEE706E9E92C0F2A720C6BFF59CE760E7BFFA715DAC184C6E1428E977557E8AB1C81713F94854EBFACE360BF8C8546E56884CEF8D90137BE36094F28897807552D5BE909DFD56CBF89A8C1D226DAB89C50E1697439984749CEB13E6E76A0E34F16B04115DBF3637AADA65856F40F005EA135AF1F4BF0BB8B5884E8E2862285D409D1EF1365F61107C783F00F3BBC412D285C2B076565523E905677EC7EE2149960C0710761DA76DDC898DF5C0422EFAFCB6B676335A476916B4046996361ACFA91A0C6766F1E64622F3C3C1EB4E6D32AF1901F5C846F4593A81CB3BE965AC113D9B3DD029507F504969CE62115B2C9BD3CBD125A05A40C4A283D8B75D72A7DAC191640E148E8F40ACA9A21D274D4D8DA07400CA9B6DD5708727E5EC32D7A0CF4559EA5219A85594B60693DCB1621A54BC1EE18EA75B228684DEA6639C0C7E66634368D05481E1098EAF6BB439C7AF62AE22346BF22DAF96BE354A501E8972D0C8F3671BB6AE149AD2FEE60C3ECDAF412773EACD3ED81BB56833312262FE797E6C3EB35ABE300E8E987CEBD364F5350882F90FAB589262FF72BEEC37D1A376273402C27A57C718C4C295CC437B2CC5A71DEE61CC33299858933E58E3AFC70A74254F829711AFB3F1AF6752CA6601397D90FBF5A6B24CBF47D7D9FA76BB9B756D98232FF21EFE7F7C1D7B392EACBACD03EE0780DAA26DCB3EC7880149108DF48E236A196626031B15D1F49CACC154E74BD30E55F70FF54B84E66815BEFD91E6D5797A1BC331F5EC4AEA33623C5D839B581D8D1E2801D6F6D27425BDC3F7582B9AB207828BAC5FC17FA620C39704FF0E61642760AF52A82F351B704A9AD8DE4F2183CD555A0D34B5638512164E93DB1E6D78CEF79F402BB1E871D3FA703313609F2D799ABEFEBA780CCF5B26F38ED1CE5F7DD3288FF52C11D40D8B1464B533A868197F56FFF42C0DC04C614068EF6158C023804CBF804048F8C20532982768794906D143B040CE835C4BBD9E5FA58506707BC499DD2BB901DD4C9E183E543BD6AFCC5A26AB1FE6058924A3FEFA57CE73325F1AF7AC74BA3FDD92EA5CC7B697C4C5590D0A14E8D1CC3ADEF86901520CB0227A754B815BBE6F515E904FD17A4F88EC444CEFAE2E459090250EF04E22D697775715A9C5975B592287646B1822119F221A5CCDECC09019164C1E76CCF2ED054C6B05A6933F12620B2EE5639DABB0BA28CF04A67F9132EA4107BE9D3A5DCBB12E6674486F803681172EFB7BA35B628BF824E8FB86E1FA794034BE09ACE727D2440769C25BF7EF0ADB7B2CBFFF8195D688273DF75411E95E903448700765F8D22F9F3816068AD35AFE0348167686FDE9E5F031F6B914229C18F22EDB96C7A3D6C38E2BB9BC6BF22209B5C9B48357EEB46D1FD7D4B1F0668CDBEBD5D462CF64E0C8160825A57F363706665E8B840C6394055026FC9957D55AA43411BE151AFDF83186CB6C5F39CC3988EBAE08A7E330A4A76BEB0B29D4E28B9A97135C0718E6560A1E1BC480E726E9D45F5F532904867A958C613B75426333F8A35F7AA5511968433C286860D099BB37E5818EAF8E92892EEF717F6D4A8574B5B367349FF740ED99C39D8954272269142456EA4FA3548D8A7C34BDB3CDA24055E56E26909B2ADAAE4414A7FB474E516825964B931B505A59087522A76955032894C71C303819BCC1C7C009C314856E809D0AA0000CB41BB8F988FD3FC8CFB691FF018C0DDC466A3EE6D163AA7B7A20F922C3F32A65F9814FC9FA99BC8EE0506D74F8561A0FFE98E0D389C03037F679D8133BEF969FB9BB1D27C739065964F82FDD1BF2C5ADA074FE546F4E6D0A329F079768DFCE13E69E2337419D1B443E894C21895B2F7C20A83F8762F89D7FC3F3B6F72CF90B028A723A836D7F60C60E778DBF3C6112DEF02F20F6CB707411C1CA09746DAB1406F7CF0F12B480AAD8CC000EB83919220A629973E0BB9AC2AFDE4A0525EE940C2985B238BDF5BFCC92E3BAD2F7177470914776413100033134509975F076E45CD4A324DFDDED20DAEA80032101CB6E2C2070FABE3A06F4CE93498A69F5DEF008035B0433CC0C7BB357C68A5C43E44F18F086B19043AA0F149FBDC3D1861252229CA9DE6B7D178D47C43ED00C69377A1A6E3D251BEEAC79044BD900EF9D2E42F0008E0646EFD8AB7294C7318375E1C7540CDAD3606DF792969134FEBFD9B4D4420F37AC065EF351D99AC0A4B0C50C3AF09DB2CCC18A0910B9DE50DCCEC438AFC8ACD4EAF701E7B27F69B9F4193D9DFEABFA90DC3620D41ECD77C965F3D5F344B48621D539D00295CD4DA92804B9FAD0C8B1AB86839CE050A4042FF95085696BBCF915423182B400DDEEB975421009A965A6F481904484FCB8D25B7CF22E360FF7C676BD2AA1623D60DBCA12CED6109307CFC2CEEA80562114B2D8092615DD8BECB1C62DD497F01100E964AD9FD86C9878F6D4C52629B31ED1657A11CFC1DB77C5F27043E7E2376D5640C22A289B9ED0AC145499F79E4838535F632CA2769EA2281855679A5E9E7B4B0E10F04B5883477331874D6CEF5689D1EBF7401D67FAA5FE07888710E758A5FA8C004E9BD5C6EA40A941AAA3487D63F6FBDA525321EB2AE620AD822BE4FBC865B743C0C1CF88560EABFA2A435E996BD319FFE12F963F7784BA45999B5F22D259CCDD2E60B28184EE475F9355B9488053FE3CEE33232A87E099CA92A1F0710D6FC774A50B44B57E0E813CE7ECEAB5784671A870389EE6EDBDDECD94ECCE5821EF9EC0ACB3027FB6D4BDDC062016FBDD610A8D09CEBBCCCACCFE8F84F9390E99DA8933E23A4902A9ABE1D8FF21A8BF186B3E55090AA41C4E222DA5A7F0B005F8364AA99198184382159EE1E0C4251F929C57E58C21905D002BB8D642773276B461466280933C7B87A4674AB6FA0AB946DA09390FFECAE6C0C23CD76A3B2167760109D1090543855E35F4D789664B88414454FDF709299B62271D66D25C3B81943D72224A93000D740B299ACF18DF0898067FEBBE17A5514152CCE661B574F82537ED6E2730D66EB960095FDEE818DCBBB9FD0A237CF7C50CD8BE53AB253818CBB5196CB0FEE049A8CE64ABB8351B2AC2A67DD4537CA468BE0614B7463FDCC72631151E152BDC6EB46C296CD2E492A5DF5CFE19807459EDF7A27D0F082CC3D38A83188B1517E2F7955B1FC3E575234820B66E43F7815DB221ACF6C4394DC6F14C74D9437A28FEEE13585FB4ADF7FBE784566239CED41FE2ABD1FAF5FD23D768C297F5B42A547F24791F6818617F3422261060140A7D203E72B16BE94741318B9EAE1F10D321E8F0F055EE000AB50AD518C0B33E4EE3C6590F6FC0F6F1DF07A276EDE0AD727A7CA4D9715D6D8A20FAB531AFE0378E9B7E71BBF269BA2AF36C5F24CB8F7389C44D7FBEF9049BBCB33F974694A5D889CA020F4AA01649D962E43CB6B5F146A3DB552EB11A93E7A12023868CB98F18860944EDBBB9021D7CF984DE5B05A074ACE0B152B271F488680185034B24E31D6A6C9C9726BCCE97E0F956CE93EDFCE5E5DD3C0439E6D431EFF98F39DE342C26C2E0FD752CE24B0A1418861C9084D5D3F8AF35004AA4DFF5E57293684C88F7F5EE8AF11521CE7810DD2BE79D53399B2E360414AC265966BE5473918B645701CDA6181C2E3993A33CF1296B3F42AF79C174A8CC2B339C7A7D4BC85BC42E4E24E31CEE79680F4A0445DCC55893B0D2ADBB1F4F38FF8D9912C169EEBA32AC02F6D892F922C5A38EEB21BD3DE3764DBD5716B5A8581CC7F6E881821629ABD2E79D10FC05AD425D422905C727A732E6166FDA63C7B2085A3D783AE1167C34B3894D55261E6829BC7D57F614327B8193BB97F6EB6ECE714D228420E65E9338FAC16A2F1EA054E51F1CBE0BB2DBBC8A83A688BC14A7B84BAAB82B2890A63EE65DB92DB6A4F76612FFCDC8A1305E92C444DF7532EF1FD3409B4D1B7F4534AF797E80C6702A30EA738A10B0F77CFA9C9BA864DF53FB66B454E1EFAF51A9F15641270E2584F52F8747005FEBA253FD071BB63E1C48B52D4B7E397A3FCDCF18FDE74066EC818F48B3D58B664193159846959A06630C64A101A19A39328E002C9C24881DA91F3F16952845B123EF280CE407A3DFCF13FB9D2E32B4917F1C6A233A360616441DB2DFA8D601C794B08BADB36E713915E6D75C8DF815383992ACCA24060A2DF242181990A5EF288BB1D296023D13C67E9C79C758086EF5D898481A647F91C6DB2E7082D576EE47441BB74A07320FD8C483D3D3FAABB340EFD59F2936F08E2F7B3FA6DC0A1F6C0CD5C234498D83022DD0A3672DE0D50AEC6DC17DAA852A8C85B3D4C30206ECB637699ECADC253F9415F3BA603D25ED079564FB9B4B7CC111709587A1A2F0EF130BD686F76D468E3F92DCF6138F8245A1D787982C1DB0CF1C6FA930829FCDEB630186E5D04510029A3926BB98FB69B51DD1551724456D7B4DC53CDD4EBCA07D65814E48F5656D21225C4321763AA4B1D891F163B0756551B48BFAC8D32FC7B3BD88A2C0DBE51D3545EC71A267A7A2DE3616DC42D3E281CBF84CBF30EFEC9B00A9C227DCDE0F06C433C119D3D7B1C6FD957A8EE03DB71B0DBF40A1BBFC5E7FD6FCB43F1626282A0748FB3EADA246C279199440A9CCCC07228E99B1296C1A82820965FAB8942E0A7C71825805BB5F11AAFB1E8EB31A0E327CD013BDBFEDA595BAAA4F11820E9F92D8550A89D25312C2D72D50BB7587D6B15CF82DF584EA796ECF2C7DAEEAB80E539BB1F1817509DFF0EA22D2D39290C39842996DADE43CA14143C4B5FAFF4946193FBBC82A4F8AFDBAF4935FAD082B7F82FAFF096622666FF0D070987BE6315D4BF6389C5C65FC79B604E891A2D9BB836BA2BC23A4532DD53C1B9D0A561C3282CF1E409CE30D82BA49270177642CAC6E38E05F3B171FAF69D8791D5655C36953FF43327B870599EE3CDF16A75FCE6772F904FA755BFC3DB90D07CB672205496C5D94C3F4010C3681E51A8053CD977CEE77A69642E72146095E6339718473DBF228D912035FA571D4628D4560DCD3F360E55392B0B856513715D22C0823D34702601011D9D862E01F3DFD9EC1B88D6740F594E20D5E4989AE1BD4B7DF9ABF6C0A7C040AB240E81FABFFDFF0552B46A012BD23AD1A9EB713D69D8F56C0F5B483B039642147814D47266AD467569371D81F6BF63B786A04603C1E9D92CE9287C88BFF8AF9E4352CD1B6D9642E49A5E3CAEE5A49714445358CADBC1FF3575D3EA4593FA0E0BD97E7CC3FC6E4A91A459466D97BAA81FBBF1DA2F5D444454821F76BD214408B239E01B1E6D88F91DB64519BDAFAF37B1588A043FBB381003377E3556AD4769320B459CB086E34122822348568C00B02BD0CEBF449605D542119C800E45AE9F5AC62F4E74A5344D879A3CF338CD41EA579E5127311FCE9C2118C5890B0D15E1B82723E2E9823B84C0E0A952595544DBE7A65AC648AA95C123FE35831E6E10C5D04707F9D4E32E9FEC599992BED469975ABD0839FA7A84EF6F0EF7C48EC91FD17A811DC353A2082A9FB25114C5F1258E6DBFDB8D1E775BCD19706F21BF41BA67AD513619213D12EC4A1B0588DFA1C53FFE775430CC9C3DB957733EAB30FE56A36B3E9FF725D50A0A6DBACE7217FC824889045E5AC7DF2BC60880176F1213063FC280A96123522B86C49C150FC27794D838E5E016A2A6C52D7C60FAD05C04EE3329EF9896A447B48E82DEE78B57D0FFCF96298AA95DFA120D60783F43A7C2762D1B5C4583C586520474E3D2DF017B377F7FBD3C2E24D7F83831D4851D654922C4501B36793CF998FEB297B683BA3720FAE960B90589A48A9BD70CE5C73E327A0031D2B6B20191703FD8B4A567FA367815611E7FACC0EA375449A33813C98A4FA0B8FE771684D91902054AA00B358D53218E4380F4D1FD2D2A0DFAF6D31BD79E3F753D601F8DF6E379946C2BCAF9C24A29CA53822009DA84C82C541C170B857F35079B9217A874B5DD2867D1F09AF8826D3690A6586B98C2C383FB67952914CCDEECA442AF5F4B1950A6235C81BD57ACB879DFAA8449761F8681E65B17ADE02677C39D2F97CBAF83D5E524702C1F5095710D78A8749F8081B9D1B189E5EB7F76C7915DC9A74191A897AD1F3B89047111E0FD9C5CE4C6D5A129975278BE5177982F9100BFBFE5FD31797846B03F56C03A8E1B23EA456EEEF0B9690C41C6877D87E3F14F5BBA69F6927A0F7A9D5F7936F3252B8EF5E69B6149F7F5A66E49C8A851F4CCC8002F26F5B66D6579746C1223300DCE30AFA71942A4EB11D09CC1EFB834107D01FFEE933986AA4AC039005E6B0FFA7F2BE088158F6017DCB91FF0DBC67DB92E0F36C0C22FA478629FC80128E666D7C74AD54DBFD5A5E8685AC5E836E0FADE58931F7674CB59F2AE2681C484EBB0F76BF3B14F2A600D36CE993CD34B99D484B2FE307833F6A9A653D89EAFCCE421BBEDCDFE4A5CBE6244A20A7AB5372DBF766DB7FAC91AD87338154E2657F931F40A1DF6A6D64B48AF8A4272775A7A908CBCD7901B442824D22057B63466EA088A26E1773B2AA3B6E6EB52AE6C2D0EBB8C6E5FB7468B1F35A56D83A3B4B65717B8BD952B8D36A9770A2CB46B010C6354A6E730740757D53B2AA5C8F7C22DB3E807C283BAC28C11F4B6957C8E2D9EF7FD0E06DBA2C91A74BEE52296F1C7B8352FC3E2C38D766BE39263CB4FE5027EC23565CB3EFBD6DE8FED63E7A5934F5954A8E30EE05D578CE4AAB7761F84FC90318052527AD8248CBD4BD1D4653DCCA5EDDDC6E6B1F6D31F12A38CF26D1462B2D9D785350879348AADF2A5536E3415BAA55452F0A47F6B657BC326B874DB116D4776D6C5F2B400DAAB229B4AB784325CED81D77A8AF6FA3C8566EAF6FD93075339F9400072D7846B09D7E9473CB05DA73722D8E3ACB21312701BBA72A0E953A3C160DFD58C8BA7438247A294E331DF7FB0609E9BBDC2DBE8D90418863DAC27C66C5A4A8A960CE22114375FB1A812B32518F077867DCE8D8BE8712F0CEBC831C95DD975217C7F80B7D146A8CCBFD90B887E7CB062DA8E929905F5FF9DE8C47D56EF8B324705CA4343BB1F48E61FBDA265DF5ADF21BFC759F5F20934FAAB8CB4BCCA7B150EB31982604025870639EBD4A472D95182853F83CAF75E6B472331251CB1E16D940F3CCF8A9303F51D472E570A43FAE0396932F365D2E6209FD7CD96AE5BD42E425DAF67795B0CC68DDFF4547A41A7A182E99BCC45744CFF73A341A29DA07BCD9FF83E7CB5F97CCD611559E410C5F43AEB3089250F55559B25351BE7FE1AF7D0EA2D4C6D1D654B4C92A167F915724638441BD76E5BB3A0815C9317CC05443EAC1EF5371785DCD109ACA2298942B90E08E9DFD3707A40D1121F3C60BFD357644371FD73E99C99EB69A62AF195B64C3B870F02CAE71CBC380694FD8F6D90D854AC2FC0806C84A125B28C1D9F8B7E86AC91E53F4A03599F260B1E5AC605B3133F022C8D14940BA27C914939121D7DF9345C42E2FDB3FE0483C3330D9CA750844E87F714F03A737C78A7BAC5D57F2F9CA2C5A9F8E7FAB20BFDD9E0AA9E124B9F8D423F60F11EA4DF8257DC9249B71742CDBAB14C769DA052A412B5A587F599F26DDEA9417A233A75BA5D5970B5526C1EB215296256E138B851DDCEED6F6F5C1995136F0D7380C558A60796E68FFB4CB26E0EF42678A2E0F6EC3E6A98E768E10C933490C93C35D2AE72F38B4E21141DB6FCB6A5717899CD880E34DF541BC9720D59B5C6E2E69F12DC25CB855832DBDAA68D7EFB27062076C4170A351F538C5AE872C464ECFB13488AEB85836B2D46A4D23614679B4FA9A5562F93C0CF9D8F794389CE853159A160365B94CB41CAC8B20D8FB91FF1C4C66D900BA7446366C5524042F08248A297C75A2105E4F653D6BD35358BF0AD576A786E6E2CBDA029591469D8B5898095EDEBB97F7B1ACD367EDC10EC1A805ECF22A32B587650F13D0D04C0DA0FDDF8508F7F71B1C6CF258FB4751ECDE3A33F0853A05FBD3616DBBE2BFA1BE58095A2E6F51E0A7FBC3C3D44F932B743F0AB6327DDDEDD551DA98BF624DAAF03FDCA8F281ECB75A84F975EC9F590D3BB4BAB85638CE38858581F8125913F07C9D6FDE6C34F12936FFA91A4B6BE85E856B582C1BC957F11F828422A84C0D2A6B0CA678B4612CF3FFD861A0DD5B6CF2438CC93D13DE7CFABF2CE2D7C81B39D5767CA2348BAB3AA9C8B00E63E13B194DDE95DBD8120E108984604278FD95D23A782BD42C08154091FA69AC5DA9145215D4E01A8EFCED0733960B1A0CA47C795264F5850EFA7C13B535526CC5AB9267F5F93365D6451C3246B46E413F18707BD97A71A2A0B0E1D5BFFB3DBFF3631BDE03556987D9F59FAEF49962F6428418C00654331C18EC9E6C98722779F8852CFE14921998C69EBD30EA0C5D0F37FB473700BAD1284555CC659C4C53CACBA15BCEFDDF4986DCF7E7F2B0E744D1A248CCB26D21D026800EA3BA0090739654845316DE5F8ACB549659ACEB9930D10C96F7C4330DA6FF4A7577DED803D4C36407F297EDD2ADDBAC0622335F162BA8F26590FDCF2435A5DEF90EA8A91F40D2660B20EFE7868139EB865321A7C545F167956538F0935BB8215793BD650548DC5C491FC5FE94808D46A374F81D0F4500C863D120E4CB2E4BF16C3A8F375659A4D5CB7AFDB68E9591569D0163FB3C036F73634945ADEC14C69FAF6E07B86FF62448ED31E9E72BD1E9421976AF3C7893795B600B380E54AED35C30F728649344729472282AF84C9BD9DC1EB3AC1414A1FECA27DBD40AEE99F9F02AEBED9546DB900DE7794326B9F295A87F7E6851A8107AD34CE508D8A51877319E7841F2A27E3DFEB37705981D8115FF42A1D3400A70C9E709ADA64A8415CC5C89FC2BEE536107E94C77BF3FF0E3C96004AD8EDEE9C5FC52CDB5BF03D1C9141C5338E8C18D5AF55464A0441EEDE068C03E1246F477078AE09F93D83B07F987DA0FC9FBF4A4C9014D283A95534893E4693DDCD7DBDEC9C72701403D5726BCA53D899663537CC6697ADC26DF6B50C92119CC62D30F8AEDBBCC5ECE034793CF16AA135B0F817CDBA9C76E8C06647A6CAB352D3FEB31D012A63DDCD246DE48F3FC7757DE27C6D1152716D7385ECB0EB01AE3E331F941033B1D0C5D1B68ED387916669EE49F2B5689CBB4EFD4CD9A9F9F0719729ABF8A18F32DCF546841E8CD40E96C312AC3CD8C95BD73367722EC92F1361803B00CAB90B396703DADF4028F72FBBD244B89200CFFE34E88D03D3CCCD9C24B0A0CE83E0B05C42DC5C17F8D3BD01BEA7F90C75836758F3DFDE21D8A04AE33C3EED9FFB90ED10401EA06CCEDB1AE85F73040DD87FEA0326684AB11BFBE679AAF96F22A2646B9E2ED0158B24B381135FCA0E5C6FFCA3D7C0FE1A5F8136B46F0EEF5B56D6B3F5B10BD19CE139122BC2BB5E0798686D011B6954C39AAA1498173FE3BCB7909F37D589F819E3EBDB9CC4ACF972A189309E352256F8CB119FD62345BC671F60D11582FB1F479285EDAECC2041939FB6E5827F78696932AD7DDC4EF65936151CC8572EBEB9743E9C04F4A7FC8B6E5BE8E07D31FDA31914EA54D0829728555A11D68C5AC346B10E945ACD6AD06B7E2DC5DB0AC6FFA81F4FF34D9C7232F38A2B5153EDB3DF3A359E6273A4AEBA37BB3EA7BE66E07BA18985494E11FAC6DD0F38CB6C6E34A363F84D58817B6F6FFCDFCB722D2D2E01CFBC91A619B38A04507A0017EE2AFDDAE36E139D4B8BDD9EB8F1C9D78625D1387E508A94EA6BC43C4BE7A0CBBEFEA20C7D31645BC35260FB3331EF0482CB72A6ABB955E3C2DDD436112829A3E834C0B7CB9F2DDD3637A59B0D29992CB4C6E54113E158548DF1CF2E82BCB56D1179C98531C3200D46865F1360E68B9C62B5F3A3A4F3DCA6F6F1F924927795601DBC4B0960E02E6A57DE68EF35D795084E774E881A06CA3CEC91078C78AFBFDA39749A9F9CEE6D14CA843CB5F9C7267D4862AFF71D65A87208BF60B63EC8E25A6C30507F551884B250F6FAB88C0BF9095391DA7FD6AF82C445C7E59E6A96F33082936B764D9251221186EFFEAAD6F40BB9CCFA552BBADF063CC67D4902BBB7AC4AB94A8DA13EC81D9F2D315F4603C1850AE72D5A035A3CB0F1379C67BB8FB755EDF127C901523246CF92F9BF01741E5F052BA63DDF411F9CE580B34BB1F7E26ED761CD9EF0A39A6E63F8F80B12D1C09898C28D8D15F5F946576C1AA983DBFD181FFCD7A292AF6BA05BF346A03D670CC62D8F2E6665FBFF5B47C32570094938B78784523D431D021301606392C0391CF0393D2D6C70808E4CD4219DAA4DC52C8F5C58F2D9DF1BA04AC65A704FF1E353E3453805FF774A53525D8FD823004F9E7709870D5ED30F81F4B696E2A4A358DC0794313699384BFD0E3EE1A93DCA4C1A9B290408236052E12053318C8AC6845631F007DF8F00F7F34517874A8619B791938E2FFF598FF6F39C356190F36B2D92EF325758FF8A500BF6B3EB073EF99ABD48B9AB47143E9A20C71BA567CF09DBCAF1378E2522FBEBD781FF9CFA1AA974C3B4951FB38092E4F15B15199902FFCCC3AE2780AA7E5FF817703D1F1281875E5071F8E466C8FBE443E8A140FDE90518C65000EEA8895A26FEA14B1F71CD576CF24E39C89833EA8B5317ED920A912AF5394149E96BF67AFFC83A695E7822505E81ACB9F944591BCBA4DBC05832A91A23F3E33302661DCD1308AC0913588C2BB547EFAE2C476E6EFED47967544288DFD920BB5F9E9D6ADFAA7F01D555ED2C9A338D47741C7F4595F572AC385A42AE38D88CEA26B4723927AF314A8E58C4CB8A48DDFF41116A5D4A769E91F8E153ADBB791AC34D25531041536502E94AFD2903A41A69ECCFF52FE65282F806E16C09834894B86DB182B01113728FBA0451DE0FE13F4769AC45CD628BC9D76A98204C5BA8CF844CD9E4C265E086D8F40D04FC492626FC68C52F7E38E4637457ED7EF9512BF6A6BB50107BDD5AC6312404868C111138A8EF9679F2F29D23BF3982EB18CD7D9284866FCBD9E43AAE91B0FF5C2920B0033C8351AAB2B9A58AAFE2F5E9559AFB383A297FC0B3C954CB00C9382D0A243F7B77AAFAC968AC2EAC5576B801E78327217B052C1DA3DEE0AC3259FB72728582A29760FBDB17E4375AEB264F5FFD8EE78249A9B87C3C89AC6B43E017404B1C01C1A1C72507542BF49DF66B5814313207EA6340D61D7DA835B373B3232F30E09985ECFEE73FD2F6F6CFB255AF1E88E586DCDC33AD88ADAB4FA9CF62D5D2BAE5F95825900E18439CD5FA9AC7D6AE6FA1803B31C3BEB5463600BDEC21D9C1543061B9EDF23A0FF90F4B06BD934D6B7499C31CFD5CEB0A2DED885583EBD6B8703D3F1FC6BB712AC3E1A7E3B1038F700415779029D4E4D2EFBC1A3C5F4B049549483CB750F039A7BA09DDAA7D7AB3FCA907551C00E36BA5AB70EA6609C7F50EBB3D4426CEDE3118702FF5B1C4551B80F2C6CF6A32D4C588F77650113112E957DCD17FFA5548702E1C4E8432B279FCD6BAF31983F61A44E04C442CCED2136FAEA6EE5AB54FA5664CDC83289FEA32EBF7599290ED0F24432EC98B02205865589E9579C1864781ED55EFD0DB500B162904F3017BD41843C7907794318382D4F137E8FC9F390D094711D12A8356D95D34E550669D94B845E569C025A07D4E75243AAC5A050FFFAB360585FF3BEE5F2B871C0A8E91C1AAAB30DB755B613B20FA08DD764982F6594E7A34EE49AA5865B3958FD3C8953B26E46F01AC42D433549FE096A0106281A9A8902529548187ADFD2B9EEDD9F22136DCCCD33AE3417B9BFB17C315B48C209059B9D3594FF03FD097A9E8947273FC7184C89AED8E1A9D097A2CF4701F7ECA8956F94E02D8271ACE0E42EA069FCAFF2F94955A6337BB1149C35A992AC57B79B2747FF8D7FED3F261BBB6D057B874BBDEE3CBF16F5DD033A98E394564160A1A72DEE123EBF74FA1F4FDF973ED78DDFB4A4A39D005BABDC1E83D4859C0775B4CBC99181EF7F1C69D3B2A5EE409CCBCB63C43FC82B8DEA429F60E979C7F2ED619AC81233E5A341A575918B6B5C7DFFFB46E5E10429483C62053E6A5C0041E32A7DDDE911255805217F8687E161E23CF7D0E857A16572B18EE701D1163150B720C7563CEFBC171926C1C18870621A32BCA8BBEBD6F019FEF7ED40068D7BE73F73D6AF822850434F46663994156F9F249902C0CAE22D2B311F29E79C3F6ED723CDBA5C24B144EF48AB01FF2767435477C4D9DAFD3593CEDF7B3AA58EF584D4EA373F879056A3F24E34910E0045CC46DF2456EDFF4C5A8F466FC05A77D33EF4009EDE0B960B9419616BA585AA892F67E44602A14AFADCE3208D6C55A3641038EC92A4D9FD5703013CBF474B0785EE00930C31B86E6DFE267E3E54EFD7878F27DD51F0A6BB2EEBB27F3B608C0CB93005D111EC0CC172AD1C45F741E95F324D1C15AC150143FEFF833229D59503E3230CB4BE1FEC67E93E753A2FE1349B1AE4D4829D3B3F4EC71474292BD85464976EF4AA4C000A91BF84386A7B7F8C9DB58468E1D71B6541C94C6ED169634911D72304FF8F0C87D12622D191BADE76C5823AB4E83C287BBB14B000BD6DB3081F18A4324DBB2828DBFE037B2F067D6F9C5A36C37C0AF09EAD51DE0D6C45888A12C9362F1D62018426B24D2DB71544F948754D3B06330914F2C3876085F469A72298DD123FAD2D3BA16D6F800AC908AC0523BB9E7A4B55695693E9B4DAAE5F6A7CF2EF8F0F7492337375328333750FD6F5455F688C0F8A0DE99045FE7035B8F09F57FE53AC605D623DB2A74C679EC02DC9F9CBD9BC9A8D646BB3B5C1A4970F0BABB03F0C7344587E8F17FB3F3A9AE1643A92972B40D0A750D652A11767E5356031D4213958DCDF4941339A871F7E3B96A3E7C3F451A75C83933DA5A7E3377B4CC2B82CA3BBB57E3C76C85ED1306378A2AC6E0B8C69B417EB7D0D4F0CAD399AAC193749BE71A843282C1183A85BAFB8BEC60E30CE7D4B972FECCB618BC3C583B0222A3B18C7963E8C08C428C57113FA1BCCEB277E7BEC1848465DDF3BF8BF02F67629BDB7F8F7E57C0C1FD3F0F54AE95D0698A767EA33AE1B63A8BDFC3E467590CE7F50F76187F754141562B55542E5E714B4D30057B04F839FCB86442E3CD3DB842049E7D7B0CF28D38683B175E84A487F4617F4213831ABADBA4AB90C31A84C75BC6A3B5ED001CA772C5F1DCF704D5CDF8DC3045305DC4B86A48A0CBE46FA775BFF1FC1A618DEC19D65C0EE53C32008EB2B38260A8708A7500ED01387872BCC35E0D8130476B479F03618275DA04DDBDF6154FAAA3E61E88B12128F43E590688F802EFD2A35F71512E4D9D0FDDE907D115062F22F9F9757D6909D2DC8CF8BDEBBC91057866E0EDED690EFB2D9B80954D3C081201706BD5FD39586A4E7AF134F5EA796013D1021E3EFB790996F115D1E8B32BB36D1233919A2085B6870D99643D124DBEDDCCCB55F3B29CF5A4C7539D531F1F44527F3326BFD60C09F11BDCEE1B6B03CDE3CB8DAEEB9FAC354DBB5533BFC0FA8030D27744445181CD4F526DBDECD67904B49DAA676C18B4CE231ADE688FCF5D7B6054EE08116F62F513B8432C2C0F4F02D89988D039B91F19BD927C177F7C1E44ED401E3B882208C174B36800F0556A44C8FF24F9BC2C7A809F19E50B8AD40DE47B621536DD0EC80FFBB6AF55AE0238EF801E23980A3AB808F1EDBAE8F5C90FAE1FD0E05A1F65DBA42619B7C2698BB1B8A460E2C5D8E25D919111AF1FF83472CA15907A78F7458C7FA8374C99CF33DAE7C69B5873A138CD266DDEFABB88ACC7772B39F5619ABC05B442DDC54D36821D512403C58F93DD6FE9CE42F28F1E6EF027ADAA251262E30AFA8B1527B3739F654FB1B0310658824226E7AFEF3DE72058FB8B35B38E8622A5CBF9A9EBEBDA45864F7DC47D160BA604695285DC978FEC2244E4AD3664710C90D1824BFD66409510F6D683DAFBF3250F56FC3BFEC7104103D2D3924A2FAB5CF83F8F1B5FD200CFDE994745AFCD627DA7C23AE3D1A15937D1751D21DFF50882CCFDA8AED2F8FA33C4E4402B9231894625395F6D5706CE675FB7FAAEBFF3974A244D1500902F0B145568420842EF1E1B1B2ED08C5F263317E222593C31BE27F3E6667F4D877615A62047B201A88458B0A164ED91BC698FD47419F860D28EF295F488FB318D15CC291C279200BDB24C0A7F6159C367BBC0F13D7CC03F3C7AC4E55A0E9C61131EE792FBF0C66374FE89F2B876CFC89AC51D4A885DB8E483A7CB6B37F70699EF6F8C2C7CF676064E85C7EEBC7761D504377B13B1BD28622B614A2C596A42F887F56ACF9E9EDA6EB5E6B1A3B0FF0075B837998AFB4E4A6C97CF11BB3C5FE5611967092951C538F1705270D8A5C79BCE61488516870B65EE6B40C7A680EFF5A021A0D850C836937F1E7F3C0E85172CAB148918648F59151A2DEF8E67768667C7AF3A664B853CCC59E365DFC8CA9F402FF04CA7F8D913B83A5D6BF4B19620F667FA1759381A1F7BCFFFF9272677B39B46203B07239ECE5DD8E06C4D34E635BDB64CF0228DF54ED696F77EB48EAC15966985FB25DC8B2CC6014730D5A1C26121D6447EF2C9A2E41E40A907F625E3C5A32695203A5E71D6276A5BD747EEB8A9D3162E80B5051D0F9B2304E190266E34E16C9F0A8EB1865ECE56657819B044E8D6140993605DBF7FF2CDDFE72EE2C0FB2E186531C537DE28236F45EA20C74D3AD88F0B7F5659EB9A8964399F59F915112D9B4156EA308CE00D84E64A138057DC982A02C5246347A2A6B0A12F7A21C5D4EC14A8C5BCA5F69569DE0FB6F23222FD7DF13D2C6B096548388977B26B4C35E85AC7EC15F51CE5E3BF65E2E49D70EFC03D7E3E6DBD822DB94A69A6C95539137166EF1F67BEDA1DF08901F94837EF78400BC39B78D441CA6DE12A8D3951611E9A00C5C4FF029331BED6D53CC5AC0D0C2E36D104FD6CF506E7FF28562804DFC281363BAD34013985F4F74139C64393221BEDBAC9CC3EF7BE3F93157720F80023389D6D914B38D36704E5BBEB3EDB07CE4029D620B6DC9CED4708084FFFDE3138A48758A7C84C83B96662C1FEC4EF76F54FDB32D94B751EC4E4FF94260C0A2AFD01DF286CFE074677C16D1DA9A86AD5C16B76A521363E701D8457A38493C40C0E3DA85DE957028DAD6EBB06A2646402125A0011EB26104E1F7C5F3CCD233BCDC08791AF98AF8026080CED609BD7797EBCFDB9FD9D06BB92F3705A211F6A067423D7FEE17BA82FE574E00905CF4A0A3CE1B5822B277A2CA61DB23E1F6DCBC8F0242C6FD1221AB0A902F436B72936D35DC76AFB78B57814F49F356786C7A3F8BEECDC1735F9C1FC1F71A37CEE3A644FF313464C7A083B218BA710EE6113B8B094ECAF532DE0D74903CA866C472D526C45903551D812B9D50AE509DBEC945674C1757C656AEB27901C851DDC94656188B2CAE246DCE7166EAB0E340772BCCB3E6C8085AB77812101DE6D23D5F64E82610348134DB865B2B3C92B27E2E0CC6764760C30855DF4CA606EFB925449180D934246469703D6F3886BCA4BF113A5C6694A27F428CCA25C6B398416C99A47FC435B3503A542AAE25CB3EB6EE0DB4E3C412BBEEE8C189668A362EFCB991E01F7B3C85F9FBA965190B80639E71E01FD079C1BEFF47AC5DC90D7D4E413D389E9BC5D39F5809C41F42A2207F9B25E4CC5B42C8EBFF4473E6BAC6F608DE669C5725CB680E515737D0779956EF0E8922676FD4366F3F82EC4814FB2D012EBE412E4996712BF820F1B9A8B79A5B4E1994F8DF947E7FFFDD7ACB1065EBB341EDDE9F75FB0362B2FC4DF76CFC87DA6AD7CA620EA215F10FE772C47C34648FFC78AC83370B75C9A1FB361122D4EFF733519C19869BA11C0A00178F2B62124B1D4633927357F471152A19BED0822FB64A246C3A57C880A65657FB81AC34FA4C718F4E635FC0B185FF93A6C564EF8D052F03C115CC58F3CFE4C3EE5B099A7751F8CCE76471A8C663C40024FA424BBEF2D98EB4C309FD505766E22107F450675B5AFBB09EB245DA0E7484212792B088FA5302216764DAB3688F60DEF6D01E1F1CE449A06C30FF519932F2C99106A820DC3006B7EEC920EE934E315BE28AC7DF6CD1B965EB67EC807EBEB4A434788114ABF7EC703D96C28B06A323696893DB3E023988D08374DFFFCEA7A4E1DB44681E555C50A3B5133020FC03D92A70C88CE285BE150D4E9096ABA4FBF3900B1E8B24629CC75398BE7820C0F0B375DCB684E6B44341E9BF6FFB00135A33E4816AB0C6E979C471A16177896927F47586A07A25C0A5F8B472680A5D9A3F995169ED0E5C3FEF01B3CB6008BFA5B3A28D6F32D1DD550725F23B8012541320324195A0ED8BAAEFAE3FC014B97B653E8932E6C6A8774670D58409B62E6079A22E8F7EA68C02186E2B26ECF515F8472B34B447674CA6F68D66F06E5DE3AB0E8150E9C96C964F10932F931E48D1E6584A30BF4674674B8723AB61F58711ADCD0DA2E20D1D46A89780EC0608C87D446FE4A47682C46896A8DECC4333CD8B147B0EBF0377E1B830CA4BBAA96E9E0549D6B726F7838494E9C229529968E134EBEA562F7DA200F0535A19F8C225DB6BE5FB96F6BE0DAAF8849CDEA4D7E45DA28C4B7B3AE09BF86CC3AFD3A6D29064177903C0FC311ADEF27E793B823CC5FBC0CAA6F807AB0915A19C7C3F1A88128F5619C23228FB635D3F0642007B25A851918FE6C5E316C5501385B3411A223183D35DBF0E92AAA3AB4B788CCD0713D22C84395BD87FA3508E3BC60395C05205149F0AB05DAF5688B5DEAB0D293D7747EBC4D8E1AC74C34A4704BCD37A61F1EE2844462909CF2DE9502B68C61DC3E5010F10884EA0B58E2F4BDCDEB339FF98E4435D751CC6FB6A0E10E0BC81DC759163904B6C4E7F6DB5495031D2C2DC1284DCE27FEE690915FC0FA3E3CA2A331BFF60EEDB615E1240C06FAC5D511AB5F24A40347C008700B7D0639F463C61A9286810FFD5C2C465129E26B002C58BA2BA3E285AF1367A3B638C8D2632C76240D75BACDE16591FC31B92B76B3F52A630C529DE6A290B5E688813F7B9251C942F01E5AEF3D5BC47C2E42AD2160720B3EF989D952D59FC0BB4EBDF6595EE57446C6CE93D965DAF8B83CE352783E86D0E95E8AD38961EF7EFDB24A45BE6E583B18D7F217E77E14BDAD5D3096423A22A91D8DE69F0826448ABD42A90D9073D14E1ADB50437166036E0297DB9E2B7AB5715BF0D3B88CEDDE99AA6A7C69E3BC693728A56ADBA5C3AE7F879DF079DD7A3CAFDB4AA15753B69A499858E10647E932AEBF20A4D3CC8E367EC5733B621D4DDC6D30F626AF884757995FFEA87CA5F1E3C96E60DBA94ADCC468A8CAABA45E80D110EA0ABD4B3A4A7191B5D295EEBA6ABC87C8E2B7129B7E3133100AF7C574BDBAC89732177733D67AF989413FB24EE127DF00F53CB1AA17CAD2C406F23A9289B7F6A4E32531E494E2D7DFB40DE309A39980ECA057FEDB30B7062A5AFABBCD37DD980824A96B0232AA4FF8F65867E56FA1FAD9D974DC56151C8CF75DEFFEF227C96C2EC0A8BFFDFB5CD9339B9106109334895FA113E265CC9F26AF851F7914960FC736735212D3F3E7DA990DCFC5231F4142CE05C9218C5169AC739364F0F161BD7DB0C50D43A74D36858D0A2117D530BF232FEC402F5CE51829A0002B060459028A7A0CA1896F5844D4FED82BEEFB560D1697ADBDCF59B3C121BF086A8FB87E9EF5EBDDEDB78EB1EAF164A90A92155DEE5E507B8F9E56CA2BE9DB2D4635F713A2C17AA32CEF55FDE98BFDEA97FF973321823F9F96022887ED2FE744FCEFB7E04303D1AFA1E7DBA5B6CC9ADF9D9EC152D2EAE09E6FE705484DADE80F74F73FD67EBDCD2AC0267696264607555FD1E0BDFF611C151A37CABEA8E24F159A23EFFE5E9FF58E849510281DEE54167C287DEDA99447CA127AA0FDEF96A14FDF8D9CF564E800CA55B043F2936A68263ED282D66B7662954CAE1648C8FD71C240EE4CA4439D25E0437D2872138A59665D5B2365ABE974E393B1F10D294B00AFD8DF8D6AD9AB48AC3372E2ECF2BACFB035BFA64FE6701F38684E143C779866547868962DD9B82ABFC451E4C2AF162D25BAE6F2DCD4C49B21C84E7A39F08786010D64260E4249E09CA0AC9707F279274EB54829AE7176199A9B2DD003FF085F1D802E20DA01D5B50A4C2983C6D48CCD10BFA77B9FD09EAB8BD54770FAE2422F91C57C9CC99AAEAF1801759A0D75D69E9BB198FF0F15A1186193A7CA0D929FCB5C8F179DF6DEAD76DDB06EBED334908B10FED4FE4E3ED430DDD70555378D30D4852E2D44869891644ECAF591828C472D6DA1F33DDEB02A11B318F4D1614CA899D681EA3F73858D7EA387EB69DFCC38988988EB30DD9225599E904F62AA2943254BDF98C2BA29EFE3D316FB24043AB5CE03F7872D0836AE1C793F7608B5A801682FD7839E3E5606D041CF593D52F23053ABDBC498D949677B86A2877AD8A48A8AC76D44D1315753C1A0B701D02A5850FC71155FAB686BA471F5231E1F334F552B9122CFB28FA0D0AEAC8E8D76EADF968AF069357B7DFD091B22BE02D6BFCF3EB93F68E18802F8DE6468E701D3E7CA24D694F6AA9F2CB0D18606E9F19DEE4477C5AEA36262FE8FBA3087162C4F26693C3A4A69E76C4CDEBE38171EDEBC06E9B7E6A1E10B9F00864C3DBCBBAD03CCA4168FE0C277CD33BE745C4C17750EE4007438144EA14B0CED18947700A4F8FA3054BFC0649A5CB49345C011033A68FB6AFB108F4B14383E4B6FA3A08EE6E7583F373549B1275BD750E51416EE9D2EBB404D8111A8A5265E7233D7EFC89FF9AD01AC9862871A420E058BE2B6CB8A18FCB3E21B4F4A60DFC9A1B3D89BACFC952CE9B2E9BD7F964A214E5ED76E09DE91D0292D7911E32F52046C8B506CBA73D3277016805FA55D6FF34B77411136AFEA0BE2E7193B7A0BB0EF6840D7FD3A914E032ED17560FA3BF9AD2E730F62312CF30A57925F9EAC5CF5726C3EB19ABA8503DC93FA8ED13FCFCFB54D7DFF9000A944A9CB666DECEE1DF726BF45FD352D26B11445510E88B95999DFC5CED6D3D48BB0B03BF6FD3E10C9EFDC05943A927A57598B5363AAC1A3A40D2857C3F8E874E575E70790CEEB0FDDDBA77C025A8AD1B54373F171D0987B11C48AEAAA667D5D979481D7EAA6C43F74B3ADB3605A245C20A1D1C9FFDC1C0C0E89B93DE61247782311F82C27B75BAF15B6163CCBE9D10F688202F9C024246008A2E744BC6FBE2E7AA49DECA5FE7F7CCEF76F6198C832662E954386CE420AF40645985D8B2EB78DA38C6C761DEA2A22072F3776983C962FA12ED6130904A6C112C21C1A47AE6B6C1F2BC3BE79EEF70E855F97502F9782E5BABA9A24114E06F9018CA8CAB2C6160E86F5F0203CB77C60C1ADC6E3BD753798831E3FD2E67BB03E1A8B5BF79B56F426F2B0A2CF27B5AF626FF2BF56355B09DEC5A0BB6732B8A9EBA5CD6C1C6C2293E2089FB6245DF4651CE92004B5FFACD31DF582162AFB5E5C6C1F3FEDD7F5FFE621D58FEC64FFDEAB9E020476EB9EC5DE87215342FD14F46E870A64CB026C08114F7595623DAD0FF85627A988A6C70F97C8E477AA886EB214975B2722565094E00E7EF59B9FF32D726E568AE6DB34E7FF799B0D0E71811138EA7CF89FFD89B39BF40B552BF4395648CA21AEA7B9A1E6FCA71C3C028CE6A328B8B1C9B88B494B9B4E573A1A9587553440359EAE8C44E0060882AFA8E186F0B9531B43D49E5E60D1C8B7630C768A2AEB7B22030B955DE54C1EA1DCE15B7A5F3FCAA0C166CD90AD7B30B131304DDE9A21585446DC2939D672D4BF78381E7D8D4145034A358E307BE73E9F1E919BBF1B7DF82638ED17C425F47F74F610497F71AE51F1ACAB052CAA8066104C3DBCA8B10E092B25602BA9D98B8131745EE32982CDC62198CF2B8AE814612B02CE8E8801FB13CC5059E3120848A6FC6793DE68326019641DE993BF58BA4D89D60CBDF84A14018B2EE1D4995DD036713F0DC6E9D87C6D231D439CCB5835C7EEB8039DD79A66CF7C8A5E6343FF8387B6D4F64E277A8C94BA4AB1793FEA74F9CF13F6D2796F45370FE23A902E8E8877A8950F7F13EAC3D4F2DE282FFEA79F8FF54B201FD96D8F5231FC8CED380DBCB312AE4A9922A7CC498DCBD2DDF348A1AC670EADF2311289331017E334080687485D5FC1505A1B7F755C4EA7B12884190DC1CA415FAC180F26BF86CC7ADAC340EB5EC6A699D3ACF8D4F6ACEA62F634B4E1B09F2B9A8455FC0E1BD50DE7641CB9F7DCDE15A8482A3B9DCD46C0C93CD949AD76CBD424B596DB3138C04A0E91EB27F0D37CA35E13FEE69B43B88818F21782116CF5F15722D75183604C125BB0F2FF88C9F218861FC8017F80C8CC28235BC5AF6E454652C02ABB51F51BAD4384F99FFC13F76B55DAA14573BCD1E319CDE50392CA89C8F3B4B4E990D4252042789C87894AADD54C35390A4605F57B5D778B63C67515B8E572B8D789C17100297EDADCE38E76708006EC78ABC0114448BA3200D3B61A3F480534877A8FCB18E5ED05D42293CF6A384C426A791ABBB54E78E4A65AD4D44EC7408656A691DCE8FFF752B4F5DFACA7CDE2C4C28CE231FFCF93B3DC5695F0A2E68D0A74E54DD5B4DB070C0FAF43AF318C6B04D6BD67999E3531EFE3BAD9E9F22F07E846E6941060DF5B4E53FA40FFFEC78E3ED3D64C28AB68E34F2004E4D8E17F1828AA43BFDD10F29E04EB1FC3B43B4ECAB39CD671A6B1528293F53BBF35DB145A476888159BE5AB2BF8A6D8158D3E7F8EB4F3F988A141EB1F641FD174F318AAE309623914FDB5B72B9539B6A7E7C2A07667DFFC4AC127C6DA10D42395C11201F7C49CDCCB65CF4290E33DFF20E737BD1873E037FDAA7945DA0B43C96A5A8EB1C5CBB7F7EAB41F4DC2DDF4B6E1274352854FEE03FB47D1FFE1F556062FE87DF4BAF28FE0E399A437DFB361D327454DB8F5439634FA7A5A06E4E32F0F4DC5FA9EEA8C5E1A135DBCB8541B965550CD12F8416DFC2F7F432ECA0A14B7A36844E84B8869B73B08C731BE9670589CB77A5813EE2B5A9BEB2DD120EE4DC3E3F0E0F76AE3B916B17964F7B66C6E6FE70B0E934E0EB96C69CFFEB70A413BEC58BC9C38D4F934D21E2A109065839FA52C2BEFB80A6CC2323F19ECC5A7D28531FF3639AE6AC99CF62AC4F9C77D162F3744B5DFCDEA5E7A36724483882FAF6E6BA15B988CB388235CAA830FF5A5EC1603FF8DDE1AD396E5790F8D4D8084E8D820A7240C6DDAEDA68C1EF33161F4BDE87BCA3BFC9D4739DB47A13F1B8C7F8AF351E9101A326D882FB82C97FBDD8C1C5173B113EF19947CAD4575DB92B5804DD477DB7E8C697E8EE2764F1682069511B07F272F7873F094D7D7FD9B05D0DF8A8CB4B9DF1722A02D88054E265D8F3C3E9090617ED72D4C183194BE60831E98BE0672B25DAE323FD131ABA8E0EF216E477C19F2C89DDE96B6C9B6F97F78AE1DC6EE7FF531BBD6378916D9D21EBCA07B67E38F882DAD2EA6F4D201FDE279E384469AD7D4FCB5C96FCA33D44ED15AB5395AFD70C343D38C2FAF3CC60847F91D7A53C55A5F73D2399697F86FF66AF667773E79F7161078222404BE9AFDB1F1193C23F2BC4F1DB818AB95D9920C554A43D8C015BFB4363F4FB036543277DE8B1E1C6A49FEAC66CF5D92286AE775AFF0B30CEC041DCDED2CC83492C532F8EAACF67E3E70FF47DD97166E575AABF283E8B4D56A9743FF4C0DD2E2AD68F0758FD012FBCEA74937A2DA0F70AFBB233D83E832676063E22FC9DADBFD19B6AAAB8854A24C0761ED0251320DD0486DF884AFA72C692267AF40F6FAE8114485813E37FEA8A48D8CFABCCFE6CE64C7CA9DD859D3F0BC18C4AD311656D57AEA5D807AE80B2B505F5B8A8AE282A57FD9C40A55523E10DCD51E3731B95D53F042492FFC2DEE7D0CED587D4A185D562515CACB9D3D0FE63C4B0E6912CAFA3C30947E66301F92DB56E7D2273D875F84F648EA6C210482C34EF097A023D0B6664FEF5DC535224DA8383B6031635A32652F0A1592C27AAA606D57D7F1FE157227ADACFD8CCE04F42FC97B5046E4D84A0970B475D444D0DE5604FE4D7865F01CC13B9F54FE42DAC484205B83B1DCAF4061DD03C20D12C4C9F9D56A8490FB3FF9F8BCED8745C0AA0B4ED4E5747DF4535F43E4EA42578AEE68D0C94619C34FC045C3EF78A91548CD9A29E4AC221EDC3A46FE94D6EEDE9CCDF17274F59D83DA924574A3475050BBBC9E5E2843DEA55BD470BFC0D5876EDC5029B9E53D02F96055E4616C0CD4BCC9E12FFCCB569DA467C2903637B4463C0A3A802A04909CFBB40CA0A91A87528F22D8A15474F445018F87A97E7449049E5C330B82AE15E14004A96B1BD2FB68B3A2246D4C5349589F64AAE6ACB3AFAC432D8EBBD8813DA8222D25BF031EBDA0C1C0E6153805C906947E0CF2F7815AF1130D1CE1539B966ADBBAD33D981ECB7C32FDC08D2F8D364A85CFA5874317FE193EA395A1F127481A17F7CF2AFC241E23717736EAD2F55136E22ADB8145FF5ACBAA2D16FCFC4C00FF25E5C54274052ACC40F09FB188A77E17C1B74514E6341B6EDF9D46E3506A20D83EFD76B4D0B463E6F3744E37E923B5BCBE78C14853AC1079B361265AB9E291AF3CA860FF82D49E0D42F1D1E370EC2225A0D18CA7EC8272E40C71C65B1517388D68B0C3021E8C1E828FCA02BFCE4B46E16C82C1D51216EF0D9D43D7B2D802F682E47B7AE2F190CC91A21F1CFE78391616C4ACD644FBCBCFF953277776B927BAFD8927CCD3C368DDDD08622DCE350B8C21E143851B18F764DBE5EEB966150F5040314B6525EB60EDDE41A85D5EF09887E4DA0854B688A2A5DF40F992D10D5B54F0789C0F2539DCD9515F2513086096309C3B408DF912F12462AD42CB0FF5FA4A081F865E9F316D38133B7DE06EDB5BFD3F87802C025998A34467A664288A3CD34E4A52FE08E193DF4C1ECF48C91E2079FFA9F74CE8005AACF82EDBA3E12658E40D7E14A7DC0F1A4498E5FF3B829C53BDBEAAE4421866055399B5E7C21BCAD649CF552BA3907DC19AB678E30F88F08DA6C6BF19F9B2A1033904119A781146F1A2F478EC8C2C50F5825C23C339BC5D629239381DFAB64EA1AC0720D1893C8E4A9083B26E0B59239068A66AA274AD70FEF65909171BD3AB81D04777F5FC8E44CAC4D00FFA121083A46800BCF71FF8FF16439227F3D7866865F65E784D744A186E8EE38ABFEA1DF297974C1C05CEB00CE249FE6337CF468D7455F79C9129E08DB01C9E04A9CEEF6ACF4DF2CCE8E7ABDB7B97AFE64F90F3701BC2CF2B37B5C150E18D0A8F72049FEC4D193E9E3FB8782DD1280676E38BB8BEBE766054E49ABE9D2861ACECB8FDB1F35F0431A2321AE43FA2A5AC06550E5BFEDDCE6AAAEC2215F79D8FFC74EF63443CE8F5C52F0D39BAC29FB9FD281DE9B0355684FE98675DC99FED1FECCC03948DC375E1B96CAFC6F13F37CA06A4FC08DC86D7836B05782651B350836B16C1A614442D190FF361549D1E7077E1CF501F0D8CA5B678717FBE8B1DB41AF4881011F57E73035FEFBE75558BB4125D16D6D11980EF9A9DBC88015BFDCF379D8E115DB7BBB1623BD640E3B12CE8581127D034F0CAEDB048CC161307F49A01D80263785D3550B7C4C0C1CED5B5A75162E5B5A6AEF806B8EBD8848B835FAE7D9BBA11AFAFF12E68855EACBA722EF52E8BA0D3F13AC0160F95A35D2B317139AB0F9D4FD8A8B3EE7A8F13BE9F5CBC2D1A6DEDA6CB26C491098DA91E6310384C00FF1FED413C714A8A81055731D95BF0A74246453FD8D373305F0C10C0B716F7F1712C2ECF06F540B932C9C230E86E87E8C2AFE2CC5E44F2CB6066A8E3348A2F61A42D6AACCCD9159537FDD64698EBF9C339109E5621B3872304603D982826F1438EF87991FCBA90C3CFDBFAABE1998ECF8B47907F2C741C7818C9600D31F0C7CAFAA82F2769B9823F416B9BF78D799AF95D1C71783BED2E4E40F7EBE406C139649DFBB8940E1FAE236C40F8F7746467E74998DFFA2DC4E6446A9443C0CF8200A3E40E48B2172C434FD026E9CA672043093223EC9800470B0EF43378AA0B791D8F6707D6CD1CC127F9FB658BCBC06723F0A3514444EAD3A92B9B8234F87DF86692F5748F7F3807508275C13D7411A1E2EDB823A0660D9C8E40E4B3B6ACBAF133BBD2519FCF9426FB8D0D12CCFFB9406C538FED04960E143F829087A2C93A7F318D677AB1B5BA3D927F6452E8E089ACD8D377D119C7CADD4CCD742D03CDA4DB33B37C6066BB77291165747C6D1C0950161CAC5902F179654110E162A9E1118945FC60B820D613D9377D015E534EC6F921EDC88ED13EB74C9DEAB81CBED20B2C65AD610049440934ACE270CA14B1E092DE289F316CA013C9FDF596F9730750128E3FA0C0DAEBC91C16F79CC071050CFEFA3AE97D33CB93BC184F350C7880EB3824CEC39A5EB1764E1B90F628C312F146CC30F865E7A9AE956F856B2BD2771FFBAFD3DD9FE60C0D02AC5A1991D0CDA18F12DCA88DCEF4F2B3C77C7AB52BAEA4C141B06ECB17708C099487C70CAD523033B2441C57C2D3B42FEFAEE56DCAA7050486E228D89729C9D11694E119F5DBBE21378DF7948E9221FDA11BEC801964E64F8C860008D57DA6E6AD77B5ED4D293F7973A8AC50BE13B33A4C2C744E93C1563CA8BDB508072C3D9D841E5B96304CB56DFAD84E637241D710AAD446F18821EBF0E625B594027447B2006075D9616FFE14C8A6A8C38051F2D1745F978150877946EFE389F19CB1DE7FCC261797E501007887288A76F7F67CFE047BE6C2C9537614CE29F2D0A0D8A9DB6E21178D9264E500C4669BD8F0FBD3D10164DCF34D9268CD83861D30C5A328F0849DD8FAFB19DF835D365BFA6366E86D1EB6166071864E51118BBBE495CBB7D9BFE1A7B3D7470944EC0F89638A2C2A0E7FF902B60EFF2932FE00C98B79C68A0AF623214B021969ECAE6E64CB37288483C5376DA2295AAC458306CC325385DCF29ACFF0FD3AC9B64B81B061996D297A4EF07D34F46720FBA9ADFA9AD506DBA4DDDFD6B88C7B84B3A57C10899CE7C731D0F3B4EC0F5AAB1462E5A8AC8EC1D3E32AA2D53E6680CF6D517CA6990EB21689756A1EC84DB94E1508E60AD6C8CA2C07080C0C4197AB6668DB3A242B83C48DC3D4D87FF5F02E58435CCBCF678222F2E04A812A919A03D519F1DC17D14554D67A0861BA8B01F77DF75FE95ED2C4C831A55D5280A5C4615E861A8E783BD411262A887670329BB89FF7F35FEE2C2D7D70973420DCBC16DDF2C56AA4D533971FA86601930FDA2FC824903997C066886BCBE2A09257F3AD33853D0A44BF5DB25AEA335090524D0FC2C623ADCD99B7CB07FD8C97EF43D245C9A8218BB701599269EF897551B778C8930A10081E3D6E2B26479F3A7FE22879A663CCE4C69A5E07A0925E06C64CF8BCB764721C0E3365A76E74C75D88EA1869DFBCFCB48AEBCCC7B34F611340CEA4CE5B822C1CE7976B506A79EFDDFD75970AA532E24E02D0821E4E5E654FCD0870FC6139A05D10EE1F787572745303615A40274D8E1723AB2E19198964755444374FBD15576304E0FD0C69C8728C6372ED030757697A0C7DBFAA6DDFD4BED9CD206E99AE04F5A5619001118C3D914B1CB88C38F0A759986C000C5546BB62C679F970FBB935CD83B2058CC8B6CA0323231CF89D02ABC0600AD7B75E210A166382F6EC2C2A068641107CFBB2BFDE00124C7B7BA88A4AD9FC4F2821E52D323DC1FE503102EFA993FCAAA4E73F40FA2B6751F2DF194142F09D0A444DD49B62CF33E934B369A4D1B9A71419D4E0983A41DEE1A5BD2F34F41A655C8EE135830068297BD62C635DE5B51FCE03F5B024AE69251CB798648F2BED880134D9522329C82CF34D2D4C8099FC41FCBB400D7180DED8087924690C5DB365E44B01ACC57EBA1DA1D84692FE2C7B2D2731C868367B45FFC2D4F66253B46EF521BD67C0A81CF3905DE294C8369E926970B09D19A8DB083F553B2ECB8FC1E21283724FE808D34795E8E4EDC2170CB70905F9C9173709DD668012A3AF9C74ED92B90293C881939ED46AC32BDEF61B9F4EFD9AD5A5FD62AF2178FED4E0B7D0CC3EB30BC16D198442BFAB56263B319FD0A6C7C0DF6A20EC128827F3C8E7F8F6B9B5D8638B65B995D71886DBBA76FD2BE8B141E5D374AFA6052184F323A01CD416F1522903111DD0F18DE732C6E4BE9E3CDFDBB95DFFAEBB6E3D5783BC54635F5DCE3AFEA55C004D3AF1A90EFCCE86739692CBF6096FA721B5C4ADBB8951AADA7CD4D646D24930433E5876F1CFEBB47F8D1F4440D23E24FC1B796F00B66A88C535CF70C8A48A44D769FDB57876DA744A34308FBD07CB34776111CA2679A0B2F400965E796CB942EFA7DD62BAD7D67AAD8CB76703ED48686AECFD33D495B0CD47F565346547B4203C75E7D66162EAA06F63DAAC9A7420894C9D5860F9E4A3A0D986CB56A2D761D3A7E950E99F376D4EB14B0B5F07788B84E16DB0407876567056AB48D73514554BF26DB87106444B283554AE5428D3E429CC324F8B8CDD1B77E98D4EB59F0B19E05071462F7B3551DB6AFF0C8C6BDBD127BEE17A6C24E6281D730444DFBDDA818272973B68E54B9E770D953CFFEDFEB1FB5F8D07EC7A39D50A0E0CFFFED9C750A911C93C6AA8F50714BBF432A2138CE98642F3CD3F73D8888041D28A418EB04AB748B487C870ACB4CD72CCDC2E3542FC936F15BCF3CC943A08F56903904E72562D68F47752A4E173AF93A0127C49529A4C7FA02CE8A5A76776391FFE1C7D42DCF52C39243B2A5528B7CAB770B794E2A02ADCDA3C6D9588A734E0D700AA42CA95693B0E8F2FE5BB4D6C81DC03E8B690F6D21EE7BEA07DF364490187F3FB2AFD28343B1F9848B231BD3563D271F00033C5A7853BE09652957746579D63E88E6833A449D7A219526C87336DC1AAB26B32A6B45C3511D3DBE445BDA6346B0C12DF615A5A390F3CFE47117F2D8A25F955E92E224AA08DDCB9A729A8C3A37CC4DF349014A99E8E3E23F56306DE4E5F6489DDDA30D8222E7F36FFD036B5AB5A453D830126056452D29D90BC1B8B03C2FC25ECCF172B823337DE157240FC6FDEDECA2566E8F437EEFD72EFDE18BD6AD7F80C314C6078CC4D53F7306AEAB953BE4339A3D55D1EE7BB7816B9D43A5809F13A8FED01F2A77D6580BC21645F69F94E9EF1A5520A33D80542C66E88ACF00071AD155BBDEB3FD50639A18A9692640DB5509749464AE76F9B7CD37106FA879E8AC9574986222F8F4B818BD9166BF82A96761E0F727D7F52DB97EA1DE0723DA4B3804E7213B808876F1AE801083A6B24660C160D37112EEBE2A68C9DF0AC02AB5F9CD6A34D561999E57A808E82F683D5A0D1C5D3534637DE1FB8290ED542ED16FB9F9E1FC8EA7D18BB3DDDEEB7F807E8EFDA350407408C8B3693510F83EB287336F36DB60E3AD0E447160063360D49EC51417C69B9B0A41509D712D1421BAAEC1EAEA3AFB27ED9277898B5D3A2D71F2EF3D15FD19DF971AE7BE54CF28BCDD761D8BBCE4FD0A3093F0570238B2CD2C27221339DFC2EE3F3191E90AC8BA3471A4A5E203F077D57CB83137DD315B1DB1C1ACC07E7CFB4ED4562A5799A21FB2AED6AE0E56B6EFF283660784560CD7A609B5FA411914203385518E1C639433976F8B461FFFACDC718F4F2FE054283BFC5E74844923F51FDFD106765F1485D08A3ECAF3CC50CF728D98EE9B4A191A12F43EEE00DD131830EB1DF7EA00BC0590751EF35C047FCBE35A2203088A484E8003101010982400A100E399EB299986DBC586DBD7B082981D28380360C4ABA69EFF3FE0725E023B8FC240BA14F43A21622A4C6D95DF115FFBF690848AFB92A8392EDECD58541FA1BCB38C025099CDECBE340A6A131A8D7CB9583F8AFEA22403C0EA7A22FCAF1692EF8FCE623A4971B20E6C78BB3014058BD4514A19A3B58900C57629900802396925EAD7F30E105C8A983EB136D8E4D10F4F3353346CB981B223168539999D945708D781C320550ECFA8516ABE6F718744FC72E241D35CB597F86FCCEF72A80BDE79ED4456A7EFBD103047F705899B60E2970F0B0AA4D0CE32781FCD7F338CC84AC88949D3306C07A1428C358982FD3535BFD6A929760A9C32BBA0C0D81D6F2359466F6C07EE9AD4D3111EBC11D475903B78D874F7B635F6423B12B8733B87E71B55F71B122856D2710DCA114C0D488560E3AEEBCC0D13C1FE20DDB79BBE1C0DB9675E281026175215D3CA209D7DEF942548244D7F33D71F028D5657E2BCAB13DDE3EFA08E6F68E8A36B4391960C28614F85322DAEEE90C7BA3E95351F5EA6FBDD743C11E968F9353AA547870A5F0C82F9FBCC8982D049DE6E280ABC234FF1130E3E0571F8170F0A16C3860C48ACFBF18D7D5EFF494F0AD9872267159CDBFE8DDBD82D5559D389CA4F2CDD5D6B2B09C1162E2071C11B633CA535C4727554C301B7FF5DB3D5BF4F2845C9DDD8F82ABCCDDAAA2940ECE8B3A5EF8034DB42D1FB1E5A8C9243A331E4BED921F443C02DD767B5D3062F33EA97F723DD53E6EA5C2ECC0EF48325BFB47AF3ADA8A9FE72839E8B0BFA2015C5EAF32B1DA2221E10BA383CE3CB91D8D98C14F8E7A06686329613AC1B92DE163B18BEC9380CB5DF269A9BFAAD29BAFC4732DB4AC979F6ABB35377A9CFE4013E01CC56563633AF84406CFE78AAB0B97AC8EC5BB48FE80FAB8ACAD01F2EB1EC74123B80D9FF8E9A235793D3842AEF93F5C740B0E87290054768BC8887F3EE61047FCF239D1C0C0BB728871F7C350D4144F8372D8D59AB012FD274CC8D7FA90C3B70998320AE15537218D4B2DA50364736752ED5D13D67269DB12036F34BC670BE35DDC3BB392DB7F32AF98DD15B78F1A01C940B85068EDB57DCBFA56ACE40EA31998521C32E901BF081DCD07594E67E08E8D43235F032E6ACEAF6E15E3BA647F1DD23451792498C4BEFE4DD6BC3342D8B24A85DD628A2C4E3BCEC3BE2430F49D50D1331FAEA975D42DCE491A0C9BD141B127ABCAE18762F4541E29B56F9EE7E591064029F4DE128C18D9B893A635F98E9EAA34EC442020AA19957933EDE4789539D1241DD6DD8B29D4F54D26BFB4B1011CB53D5BAA05730CA689A99248285D98B3C78FEE1CA5129F147B0D56627C53D32BD65F7AFA27072E8329BCC6E2307B237E83033F80F3EF7B20BF7E1AD23FD3414C93672E0D82510975FE73B14406886C68C73E9F8E0120088AB9871CE6EC8B8E0D71A498C03627F00022E67E4C521AD609604BE62DFF0FDF7DBFC492DDB79B8D1223214A9FE75E7817520ADC0656574BFD4E8CF1922C06B440D8A7803C96F165E1F5BF091AB9C6B5F8F702142EB41C227E68F305C2E766A93B8997CBBF8309BA660EABADDA1303E501C64A44FCD6C78765E89E14223987A3DB4398CE190FFF260B2366E4D4F5C81C015BF02CCE607BDBEA669C94BF2C1028D7B45540C1045FCBC4A405B43A249C678DF9DF19B5D9E5346100EF9088F6491901F4258700913324A53C7B9EC304A522AD3FA2F25CB9B8B0E268D3651A2B15E36C85D774A877DE264905CA11B985F9F776A7BFF796AABF706F99A2FAB64BB37AC78EF1F62E6825FDFF3D5E37ACA5638DAC2BE4F592D9DB930FEF9D2177518DD59F37D21C0D3A7D77B51370288163573FC09C40387EBA571E3F4E232DF22C8DE8FAA32FD0C77FD217404C9F4D0EBCBAD90869C0EB7C4344D36EEAE719FF46BB15648FC9CCCE2AC5D247BE03893D025956F704822787961E564924CFE9381753DD9CE8800B31281EDC1EBD968E540B08462B64E55A6C5E702817C5138A90427F8AAC4DE51F776671B70FE03073F9031DD03E74E52944DAB19AA4811182498C01FAEB8296F7DBD50FAEC84BC868DD6C1EE0B42711EC2A18B5C46C304C64FD3BCCC418BBF3A1CA4042D8E322B46614829660E7E043700F49953053A817470DA0490203BEC02213D61337C95233D284522B62BA2FB77ACF9DC2F26C5B82C4C6F6BC2F1FAA3F34385BC795852E8E9A4BA1EDC42B00A90BC345D052C64EE994DB41A264B946B0F75A5C18D11D0C6B603507C4E89917DB595A5EF6DEE3138F57E6D28F68DB60A3057474FAA06C8672337D5673B0F88A1F0A5138F96F5827C05D811C40265D5A180DC14D5E39033DCBF959F8814017AE631FB18C14B3ADB8E12EC2D437A80A70F6F2D0E7239F603D5CF1E494078AF02BF991FEA44B5C7504EE8FE375F78CA3F29622FF66B4616B7C6EA0B15EBFE39CAF871E38579B0DBF370FFD37F1C034ADDB229F5787BDD3FA541A58741F7B45E351638FB3F47C687AC01A784FE7170A8405A67A5FD02C88E79CD8772BB8D67D0552B889E003ADBF162516DC962F58BC38EFC0EF3A1B7A5CE94111A5001814EFB9E7A5EFB2C3244D82F6F6FC9BC0CC55164E20975A3F5ED4F13D1EC9F985A24AE7BF87C00C73318E1E29C2DC64FF7BA09380AEE4BEB6B52BB9FFDBF72E30A96FE3AB16C0B81220E75BF695871265128EE2EDAD56F1E9CAEDC800654F8B15FFA66B64E92F223C08A3A2831AF6EA8CD4BB5A8B75B90048C568EC5D2C168860C50295E697F23149145E049E9BB9E46740DE931DEE15B870BE6D2CDDF9C5526DAC6944330E8FDBEA4D0EC9E526DFDD64B31184ED9F9DC27F7BDCBEE758DC38B1B1AE3B01E339B8286CB26FE88BBD8B71020609F0C1A3A6BD2773FF79F20F7B0CBF6CED1EC8263075EFEFB6A1047EDE8B0BB083B80B97FFAD79566969AB4C2C467AEF805EAF8EB7093211569EEA6F6AE5A221CA70EDF026D602FF5A18063B8E2AAA56A18BA73451AB2CF69BF441CF3EDAF61AE2622F8511FF4BFB0FDC11D69470C07319BF96A556F45637AB4B25E628376A5CDBC6BB06479985F3BE0A81490F036E81F4FFC953BC367B45DF1979847911F8F9A5A471E24DBA6847E31BEC62B20B428A25B034D195B5A8DCB20E33CF7111E50E0BA7E35491C02FA7B8921CE271EAF96DC2B95C2C2E0729FF45EC5555E0D736587BB8BFAB19DD5D0F117417F2801C0FA1D3F8692B62AB9437A7C0CE65F75B9B933E4565DF4C569DC7A8C3F71B2CBA91322B0324E30D0A32E800190A90BD28CABE138BC21AED4B7BAD68221DB2D1D2DD2E2EC9535FAE4CDC0E65340571F871F855B6A5399C02B3CE2872CBB904F885A0E5676C1FA2D1FE141A0EC2BB4687C5387D0583012BA6615CA6C0A5BBCB42AA4AB36936421063DF263BE3305D663812F6BB7147297B5FD01517A74D586D00F060C6AA8D643AC6C5B361045BE56878922C817B86C6AC96C5CE7A77FC53D31E87D0054AA6151378CC06D57179F374D98AEC6BA769E0A0417933413F6A4FE1CCDB018E8D30A61D0FBB11FD2205DA3AB6C1D15E80964579BFE4A4542623A4E85249531EE1B9BF18C9BEE85504A4387292A440F382A341B5FA828DA7458FD6000F6DE121764EC53A49C723A5ED7D573BC1FECA1B860ED558CC997E9ADC933EB25E07FAC07A31F3F4C3EC2DB19D06BC949F09F6EDC2740AADB1446A746F585C2601B348B2779523CF030799C6CADC435DF9FA2BEE6F527D55EB86E2D751CB7C809A9F242C33957BE7B0A04F52286DBB6283D27D142CCDA0FEF8BE48E33CB5EEA035437015D1C322220D0103D34B32492BF4C6EE08512DABE972A27955179E8FF6B5B8F3BF81FEA5AE4F1881076090F5F0382574E91602976F984930390F6746A4A5795147B3D678EE3CF3B05D6FF4560A028E1BBD929EA29D706F23586CDCD2202DDB1B27B0CF627747C1D70720783EBCE8E00F1610340AB9428ED34CE1AE4563F1EE5DD413771FCA2A75B124D4B1DEE8718D2A43DBDDD0946B2F8C6879EACF33344406B7E3468690693E9ECEB601C4F20C07FE145419790326F2078483F975A747512B06956A4067D6447E6AA53473378615C40D7E4B6F111E31E5C87220D8C872AD514CF580CAD091837BCD7F7764BB8CBE2A6728E11E91CA25F47903257430868BFDF1022430EC5C24E39C7D88769173E7C7D6149119F307924BBD9BF1F6E448CE36B961D185120B89660FD9B94E15E01685A729629CCBC512B98E6B2CA66B561B264B365C53AEDC7761670A099E0C50774B4034B3455D64B9CDC97FA6C86B87A719359EAE96B825926B0679C231693BCDAD0CE913EA2F6761C248B5B7066A4DF8D66DA62C319C495BE5356CCD4295FA97FF6A51C2A0A2092F2B5204E01B86514E2ED515BB50B812E73937164790C56AEFA13AB3E36777440ED00EA30E0105C2548DE3926BC12F3F93247D1FF591D86ADF41B1A19338E9702A3923534D55544AD0B60807EEC96EE5F5512A09BB6A24C82452E142D8A62D26F1DA1F0B8F3A65973D08904C08384E54762365196EECE88123BDBFD865027D4B7554384E8389C3D17279DB7428BAB313CB1921E05B5A5E90D53E26F151FC65E61EE720CBA02D242C3DCD84E2D022F5F71C57C2ACC0F6B63C4052DF400D009DEADF15240E3EC6F90C5FCD3D66B7225F922AB89BAC97981A828597A8809BA4390475F2C36C7763604E0FB7204BAA13A3BF2DCCFEC107A47824FF53488986AD5BAE0F6C5FB830125529E5111625629983F366F7DF812B8099C62DF7FCE0855ED12366079B0A5D8004C8432F35F9D23C16CC4E5310C85A5968A854B13BCE4BCA249FE98DDFD4F97EEE3243686FCA0236E69AE5BC1121D3637C82CC4D21E1A651C5615613C2DD54A84D856FBAB3FA175B7833B6C6DD8132EEC27A05F16963A3B81FA29F200AB39046B08BC519A6048A41C9C54AC1F0CB8BA3B185841AB6C8A2C94CB2CD53933366CD2CAE3CDF2EF0F28EDE5E50B9023052C6B78CBF1524E6BD3B506B28F1654DDD7F163132FDE607B525B98AAF60A016C6459A9ADB25EE6E4FDB5E9D7381E3BE2A39629C8FCB9ABF223D6C865389F3782C1DA27D0CE79EE0F66636CAE5302ADBECCE80C98DE7A85F0CD52B7C2F98A83C06D1B26C04B3C8178E1D1A6C26705F314733CF6DCF74038404358D9162C03F994CE40F776329040AECE4F6F8BBD5A313E85569E1A39A5DD4924A8BD0C98382C8755B00556748A140F347BCC1EF8C10C1697CEB41FD6FC48B75223438B3AE64855E488A077363D00B7CB517E7A95769AB10BC63C2EAEC57BA391E583B8CC0792FD0E0E9ADA0955CB4E48A2D2A691A1A7E7BCE87B28F03645BEEB28D1C476110CF45405E0B2F573151B14FB371B5511A379AAD6C0C1D0374B20E4F0F4B2318485326C6587DD9D01D46EBFB54018FA0F2A46EDE473307C5F873A273DD7C6E206DC5588EFABFA22DB73AA93B5F3093EFE18246A6930BE0896F3DDABCD23EEA4AB63F2129172048D53D1903AD0060A986BCFA64559F763D1ECB028CBE778A82FE369A0577E81F6908F45143C82397A9D28106ADD0170CE462BF801B4DF8D719F367B8BC50CF14C8446D8C429BDA36C5FF2AC232D5F41CC14264CD64F0E6ED9925EF6ADD571CC1347648C9DD6804F43C1D3510D702C073B518BC293CF619E065D2E9CFE4DD1370D0D955E158E626BBBFEAE3968045B16705BDDDB1436E9492F7E3F6C800A5052FD9823F842F57A8E04D60EFB7507060891638E508E7644BE04EB3E6A936D9D8B3BE481B759DA07FD347D17FC7363AEE6DB9CACE31D6C038CB54FD9F91FCF9D59DE940915666C1CAA2F0EE4BCC1D97A27CBD993419F11A5E8E421804404374397847E56B156A99E78539A0C83C3A11F016907D5B3DF5912A32E6D349A92F50A279F20CBB0B7E42B9F7B4F8AAAC2F70897795E9C16472AA217D20F1FC9A9857250E43742CF981EF525D6326DFEC2B779809CBCB4087FC77D66A3B00D2A10C0451FFAA755B4E4CF492514CAC3F1DF3833FDE195EF300220C51505EB62B4263BC193003A1629771FC5F0A83FECE14582FEEBF82371F20D61C489052DE54693AEED5EE697D09C13EE7126A48E282E3C0FFF096C08F0AD63DD66BB5357D33E756C88D086FF5911AFD42B33AD0CC2BF93BF36050C832CD926F2B35CF97B102A5648252CB037A737EE5093DEA2F0D1E2F2BD6FF652302268B1C8442B69B7D541659B22278E49678576F8D42EF68301E37886D973FB52D93196BD0904A139F2FA4B6958C450345CDEE53F39586703A500BB873864ADDED08249BC3ADFF9148AEA12A050315FD9A635A38DC7577EDA76B4026A0456F452DBBE440C16299FF11201F6091317CFD0172686F675218906655CE08D9B6BB464AFEDF11F38DD821594E49A010C13EE780202D9494C29F64DE13847E60CF9F391DFFC02FA2F1FDB118A3A03F9543FCB2FD147586F30F77FB90C48ED7B4052003E141301003C8BAB6C1FCB3B85E8DB294C7EDAB77EFAF4FC3CC8A5C863D184B99AC2B8638399676E7A32D5E3B50FA5D30A608DFFBE194BF444ADA01AC05E6E72C9DBC68066354612ECF48955A8C913A389EA84816D5589F87C8E8B05BD08230AF12782C1B2A5BE7F63A8037FF23C4A4CFBA1F58899EFF3B73A9F563F8778E48FA6E57FF9FC8BAD9E922EE955F931BDE3EDDFA5D930934478A65D34FE331D4AEDDCE5E006995746856253A57DDEB313E0746F4CD9304A351187752378ADE9492E624C0E7350B254228CE9D288B6DE48D226C0F2247CD86B877F98AC393BF44D66D9C8C01917A130EF2B01F93B1FFB47CE5A4C834B874441D1C7BD2C429B51843C91662ECC27BC23225A0C135657C923DAF722399DF4DC8C2DC8C3CDBE4C2A434D9F4760BEA20DCC8B4C41CD10059850695C34438ABC97D929C39FBADB372F56F3C529273F98C55DAA8A99C16BCBC0F787F88BE140D2FD5205177D2E1899BD37DB09FA143490479495E2BFD8DFF54B2202EA8FE047DBF6080DBF4DC39374ABC119FFCD28A53C245DDB84630346CE4269887094459555B453EEFE9328679B7607B3A27D7F6131B1E053E862F673677018D5186D107AAD7C65DD3AF4687721BEC2AD2338574CB0B9DFE583F8D84289AF605736CA15013B0C996A326C6EDE3341EF14D8A311EE139C0D91AF378C9F7055C566DCFE5FAA9DF0393B41AC20DAEB418196A64989F8DA14692943173BECC451CBAA34BCAF751226B94F5AECC225C338C0597C2D853131A8BA4B1C55DD0FB7835C5AED2EE5A7B6F8D91B7BC012172BF358785CDB6D7415DC5409604B173750915BBE7BA42765D715E5AA26BE97D3FA88D5F046BB3D889719A9E26F6E5F08187D3282DB8797DDB4F3D904A3D4DF6BDA2FE0068ACCB8944F8264A0369BAD41F8BAD106C95C1401E953324632204FB3217AF7464849CF886EE3BE885F15D589D836CBFA9E4C8C006BAAB3937F365D3730662822C097FE0AE0AD88B249A76001325240877874FD3D97E0BA6BEF2B9A648FB74E04D35CE774AD934AFD8B4AE9CD6E874145DE041FD1413B8EEA62FBE88AC2B5EFB29CB30BB399E6AA74BC34CF4DC961F2A5134E7F7CD20AC9FEFD2DF480637C25E15184DBF2573836D81F08CCA92AADA8B676F07A03A8ABA5169BAB54D18F733D5E5F11C0527F0DF7EB5C1E1ECCA5D1E1F2F3CF4CBEDC5DC9ACEA599C14654B53D2BDF2ABA6AABAC57F81CB1C4E7C7899B38ABB7AEB4B5FDC72C12A1E5A1A545A8D32D9D8E53D33424EC2B010E623ECBB66472B858B00C3C7DE61F50ED05F6DDD538694C798306FC936DBFCA9FC64D5BC67DECEEC3E2D7BF61691DA2158440F128E4EE32127508ADB707F30EE6BDB6E05E0234691D868FCBCC5C5FD992F82A63D9863FEDD8EA3E38F4EB066DDFBF39880681D014072E5EFEA418E1739B9A1669FB9AD6B4C2E62B796FA47448F2B73748A2A12B9D209460AD0594B5810F2EA7F990BE892C2CB85D15DC09E11DE4B706A1335F0FEC4E2D1547BAC1E1C450C090742024CA2EC33626EE7227CFCBE3575D7A0C19C05C1B8BF23DDC5B5D24BC672A06891ADFB3708B082964B1BE9A6DAA566B01C4A9DD3706E0B267CE7FD302DD43AD3A83D20583DC162B61C76BF2424BFF526C62842D3FAC4B65010E36935D2DD02695DDF986294D0B967D723316DB8AB2FC4EF4DF665EDA024AAF4C11E73D6F1BC9906A975CACB031D498EA0AA81D8B7E0F34BCD6ED49B66BA6D263A3D469C00E97DA76613B0BEA5D94E7FC62D3DD6381922964B535A0A5211E7DD3C50124EFC00C5BD3E69F4E061FFC854266D9D64A043969060AAAA3A7D159F83077D344BB844D5F57F57109DAD1F40B0799E7E2C1B47F86F45A2CC66B648568E1BB1BAEC4D6BCA0C8BE8F6C2717E9722D8BBF7AE9095B29EF32E60315F828FAD22231A480C70C8086EFA3D03DF02AEA9933D42C5F1F957658B074F236964D87C773016D1C12D6013BB45FA0B17FAD5B8A74A65983C22455AC892217C2C91D59B265832869F0ED7018DC2B2864CB057248F0C759B518ECDABC1B7EAA69AB139F05FA13F05B9BA06F23E4B2829179178D252CBA6E712AD8CCCC71C923A0AEAE1552DE0EA3AEB9FFD0C12352639C20A5342AEAACD9289A07C8BC9DE3B249AB7B74B824A7F0707430931FEB3F6232DCBA80DEBE7CDDC9539C89BD359FE0EF9FBC3A499ACA220E2B9BDD59608D0EE715D4A31EC81573504C29873CC8C810F7BD3547CB2DBFF4BFAD36366343CBDFF17D9998D02CC4F83C2EEE5B329D06AF5FABB7293747116058F6ADF434C5ABF59505DB62B32872F58F747AF43EBF742A8198C1C8520D564DA0D7D9683D89C3BCE2D326F37C3AD3197F19282414B002D6F0ECAEF43EA55084AE492B5ED7DC952C93BC203711695BF3C20D899C1A07F8EA7B484C00BF745A08C86F5A5DBDC24FA34A304F3A0A7DC53A3831BA8C8F06E4D46533EDA6162412AFBF2F6CDC39DAC732F326BD671D489458EBD043DFCF9BDA203316A03140898AF646BC03A902DFA1B71AB79C85ECC681EA9D2206E4B24A4A9709664E06440513FBC7409D247D9E8CC2F4DC8C90B3A9451A6B2BFEB13EBAE4881DB3A1BE36980629569EF224F6DE3FEC4FFC947308A371C6569DD57035567CB166F2D93D2758C30AE0B2A8DAB702F8AA82F9663570FA058A364C07B151443F7FF3D0B83C901200564F226BABF4BDE7A7ED1AD8B1DD7A560C07F8C187988F650BB773C2CF8FEC14CA9982B47671088CFBE3FCBCBB81C09EF0531252D94982A8AF11545872B43676FB03299C3052BE39EB18247C4CFBD364B963AD640BEFBDB21DB36034EA3C16E9A4E1B9F6BE7A8ADA68EC0E69BF85155BC543EA6CDB01905BED8ED1C6E00AAB0C55CDFCB701ACCD4C0CBCA2A158DC39998DEDE3422B7C7FFF79B69B3BE2E6DDE4B84368839912FD43176B28CB2E3DED1A8A8604C44B5B5B2D908525BF9800577DD291E3B80FA8F2E84E24B3753D5EA38E3DD93CFB4C5A950442A8E6CDE9174EBCE6AD69C65278C0FD4891311AED98875E919EFFE69D47A791AC70CD12A262B237E0F4C14B1CC21265F329EF9A79D21684EF64BE5A2380EEF2B31361742D496FFAC36C2B453A5EBA4F6CEC5837BBFB76250171627435DD40314AFB056DF3D4A8EB0943A59715ED9EC6CFF20276BDA75AFEABA7B13388D7AE6DE7578E8C9A13E63E486E8476FC3896030DB0ED99E89BE7437D81E83026F0F1D6AE54FE195979FF6FAE8A44F4CED889C677C23A6D785A7856FD703A0939550389F4171E1195B59A5546F22E1BB59A64393DB8B9DBA8C9B195C62078BC7C10BC05E79B6A8C847CB5B055C6BD3A28B17ECE00EC4A1655F5E282D97B52D492C55403134D8FCBAD10167565E2605650112E7DFA4DFC07D6021606CB4A61BB1558EDE603F1B11E5377DD249EE5B081A8BA91128C8FBFF8DEAA9A91AA57E60CA3096FCEA9A0A1A75C8E8A238008FD57C825B38458DF6A5FC4C6D257997B6C3775220C6B68E832D5E41810054106E3431EFAD7448B4A87355E78A6AA335D14411A8A22BD0B6F0052818F4AE39903B936B8565266F576FAF0D22BACC53897DAF7D99B74564CDDC783A4C973B61E4C96CD62980E77F3892BD2532C6268777F996356516798F04277F5FF4FB19524BF5EBD7577A27B4FD9663C94D6E74114D2AC4C02116D8F2889637294EB3EF7309358FAE024AF6D4A2F82619B92E7EAC203A7354C8F5E6F253506A7011B91AB64B303ACBF3D4079DBAEFEFE8258E24612EB5ECB71B19A8743952E05954CF9A56DBEFE0015D3C9E68685D6E340A21CA73DD078E41B9924ACED9F146C14F9FF3F17C1590F5E3F5A1090EB9DFD0A5E733BFF2EFF8F1E309BCD2C9302C1CEB2BE9552BE27DC100FBB4649E5CD11ABFAE63A67D4F7CECFEEAD73A832BACC61BC9674D7904A4C3C53C005A7B5CB939E68DBC6A271FEFA33E625BD019F2E0B5C1DB7FFE45764FB1843E974C741B5D61241CE147B5E15E0369EA16E96E17903BB7F30ACD7010CE37D65D58CD5DF0320EBD925A5B8BA78D4F2AF30457BEDA0CF1AFC599016EC6038149E991BAD496138F1CECDAA9C9D57B0E327DCD8629C05ED0A782A98CFBE91A6A57F596CD72D3A30C152EE0E1258466DE1F213EEC1E1773477AAC3A1A8A30EF8CE00C6154E55B4EF6BD182686AB9BCEAB69EBFEFC1347DC23085BE81993648E0F1FC7F6DC5BB6B0DF19CF0EB7B035CCB143169188F15CB96B0088AB4C636B5FFBEF540980B6BB2CD9F3BC4ED03D91F03AE840D7AE1FDEC62436BAE651881137C97CD1F38C625E70D203CFE6D71327F063884A8B43FDCC68C286205E8D88542BE93548667F6EBE174375D84A5C0E8FB2F904DE4CEDC604493F6380047F43F841E4600F1C1838AE49073B8E499F41880F6CEB451530DAE67F8492A5A5866A994B24D396D42A66ADB4418170B4AF7A1B56765363F7F9FFD301FCF04611EAC001D984944DDC7D620F5C17C141D8B59F0867A921CAD8C37540813658FEBCF2010C0D0E945C5775B281EE73D198E09E1A0C1927A42F70A84DBFAFE667216F327B35A33D028AC3A69E9643AECDDFAF397D0747BFBFB494D0CDF5F17E802537A38DA411B8FB0306E8BAAAA4CEA5C1FD81971E6C41257CBDCAFCFD273595D493982FB345EE27FB40148363E5EB0D1D714C10EB09BCF0C792FD92A3B401FF4ED6DF73BAD6DDA1EE72C0211AB480EA5EC7B4D053D54CCEC8B1DAB9ECA890E1E595ADBCD99DA03DAE520470BDF457B864C8DA02CAC60774C3ADD35A229F3AF51AD7EDB1FF94C673ED755603F8CD43B17B4CB48C47356FFA161FD95657DC54E0437D9304FA36475B510ABCEE09E80C2C847C7C84D0DBD0750C2BF1CB197DDEC00D25C44A9A61C9DA08AA7129CA4E3F4E08E14AD309E10E7DA0B690286C12B34E3080D9D514882E8000DB0B22B288F219D97F684C9D414680128229022099932550209440230D1292FFE5203E801B3D8085B9678B9770A0BDE6C580C3D2DF5DB4F4034DBD8EAF588663F34839B031AFD774F94E47585614A09B18EA4A10538D1C35136D57F082338F18C5EA2D3409806E9DB683D6011DFD48330440863B74B994D8C8D13869BB28C859A7C3DBB6083BF22137491C70295E15A0ED7E5533BD7CA605524BEC251CD8926452D2E90CBA833244D94C8512CE2405E0FBEDC32A79D8AE8590B1BCA193DE8006748900DB2DBD82AF8A1F50E80BA14FCC8A8D283F7DAEEDD8A1D8C7CDD0F7A568B55BA4CFA36C252C924E69B7DE233C051036A02321796A298DF2A392DF7927AFFD824D1563AAC5E3FFD9D518A48B1494D789D0F13638182BA4DA3EF8B2388146176AF603157E333F53A957E77FF6976E967617C81735E387CBC41F80432725FA877DAB34418B4D96215629FD6FC4FCE80FEF873ABDE8E0F59C9845C11946C4C208770AA2379E5BE1EE76A67947A2F07D6979B6F8AA0987E5AC11263FBDF716C62164655DF191822A2143989CDBA9EC36F337A4A70A81EE0E134B5B9CB6C27A74E4AF94A783CE25CF777C1F77ECA60E8B4C80E09577F73E160DC8FA32CD0F111CF4E516A561E2C54218C456E722D5CE8C0C9531F97DA271FCE046947F6F78C7AA7DAB569962D616FFBC16435DBE8FD79CDFC96FD92AF2FA4180252DC8DB599A79B8B3F31C0EBC679988BC808920C02CC42C9F0CAA8988C09E308CFA4F752B425422D6BC7E8F0A607422D4D4BE719F1FA44CAEFC7C857611A23D4C6712A27B87FE5847031E15651A1646638F884D9E64738CAD32F2354EC115ADEF6629CB46FB8B7192EFFBB8FF790E91402E7F82313C13E1E65AE0E813F4B1D110601D6554DE3ADF5512B412336B655BF20EFFE4149C77636F7243C59A90B08F315BEC25228D430ECC1098C4A1590F067F48972E594BDE5655E85F55BB6B7D1998B86718E85015FF541F8E045561BD868F069C5AE5828527B4E15D9386762080205CD562B8C2D6B2A11E07E9F37D1CB3685CFBD1242BF0C0E061ECC4D2671BAC71681E038F33CB248E93C706E7C45493D067935DCEC38BD9B8EB371F9A862315F7F8D7B43E1DE373E0697EA3AF33E28CBC9F27145F819766EF92F12714098C5731F816650CC097BF0E72E185EAAF1EB6C00ACC1389294B2891B2321761C826A41A9F1AEE38B3983FF3A769AB5DEF13406F0F4446D353EE5639227DE776483EFE0B1A36723CD2B47294B2875EEBCF0C160F4816FF64216190C22330FE3350F57F7D241EA955C36B2D4491B5287444AA32EE4F0EB23FBC4C643940DB55951CCDD6DB84E59A5CDC21D8740F9F5A90EAF1D6D322102CD83138B6A345691D6E42092DB929CD326BFEB844089662F1FED86F341C4171F47D2CCFF8133C5F0DFF6A3A52ACE1C7E3D4D56217F5AD3FB87C7EF8D9450FB25949B19D76FCFE48F7BD900072C5F3DFBF334BB7DB3796DE47D812EF6464CADF2F51BAA1F734B1A1BB634956C0D6A3DC1BC53331C4C3C7CEB46C363E2770B6C5D73206A20366D71A47E3E3FB6487E30406DABEBB4D443ABEEE78A2065F2818E82E649046913BCDB0F75FBA7DDF7E417156E6E3149D324C350D0A922FF7C8DB0424A183D9D1DD248651BD8C076EB0ED13D27CC126D9E8CFDE54BABF554BD56B3CEBEBCE04E5DDA09D6C81B94989B9C55C9AEF08760BF9EFCBB7CF4BEF083A6601A46264D1B1737798657AC5E33EF5E9168DAB738ECE254B008305E7724708EAEB622FFF8D19ABE44B7375B29C51DF3D1E86E08CB51CA97C968F32187EF4A90380483B08ADDFC856C65E169B1C521DDDF2ABA4C08BAB80E9CB4734369FC63BBDBFB1DD85F02D603817895E528E86FF68FDD6C4F559029E3901B79D1027B828A9A865F818FDA36D98E0D7FF04A3C08047419335F4FC1D33F1D140CE7D8F5DE3DB1638B4B399EB29F91911EBE78EF4EDD3C37033B03C0263D7F73B0AA68B32F583C4EBCD8CBF19BFEBD33674134630BE14C95457F4F686E10664A9A0BE2EC6673B6F64C6717647B833A8361C93A3A65696CA2D591DC36169F9B911B2D71B1B0F23AF298B492097DCBEE17054200EB2426E50FC9837C5B2AEA7C9A172DE9B36B7EE385A71A4FBA381FB91E8FB9D6482E9CB4EA1F0EB24760C7AADB35DF191A2E40539DCA9F983A0C401FFADD8FD105BA08600891365CE5FB85EC4024AE415F411EBB9AC7FDC5F9137FD9AD4B9AE4BE13588D324415143B41E0D724D3EFD78EC043306A873E3E935EB34731E86427D9A25CA680EB31AEC811CDAB00967E54ECAB21D8F4359BAACEBF83D41FE8B10998BBCE6F7F51EE5F715E5875F75BD3440DA66F1C75845FB7202FF03952E0030393130E2E4518A0825FF28CB442EDD16F2B6282D0B6FC56F40C9F7B370C8F1BC1C0D0EA694984FEC9DEAD050C3292ED6D473FF68C4C46BF5D4172486113C3F1BE8EB309B09FB8901D0FAB98EAA8DEFEEF2D3DBBB7D2A7E16767A92A8DF4F92486A92A868BB0CDC33AA134A7C2529422F12B43FABC7474E4E4A7863648B8622E5F0ADDCE497DB576309399DC040364446C3BF5EAF94DC28B4D18916C4CEEEBFB87B5FBA9FB1520A127BE5BF2D199B217E93860212E9E4E4D3F33B8E2587A49483B8B5A5AF9D06C7E02AC217D055F7EE2424F18CA3652122299618BD2CADFD4709B608E47BBA3EE2D5D43EF2FE0657CA3D8EC2B34D92B8528C7B6499CC68BF5FE8A24481E89E89ED21526E4E64987DA99A797406F89DA423CAE3C720A4D733760F28ABCED3C45F8DD3FA7C0ABA23D33EFA74A561D1D4E8D4384CC7B83F9D7B2DE279FB0E49AA8BEA8C61418A6768D5929E1E9B831309E1BB5C5B2B5923D4D75AA11E8EB1F68C7EEEFE3F659D22180701C6ECF277AB1005CB7193588F76483C6487E1478C3B082A51E301C0B480ECD74B403CED6F68AABE6F56BA84F4111A4E3AA6019BE0319EF89C53C96C1D692A65E4235C35136885F8D71FC0CF7D8BE6DB634FB2EC64B6ECBB5FE0A08000055E1A78FDF463050580AED5428E0E94D816A87BE4B0421A607BA6F29381AAC6940E0A238126F00D122540BDBDBE014AC3A615EAB1D077D4DDC7D520F8C7532CA7800E9DB955B61F9468AE4244D7D7CDDA46DDCBC4F99FDD97FEDAA4FD7727B865525B29E169CE98965BD71246E4ECD482B6431E34A243D0FF25F4EB2710C86618D518541017228610AFA7C009F67462DA4B16344F1EE71B59A182ED0B9059ED13B7F808F7D6E11CCD38B11FFF6D64090F6CAFB6DED82232D0A661113DAC5190F30210DCB05FDA416FD7620726B8214EC78E336526475D4E1DB0FC533C0C66555ABBED04A72A326C7CD4414B27D821B2D8EB0D156B12D80548D0860D900F41AAFC546EA29DC2E55F5A4006B5FD0D7800F0C2E1AE8B078FC2418AED3367277B2F95ED9C46BE4CE7EA0E73264CAC430A8E2080092C9713825B14290477B5D52B2502F872DE9EBE2473A94C35D48369E2ACA7632761517959F4C3ADC3602A80671FD2EA5D0C6BEC90C307A6E7F147E9E4BA73767C172897C9E0D19A61A698B55FB58A409BE7456738D952A9B752D499EC54AECBD940D209B706F24EA7B7ECCEB78EE48F5C2FCA0477656C6336BBD7B6C452EC9BB84E0F782B6E58A02E5F8AAA56C305D37B136B6E3B822206220AF27BFC5DEC01B81DB0E419A9720EE3F6BFE01C852B8C05AFD43669AC076EE549FE047879224120161273274742B833003F6158FB4DC1512857AA345457DF4E7C26847366A38CDCEACF7FC82AEFC2DC5AC299921A3B5B5E78DF299B23668E982256FDFE5807CD57A65E288FCEBDDB446D4F19D01C7DB07F639B4F05883606319D5AAD3C21996398F912675FD28BBB2221CCFAC1F6FF210F384BFFF6615AA111F620D42AD90E36DB7EA4294D317070C1AE7DC75B4E2A7CC49341E2BFCD891637B1A0C8073A4E2235CA9A60D4DFE2CE92EA66B2668B0E28A8B56EFDE72276A50827E45D86CAD3FB5E95EA9DBDE5975AFA42C9F35F34616911ADC58E269482019D0D23F27B6A2C32F9841B8E77B7D0667D398F635450D24D408CA2D2B16C46FBE954E34C9E2B02AF2E07AA6F186324A34A064E06CC2A90A10A2CB84B5373456CD31FA68DF21648E2872402BAA37D6FC61D2924DAF38CD0D0259D7F4BECAA61A779BE624037AB1BF0D3F185DED00640218D21A8AE0D004227C1BE382C70DFA3191C26507081FEAC5F2C98F9D67EDF254AA6D2F42D49E07CA820B72C8181A121F841FFA5EB3B55BFE4B8D454DBCA885F89E39DFEF7B270A78916AE01929F4862FB74048ADD13DBDFC2829C3CF2AB3E9F9E8152CC3A3EBA6F96F03A75F2D39F4F4F70FB496A6D19C23892F8D3C9FB346EFE0C1409FE4100188626499A040782BA369E0AE57A8FCA4BFD844F3AB23DECF6A1CEAFD66394F4D9B83D4FF127BEBD7F3A47E27F59227F4C1A59F2BC92EA6F70F9FB324498F0EDD45AF7B3040FD503D3ED6409B24E0B7BEAB4D8165DAB10C9E9896537B9563155CC69E49DC76190A85ED48A2AF67CCD816AA44DD5936096F0C2F29E6D43B4A428645D2C498A155EB12663D80E3857F2A64922231C9DD8E51AD04AA6E5DBF09220781D89D6D0700AAF95C6FD660590340FB226C0DD4F7BA5DCF5488DCEFE2223E25A86DEB89EC5806564748DED47FAE44E73CD72E40D6E5E361DD9FFC4F96A870F5DB073B53A11C767937A7A1DC57035584391B743D5918EA0E68C690A6B6C25551A7291D5E88B9EABB97BB1D430D4D840DF73C1510855D363CD5BE66A18F5AC9C8DE7388BE4B584F0FAFF77AE83A2E790ABE96038A566F5DF14AFA8100C070749385048883C20A07F9F671074465279E12A315CB10347B3C15BE4052BBFBAFCEADE27DBBDE60E18BD70BA1C00461302CE11F6472F61F48BB639444FC5AFE1CDAFEDBA9850AB888B6ECA850CAC4E307E807686AF1A90F67AB0C7668D85C05331A3576938D4AABBBCF7C88E95E3AB4CD48758A0C3E1F90FB678E420092437618AFEC758D4EFA54E658D1AE2FF12DFE4044CEEFE8037913619E6344623529DEB9E090BD4D612B48FA2F7DECA84B1222AE9FC8C552704FBA7EE09C37867776F51FACEB1C854312A8F8253A630CC07F4A50E105830125FB41366EE3F786DCA20530AD95D2A8E86EA69E195F5D785FC5C3F8BABE64E9D716437888F5796A67E09AB8AFD7ECA88FEA25906F475827AE1CE4599ECEE039AC19807C2AEF56006420EB87E3F0C3EE6EE7549BCBE93D85E00A4502E2DE65EAD10E929E4DDB72D96A8F12BAD4B3DAB56246E53177FC17E2718039E0DAD25A6404E7221A38BB447EE1FEFFEB32FBFB0D5C6FC122389BC8D5B7C530792F01D31AA00F1AAE6270EE2FBA913260890F84BC990970022F024F16774D2D24D2ED7E480241EE85541AB7215DDB6794007E0D591E28EEB60BAD8F2AFFF5168E4140CAF9F8484002E60B5D188EA117D5C7B0B5A5994130C22707AE83D9B8E3453FE8FB49DDBFE9DF5DED1DB222B58D22876D11B9A26C3EF193D2FD24A6494C2004EEADD5951A7127F39D97A7E76A7CD5D17201E9F6F8F14F89EBAF01D31982F785328E2911A858D12EB07A36BBF66AFA6968009691B2EC02B9AC104454F4AF888DAF39BFBF10F3A78E5DB53CCD1CF94E9407B98B2E746FFEF31F8B17437A85621D8D453B44B8D082C25DD5191D7C8BD7EE04EC74734F683010632C6ECC20CE06FB348F31EF0BD63AFAC0E4AC5577FD2F53DC6032968E42A48A067A361123D316CD65AB4982CBE5BCD87F6CC0DA4CEC294E4E5243CEBCE8ED16719E5E0602E4DD3203A95242DB959144972D3ABF1896058EC57229098DE9A4536AAEA9DD7EB23DEF8004E83A78BA6C4AB784E1D4D18CFBF66C149B5A82B3674460FA4B89606BED9E7783BD17F63AC426C5E9C82272AF2D1AA0CA9904E40DF75C4801F02564F47807A32022FE4D94F4ABAC71BFAB9FF354BFCBFE10917FC860DFD736CEDAFFEC2EA20884F0DDC9BE6B784126C712D018986806926A8BF3F9BA6B7100D9CE863307AB3BB3778522F5B4F0037A99A840FBF223218A38FCBC8D175F230A0A58695AB1CFE477E06FFEE2157409514E66B9EECE73E23E06A532D22777E7CCE6A0209FE36F008AB4A2DDDAE9B4687D93F34D48CDA52D30418A97255C38C270ED970B937A833A91AB3D056C05A52367344A0B3701C7BE265805DBAFAECCF48654CB6B55BC64449627449BFBA946894DA28DEB1DE1B73CD54E801F26D82BD99134F3863BEFCB2C519D9AFD1A882811299DF6D0D24F9AAFB5453AA80E47BB9282E45A910A7F8DC9ED2AF692B7EE7B5C11C9D1BBDC52C0A34C293A733E0E912F7322308657456CDD73BF0CF3242702385A238035366BF5CD9F277C8E90EDED74C1CFFEB92A0AFC325F1D749CA475F7A1D5E79C51612F1D25E588A6BC439F83ACB0061863251AC7A90BCF695F9FA471D5CF1B2487C66FE4A744828F81936E31B7E3D80C646B94EE46790FE7EDAF38BB1C3BE57044ACC16594C78212652C2DF9342D208683DFC40A64F2D7E1FC2B9FE751A8DE1CDAB9E44A9A8DCE8CAC3AF7B7D69BBE203A0C1359E657E27A3A5C37C90D8457879F8EDBD058D43BFED8EA1CD236B2FFD0501D408FD9B5D4EFEF066AD976C58B9989CD1A561EF6F4CF0529DED5D6F9117FCE70BF4BE4EACBED6CC8BC06DAD88487761A2A3A5A39C4E55E861B109A73DD4FCDB8D00FE0C401EE03788DDFC2061A2100F19D6D65D693995D7917AC0C6102799ACA14900A23AF3B63567422D16F2EF03C1B338913D0C382530A8A5332EED8A563658B59200F79D69E435874BD63E9F4675D65C01A1DBD227FFEB896DCD73B1B84D6DEE8863E026E2CCA9908075F94EB0D8FE3366DE8C31C91EE9AF2FB8ED3468ABE3AAFB2E0AB06168EB63F8BB01A5E2068A31CFBFB978B846E47D2A3957ACEC3F5B89D42C0B00B8E57D33902C11C3D857DEA15C106B0010413277CE91E794B5BF22D8FEE857D901A482304C7F0D4723E6A895545FC7E2D2B20779DC6628DE5ECDB96B619A74F632016B2CADA75FE2440564D4C898F7EC7469FD691FB5E962A98CD53C98214DA99CD840536CC9F1A846545F20CE1C82A7D4A3EA0491B9C701AA12F5C924E80EE97D74F1AE25FE483CDF046BAC8B43415659176281530807F22C7BDA949D87288C6DD297F2523D2828F5480F33F8ED41C877C6461E00642BBF43844379DD1FDF398716641AF536EC897C8DE0F2FCA31572F00812E36B68D963AB5D218FC92F9952CC341AF50E5CF8D7DA6D8BCCC90E8B2A94DFCC8927E42CFDFB3F2119EEEF8E14E052867A86309972C2A2280273DFB3E4A23F9D2CE88B10B85FA03876F8284EABE00A371A2DA577188CAAFF3F7CD81B15B4FDEB89835B33C8BFB304DC4A63EEEFAC8DFF0B389C1B9E36E790FC2521C12B3D022FCBF21550C36B9D09242BE7F31F62C916F2B0B401823DA39B9BFD814CD8B333B0CA72E39872A5F59596D04E19521C5A292A3DE8454A69660F62473D14AC851FCF36DD1915E763D0CBAA16EB15390D53B6A47E81D5CA90A87BB94637B139424E3504D46A9D9320170D87CD15784C72A0E0A18C7E881B72BE75236B48FF6A8DACCD50A1CD5612F9B5B6BDF3D36734228A58188A3ADDFCA7D7459B44B3A8A2221ADADBD8F81BE9AAB22A8A96915BE83189208F6EFCCDC406403FDEE334B2B964159AE04803BD494F0B2088537624FEF467BFFD8D7EDC3CCC8A645673408295FB99B630C9B567DCF2F913ED54E87B57240FB261E5143BC0C4FBE7E7920E977E23B84F42A1EC1534DC73C62D8AFC2976568D04D73ED1AE6EA1311EDCB101ECB11D46AAEDCDAE77DCFF5E4C169C096D1A74EC516CD60025A50C7F14A575E21EAD2DE8615C6A55208572D0A4C4F023DF80A842C1EE0FE4801B427BA2B40CFFAA3D2A87360904C64B3AF2DC2D5BFB26EF7B4F5CA8FCC15FD84902036A9B8C841ADF8BDBCABF4E9743327DDDA32D290BC13A83366FC9DB43BF57FBCB0388F50C4962598CFAAB17CCD80D3A8674E4BFFCA67CA9171273DDF292F1D8EC35E9848858EF11112D154724201823E7A02AB976D16D761762AFBBD1BF48A4E79B53849221CF5C1565A0E467DD34FD77E536EF54D8DA7311ECFEBF8FCF6FD1B00C186115EB9A85C9DCFD99DE3E4E7F4AEB697B5663D84FD3F8AB582B2467F0918E37C71CE1F8069B86E662702933CD43B2450C0DD8200369E8DC0F7422DB6AD62220CF6B99E857192DDBBD324935403CED1B8EA9AB53D1EE955C9EA56B1470F01FEEBFDE5F752B867A7D799D52499EB5AC7CA81C45ED0B104B8DB4EA52E3C47AF400DD2421E26B3FE51C961A8423334FA3D8392BD2B56687E49DA1A3F69CDC065BF5A9491F1CD2113ACE3D31ADBBEFEA658CA135A98D953566698ECA2CD78922F29FE2D869A685F597E1F08612E0E32CFB2D0A0609577112C9FECCE5B6C5F3CFA7FC384074E896B70728FA93DDF77BA3FB8E71DDDBFF95629D10F5985CD0DE87515DE4E1A29B55E68BBB1C79167F67887D77648F9705CCC944D34459F154EB45823B06DC152A0235D1881607368BC0090B60BE90C7E34E9AC867D707274DF6C42F8D5207E351509C4068A3D404C0C54ECF7BFE9CF8E326DAB3AD72E30FC064D6DD4B2C8079E1EF119633219B0AA5F1AC7F0272D91BB388DE1055A4BDC656779DD65759F49C00BEE05EF4CFC0EB3DB006C7BFA53426E39AFFEA245791ECEEF7571FE5E453BF930FD4318956C11753BDA4F4EF35BF331D65900E55C7E607D3DAC7AE235583A5E1A113D1AAE8BD0A62816B704588B62668284A4DF47EAE9A884C034093FA7ACDED95DC34C1DC5ED918889B7AAA0A23F387AAA253F91DC31F402DFAB74F3D819F836027E01FF43A04F3C7C54DAB10147D6B78D67F7F0B9E73FF29F4FF7B602A2B74148F27B50698E89E83558B827C42E86E56E4F6F3C0EC5CC3A432B1DB96A6FE4635B74F1F6B3D6276A89C5483171D05CF93E55F822C475FFB23E4624C92D5BF5DC54B86DEF99FF5F7CE47440B5631023A39BC210059470AB68C794EDE52373B70A06EFF3C702CE1FD7FBFA1FCD355FB4213148E57D819008D72B2CF19894D5F31A7892335A1F8A78ECFC67696A873AD72C1499BDF155115EBABAAE708A1264319368512C279E3D0DE7CB0CB6776907308FBC10033D9EDE64C1AD028C46F567FA9FE0C8D8C4A4E17249C166702F3BFD2B0A32F87007D3A3A298E4E147E22BE6A70F57E181572D4207A2F2BD0FED11D543A39BD66874EA8D2439F58903CE7E1E124DDAA5B8B9AF167E2BB2191FE81C24B70BE4154CECD3637C34C3E1A023926871F8AF4F17ADA1E4DC1497F3993ABEEA671471A0F5B2E44907FCB33AFF632DE5E097EC78E0C81F180106434E51BC18BBD96D7568F17E0C76DD8E8265DFD6CA1F134344D63F6E3AAE0837A8EFACBAD1979B745D3BCD4C655E56331DE17EC5F359F298D21249AFA91049481D2E7307341155CEE676ECCBE12F9F0DAB936F7806D518659A167402EF78CADA58A5A18DCF96881A5FD5C20FB170C92BFA3BDDD3488DFC4CF4344E222AD7E816115089208E194DF9BDA4B267EB94D53A0B72929EE6B28FD8FD28844DCC0CCDFD2D887735BFB97A9B2CD8C317D600C645BFB15EA23AAF6EECD4CACF1969B623C93F062ECE18243290B6BF4FE53E4C17766B8017097A3B9017E21E148E66476128FDF56DDD161E70ED41CA0378EEE4BEE2F2DBCC3412FCA3FF3B2B6ABE0FF7D19274979882F9438571C348ABCC32161E6386EF29D1387FBA32CC240E38588BC1B3925881BB3071B33BBBF6A406A32473C0AC937A747E06DC7627675CE2310AD0A867756B046D42AFEDA0019EEB180778C799C19F2444D6BFB0E303CB3DA62DF230B1ACB0ED95E31FEB133BF38C86C2359CC7165FF2C411038BC3F4D0EB7757847EC775EFBE31F1FAE2023FF68E2A43AE796583491A5B7E27691B3CA0129E9404554CD694A4FB9866936EE162583E04C9DC645F27C955BE406F33CB2F66BE1EC94C05066AC68E85F40E5D2F0B0D3C57575B8F24646836C048FA1D5A8207F479815816F4E44A5974902D6031D591A95A30FB9B52D1F81A2297C68AE9256CE728F0B641A719C3E45271B5EB33E54FB338260A901BBEC33DA8AE3F47037EE76A8B1931375F1DADCB25029068ED3C47E2C99841EF50BACFD53C55A6DE64E9C68E3350E7EBBB795145799F187F09A2951837FED122FA72D865F39B72DB9385BA732BCD4AF59458420D867BCD0B76E4056898820EE454C1392C9D925AD2FCAC3E6BF6EF5876438AC64668F427BE4DB623116207F5494F7828ED72083768C81F5DF76843B6E7D44DE161B046277C5917A25A535130357CBC688340AE55EE62D9AA02834B4C38BAD8B32F0050CA0F7AC0EB96B564DDEA851CBD5FD30E3F10921ECF7FB20D52C5ED842496E9A6A07A2768CAD7E9D8FE4EF28D7722C2B5A58AA7E23AAD466C30B4F33483E08B210A8504EB576F4AA82AE8D2D7FC4A31228EF725165F2564A585047CA34CA413C30FCED5B263118414558C69D22A73929E317734399721DA950BD3824636F52AD229B2D7FDE90ABE5405E9DD2C8B66ACD6CAA37D48E341B85DC821E70EBA69D9C08AEF05E17E5616315988B085F2FC58FAEEDF0F31FDF73D3CE268F4BF4A43923E3A1658695EE8F4E52CBC3F16778AF85A4E3116C88515DA7BEB3EA3F52653E4D9A4FE8FFA2610924EC814ECF7CC5E12985AC9B220B84A64611DC14F43AA1215F826F313241CFC34523DDA92189CD7CFB234CDC7FC75613C773BA3C66A3AFD567F617D1E9C83D0D6035E5EEE78FE15EEDDBC06D7A206435CD13FAEAE3CCC4FB77996FE767C3EBE1C6B6CCF523C1613A86E254D39F4D3A1595CA78F7B19EBFB423AAF5D832C8215E7971727F515C3A45DCC1C2B4A48BFB0252EC894F12FAD8481FA9293E1CF83EF2D36C92CFB0D464DFB1F5D8A482998FFA5FA38581679C2D2D6093D70706B3EB7150018B3A33C0A08F9AECBAA86D77FEBA0BADB32E5D313EBD22278404E77F4F9C56075A1A40FB8DD977456E12BFE5EEF747BEC4940D29F1BCE66BC11D69FF770D01DD543D97BDB750D8E39E6F1483F7E03F6CB34F73350BB0C50F9ABA24DA4609B3A3F4842D28A1D25C898B5232EB918521A03771E0838B73A815BEE13582199D55180FBDC79D7849F6B9D39B1E9295CF8EEE179E758013B09C9761A97607B1DE578538D43A2149D54C01B013F247F49584038B6AB4E509A6D2C8B721912CF0B7D15A57A6DC520100E896146586D1B68FBDBD439394DE240EBCB91403B7CEC1DCDC679D3C8779CF17D3778C6EB71EA716D1DFCDB8DCE04FAB87B733E66C61F9203C02C41AF27C116A9818355AA3D544394F0E2AF1256F292A9A468F82622C992FE52EC5D811B09AA0F92E0A372120EADFC8105C4609BF6E1EA7561651A0EF82CC2F018590F0E52BC940AF44F3C80F8CDA2590940AE3640019EB64368B1AFADBBFB577553E03D90F39DF2317CA8A5C14C01B1BF0BA7A9BFCA41D2DD247868E115739627EB066C51320031037BAE19F2B4FA8945E549DCEB7CF0C6F2A2CC92A8C2F3A298EA86A585BDF9A29F2CF9D988294CA8EC70737B40EECF81736250D7FD01CC58DF690B8D882C543859A34156CFBD6A14AC49415709EC5869E7795FB3B56D6D43F9FFCDFF5E218621A0793B31DEE822F140306E83064B991CD2A7F4CD942AFDEEEC5C80C7746A3296E697080720B4C3F1AAB82DE9E1368619AEDA6E88D0B1B0F0EA1F24AEC4C6E67F82316689FDE576F53BDAD885B07074BE9FD952FD984234693A9D614139E6769472636E14D1835DDF6DBC2FE8425579F2DBC490F744B9144B48A628C15B9B932C21B43236BDA9EF89FB9B4B3DBABFBEF2C8F5A87A120A63F9AF9D2C27CD803A6459259B63FFB4CD00161D95C4DC378DB56DF8D2291D20313AD8D3929A317BB055CCD221E31B6705DF264F280DCDB9C9406D8BEC18E57E7B430AEAA47EF5DB6C6D3130B6F91D43FC3B663E3A422702E9706763DB0370DC1983475D6C245F823EAE1CC7FA39F9E6AB3EF0C7749637BCB201EF649DE32DA3CF2EE0D861B7EE884CAFEDFB77B494622CF832054087D4D88CC38C7986FD69A73235F2FC5ACC63733D10A8FA212B7F7FF5FE10B08BE97E84B247A673BA3EF637412525AD9A7ABC16108A0034F83406603FD89245C1E7CDFBBCBA7C373E44E58EE7BEBB7AD7ED4291186BED26EC63CC6F69BC9C5A1D16B4BCEE15CFE06CEB3CCE1D3E9593A28C9A6378D800BDC5E6A26899E9A90399178649870E03A64728C71B63C82AA7FDEAB81924421B4627441392AED0A99204C9A602B1B6DC4883F5AFECD81060004017F7FB76DD11BF5646A28E006BAC7079345982C0C34E45727E24BCF7FF6BFA846B69924BC9BA456277E56DB5A02C58825800797BB8BE816F3B8D7DB650D137FA3EC2041B61F046F8A3BF07A7974852F4DA7AB3E42382D52491BDAC6DEA311191544E79A211BC01D064B5B3A12DD8B54BBEB3A435F8F2083F260CE010065F40046061B72EF5C2DB1A5D5B165A521D073DD0154340FBCAC78B7BB743D373AAF4877B9CE4EF1DD9ED8B2EC7F9D9497F22DD796C7EC90205CB683692652F92DA7F8D8D5A3467B6293733B339CE4C34318FCAB439180A20290F5CBAA4F267FB91073F0503F04D418BA3888FF9FAACD44A8B21E4E3E4BF526CBDAFA0F493D0BCDDFFD1E52DFC949305CD763124F4964C57360B1984AC5F2C33FF3400D42E0EFCF65B3FA91AE7EEE1F812AB40B410ED5890AD93D5132CF121251914708DADBFD84439C93789C3C58A4AB6994EFFC40215DF9052398313FDA6B0B7B610BC6EF8699E1CCBCEE30305E82C6A776C4C735C913A1D1ED8780CD073CD244F6222955C14B25EA31C4F368AE96BEBFE75636D64E2748DE593C0D817AA7261DB2BEB89F05325B46F1AD6D79CD6BFFBD04B1CB8365756A086B916B6281144EBB7476FDF99B0F7C0138B8F3E44DCA2A697ECF80271C602CD0A6F70CA753235E9BEDB0FDA23C097CF84F0D243A7BC0CCF1E711FDA260F3B170365629167C1C6CF53277C31AA04E73C59353E968B72C3C9EA0105B8B72B09BF71EB10C3A5263D843004E683DEB4609FEF5136196F1B745F533D5B2FDA2718427C6566E4BA13DB32A5087EADD705E9963010694B932392DB110515C2E5FF4B2941ADEB1B10498864773CB3AAB5F0F4943B1BB2C3DF4B2B29FA46299899E48E613A0C88ABE4EA81F4B423073A0A2133AB0F6413FBB80CE50B0D973E1953ACCE57F4EACB524FBA84B1C91A3BC2450C1788FE606C24A299D4A5E7E7D192F5FEA952CA53AA91E16FE868E39969B518837682A7B67CBBE998CAE2C4445415A131601F439EA074893AB7BAAB74A4280DE343639F236872CFAA3DB14D464E026B9904B259DAA5B172A684F54C8192A783BDF1DFA4E040C19BC2E9B6FF49DC2C144D8C951A499F007E1AC180973E178EBF68C0A96C8ED0E5621B4813D2092012787BE07D3C292F320C038018E53FEBB1490DF4625D7A53117B8AA9FCCF78AECE3B68E61C7A341FE25F248D1A9CBD3821ABD244EBE8208D0A32D88D0685F29BFCB07CF6FACCD7ECF855291FBF58D9FE10116BD828ECD6F3C6483C0C115EE4F1AE9D7BED360E80A6EF7BEE1B196F617E0D6F24D5519853287E162116BC64ED3F91B6BF550C16E66538B3B20D06EE5890025555D70E8667810F28D76A12A27CFF66FF26735FB78F0DD171916C44FD8A19374A6596EA95907B0AAB2E8CFA0F8FC5DE43A32F85ED43C079D62B2FAA326CDECE801F85EF4CEFF856CFD81F3B90371E17253332AD69A5ECB5679C1A4FB4FCF15D4D28F87DCE64508FA8DE96F4AC49AB1F4968C95F18F6C5AFAB9CF6C44E7253AAD6F1B08E3086BBEF40FE8C18178C21FD19F98BE7B0258DAD5099304D208996FA133D02057D5D61533C8D07C1BB4D7EEAB33ED3BE90933403C4ED8730585C9105B6F7FE14671C62FF26A59F6A4F96FB4B1B17E76224B2E9A986CA5991FC4380CBCA73347120AF5BA2F319BDC2C045C17C9F40CD656342CE97FBC047D565DB86302D7331449543188DC7BB1CA1502D8882CBF26DD4074ED2792B6FBB7879566BDEE25C73B844365ED795F7ED2C6411A473881CD9869529F507908592684198C29EF6A92E813AA7B11A203709D72A571744203D761BDC55B9E7DEC82C177D94A8D47605A3F7297258A656FDB75DC0F174EFA9147A20DCC47BAB7CA24FA24A40FDB39400C495B89B111D481CA531E89A4BBF0CDFE646E1B926E77E2D62CF55A2E3B6167E19814A2E675C19C4E7D586F8B2F93DF296056CCB5FD12D9416CF3A5D68B651D87DE3E7F2278FFB744DD8731F33D1EC6790382928C8DA1584B6D4F5640E64C66721BC0B4D5BEC01B6D13CC9B59DABEB972C5527B52BDE82288785E2A99BE3B172729DE6865CED173536A32CB5E7EA7BC1CB95DAAE82CDD8285F51980A9EEF3A3ADB3F6371CC29458D25B6742383944458DB14960A0ED64E269BF0F06C8624F98867DD32F9A280C17C4F0A1D9D502385413AD20D0EF80515CCFFBF08BC44FF0E087DB034DBD37FA71BF74528349FD9C73D760D05DB3D72A3BF00D706D529C07FDF554A7DB8129E9A58984D070440EA0E298C1AC2ACDA2F5B2FEBB88A182D31B82DFCF0ACF60AF7DC1178C012672BC6381B4FC2C44667B1E578B3183B9159397BF2C6686550BD5CD7F781C5B00F12160657F40CDDDEC5AD7B366E003DB7A9AB2D621C300F302DF8F6D59288E6F34B4A88F113C92672B35C04E3751B0A686E4221E7836C5983C18D0E7B5966A08AC5A8D9CD5FFCD53DA823BDBD045EC94740FF5A0EE3C056184C65FCF7E077D028C61B451639E90248A17AFCD8005A607B8EF8CA2475B20AD2EDC47A26B7C8CA24E0813B2BCBAD1E4AB2D7C0D360176BAD1B8013B4F5A1D205044041D222DF542B4629FB2B99A049FF10B0992FD17DE30A52305828BF3B83D78B9C5A8147F6AB083B222E043871017219E53E9C2AF78F052022F6662D7758E89151EC51D828888C0FC8E8C99D261F7863008C2469F001440F4F1385CD9105512A2F8B8B5EDA472C08E36FB3CEC872D3F99A1746E0F13B63A8B3370F7C3A0AF7E6CB5AA891035AC95F51FB53F93BA1C46DF44086B030864E94EA8A8A31926C2C3C9D16765F96F3BA6C9E75A0DC35AE4E539CE519B473B61B8DF8EACA9A851D08EF189964A8BD81BA5CDE2B4C54ADF22094D5DAE032917BB1C8487EB1B5F94E678B0079F0D50432D0DD552A2FEF22D7EABEFB0D213485AA8624919FC5333BF15AA3488051283812322214300018680DA8511A915A5F7FA5FC6A9EA7677FE0B49F16BEBE0EDEE212749E19752B598BFA1AD2F280CB3DE18BBBE18465C78E5A3826F49B0A2EC416B8107D8CFEAFAF7FB445D7D98793948C7D2105C8DC8047978A15B312D62F8E668DE1BFEC358E20DE6ED17F1DD1B2CC53E44C40A19BAF9BB95F5DA556409EDBF162964BD0398062BACFC324D5FBB5B28B7617411F7FAEBBF1406D1EB4699CD2C15CEBFEA42F84E048783E5A743ACACD5AC86DF3C34FD62EFBF4BB9282D7CF907755A1513AD43AE3364CCC4F4382911CCB6A9AEE46AB71042C314A52B2388E0B4D2F75E0885AADF75E18B4C8D8E5E33D9973132A2FB4CB1E447A3FCD53B4941DE45F246A0B749A4163FAC5768CF5E60044E46AC6D11FD2B9E37451DCD5A610C2DAAD1CA082D792BA2B08897A3D9E1FC74B0B6D4CF968FBC34BAF07C665AD0318AE3BA89AD9C914DA0F753F2D9114A4076B3EBC778487469E4CFD07BC06CDFD4B11CC84E90222D33F45BBE7B0D0994A857DEED62B9745E98A6CF464198D395AD307E6E0764CCE0CACACC3077129EC41C718752A998A4BD20C83A17EBFBB76C0F6300C5D556157F0B1D727A24342CDDD42DA81FC27A58068F0680275290392EADED0DC0298F814481FFDC7914A2123DEC7FD829F2F16D3B24DDCD72281DF5C80AAABC7A8CE21006AC670D14CC45E774122051B17EDE0CFA1CDF94485EBC4BA7B7A83704DD8392E7513F76419283B35D79027C5A16A091CB5CE0D0BDEF7A3C1463581A95772604457D1C0DBFD360B321F7D23716610EFB56E8A6BA2DE9EA3EFC1D5D7252FD3435D36C936742422AF3E16A721EC6C6CEC7822EC948496E05FD0690C3537C24954A46FCC7A5E5BBE79B1583A1A3FAFEFABBE18B579320C22B385DD609B03488CE5E97D38B32EF5A1274B0646C5D630C14A6270878AA3FCC3C8323F0A3FEBF9FC8EFE4CBF7D438EBCCCF3EE0E4DFBF961711BDAD1DE2B6DF76AF76A511A082A26D92E0DF6FE7930229EB029DCE49F3C26C08A94BF0AFD0B87BB0FD0D9F288889E522F7C41462B841122F95886E03C8B7AC1104D8FEF485EF8537FE5EBC65A11C63E05376F65D93A4BEAE22BCB52D7A7CE0F4FAEB02801EA96F27DDB68F45BEDDAB35DD169496957A1AFEAD755AB5D1BFBF9EC290FC89A7847AB007548982E44C0DC7253FD9CB07C278746A3FEEC27116724A66DAA74B8B22C9BABBE103DA65EEF523AFF2F867942BC3F91D598CF6D55227FCE15EB72BA0FB4B40587FD6D341DA0C3F6E59B3F550F9777FE815EC4DB9EC0D4AC07B0EAAB14902321465504A951E36A8F53515603E420D410CB4FED1C0194FBF39749034575C38F632F705F5EA38919BFBE6D6E06B47DD3DCC0DF8AFEC000D15DF062AF28235D2A0090B3986FDF0D24DF6BCFFADBFB46373E3FD3C1C901C314EC869FEC4A548312344B1765F0D7EECF7C179A3A0CB6027F5E81BCB74D3B5E91483AFE8EC0CE48B90EF7B4581D336996E078352F16487E3FA8381F9114F17CC41AA293CDE602A630F6FDDCC91E6FFCF43673F39C3D56CBA2743190002587890A1B5ACEE17466EBA32BC4520EA435DDC2320A71BBA9A8BAE4A38BB9EA72B326EEE20D985A665BED78CE08470BA3CE0E6C092B621506A87CA6884B7CB4BE20B3B9F33DA53B98809821F0F5B3F182073DAC3F2C163784DFBF94BB7437B05C9A442A192308A58D9358009520275161340A999913696C9DF6A3C8F88F532ADB4383801BD844E94C4B354132CB5504AEF15E5F7012B165FD2316D00DC09EE00DC5D9A81536A5B4B202D69F92129DAE88CA6A7D518ADE3952F413586AEAAEDDF29683E40D7497C7A8A6E3E29BB5DEB4D5789C4C873E5823B4EFE5EC87FBAD4BFA507C0FD0C171F09F298624232C88CA3FED953FBB4E7CD3F6847930F339A4B15D25F7582FDAF8D3B1E1659AF8A695865F665794F06EAE78D2F9075C2D9B5D43BD245D0D2D14CE05D478A87B9D8DA9FC31F955AF609A559304880948CC97F988D48E499EEC2BAB7B6232D4872285CA51ED0338FF3A9E39DCB638C824A9E27004EC984845580269A07092D9EBA43E3706A5069A240634777E010BC5C26BAB9F01E22B2CA1B348B3E6472CAE85374A1EBD6E0171AB9449679D00FFE0929F29238E8D0BA7476F298BC589EFD4E0EC1464A64B8DF6AF3E23DB5F965763B1A93C9C635E1488F322A09F6D81247005BC0E2AD31E1734AD355099B9CC4A1E37D7504695B9CB79AEA65FC251F49BF0689A2A4BCD94813DD9880C5FFFF85A6FD14ADA198CE3DEC62B251725883937BEF821992F60EF9AD7A90A73D1AB4B6BC92299571A1495C341FC17190F690473E9F4F1C7A58F685FFEEA723A2562571A34734B18C06FD6451CABEF1F48BC15CE8323702D886DA5B06D61F8524D798B4853D5594EB21D664C27B67094BEC5BE81086CC563AC183A69BE778458B4646F9008FC6F83F2D380CBDFF38ADAF0DFA78BAC774169380AB9A831ACF3319A2ADC0A8DD6B0D75A7FB81C3884C70B7A6B2FAAA94703CEC91568BE9B60B0108CC897CAF349D723CE71B81090F23DC75E088AECC4EFE239CEFDC27F0831865E726FD0428D1510BB798722D22EDC0ABA0DB94766A6571EB968FB4C11CFC871A6E9EAFAC5D224AD8209961FDED57E45C571F0DD91F141756CA0EAF77F7CE04E22C12D550471AA45CF1F4E808C79FC59BB0AB8D06BE7E2B98289EE056A002433B76E722330E3E3BAFFD0DD4C8E9367D2F648A6157AFE560C0C9DCCB557899283E4B1B38AE41D3ED6A239594A06B4C426A9DF9D0B28BC4739CDF058752CAC684D956FBDE2DC14CB4E9AAF8D077BB6AA02ADE4FC175FC00C467E99222C63BB78668CCBDEEFA6F183DEF28C3BB5A70CFA79F476F0ACD31C33BBE01B5294733CEC48DB30D64A7B97534C40F2D119932484E877402554E281C2AF6E494B6BBE1C9CDC591DF9FDAB25988DCEB0B13AC111F71D08CD80076C79AA42C7FEBDB8DB8C62816844DC82A32B37CB6181CB5E705D885A57C2429AD29300448621F01A64C6318D0E8AF22989883F58D35330749123362871B92B341F99E5F11F8E31EB7406440DBB38042C3AC16BBD750D807E0699DAF7C92601E2A0DC919215FB39F5A172A9DD66CC1A5B04FC919D3F9709027877B8967F628C82E32D6459E208CF462F22737EFEACA6026B66BA3A718346795526301E47E7CE6F100C421E3489762B5748B7786B74E64A0E3EE0706AA7F2C2E998E6316DDF5E8FE6A27B445170546E73E4C7C0ACF4B6E7916273DCA1EA0B904E1F4B5740B98B03DC8610D08D7C549EFD5478FE4B69D84E2EFEAF7CED1BC8D4E2596FEFCD923FA80E55F9B2203E6B3AC1AD989D7EDC9D1741ECE0AC7FF77DE56CB76DE5BA5C857B798C7012A533C615AEAD7381DFC7817160A8DE24161B9603AB5B1C813E87D3EB4631C5A6534E465DFB518D34435CDBB703C29B52177869073CB55756E2CEF9FC471A92D522D6F8CE88DA2AE0272AD134FD80FB9E1A594AEA257BAC9A793B04E2E33507A1C0EC51ADBBEB0FDDAC877309966338E356AEA422ABDCB3362D8F9F1A380DE8CFFCE0CFC2ECE3F2D0097EA37C36B181F84C7EA70DF98B2E51D2C06677C9F30E23CA7F14649D4C21411B4C4E45023344763BC689F2D938ED134EC69DEC6560DDF3E56FF269B40A654B25389E5EA48DC8847447C9E4EB0DD88CBB53A1A65B52D9A5D90657E38A01A9D5971498DA53F796B64A8F3E99DFF0CF03E3AF8D23BF59C6E82D93A2B5464918A89ABEDE58AF2DD1D7BFD92DFBB036901F4B514D037B691C51F3E9FC79894C14B4A457B2CB7DBE37394877BF19AFFC0DEC5924D9835271836D3E010BF28114FF039570969D9D7217DBF501A0378CF08F5FEC67F2ECE8AD52EBAB455FB01CC559A4A0FC3B4C1BF755EF9638912719C94227B642600C82777E14DF6B2B580B4DD5CCD3E1CB6636450BF9A5F48973B43B2CE7E9D7AE7954C993EE076F38AA0337597542803E6C6DA540789826D305860123705FD37156721F955A017DC2645E78C15582D597DBFE65891035C9A5C9DE9E5F86A6161160844C93F9888287FEF96341EEC4E1515CE59C3F36075428B01EA20279C5276D350F0012E45397564B4AA9C5E0AB807F127EA5180FD6C27154770DCCFBDEAE1BD31A0973C2908C7774A166CED627A1BC59A326C12AE60FEBCB7AD755A81AA38D8AE6A0BC7543858A21331A96610BF58215C23AEDEAE6C88F3FC3280DB81FA545439D6B5BC397A5E5A4A06267729F757BC509A8154AEB77018C20E7BAC3B071B73B46CED04FC36913C4DE7443E0D195552C96252B370A2E08B6C0AF7F632A929C1006CE9579A3698125168C0DDD61478A544CF700C532A0BAFC66438155AFD12AB14E057E1BEEAC9146C50B98D4CA6C987383E63C33B072775462AD55A2C8E5DA8A7D809260A645E129C224CC5317BDAE53DF44DF54CC6DE47898C28D8754FEC5526C184D3E6AA9ABE776745819C9C1BD9925E9E7A8F1826D0F9FDFA8D2751AFD027E8BBF1F1A218C7255FA2CB94922C67162EEFAC7AF1E4BC8E5C298868261F26AD2188729E2584763DA39E87A3286138F6EF7D184C408D3A38B21A4A6814ECB3E98F240D7A487D40BE10C998C8FA98C47D9422B5954E16088FB76967E8B8CDCDB1C6E77D933CF155E5681A64E78A012AF86306B5865FD9E4911A6CF046BBF73207CF0BCA78E0EC015A73B3D2221227CE81FAB2AA1F0422575055971F5E1CB2C0632A3E85ED5B16D80C84E96AB1E3DE6B6351BA588A88FA775593B40EEAF4F2369F8A7C7A4A406E02FFED4842C7C53AF46C64F538E7322DFD3AEEE7D0118D5AD36021326E9E076849F1193729EFA5FA14995F6BE93AD7CDF538B232AEC5B9FE8D64F0926EE29D566CCC74D1988D6055A8FDC17F582FD6BB1E1CEBCA96C35ED56BBDFF10378E49194428E88C089E1642488C620B360800468448CA259CAC4A54B97FA4F3F3D51D290FA526CC44E4B6210CDDAE2FFADB5D3B7C41DD61C9BB88DCCCD3CE201850440C07F1632E9307AD4CE3A7E26B049EF0BC2379A31A2E1DBA77D858BC8E530B106014F12994F3F5666E360B795672214671683542F636835F5A67F0FED0A7BFFB90E522748B11D7B8D2D8C4290EDE788C3299B192C0FFBA5699811D1590534A07DD8D46B9FCEA5887FFECDCEBB2BDF59A6ABC66B7F2F80E1244C5DC1AF4D273BEB6E99A25F887678D5E01B00E3481874767AFC82FB4BB1B1F15218702291AF17C84C9C080FBD901076DA1C8190197427E5E0806DE886FF2111EA5A22D07B1BE6CA919BE48F3C96CA0D632D4F660022792F22EAE01AD033387C5D59931D4D94B9859239E407768D7A0DDE08C300E2AAE1412976357FB146469FFD3DD47416EF286DFC372C2C0BB344092BD94D1E3737BBC24DB677B2EF4F6071F9B46B02FD0165860ADB7FFC62015F032E6DE2D9120547E28A5C3C5AF93269DC77F6F9026DB0D7A541C3050FF57664F0A3CEC537D4846CA92C8E10F3522DA70BFFE76B92793E5D0610976B4F109B70DB4B1CD01B8CAF38E053B8AF13B3AD89D0E0985B89ACF944AC6DF5003B6D59F4705FCFFCA42FD4AA1EE8614F9F8089616D1A66DD7CDCA8397EEEA677C30B9F18D67EEB936CC71FA82CCF343EBD11E324DFE2B5C94A97BFE2382AE3958A8FD7BB2A0DC9E2A87865962ADDDAAC82E036940390130B21E164B9643C61B33660DE359B6894BF0A9142CCFF141A0EC297A40D175E28EA81121D5B1F450BEA7B0F74EFECD81E4323F2EE5DEA42E2815455F74DDA904EA2194F5CD7FE72864A1B329F2FF29416C61196DDB41D6A59ED959D6D9B709A8316609B500A0BE98329A80DF940F780612A3AA5882317396550CE0A997B760E0945F257204740979CC6B192E22233D2992046FE30CF070248E42913468049EFF1B5C36C41A510EE97ECA0502F12DA1A4C19D3086C62D8B5210CA7778C200994B538725BDA83EC57B61CE7C65BB06BEC899258AA2C5F88368890CE205A3F6F897013BFE87A9948AF41D5D93DDB777F9830C1B465108597E83888BC7D3F9AD31CD65C442A4E583C6B59C2ECC6E2C035DD7BD7534976097F0EC8CE73C3F2C96A92D4697A6408B56FFFC8BBF8C449D4B091F88BF332E70610D22244347AEAEC6361FBA97697DDA7DB46C894A3543C13D91D13D3EFA7FE4DBFEAB7EFDE6F19387E9CC19A58663A0EAA50B638130C331FF4774CE343A9CB44D62E891D9FF7AA749E8BC8A8F8A8C88BC6F6CBBCC9244D9B64423A3D9DCDD0C163B0F76CD3654F744263A1BF5F83CFF8CC2B066131702D69F72225407292198FF278C014AAD2424023CBB209C937EC2806CA6A6F81683663DE1BD3F17A1DF3F65C4CE5279A3ED612AB9E867818FB55A2FFA3AF7F8F4277DC39E76854F995E14C964B0DA44647396D0EDC0A6FCE4FA6CA6E4C3248DE9F268573497EFE4DEF3A65736ADCE417C7E52C70879AE9E743EEACD986B3BA283AC2074A6644C7DBAA9AECD2ED375A6C0FA5CBB3F537E7033C835A658B0C0F43FE4BB019ECF985967BDA492E85D94341C4DA2F0EFDD1E3AFEFC3F2BF4F77C79591C39C5ED80D4D5FD3BBEAFF2195C4C5A8F989310FC4B5D2C6DFFACCD7ADB883BF8B793CA8202BDA5D09956B890C86DA5DFBABC380ADBD5CB3E6BD87BC8C61F63F3D5C1EB5EFE3D7A57D08907CF5FB20C4791935CB5C3863A4D98F36D6FA0407F802275F48D5C00B81ABD895F148C62DC3AC97E63EED0CC8649373FBCAF5BE2EB998A5309C50867DF44CB7253A0202B95B4E7781B5950C9294B55616D4B480BC23274B05167AD228979A1FD4570399C5F70BEA526B33FFF23A5265E31DFEBB3A75146786DFD215177200F983647BA28937C811BFFB1692F0098D6D58F5851FBC569264A46B51BFE9DF9AD3AEB9697C56AE759314629F418C4B62A987258A1ED3D9CDC51D2975F65C25CC336CBE840DF4E7069BC7BAA0E03636C4639F8AF9E291AE835D73821200C8A382685B9169F6519A776064B288A561F80B0F9D609BAD3331ACE369671458DD15C18D69CBBC2103D4F625AB0A150B2D6253815BC2A181C3EDD223942C325D3BBE031B07F051A2003CA467E5ACA87E119C44089B21214AF8E638B633D6B5DA2F9E8E974D130F2AF00BC9E7144368950789B7BCCE90C8AAC6838ABDEEEA3E5F9AEEBE6F243EABC3860D0A3E8F5278112157FD0655DBBD488C51C2CE6343B08EE326AA5697F7506CBBD7E8DE84DC1F80CB2CB476C74FCEACF1E998F32E8DEB6F5588D8AF96F622520357ED28C6C395EBB94F7DD38620E060F57D68D3450181588136B23BECBF76E0F98A6B274BE8C8305D28C24656AAA63268B122EAF75806D189A6A3F18E0F31B870822FBBEC885093E77A2E26DE1324E66E022A528BA4FC8A9C84B82D31C709B8479B527286DE177E36E61F9395F0EED6D71E41AC544493F57505CCE9DF7D609C5B6AAB14464C34AD6B2EDE32A51507DE3BE759B11C571E10FEA1DAAC5DC58ECE8F9F9BFC5A4C7CD606FDBE15AE0CE0F43C9C7E766D2E97A8FB9D5BDFCF70EDBD89765E2D5CE1FCA9DC30F9B6148A11E3F60C3C5CB46E1471C2CA647E05D552D86C037B6846F8455A37DC3175AD24E509C59860833FF3C7654C2E6169D04A0B0419D2FC99AB001B7FE482FBA1736A7E7E86F9143FD3E6096409B1B896830005B63DAF6564ABD22B368DAFED470D2645F0BEE2E8F47AE9D965ACEDBE840550FFF9B754B48D649E5BBD1E01CD0DCCD68DCDEB5CA8C25F28914777A36FB74FADBA6B334512C2E686C29570BFF0999493AEC81FC8AC460CC485684A295785307CA0009D0A578A4F957F238A80E987D5FD260B8B2D20C051903C83C92A18618A892F99923869A1C659A7FF5EDA82135CFFBD040E220A0A1AD9175EDBEEEB814C1A35A4411CF77EA7AC8E0A8AEFD9BAAB4D6435813750E43680755FD129A0AB99FD8879C24ACBD4BDF2770A9A8AFE3E680B550C282FF13D0C6AAF528ED8D948ECB13F1156F3914786A5D28CD8291CEA331C99D867618008B0EAFD572944EA163F64E55E7C17B03B782B8A60A747B8CABED0564916E02124E9E45D116A37CF54BABCFD7B445FC0BBE4416F42C2298DE3D36CA8E78458928C1314B9D38EB7E737D4FE2F6E0D4889AB12F9803BB651730D929235525B36A979A9A01F06CB7DA133BEB37F7AC8B48C089D8FE9F39E436B96718C66272C37D6345A8245F0252C9A71C9787511CB91F1A1D4D808DBE48585E4EB51612DEA99C98F69970A9FA9DAB79D8764E40CC079CF0F893D1EB044E63AA53C875336138C49FF74705043C061293EAC15AF3A4680CC2E73E558CFB4909F380B11577BF1021234C5C86E2F5E2E7C456737A71617BF7EDA518E0CBDB44954C766DABF4E0F79B6EFD31CD9AFEA2E89C4E3B72D987A90A764E26742140F42792934384B2BE9E6B525097138DB856BC2A0E82B83DC81C9DF5FF475ABFD9AE3D29ACE02C22E6DB54CCBD2E0AE8C76154D73C865E7729B48E3EFD47A207D0CF5F24D6680BEFA1E0FB937BB19D64C34AC3DD1D1AD40347F2CD5A1A5C94E4BA1F8549A16D5D26DAD52BC53D4CB708A9DF2464F0D2D9C50B450ABE60F84BEBE614C57FC532FDEA1F0F914468A87BF529EE80C226047758BEF91DC86426885F695EF5A76FD95C216E9C7216C8AC27ED4F3BB68D35A0F737CC8C156DB508C415377DD49CC306078051BB2540015916664B8B956048EB14ADFE9421443075D279AB81233D2512E07E3AD96F9813B6EE017402F674C17F6302528B515DACB1016E82EA1F2C672E2608D676886EF70CC8051E9C0232DD8530BC3BA0E0831A46869D9F5DB187958202C62FBA0567F9AA2A1469A70F197E3905EC24692676E45096E1878A82FFB1EF57BC9D1179DB727757F3F54BA13757F3FA095AE75A4A2A5E46B5FE84CFFC0A68FFF51C08C76647ECD7D3863207888E5909A1373835E8EEDF23C666D0241E8F4FCA966A1AF3FBD6103982B246FE3825496D5867C928F6233E6CE5845124567F3FCFE509774824D14F7D8313B16BFCAC1F784D8F2F8D6ECBA5C459077B484E3F272DEB7047E8EE480DBB51AABE02A3A40634A03187EA88FBC985F130A2498FCA63BE77CDC8DC7634E17D77B2FE13D932F1343301C01E284A247DC6A95811DA0CF3F51E68690E892D97F24C76FCB9D1B4F7B84C8D48914B4862C4FEA27A1A649EE4C5D1AA41AB9F9CCFEA93A3FAA5B4BD3072A66537A5471C3ED9F9C245246EB71317AD0CA7D4D7EC57587584DD418ABC16942FA95433C3EA5057FF26BE89A33819AD7354981785799B9AD6F05DC2F683E2D42FF1F21E47F5BDEFDA7AF564926F1C919D73DFD79732CEECC6CD5D1117AAFACE6D8548DB11462585093C8071999E93F5F327A8F561D4A5844F9CE8720C6361E16FAD2A3C4730D683E0471899B895DD85765750F4130B0EF38737F05301B7D87EE3F2FFE9DBC92F4F435186ED6AB6D364E641E2E36BFDE9ED8401FE4EB06FAEFA8DC874A4E2989CC2458E15997E6EA79E7FA5F900C866C14C5DF2A0B9F6F16FCEF8CB10F363997702BF66B02C24D3CB28D3695A8276BB4AE9820B5BB3821BF048CAEA2FC5259A24EADBC61A337A846560FBC3EFA1B0FD94ABC2D02E638D7331C0500994EAE01A0A34181A31ED13242B789384FE4D0497FF831F05E37BAE07230D8FDB438A103B400E4DF8D633CEA87A9B114B54ED9CC4768655D1DC7EC7C54C875B06884C679A8FBCF5262A29499E22C6582D92D215CAC1342DD2B52DEEE19407CAD66DE9035B2498B9FC752F38656561B044D3C9EA38AE83123FB6E5A1D9CEAE5C216E132E8AEA32BED3D3FAC71D2D3A4C166DFDD0FC25AEAB550835F8184DFFAF17698F676B2E5529074E6801B22B93D8A4854A883FCB6CD62704BDBF54F3EF3C24AD22CEBDB7C7823B133C823A688B688F32792CF972FBC2604037F5150BED9189576B62A58DE1A69FCFF06954C86EE6E934CC8F7C569E01BA2540254C467D70ED44303D2DC33E3D05A953A58292CA95DC5B0A824490CE7F033C3AE1300482C7C6EA600A5454ACD288C7999D0F9EBB333A1468A7E99CF2C3112B511FDE7528D6F7DAE891ACF8CF8F34B79EBEB96D7E8F98D8340B5BEC4686E0D07C365284B65A070816F1133B33D0242668102B55406A8E5459717449250863AD155EDD76CCB22242BD5ACA82FF0C527777C7A74AFC6BC052A76BE7E11EFD4F052E3C017A4C6E092134307E5AD4F1A858EB24F43B4FE2BCBC01E559BBAB41884F332EC7868275AD4D70AF11F4F20B8F1E0075B15BDD335BE85D51C79DE5D842BB9D54F1EC5D940E78714E422E8780BFBC4B0C2C815A9D396893B3DDF6FD952F64D469CFFFD392CB0E49EF5190A4F3369E6BF84B03FEC2595964ADA41D418B081DDACAA1F6993C929C8B431CE5ED5EDB917D60D8C2828E0AF1815C505DCF3C0FCB0ECF872937F091EA51C462044E6DBBBDAB734BA037DAE301769FA93C467EB5C233899E2C8592713F0245A543943668187A2223120ABDB1017B9FEC4A7F7D9C00A8D3BBFF8935B82A544640FE03766AA48B7CAA8E0BB531FBC8EC60F0D12CEC5EDE1102EA83169DD3221956CD69B5B4F81F2867A2758289192952C9AB78D2D6F6BC85F451758442315FC11B0DC2AEC4EE093749FB439ABEEBF0898D6DBD177F255C98630CA72BED582093F55B0DA0FAF5FE312E590B07B42183E2EA3DF9D0A5E6425D5A34CEF816C2F7727FBEBBEB84C33AA10B48C603A9733A21561E427BDC9F96459577EFB4E8B34BF3FE9C997233DFA556AFC9394885EB64E62A6C6D005A76282CEE82F4933EFB1546CB459739441FD6E8386B42B0AD7EA629F6133CAAB7A4464017E0164FB9F2C6324393A1921DF2CDFE612F26009FCB6F54DDA0F31233383DEF4C8F5C006EB67A790473844F94B36197284CC3B57682C2BCD3124C99E7B7EB2E606A4611A8F2F5582556C07D699CFF8D3E37770FFB7590BD54824F7725D25149F496295BA1281409EE506A17B739B97030ABFF5362D0CF643D2927FAABB666DB95D52A26CF0AD99D2B29FE9BF23F57CE16F298F4A25497417FE7D87D7E4BFFEBFA83A2E24AA9D30EA1E46C04D07EC344C635E449BC8FD1A12C5AD6DDCED6C592350BC284F82C51A73F2E279448448592E6C9DABF84202756D1FAE73A9733CE0C3913D612628592F03F2ABA1EBB0EE03C43CC3C0CC4F63ECFA9C4B1A624B3A9D5F2FF2E6EE48E52894BE1AB4A1EDCC253359F71DF42FB40DC64C5E07FDB3608DC3F68D49537A781B6705D1933AF088AE7DBAD6C73793D7064668B90AF6C311491296D5BB0CE3047B9E191E61AE6585918D4B0894590C29F38E1A52D9D0F0B72E3968ED2F5EA0491873E208E41CC30FF64E96FE64CE7CF08871B9A2401C8284688608301FDFAF495EE40DE18F0B312C3A9CD29405BE94EDB5CDC12D84BD94ADF8DDD8F47F30F84441A045A1B167A59EF15BABDD7CBA54EB96FC248706EE1B30CB61C8DFC9F717E4E39A0756698DCDB8B06C8524771026B7DCF83543C1B5BF99CEA08D921CC094DA2182AB2ECD0EC06E43608CE6573E23BB99C1688411E3305249D8D93E0920C643487BC6B0E26DAB8B2867E45238991C6C89F3E19BA7DBFCB97FD047EC7F725059F6238FFC620F31953D93C319AE6DFE5E51ADD077E5D974923C9185FC60BA1DD83D4E2BF4A9FE6D973D1CD0C4C565CC00F55FBB18998AC0A4EE8EAAB41F8B68BCABA4F1D557E909704B27DBDF2DDDD685D1E0C3676B958E42701945A892F88E0E59EE190BE456E483920A3D1F8B59B154412AA762167488DE39F19628E29D72DC51EA5A8AB5CEB7089D7F56123EF6FAF01DB735E08384867F5B1DD657FDA90FC2A9AE07AA12E57B5F9D6297498428E1B84E83DA418EE8438E5ADEB18F8FDEFB13513F59C0793EE648D09D43C0FAFE644D8C6D65E8D6737B05289D05C8C42A89F1A3AE58BEB88768F4D486DAAFE49B641B23053CB894F4C86B21791E57F9E52DED911B7EE5158B6498B0E138A10E7B44F78D687BB8401F988556C748E25000C96081E70A64886C299B8C62EFB33AB705A810BA5417D61EFCCDFEECCD63C5C4B6657EDD0B93A4550ED3C03CB2355B1A6F298B7D8486968CE1F08A378C921197C82C1FF549CDC3D28D9634577A620392901AE3A14C9F21EE82BF4AA7F509F3DBE46E7F50075E3041618696948475AF61A095E038FDBC979B38F94F91A042EE0D563617E7896C110D0B34D8E840128D3B661BD7060DC66A7A94D79AE2C7BFD03DFFF73FE6FBE4AC9AC0C2427A1F4ECCE16A4B69EA2AF6BF6512706E5494E3625E852C0FD001909E3D4A350CA69A99C58B3A10273C0450C4A6FE1767E4900D8A56EC43B2F457BDC555B5C5B016B11F1241AAD2BE507124B9CE15A9C1F3F3E2B20E2A07687F57C0F1ADF306E80AADBE9F3D25FB220BE86C45CC8D13634AB183716BB4414C6275113AF5904F07BF794D9A9925BAA8C22C0C7755F43E6E611419B35D3EDCD54F8C7489C6A79D609E60B2C8C4411DE7643D0A31F03F2F82DF8588C7318B52D786DF5A8B7824BC93997E1FB31B6BAE727C889F89F19BBB1DADB5E0281DC05BAF25B83A8BAA86BCE6A2CA4136032EA37CCD0897C7A5D88604622BC370CF9F197612EB215B4D564A6F5ABECB80391DAD4448F502766BDA922F292515C9F02B228C43CA89A3AD1282116F86E29B0445264CEF2A1F807B2D53F4E06443C14908700C2F9122195028C2B741E2F6249B195B5389B7B8E7C39D538D8C631A90A8FC056012EE2AEFE1A2E873E37327877EFDF7D221AEFD425B218574C885AE351ADEB52331F1031C08096BB237F4579682ECB6632921C173C8C3099A1108D3663941506242872713E7667CAD34446670CA161FCD6FB418BBE4CF97693908EEEE5DFB7E508DAFA1EBE054CFEB3848C2C672F9A1264144BE556512EE9D59EEB315221FDE9681F2B36ED14994E0C988DBB6CC147D778FE2639D39617A1B7983F7B08DE9EECC3C94B774F193C5A5F6F2FF5283B5B4581361AFA53FFC3A26BCCA614D78AD2FEB48EF0D09306D44572E42A78F807B3C939B5524E6CE25469846D4736737F9F2DFF70AC890B7DDD8A883E36EEC41B80F76EDD88C832A732FE0C2935E34493D48FFAB14EC716F87AE9910D2373BB07720EDF7753C79707F762E1B892A17FB50B3C00B1AD1F4A27C1D9B59E9761CBEA00C76ED09C61288A73F0427C628804A56DD0A75A932EBE4EC46A4EA80429D0D51FA2D1E1225F5CE3CCFF4E54BED060588956BB7B181B876123FCA4A16CC304DC53CBF07913843E3A279CB079EE079B9372FF735EE94FD2DEE37263E5506A3D5C06C7C36F87488DE59828AC1F1DF513CCEDF1D9E38B71C30B66DE5E92B5C217AEBE87C23D9BEA3B13C7970664249A556B0BB8B05DF5FC19045CD088FB593D79BCE7D6FE824A15A4A4980BA5CFAD262932CDB23E0F03020543B0A7724A5D617A3A8D4ED7BA61E1764F5E2D599C1F38F41271A532F0E1D3E9736CB0AC534D95F3C35D8F76FDFB8381E508AFFFD64AA9377DFBA3306806CB0F16B4B941F4EA56D5BDA31FC43AC62A6A00CE08ADA84FDD440FA185B1DEAF2F457F38AFD6993145B116DB69D92D556D27666AC87AFA2308FD3073A2294568C2887B376417D112532B9A8D22F2A805F1D624E10C59B4D4C47F99196375BFA651E1FBC35074D95866F09265302C07C2CA53FA20E93EB0C39F983318F8155683CD48501456E627626296435813AC36E5A5C96CAD768B056F7E7922242BD3A848F3D92FC777C9C3942EF090A5FE6A9009C1B0B3F045E74639338EC421289791A84A4F05480DB766E906E82FDCF09F466B843F1451D05674322CABE4C05D660F26E832EE3D6D4F978DE31A48C6D50EFB458038F5CE8CEFAB9BF9C05F162C37798AB2A006B54C1300D7BC62D3FDF75127F8C17994C68E2AC5905B7BB8A2F5F37162E7975B5C1A9511EE9C5EB1577A1D8AC85C512E2A24F81B2B84E8D9185EB694C15F2AD0D9470A070A164CE4D23FE388E2852D1E5D566DC918C99390B13468ABE005B2310EA9D7EE3BC7436AEA7D900B4A123F4920D30C5E26E4D281D3F8E2D5C19AA83D0261D6F8945D14D2513BF817969277EE0F538E8F2DB8D759856AF0801BB7C26F566DFF9F102E02DE63FC242424353D9BC88132D544AC5584DEEDA6558C604212AA8310231BD4BCED04172AC52DFC4CA4CE20F4937CA1B2B5EE6905EECFCF7A6B094A9B0AD954E3F29E79FA48D611157762CEA9D8FBEB1A18F91E27A71B9746D9D8744A61551ACB7C05656F74D9E504A0446AA51BD52D415E96B77DC3BBBB506D1C280A690AC61EB7E361BC9D97C6E6735DE81E48EFC85B3E41654B4F5E3D707B855B56648460A39617863C0B26A28069E74F05F727558B3217A685C81954E5DF26FB74D7C5F0DAA0F7D209C5FA5FF7B355779771B657971B221D6957CBD88B8880395629772896A3F58074C6CFC5D1B2614A144A1E3E50A3D99D0CC845CA2B23B2BB330D8DD6F0C7460A7034E90D14F4C1249918D4A83330BB360403B8505D795CD9EB2D062591F9D6343C6458FD3F01B503C97183B4D222099BEC0490FC5F52A3497821DEB77EB14C82C4F1FC68825CE84A2046D8F8FD2D86B64DD1646109A23366A23F8AC860B96EB64B992D3177F483F1926E7CA75577DEFF2BC79F9DCA50FB83FFD0F63002AF5465C08DF1DF0F688A1E6853E6006C6E5AA7315A643315AFAE82AFE106807390EBB5A0676F4F935D156CAC753667722EC6EDDAF602A963125E33658F1FE8DC0D459ACD5B3092C3F5A522371FCFC52B6D39D441917500BDA90B12000AEC4D2F3EF528E707DB2258DB89808022711E75364E9BDB8D9B7EB95AA32C63CDA657CBA84C7176ED47263E759E04E1C7013772FC9D4FF2310DC2526FBDBAC2DEBCAA3EE1CBD9BCD06D7794EE1B4BA34886565E7AB455910AC492906782C683B75082907FDCFE7D29D4B87628EA5F87D1DC3D707ECEB78CB06F2B0C0EDC993B64AFDA833B386B55E0E2CCECFC0A75280B73DA92F2D93BCA8CB68CED20E6683AF73A13D078415763EC5310D18CD6E3C750821A21C32E328127BCD233AF2F0BAFC79C218807FF7CCEC7AF4C1B9760ECE114987E680A10A038FBDAB568E9F3B686A9C4A9BD56208E4EB73BE1C27519B4994CE45AE3588D5F27CCF9CFB217611BD13472FFE3E130274834A1073D44988A4D6CDA8E6196F8C7F9448636828F74D84359E2A71023FAE04E24F91542998F44FA01C163C132F98E5E4797E4CF0CB15FA4098E7818ED8F7739A5B458125B6DA90A92FC5D2634CF3D58BFFFF683A8FE4030631A559EE8925293C6202DCA3042B3D5D15BD4B6300EDB629A042C3CF9A8D7A0764830551A74912E85F2C946EF334CADAC0CAB9A3616DC8A691CDDCA0182BC82B6A6CE62A949E587F5A6686C504F7D2D8EAA3F8BA8315A8E180A646170332EAC3345E1905D1BCEB4FF2EC8ADBC8E77CA9645CCB507894757E096051EFDD929BD14C00B7CFCC76EB3FC1131AB4234394089433F9E61DA42C00BA599B8986F185F8D18A2B9BA4566AE16ACE2A0CB1DF0CF75F63B6A618B04AAE6F4D87A2B6D119E9720CAE19825A6F8DC46D44EB257430D2855BA33308629E94C5B983D3226EEC4F7834B96D2F1194F84190EE6F5239E3C855B26C9CF6333EAD20E7B42D918B52106F80D111371F35BA6A1DD5FB47957B36B60E900E284859972796A5532CCD26D2B03A0366D963141033D7F649FC5A563035BEA50E5F52B419B398AA4BF34539BF2BEAD7294B905600FAC3E923E2B8B4811BA61C78D154C1ECB0EDB92D2BBB26A4DE52E0650AE30C9D1D213A213C6F74A3D156AA431224880B9A296754021EB88927AEBB967068D26A404999E8EC5884B26DCF7A45555FB047E4BF804CA25AC152B2E05500E36234CD555F41930DF277D870B1B1116B13F4E7A971AD9FE59DE0D028CFD0D76D8A7533C7E4608491EA3C1F22F1D9E7F687E45B180737CE4EAC383EAEE40BE73B142D26D1F8F45048ABC85C5A48C1C7DB01D7DD367C7DE8C48C483C86FBC426F029D953BD8CEC9A5A23FF06DF9043F8B561A6BDDCF9A737A0BB9A0FE7DD6DCA780821FB9E2DBC9C960EFCE27F8230DBC291F5753D0F84B6ACB56424C85FDAAD38818616DA7276F3E8C00A5056E3C27EC9825D5AA935906000A15D29F4876509E930FFC4E6225027E4F26587920B03CA1732B28C3D91C40DA83C983A50DB9CCBFAF9EB3F5399BCEAB915255E439D7B86106888C2A8F9596AB5001C3F604B3C087189C9581E8FB013801DAE6B511BAE3AAD626768218C5E957FA0A4015D132FB07C4B0BA0851A954C85015892798989599CE00D39A73B19B393AA13870CABF64A058804BDE0B0C486423C6C29915B8C436138952AEF2712C308A543D80715BB7B76D45C19AA6E228FA6E2C8A6854459DAC15A81F6775E42161D8E4D68740D2EE55A4A43409DC80A612CDB384B6DF9863578C1F7B1F43575E9D5D1E9C2A2B801833F4026318D955F2315594F9623FD523C6338D2732EA076D27114E192F323B28A42464A251B061A25BDDF94EA501B775F8E728C9B67A1E573DB3E4A636F3240DB0272871B76D7CD4F5F4AEE6DDE5793E106847C55929D9266B4006BA5DAE91BB02E80EA4AAF29215E3F957F6C660C3730ADF47890657A065BC577C590A4F465ADD02081A86640839B6A89ABE1A9A7BFDFD4B3984996CDFB492C51096983A0CB10E1382EFA41BB286A613B212FAC04A215198C8951D9063E78779030490228A49F2011F633E7C16214DAFFBDB334AFF78B024FBA40FCA425D0432381C01203D8E877B3E4064DFE7A695904AA4E84CE41717E60FCD6866A42849ED33A4BE9801F1EFF68FFF5F04E8CF2BBB88071087DF6F4360F63F37D111EB93C28F8DFEEDA4DA706B8BBEFDF01D939AAF880880BF9BF9EA587F41D505DB47E5ECC03BC59DD5717FE68B2E4E0345FAE19D833B1006515D62ED2C3F15F20D24288E57B05431038A7EA1B07D61DABEDF9FD9C507A11B0E5CBBEA98E2770BB42DAAB2A92BC1DF3211915F881603F43902E46A0AD25EE1DFC684CD095C196C93A84E33C2959D28AD9C48A94BFBF29DE0B8361246E33CA6F096127FDBB4553FD40465FBEB6AC4BA4CA42AFE53AADEA952C7C5BAC07F34C274C312D36DAD46CCBD488B8DE07F2FBE108C0581ADF086DFCBACAA986A9C40E0520FF4DE47EC962DBBA9714EF0A0586DB6BEB2CD336B6DC914F0B3F6B3EEA1745340A0CD5427FF7E15A01FAF1D77DAED3029E6A728E15BFAEBF34755BA888C3531638C995B24A50E94721BB52B48A127F873499B6FD6A94633E0B8DFB626A3D5D1C52891F91F07DCC4095038EAB2C5D804F669B51D0BF126420FD5DC02E2D8C4E8A168FE7EE96994468FE3175B18BA43EAA7EFB93177141BA15DB09AADD4D6A6097920EB555A2530284923684737780670E9FE8EB0D8517EF1C703F414C4F299A3CA6BF06F3C8E8304F0EFB02A642AA6CBF9B097980E5198B558F23BA1C6399E42BEE999EF2361369934428640CFFD5FA8345222750A62E57B8ED30A672961516E9421BBF5DA25097088D6593735AEDEB4145C7CE1C5BF1F3ABCFB75D74238A43A01DC36347BABD0A7BE17DBE89E8BCDFB0493040E39E6109851A14F1AC019E1EDEA5BE6ABCA484AFE070E7920098FA58DC7159D73E2F99CAFB17B73E0FBC20C9F3D9B0B91F629E21C41A5AFDD5978B62ACBEA2D57BE1F0C28EDC44FB1C66915BF89E055ED4F52D23218BCF0EC8D7E9D3A2B7617BB8B628604EC7D715EA9C087B1F61E3C9BBDE92FD7E0D48E95667A52FBCAF86F7C4A461FAA3B15D877556EEEBFE51DFBBF8CD3134A00CBA7696485170ECEDC83EA454E1C7BE5FDDCE2706164036F0DB5010CE0FFD77F964F767BDBE67200DA1557D9ADC73C1BF6FFB2910E2EBA62A070AC8A00905BECAD0F12AB32ECFADD6DDC1938E69DCBCC1FD352B7F46F44C79EE4AFBEBDE4DD84FACAA9677ACB98A536691F8D606CD650993FC452031AE15DDEAB8BBCE949F5394D4C6070B3AAB8C17333D67066003775C8B4EB8C12DAFCD805E40C669B0B1E8AA705D5CEC7F28E1BB9FA0D6094BD21410A052D34D9B234CC3D44842CD74D842B6B6CE29B3C3E696F4AA119F3556872E7C328B449182DC15C56AC7D0CFBB46CA194D7D978E0702DC809926A6909CF3CFEB152B7DA32C6C68588931C03B67CCEE622D71CF92A39C274A449251EAFFDBB949B109D14A1EC1719E718C5DBB3373158F723848D01A51BED3CC68AC0CCD3287C742C4723A55BB8D07E8410B6EFDC268CDE01FD5EE4C03F776B319E498EE6BA116ECC7183E16B0576792479BD1B50213D4C168B12AE687C13C4492BA7EBB004F962036B771AB70A617238DC644CC4DD306FCD6A89440AC68E551818D22340140CAD7E32F2EFDD664097E33D1233A41E8EFD7371F604ACC85F2FD9323F07EB9DEB51EE318891B014E0FDD0EC10FDC7BA8A2A44A9A08E616F22ACAECAE85B58B4528DA30475B0557DED2260757C01B5CE6E79F4F276F7597628F52BC66E697D1B5293B6BCF5EF838F4EA59A0CB1DA4E08EF8F1288C9A1E0166F8E34364F7E5A054164EC91D87D8AA675652A1731814D5443FFF34F2F9B8E801CA0DFB9738CCDFBB9EB3B957F824190655F0EB1BFC09A24159AC01E8DA91C067A038A5EF9DEC0747AB658FDFD312DCAC926A9804B9D3A346B381775640E41B826FEBBB8EC0453C51F80EEC993531507B262628231EAF6F8F9927927701C485EF74E092E1EFC6DF08FE0C19ED582122152D98059A0B3E1F02498A155068F994DAA95AFE0F2B2CACA31C9D1D8A824FBEA3FD51E72F2DEF03FF4906F7496DCD7C1C36A085051A46D79FE41EF1CD7E8A3D6505DB372EA224DFE9C69998AF716B7AA5D1DC97F8B243A7413ECFB4421587E0F6E46E4D40A0D104D1BE9BFFBA05BF2CFD1E06919625A78EF1A43976609EE1822959EF3D8400E733A84D162D94037BBA6BCAE151ADC7D0F9D7EB3E7F7D9B78E8636B06A2887B45B7A163FA6AB4A1DB1FA838112617A655630FBE15CFF7E3B5FD6B581DF33B84ED7E9303552F330E054715D18A0F0978E6DFACCF727069D669F42F0FDE37ADA224578B3EDC94D2C3289EEA785E9F4FC71F715223DE35724A6CF7E5069715BBF3459BEB8E8D845E7F887BE6D560345533AB33514A12F5E203221BF6DD93705FC25C68216A59A64AB163D814839652E3FD3DD062074B548EE5812F21268EC0A33D9E567E80A5AC7596BEA4B29CF03ECFE39ECB23AFA01C6CA20FCD3A3A6DD313AAF6DA699C0049E183DDB5F2A932DEF9AE40A1CF027BAFC8C7382EE135D29B3CCEFEF68E4FADFCF0D1B89C1F3E7EA29E731ABD7A2C423247F6E1A421F8E1C903E4086467DF8CAAD7AC2BDBDC308068AAEA07C05D5AAF691EEF8BF6F3A9038C160A26B5564D47E31454C83110E6D9D6F3B1C2CECF443F5F2CDCE3212EDD02A88997B726F05D89FBB2C7A728AA0CECEFEDCCFBAD2D0BA88D13FC6DDF4940C6E2F1096249CFA08194A56D266BDF60A92C64007185CE5130606148FE3C6205609519F18DBC8539F97862BE5F6C0182C0C5119C1126F07BA8F0F43A6BAFC821966FCEAD5D8C0131D33703F193EE7D3B10389E85B7201B9512C4DAC16517320A685E7252F64D547625A6B7E4BAE9BA3EBCFE495F764977555E7971646E630464E16DF0114B0F93C38FE17B297A52D42C0B111264650E3C94F3911ADD737CBFA00F0C6989631DD032F6DB97B33EFF4E7880BE3E3DCC9623C38A0AEB4577F2F2354D68A0A080EC7DD306E3971F4EE4B91077D62B2CD1D434A70E71E56A45F6887F52AE6ABD2FA6C89D940E0C7D9FB0064E2C3663D2D587A6F7E2A7BB25064709FDB32FFA1200C776C8F9F28A8D7B6E742C294BDF1299B9F8681FDF32E84830BCB8D040777388618071B8BAAD92316B1E7CD49BB5F9E2BBE8E10F1A81C804A1D48C3EE84DC8A727752D666588F327790B4ABCE4302FE6B4C8009322126CC44981A26CAA8A4F6021EA8D47727E4C913904EAED3C7B2179EE15EBF9A7A7D50A0C192A04214113A87FF4943ADB455D553270768175CDD9D90B70984FD6B5148A47627FBAE5986C06E9DCB8E73AE4022CD4AF2DCF973E74B75C738BBB4385FD511FF53465873BFE43A86DF013BBB1A40FCFC52B2C31FC8D6F5D71A47F1D73FDBF6C2253F390D9BB293532F7E6BCFC707EB0F39604FF30348A4C2EF3256F4CA8B29830A20117D19A04A072F1087BE8D1776E369D020F2C6D14034CEF32AC9111FD6EF485AE16DF67824A30C4022C5F730CBF93F68E269F029A029D96C7B798E2D57136DA5C7BE9AF9EB493DD85C294AAB127D4377FAEBD44ACB36D2694DA4528BB6E9D2A45CEE2926B4ED44E66979F2B1411331FBD97B7AED8E8D3D5155F0C2D4F092AEF24AE9FB7BB183D477C7CD4748D24D43DF05247F900B647F1C948F5C4B0F1B33CF63C7A0C1D26383FF1B2950026477E253DB9D946C83460E1A8561A5C739B33E0DB11F6361602E0CA52E8FAE618A2FBCE4A3D14D51AEC49ABAC0621B2BC34AC90CF0A547B49429533A09E5AED78C309D434925539DA7E4877A2939FF43748E1E29524A7346D0221D6F44ED785173AC546497BCD57BBD3949D511AEC2EA6886753BCA7E328384ED928C5B9EEB27435D91232363A09541CA6393679D8E48A1AFDEAE9CEF4ECA020D4BA429C9B4666B51CA464228F23BBFBECE48C94DDDDC37EC3F4C5BB0CE51A3239491D5969501E0CCAB51583FA8E28B809CA2FF2A8D7D4FFB842F8CF199DAE6E57C39D5E35A42F8241591A72631AA8B902A1DF70BE2B6BCEC5FBE978925C9A1A445EDDBC9103B5396DF80DF445E0B8622B17036F2CC2EB7932B7D04D96D3D271C36DE72BE34842D7D69985E31C57F958B18C5DC71BB9372B3141CE3D1C677AAF8B429C2DD1E65CA0EE13371203F7F75427E7AF02D09A1B7D504B2183E68667B14FED03E8451B9DA2CB7DC77A5739E40BA94BFC5B5B5DC11C811FF8DA5B06763454C1384832D57FF2DDB04441CF1EEF3300E44C46737EA98335B1B9A40301AE80BD4AFC120DA967636272662ADE9A57050CDB2CDD2286202AE09A81A4183005F172D4B6CFE07B3BCA66EA54F40808AAB8B2446019B18945F67C0130DE5E6C0094CC4C98BCBBD200AB6C973DFB8413301B38D4AB50757CBACA4886902E72F96E75FB7420B4E96E8809F5B1A6A085DAE008F2250C43481BD9F2AA0C5CFC23238FAB5FC6970813A0BC6AE060166378A195954B906DA2821EEC6B364D4D796FDD4077F317D2D570C4AC40CA60F8F6052E03652799979B826E0CE9131C30803807E8B3310CAB312EC458300231AB9A8E09603FC451F32BC42F8280610B594051DFC9110314DA0BB224BF4132772F661ADED2CF1026C19440213A8DA488D0F119C60415417AF6981D7484B87FB1F81B8A8230C650D0ED14FB844610469B00D956ADE1D9A09F862C41DB184876CA3060172730B9F4AAAAA0085128917E26F03144429D906BE059EA05F8346C814162206FC2336C1632B0A5A58B640BF3C851020DEE0C2985E82BE888126970F69222E36D236F488449106AC70185174B86E3316B7C49D550D4185EB2C9CC158261082D96A371308292BC4E472FF122610EAA949561ABB0DC00FB0BE7A0D56A7432C21E18210219014F2AF95D9FB4F3C527D985A85C2790578975A4CAD7D8C87393ECB6FC66B87C496AE81446B55F8C2FD0A749A20299530F1354A858F4815A7FF422AE8E190269C946FF10C3221C311A50A29A7519EEA50B8A8C6D4DA47FF7CFC890B68C1D44E887F1D0AE9AC8182B44A50A524720E45C0A4B8CA9BE41BA3DFDA50E2E79CA0BD35B1C228051BCAE1FC3584BCC80EB34AA3D70EA3FAFDB23D74A8F9321D838EE9AB1AFEA897726F02C1321668F404CDF40C4DCBF4888B093634DF392728CFB59FD8B69813C7009F10C2CEF4C1D41842E18B0EE9D03264E881D1DD8C099E93F8F7D72589970E83092D0C0ADD099E8FC0904F6018ACF06D66C2F024184565B53195B9FFC44E7977441D92AC08F4F6907B526A45589B6FC0F07CEA899BF3ABF1DC61D1A32DB04863C2CE7F6149E25C603926B08256442836ACDC3901A360C558797744852426A01C53031275A18D25ABA1A9BB580E7F38E0DD7F41081CAC86C31C95FC0F4706E01A544DF90CA7504ED444E36B10138C765656C4CFE26F2C710C8852859CD37FE24FAA3135AAD07F1837219990048B2F2E8978DA9115645F059EC0E1B98816FE4D35157AD620264828A3A26B5B4EAE0FB0571114D228BB260A7E7CDA7EB6A2A488F26CF87274CEBF4FCC4D33A6D67EDCFB81009C9527E584525010B01202AB20303815381384B6D256549BC4BF086F239210ACE72E4FBC9F0F40F25049084269A2FA8756355B4D90D1134D5D90F98D7895F4C4D581E7EA8A6A5A660B787533935ABAEA8073C02E36282896097D4E14E0E0ED31384F01CC6AE7FC7A1FA1649C486C30A8EFD3EF969D2D47FBE6B868B5E3B4F63A74AF5DC4D827947653A1BC5FB63556BF85D52FE33CB5B2E31444F772A0F4F942A8D607DA7893AD6CA09F30B63534D0753642715214FDA79AB805D9F28757AC192356E744BF23D1586389E97F2D0135A3822187E8AD750C54DD19CAD6FCB73808710155676AE62807FD0FE8720C060E754DC84266F6EF3CDC6D1DCC4E8D431990E1E194F1C0CC20131277211D63C972A42887EB761A563259E3034B0E038514512BA82A07ABD9101B96465E6D50A58BB08AC1A30323070D1B404CDAE920C3D8C508C41406C739AED74E210D3651A4A30D63910893BAE05548AD90905288F331835220C2C9E8C8980D67B71A86BECB453A470C3CF867432C2867BAA43CA462E4D4E4B1F633970BAEF31086FE9B187AC1CC658665492069983082DD97169D5231B22226CB4191E62D306C5C94B8FD3DC30A970F3BAB1776A252A320A82A5899E4D4C56D4DC087D11EFACB99A44583BE39C3086862A40833C71856B971135ECE0D214FDA03FE0760E4D4B018C3C89EC4C1170AD61A0C8D58A5EAC935B918F95F6F34614DA60B654F5DECC3C4D4EBD950897953EDF6125B0D5923A2C7CBA1B595BAAD56CD85507328FDB0C131DA99D91A084661396C1FAA8C529F431F7A84459471B7CE54C8B9103BAA8C3823291BA750C3E87B58DC0A2B480DA40EAB8BD49AF8D54CDF4556706AA9D84A2A520355E27E491B179A69FE4748AE7AE45CA24FE698A6DD42E1C7511D9F4085ABA89ACE2AA1CAE9531DD1A0DDF4ED49497E6FA9581B492AD706E254EA10D9A7D7C384586760C69EE27135269FB0AC1C423BB44021FBCD46DF8F4B060AD715260658915268D9AFC8A22FB186C26CF27825AA246E2F741AC589966838071AA726C4CE4FEAEA0B915A0D6C4A0D74C6868184CDEC7BBA23A96B88406A35622935222E39062575BC110B7EB04AA3D924F94A886F424B30FB620BAEB949DFB0B049A7221952675A52AB286B81D4355923B59AFE2936EDF7824896F0869BDB0E08C3989932357D56E754B4C8CAD4BAFE1B7B6206BF750C83F5EABC33425122EE5A08641970E392C396D9B4A756ABB952AB7E071C1BD3AB0D6C8D6C775D86BD91A78EAD20BF29D4DBF00DB0B513DF726C9DC221B65E4E6491F3CD92890DD7B0AD3FF86883822BB6758DAB6467AC3B006620636FF9BB0C7DB593A0279D743A01B6101238534B3311346DE983AF32F0E86BC3565AA138923962604A4C45DE9F155B5C39935C0269D8EB17A634E1941A1C096C49FC25875386F2BF5A53B595A62AE328EEB81C90347D536DD0A09D173AC0B53C092FC533344DDD3459A4D6B469A569239DB115BCEF40B6FFF083FEB95EEE5579F9D721E9BEDE0E9A1F8EAC197BEDB26EEB130F2EFB75B06960904FCEEF6DFA42E0F885B4FDCE110FEAA74A48AFFE49DD7479A4D6F459A5E9637F084E7F803D71FA5F1B2A75ECB41961699D6CDD017569367533D0905A33B295667CBC8D19340E3A5CB5B173EB932D7533FE21B5668628CDF48927412F61D233D9F6E7345B8BB3DE6C2E817F1D8FFDBC5F9BD3665FB27765FD95047B4DB41A4ADD6C09A4D6EC1F573E7B600A87F5B3012EB8E470F689E46ACD09549AE3B98B416D7194BA398948ADB924D7C65CEC6E63273C645B1583164FC2870FF00F26CB63F82195444BDD4C6082744E39B7C1DA996D46B5E67D17E675C64E367942ADF97CFCFC37238C0BB1321A2237D999A8EE714BEF53F6B3226177F486B800776982B1947F8F27AB5A0B3E0A0B62864E516BC17F61C18D943FBB80F0302E9411262C1496620317AAF4E9F7A0D1F0ECE95DD866525C18C74B962056B8086A0E0B95C279D720BAC0BD54C1C1566311666CD35E4552E176883B54E154246D78FF91F57A22A44ACA988A8B644D0A0D96CA68A4633D07F9BD68ECB776E62A8CC140CB6C1D713404199BAAD72B523E332AB073E3031E3840C4B1DCBEC88F8FCD308C7998C2873847B5E063815344522B2DC7E4DC310E763D8CCF9847BFA5886D87552131F63B7977C62636045A2784CED82EC676E7E5F102E74DE8C751B073381DFB8FF1F26962CD3F08B613727B90806C8E241F80EDE6B63DD6C736A2D78843D717B7A39B66175645D7F3F5D110571845837E30E714E160BB6FBB3294D4DEB4706DB577AA5C6E6FE40B07CAE4D677FE182AFE5AB7DFE02C1C6C3F00BF3E340832E66A2B1D748CDFC50E0208E83B339ADFA10C04F5E127B47776E28A2E1A4D7E85605B28A78832735C7592920863C55135AAF01DB063D08D3A0DFDAA977334877B9EFFCA9DC8851BA77272D25E55279F0E87D3A97C3D87BB87153AEEA3CE57B3A32AB97ED920C4CEA5C765E148273AA3328E666C219874D26F474DB77ED909DFF943C998E259A4F19EDEC3565E1210ECC2068F0D77DAC5241C55BF0F90A4A4D82568E34A44C362285613492AE637CC1FF6C42E27A8D57333CCB7EFFA289C355DB9EE3BB6DAD0B0B2755D7F9F05FB75901FF4ED11F74E749C78DE018747CA9F1DF0BFE739AFD91D7ACDF5B7624EE46BF1A86B727444AD360D722152570F8821CC7E55E8D7258317B8C5061329D3E51474B97C7157F73D61C8C9A74FB524BFB0A42E2EE13781F4ACD054D61D26787A5C1266585CE5B6C9F144488F9C08EB913B227A24090546427235B968561DB7AC6509FDB1B3E18A545C4A2B48695F0CA1922A6A4B05CD58E61972154C2CBF5C42713743074725FB691921C01973B46CEDDFFDE68AD2B62CCDF8FCB28A65CB4A966DB8BA9F5C908E94C5558EF9B8F9B2B8F1B2E4638EF3B5C04923A4DEC05519C6FD4DCAAD8A843B8CC764AEE9E416CFDEF7C5BE47295ADD57A1AAB8C2E5CCADEB1F8F5E416E8A59EC06943B2B08F9F8A6627CE3BDFAAEEBADF4301CBB274D3ACF1725BEDBEEC3D36D8BCAEF5451D9353F35C34CA53E46C796AEF12BF4EE8FCBDF83379AF0FA81F98F66ABF1C8C8155620598D5F9EFAA1599E82F662476FAA481953F3F0574E0AF18E1057F0BDD3FD4AAAF446DC1199CF57B3F8AE513A8AAB9CDFB3AD37B309540B0B69BA55D4AEB91A2BB25AF5CB56D415EEBF115CF1D2562FD87ACA1147ED7EE4E16E046D747B293B64442C791778F6311BF62F6B2BE9CCD8448B99570D4BAEB7944CA4196850D02022507D3FD432B955DF4C8BF4B025F6522694E292C992152BB1880FF49F8E8770A5A309CF21894D5E5747916B0A3AE209B8CFB41591D867E3B81EAE42C3F8A80B540BEBC22A597E5B478383A23ABFCAE08BBA4AFF9EE2AA9E98FAE6873D1232D31FE9B8C6F1A40DC489AD85442AB712617A35EDF8D8E89160FC53908C5C2DA6B45AD398DC4DFDEA688D9A7F2E596D1031B79B34BE7A665805752B5898B89C2005BD270B55B7002313550A89B6F69C4148ACE7E9292D35D6FD192632EE126167945C9D38D0618FEA6CA8E08C65C29511EA3B1A136F0C158FBD3AAD7C9B0523EF213AD568D1EE3F6B0EB2C11BC121F6AE5BEB114376AA52BBFD909EF2179A1A8E15F2B8A5CAB0706D7678835390677D398678017B7B0D6BE8AC17C39FA2A5B454DE38AEFD6C88975234E32AAFAB1CB9AE59795D6CB159574827FBCFFA9678F0A121F62D36EB6F82611B14D5362C4AEB8638DADE0D13CA1BEE1AB9E119E50D1F2C361B97A1C566E3B3302CD9AC5A72735A933ADADEE48DCAC95747263F574EFEBDD8F4F4D7C38B4DCF1768B1D9745245BBD86C8EA0619B51B5CDA7A775F399683B36FF767E11C62DF586D89BBCA7C91B5D10E9CC181C8D5B383756FFE44D3F84391CD6EA0B17699CDF7ACDFEB3755F1B7C1A0FADEF6A58B1C38E9CD530F74EEF06D35E7C8DEF504C9A52EF8AA32C6AF5001FB477770155A5905B953F1EB4F7240ED50672AAE9CC4C58E78BE5C529131C77FDF7D3E3E1334C4A7A3565230F28EE160D5E851680AF0ACE0BFE87D6CF35F816B8ADC910B7355A59BEC310B7CDC137C4DE3CA68CD02349B2C6659DF33909F1048E961C253AAEC8F9F9CF46A8B5D9717A4A47411BE0E4F8C11D92DB3FF1584EE4D9D1235FDF83119260BFF0DE168EBE56E9F8BE8AD57DE54A7D752BFA6617BA918A824D929E8226BB2FF736B5A4710C0549DE9B00EEC65646B855720BFBB08CC7E023C987EC0F1DBC9D483C0DADA6C115B435F7F60ABA48C68DC80FD2929407907B7B053D2CF7B63215B30A874B2597B037733FB08F703FB0AF16F8E13C48BFB66DA4BFD797D3A2D6D137A508C7C1C8A7B4341F4983C8A329A545A279C74B3373235C34D5D2EAF2E2284EAE388601B166F3CF9DDADBE4294CF5162E79FA7E69F218B67BCFC917295C91733B6E2AD41D26A572C08992E9303C6F9F4770D68261A9E06AE661E656F61BFB51D30C5AAC8283E7BE643FF7CE5B1597779494DE0D539FC18CA87328967F141369343F7367B528E93F9DAE807A211D85FDF2B5A2F996D361298CE4278AFA602E640A7F587438CC242729EF88158D43135C00D97C2DEF0E78B8F015456F431B7C56F8C5CDFFC16CA1BF02FECA4B7C53FF14CB2964BEF22E9B8AD683067D7046BE56B40FCC81C3E1C1FC44D14E9846C695770D155D0B53E18EC2BB2D788127BC2DB90E6D4CE8FF3E473594FE5B6433F433B436506FC0D7C35429AE42828EE9CAB80DD4D77C9ED71B60FF67D87B8089D9253BC4EC0F05BCB7E61848D8F93DA6B8C601F07370BD22B080369D0717F0931348B546387B9FF40856F3DFA42B28D671EEB5D3C7637F724D2EB83A921ED4061A2338F3E655172501DD72FF2199239A6E83E3E5AE85B3E4EE0577C92DC05B72AF86BF643E27188D727F24DD47B43F0A19B94BE178B919384BEE497097DC0BE02DEE616A2B2B8CDF86F77FC65CB006CD304DB39F325B2D350C80494C99B188DC9CA8C8FABDD596E0B89F32B702BBFCC438CEC032F3003F170C73ACEFDE735C30B90863A32D72AF342F92FC6A73DD5AD25C254FDD6EA59F1422FD04C5CD7D720C6E2F17C584C6B452A889323E95F135C9FE4F39F4F3215D707B8F89DB939869F85CC7AD414876E5F6ABE3F6E3AEC9B1999E3C9FE4F4DC59FBC625DA8AD961A1AAB56AF96533062F4995E7917CC9FD828B99B5C1329382D2B7A55E61B085C42E65EC6B5B553F5374003466007038771C3E04273F06131C1D6D73BCF5E0DD26134A8A3B4A1AB426063F78817604E1939E32813812FB2316C7E06DF5E359F2F42943C54CC08C9EDF2455501CE9BDFD29ABE3BF3A88ED83D8C1AD0981B06BC67C17891A35C6D99971E2E340BC7DD8AD7B2B63BABD60F2283C46603AEB99E9DA0EB524DEA0E0D11D82CFCDBC7620BA1BBA9D517891054B86D1ED8E71766C8101B1C1FC0D1E5A6E8591EE0E80C65681E7F582B5C12BB792BA7D1920BC2FB51BD10E3E786964C3534B5F4A562B860C322ED079FBD1ED208F1EB612D6FF7418CB5BE2D15D0CD90F63132186EEE62E4F7729A6C08C6717B1A3603B92A65EC7566835F7BD5574B7FEC12CBB4020D5CD14BC601113DFE2F87F1DC3CF3CE9A49100ED68448D60EDBA7D2618B1818915839823075C716C6CD1EB210620CC6DDBB3F3F62240880FE8FE0FA7C3A6FE3E6E757997DAE12E374C7579CB9BA03809D19DDB08BA0F889F30FFFA264668B84474C0524A69819355C989045FC66BC3B18CAD45B06CE2D8586F8C9B5BB8B347DBED8862C36367A2812AC5E67F9B81FF7B1D7274D2979AA607EC9E2579D7F3A83551F4E613D2FAEB3B5FFDDE26EA30EF010B24D3B7E66E4EF666122001110802A8182EE98ED928B924DC21DADA5461221F43B84D424DE9BEDF0EB11F0C684D9564CD20DB5D60C4E0584192B68B54DDBF8634B36993C156D36D7FBA8D790030FFEBD1FDE9D91FB0552776C27A116A6A35644A86D330DE843542906E3EFEF8F70DC351A593BA2CE8BA539B32CF31D03D33CE2D96FCDA61543CFF8F737A8C4A14468275D62C8741F013349B3D3E20EBF407D2660362D679A8E1005064CB3FD514199B6E1DA58BE38EFF7290DAFF710E37367B0AEBB9B38C47854DF9D3FD4FE036FF96E1F6B0F4DD254BFAD56163AE225C49B68B05D573EE9D894CC296E88F44FB75DD9EA74EB8E8588B0B4654AC8007CCCDCE2463F214B0A7959C7984694E2F102122FDF96D7983F955132BDFBFDAC57534651F67AA3C5A5180DD45AF82839295F1964B677AD671DD7B21321CB4080E3910C990E1DDF81EC83B57C5CA6CFA6F05319ABB66BEA45BB9A2A5D0AD08, afterDelayedMessagesRead=1320616, gasRefunder=0xe64a54E2533Fd126C2E452c5fAb544d80E2E4eb5, prevMessageCount=147491357, newMessageCount=147491535 )
    • TransparentUpgradeableProxy.STATICCALL( )
      • Bridge.DELEGATECALL( )
      • TransparentUpgradeableProxy.86598a56( )
        • Bridge.enqueueSequencerMessage( dataHash=354BB3E5DF3608401B98F041B8CF8C82272DD7DF329785277C324B1048668D13, afterDelayedMessagesRead=1320616, prevMessageCount=147491357, newMessageCount=147491535 ) => ( seqMessageIndex=495857, beforeAcc=B060E2406A260E2FED65F9C77630C42F3C2BB38B5CF5D85DA03E1A22F910F52A, delayedAcc=8F9E78FBD0A589EFA52B7D17D12664163B84E1D90C5CD21229585B92AAB4A7A2, acc=1D0F3787976FA7030126E3AF5C5CCFE51DEC2D6487EE6BF15E3419F22E226B1B )
        • TransparentUpgradeableProxy.7a88b107( )
          • Bridge.submitBatchSpendingReport( sender=0xC1b634853Cb333D3aD8663715b08f41A3Aec47cc, messageDataHash=428B79721719A60839A088C05E888B742DAE3ECC4292C991A8CBBD5905F4996B ) => ( 1320631 )
          • GasRefunder.onGasSpent( refundee=0xC1b634853Cb333D3aD8663715b08f41A3Aec47cc, gasUsed=173822, calldataSize=99364 ) => ( success=True )
            • ETH 0.04002293065448334 Arbitrum: Batch Submitter.CALL( )
              addSequencerL2BatchFromOrigin[SequencerInbox (ln:154)]
              File 1 of 5: TransparentUpgradeableProxy
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts v4.4.1 (proxy/transparent/TransparentUpgradeableProxy.sol)
              pragma solidity ^0.8.0;
              import "../ERC1967/ERC1967Proxy.sol";
              /**
               * @dev This contract implements a proxy that is upgradeable by an admin.
               *
               * To avoid https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector
               * clashing], which can potentially be used in an attack, this contract uses the
               * https://blog.openzeppelin.com/the-transparent-proxy-pattern/[transparent proxy pattern]. This pattern implies two
               * things that go hand in hand:
               *
               * 1. If any account other than the admin calls the proxy, the call will be forwarded to the implementation, even if
               * that call matches one of the admin functions exposed by the proxy itself.
               * 2. If the admin calls the proxy, it can access the admin functions, but its calls will never be forwarded to the
               * implementation. If the admin tries to call a function on the implementation it will fail with an error that says
               * "admin cannot fallback to proxy target".
               *
               * These properties mean that the admin account can only be used for admin actions like upgrading the proxy or changing
               * the admin, so it's best if it's a dedicated account that is not used for anything else. This will avoid headaches due
               * to sudden errors when trying to call a function from the proxy implementation.
               *
               * Our recommendation is for the dedicated account to be an instance of the {ProxyAdmin} contract. If set up this way,
               * you should think of the `ProxyAdmin` instance as the real administrative interface of your proxy.
               */
              contract TransparentUpgradeableProxy is ERC1967Proxy {
                  /**
                   * @dev Initializes an upgradeable proxy managed by `_admin`, backed by the implementation at `_logic`, and
                   * optionally initialized with `_data` as explained in {ERC1967Proxy-constructor}.
                   */
                  constructor(
                      address _logic,
                      address admin_,
                      bytes memory _data
                  ) payable ERC1967Proxy(_logic, _data) {
                      assert(_ADMIN_SLOT == bytes32(uint256(keccak256("eip1967.proxy.admin")) - 1));
                      _changeAdmin(admin_);
                  }
                  /**
                   * @dev Modifier used internally that will delegate the call to the implementation unless the sender is the admin.
                   */
                  modifier ifAdmin() {
                      if (msg.sender == _getAdmin()) {
                          _;
                      } else {
                          _fallback();
                      }
                  }
                  /**
                   * @dev Returns the current admin.
                   *
                   * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyAdmin}.
                   *
                   * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the
                   * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.
                   * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`
                   */
                  function admin() external ifAdmin returns (address admin_) {
                      admin_ = _getAdmin();
                  }
                  /**
                   * @dev Returns the current implementation.
                   *
                   * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyImplementation}.
                   *
                   * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the
                   * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.
                   * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`
                   */
                  function implementation() external ifAdmin returns (address implementation_) {
                      implementation_ = _implementation();
                  }
                  /**
                   * @dev Changes the admin of the proxy.
                   *
                   * Emits an {AdminChanged} event.
                   *
                   * NOTE: Only the admin can call this function. See {ProxyAdmin-changeProxyAdmin}.
                   */
                  function changeAdmin(address newAdmin) external virtual ifAdmin {
                      _changeAdmin(newAdmin);
                  }
                  /**
                   * @dev Upgrade the implementation of the proxy.
                   *
                   * NOTE: Only the admin can call this function. See {ProxyAdmin-upgrade}.
                   */
                  function upgradeTo(address newImplementation) external ifAdmin {
                      _upgradeToAndCall(newImplementation, bytes(""), false);
                  }
                  /**
                   * @dev Upgrade the implementation of the proxy, and then call a function from the new implementation as specified
                   * by `data`, which should be an encoded function call. This is useful to initialize new storage variables in the
                   * proxied contract.
                   *
                   * NOTE: Only the admin can call this function. See {ProxyAdmin-upgradeAndCall}.
                   */
                  function upgradeToAndCall(address newImplementation, bytes calldata data) external payable ifAdmin {
                      _upgradeToAndCall(newImplementation, data, true);
                  }
                  /**
                   * @dev Returns the current admin.
                   */
                  function _admin() internal view virtual returns (address) {
                      return _getAdmin();
                  }
                  /**
                   * @dev Makes sure the admin cannot access the fallback function. See {Proxy-_beforeFallback}.
                   */
                  function _beforeFallback() internal virtual override {
                      require(msg.sender != _getAdmin(), "TransparentUpgradeableProxy: admin cannot fallback to proxy target");
                      super._beforeFallback();
                  }
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts v4.4.1 (proxy/ERC1967/ERC1967Proxy.sol)
              pragma solidity ^0.8.0;
              import "../Proxy.sol";
              import "./ERC1967Upgrade.sol";
              /**
               * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an
               * implementation address that can be changed. This address is stored in storage in the location specified by
               * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the
               * implementation behind the proxy.
               */
              contract ERC1967Proxy is Proxy, ERC1967Upgrade {
                  /**
                   * @dev Initializes the upgradeable proxy with an initial implementation specified by `_logic`.
                   *
                   * If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded
                   * function call, and allows initializating the storage of the proxy like a Solidity constructor.
                   */
                  constructor(address _logic, bytes memory _data) payable {
                      assert(_IMPLEMENTATION_SLOT == bytes32(uint256(keccak256("eip1967.proxy.implementation")) - 1));
                      _upgradeToAndCall(_logic, _data, false);
                  }
                  /**
                   * @dev Returns the current implementation address.
                   */
                  function _implementation() internal view virtual override returns (address impl) {
                      return ERC1967Upgrade._getImplementation();
                  }
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts (last updated v4.5.0) (proxy/Proxy.sol)
              pragma solidity ^0.8.0;
              /**
               * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM
               * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to
               * be specified by overriding the virtual {_implementation} function.
               *
               * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a
               * different contract through the {_delegate} function.
               *
               * The success and return data of the delegated call will be returned back to the caller of the proxy.
               */
              abstract contract Proxy {
                  /**
                   * @dev Delegates the current call to `implementation`.
                   *
                   * This function does not return to its internal call site, it will return directly to the external caller.
                   */
                  function _delegate(address implementation) internal virtual {
                      assembly {
                          // Copy msg.data. We take full control of memory in this inline assembly
                          // block because it will not return to Solidity code. We overwrite the
                          // Solidity scratch pad at memory position 0.
                          calldatacopy(0, 0, calldatasize())
                          // Call the implementation.
                          // out and outsize are 0 because we don't know the size yet.
                          let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)
                          // Copy the returned data.
                          returndatacopy(0, 0, returndatasize())
                          switch result
                          // delegatecall returns 0 on error.
                          case 0 {
                              revert(0, returndatasize())
                          }
                          default {
                              return(0, returndatasize())
                          }
                      }
                  }
                  /**
                   * @dev This is a virtual function that should be overriden so it returns the address to which the fallback function
                   * and {_fallback} should delegate.
                   */
                  function _implementation() internal view virtual returns (address);
                  /**
                   * @dev Delegates the current call to the address returned by `_implementation()`.
                   *
                   * This function does not return to its internall call site, it will return directly to the external caller.
                   */
                  function _fallback() internal virtual {
                      _beforeFallback();
                      _delegate(_implementation());
                  }
                  /**
                   * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other
                   * function in the contract matches the call data.
                   */
                  fallback() external payable virtual {
                      _fallback();
                  }
                  /**
                   * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data
                   * is empty.
                   */
                  receive() external payable virtual {
                      _fallback();
                  }
                  /**
                   * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`
                   * call, or as part of the Solidity `fallback` or `receive` functions.
                   *
                   * If overriden should call `super._beforeFallback()`.
                   */
                  function _beforeFallback() internal virtual {}
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol)
              pragma solidity ^0.8.2;
              import "../beacon/IBeacon.sol";
              import "../../interfaces/draft-IERC1822.sol";
              import "../../utils/Address.sol";
              import "../../utils/StorageSlot.sol";
              /**
               * @dev This abstract contract provides getters and event emitting update functions for
               * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.
               *
               * _Available since v4.1._
               *
               * @custom:oz-upgrades-unsafe-allow delegatecall
               */
              abstract contract ERC1967Upgrade {
                  // This is the keccak-256 hash of "eip1967.proxy.rollback" subtracted by 1
                  bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;
                  /**
                   * @dev Storage slot with the address of the current implementation.
                   * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is
                   * validated in the constructor.
                   */
                  bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
                  /**
                   * @dev Emitted when the implementation is upgraded.
                   */
                  event Upgraded(address indexed implementation);
                  /**
                   * @dev Returns the current implementation address.
                   */
                  function _getImplementation() internal view returns (address) {
                      return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;
                  }
                  /**
                   * @dev Stores a new address in the EIP1967 implementation slot.
                   */
                  function _setImplementation(address newImplementation) private {
                      require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract");
                      StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
                  }
                  /**
                   * @dev Perform implementation upgrade
                   *
                   * Emits an {Upgraded} event.
                   */
                  function _upgradeTo(address newImplementation) internal {
                      _setImplementation(newImplementation);
                      emit Upgraded(newImplementation);
                  }
                  /**
                   * @dev Perform implementation upgrade with additional setup call.
                   *
                   * Emits an {Upgraded} event.
                   */
                  function _upgradeToAndCall(
                      address newImplementation,
                      bytes memory data,
                      bool forceCall
                  ) internal {
                      _upgradeTo(newImplementation);
                      if (data.length > 0 || forceCall) {
                          Address.functionDelegateCall(newImplementation, data);
                      }
                  }
                  /**
                   * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.
                   *
                   * Emits an {Upgraded} event.
                   */
                  function _upgradeToAndCallUUPS(
                      address newImplementation,
                      bytes memory data,
                      bool forceCall
                  ) internal {
                      // Upgrades from old implementations will perform a rollback test. This test requires the new
                      // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing
                      // this special case will break upgrade paths from old UUPS implementation to new ones.
                      if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {
                          _setImplementation(newImplementation);
                      } else {
                          try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {
                              require(slot == _IMPLEMENTATION_SLOT, "ERC1967Upgrade: unsupported proxiableUUID");
                          } catch {
                              revert("ERC1967Upgrade: new implementation is not UUPS");
                          }
                          _upgradeToAndCall(newImplementation, data, forceCall);
                      }
                  }
                  /**
                   * @dev Storage slot with the admin of the contract.
                   * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1, and is
                   * validated in the constructor.
                   */
                  bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;
                  /**
                   * @dev Emitted when the admin account has changed.
                   */
                  event AdminChanged(address previousAdmin, address newAdmin);
                  /**
                   * @dev Returns the current admin.
                   */
                  function _getAdmin() internal view returns (address) {
                      return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;
                  }
                  /**
                   * @dev Stores a new address in the EIP1967 admin slot.
                   */
                  function _setAdmin(address newAdmin) private {
                      require(newAdmin != address(0), "ERC1967: new admin is the zero address");
                      StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;
                  }
                  /**
                   * @dev Changes the admin of the proxy.
                   *
                   * Emits an {AdminChanged} event.
                   */
                  function _changeAdmin(address newAdmin) internal {
                      emit AdminChanged(_getAdmin(), newAdmin);
                      _setAdmin(newAdmin);
                  }
                  /**
                   * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.
                   * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.
                   */
                  bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;
                  /**
                   * @dev Emitted when the beacon is upgraded.
                   */
                  event BeaconUpgraded(address indexed beacon);
                  /**
                   * @dev Returns the current beacon.
                   */
                  function _getBeacon() internal view returns (address) {
                      return StorageSlot.getAddressSlot(_BEACON_SLOT).value;
                  }
                  /**
                   * @dev Stores a new beacon in the EIP1967 beacon slot.
                   */
                  function _setBeacon(address newBeacon) private {
                      require(Address.isContract(newBeacon), "ERC1967: new beacon is not a contract");
                      require(
                          Address.isContract(IBeacon(newBeacon).implementation()),
                          "ERC1967: beacon implementation is not a contract"
                      );
                      StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;
                  }
                  /**
                   * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does
                   * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).
                   *
                   * Emits a {BeaconUpgraded} event.
                   */
                  function _upgradeBeaconToAndCall(
                      address newBeacon,
                      bytes memory data,
                      bool forceCall
                  ) internal {
                      _setBeacon(newBeacon);
                      emit BeaconUpgraded(newBeacon);
                      if (data.length > 0 || forceCall) {
                          Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);
                      }
                  }
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)
              pragma solidity ^0.8.0;
              /**
               * @dev This is the interface that {BeaconProxy} expects of its beacon.
               */
              interface IBeacon {
                  /**
                   * @dev Must return an address that can be used as a delegate call target.
                   *
                   * {BeaconProxy} will check that this address is a contract.
                   */
                  function implementation() external view returns (address);
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)
              pragma solidity ^0.8.0;
              /**
               * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified
               * proxy whose upgrades are fully controlled by the current implementation.
               */
              interface IERC1822Proxiable {
                  /**
                   * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation
                   * address.
                   *
                   * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks
                   * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this
                   * function revert if invoked through a proxy.
                   */
                  function proxiableUUID() external view returns (bytes32);
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)
              pragma solidity ^0.8.1;
              /**
               * @dev Collection of functions related to the address type
               */
              library Address {
                  /**
                   * @dev Returns true if `account` is a contract.
                   *
                   * [IMPORTANT]
                   * ====
                   * It is unsafe to assume that an address for which this function returns
                   * false is an externally-owned account (EOA) and not a contract.
                   *
                   * Among others, `isContract` will return false for the following
                   * types of addresses:
                   *
                   *  - an externally-owned account
                   *  - a contract in construction
                   *  - an address where a contract will be created
                   *  - an address where a contract lived, but was destroyed
                   * ====
                   *
                   * [IMPORTANT]
                   * ====
                   * You shouldn't rely on `isContract` to protect against flash loan attacks!
                   *
                   * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
                   * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
                   * constructor.
                   * ====
                   */
                  function isContract(address account) internal view returns (bool) {
                      // This method relies on extcodesize/address.code.length, which returns 0
                      // for contracts in construction, since the code is only stored at the end
                      // of the constructor execution.
                      return account.code.length > 0;
                  }
                  /**
                   * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
                   * `recipient`, forwarding all available gas and reverting on errors.
                   *
                   * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
                   * of certain opcodes, possibly making contracts go over the 2300 gas limit
                   * imposed by `transfer`, making them unable to receive funds via
                   * `transfer`. {sendValue} removes this limitation.
                   *
                   * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
                   *
                   * IMPORTANT: because control is transferred to `recipient`, care must be
                   * taken to not create reentrancy vulnerabilities. Consider using
                   * {ReentrancyGuard} or the
                   * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
                   */
                  function sendValue(address payable recipient, uint256 amount) internal {
                      require(address(this).balance >= amount, "Address: insufficient balance");
                      (bool success, ) = recipient.call{value: amount}("");
                      require(success, "Address: unable to send value, recipient may have reverted");
                  }
                  /**
                   * @dev Performs a Solidity function call using a low level `call`. A
                   * plain `call` is an unsafe replacement for a function call: use this
                   * function instead.
                   *
                   * If `target` reverts with a revert reason, it is bubbled up by this
                   * function (like regular Solidity function calls).
                   *
                   * Returns the raw returned data. To convert to the expected return value,
                   * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
                   *
                   * Requirements:
                   *
                   * - `target` must be a contract.
                   * - calling `target` with `data` must not revert.
                   *
                   * _Available since v3.1._
                   */
                  function functionCall(address target, bytes memory data) internal returns (bytes memory) {
                      return functionCall(target, data, "Address: low-level call failed");
                  }
                  /**
                   * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
                   * `errorMessage` as a fallback revert reason when `target` reverts.
                   *
                   * _Available since v3.1._
                   */
                  function functionCall(
                      address target,
                      bytes memory data,
                      string memory errorMessage
                  ) internal returns (bytes memory) {
                      return functionCallWithValue(target, data, 0, errorMessage);
                  }
                  /**
                   * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
                   * but also transferring `value` wei to `target`.
                   *
                   * Requirements:
                   *
                   * - the calling contract must have an ETH balance of at least `value`.
                   * - the called Solidity function must be `payable`.
                   *
                   * _Available since v3.1._
                   */
                  function functionCallWithValue(
                      address target,
                      bytes memory data,
                      uint256 value
                  ) internal returns (bytes memory) {
                      return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
                  }
                  /**
                   * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
                   * with `errorMessage` as a fallback revert reason when `target` reverts.
                   *
                   * _Available since v3.1._
                   */
                  function functionCallWithValue(
                      address target,
                      bytes memory data,
                      uint256 value,
                      string memory errorMessage
                  ) internal returns (bytes memory) {
                      require(address(this).balance >= value, "Address: insufficient balance for call");
                      require(isContract(target), "Address: call to non-contract");
                      (bool success, bytes memory returndata) = target.call{value: value}(data);
                      return verifyCallResult(success, returndata, errorMessage);
                  }
                  /**
                   * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
                   * but performing a static call.
                   *
                   * _Available since v3.3._
                   */
                  function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
                      return functionStaticCall(target, data, "Address: low-level static call failed");
                  }
                  /**
                   * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
                   * but performing a static call.
                   *
                   * _Available since v3.3._
                   */
                  function functionStaticCall(
                      address target,
                      bytes memory data,
                      string memory errorMessage
                  ) internal view returns (bytes memory) {
                      require(isContract(target), "Address: static call to non-contract");
                      (bool success, bytes memory returndata) = target.staticcall(data);
                      return verifyCallResult(success, returndata, errorMessage);
                  }
                  /**
                   * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
                   * but performing a delegate call.
                   *
                   * _Available since v3.4._
                   */
                  function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
                      return functionDelegateCall(target, data, "Address: low-level delegate call failed");
                  }
                  /**
                   * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
                   * but performing a delegate call.
                   *
                   * _Available since v3.4._
                   */
                  function functionDelegateCall(
                      address target,
                      bytes memory data,
                      string memory errorMessage
                  ) internal returns (bytes memory) {
                      require(isContract(target), "Address: delegate call to non-contract");
                      (bool success, bytes memory returndata) = target.delegatecall(data);
                      return verifyCallResult(success, returndata, errorMessage);
                  }
                  /**
                   * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
                   * revert reason using the provided one.
                   *
                   * _Available since v4.3._
                   */
                  function verifyCallResult(
                      bool success,
                      bytes memory returndata,
                      string memory errorMessage
                  ) internal pure returns (bytes memory) {
                      if (success) {
                          return returndata;
                      } else {
                          // Look for revert reason and bubble it up if present
                          if (returndata.length > 0) {
                              // The easiest way to bubble the revert reason is using memory via assembly
                              assembly {
                                  let returndata_size := mload(returndata)
                                  revert(add(32, returndata), returndata_size)
                              }
                          } else {
                              revert(errorMessage);
                          }
                      }
                  }
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts v4.4.1 (utils/StorageSlot.sol)
              pragma solidity ^0.8.0;
              /**
               * @dev Library for reading and writing primitive types to specific storage slots.
               *
               * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.
               * This library helps with reading and writing to such slots without the need for inline assembly.
               *
               * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.
               *
               * Example usage to set ERC1967 implementation slot:
               * ```
               * contract ERC1967 {
               *     bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
               *
               *     function _getImplementation() internal view returns (address) {
               *         return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;
               *     }
               *
               *     function _setImplementation(address newImplementation) internal {
               *         require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract");
               *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
               *     }
               * }
               * ```
               *
               * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._
               */
              library StorageSlot {
                  struct AddressSlot {
                      address value;
                  }
                  struct BooleanSlot {
                      bool value;
                  }
                  struct Bytes32Slot {
                      bytes32 value;
                  }
                  struct Uint256Slot {
                      uint256 value;
                  }
                  /**
                   * @dev Returns an `AddressSlot` with member `value` located at `slot`.
                   */
                  function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {
                      assembly {
                          r.slot := slot
                      }
                  }
                  /**
                   * @dev Returns an `BooleanSlot` with member `value` located at `slot`.
                   */
                  function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {
                      assembly {
                          r.slot := slot
                      }
                  }
                  /**
                   * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.
                   */
                  function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {
                      assembly {
                          r.slot := slot
                      }
                  }
                  /**
                   * @dev Returns an `Uint256Slot` with member `value` located at `slot`.
                   */
                  function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {
                      assembly {
                          r.slot := slot
                      }
                  }
              }
              

              File 2 of 5: TransparentUpgradeableProxy
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts v4.4.1 (proxy/transparent/TransparentUpgradeableProxy.sol)
              pragma solidity ^0.8.0;
              import "../ERC1967/ERC1967Proxy.sol";
              /**
               * @dev This contract implements a proxy that is upgradeable by an admin.
               *
               * To avoid https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector
               * clashing], which can potentially be used in an attack, this contract uses the
               * https://blog.openzeppelin.com/the-transparent-proxy-pattern/[transparent proxy pattern]. This pattern implies two
               * things that go hand in hand:
               *
               * 1. If any account other than the admin calls the proxy, the call will be forwarded to the implementation, even if
               * that call matches one of the admin functions exposed by the proxy itself.
               * 2. If the admin calls the proxy, it can access the admin functions, but its calls will never be forwarded to the
               * implementation. If the admin tries to call a function on the implementation it will fail with an error that says
               * "admin cannot fallback to proxy target".
               *
               * These properties mean that the admin account can only be used for admin actions like upgrading the proxy or changing
               * the admin, so it's best if it's a dedicated account that is not used for anything else. This will avoid headaches due
               * to sudden errors when trying to call a function from the proxy implementation.
               *
               * Our recommendation is for the dedicated account to be an instance of the {ProxyAdmin} contract. If set up this way,
               * you should think of the `ProxyAdmin` instance as the real administrative interface of your proxy.
               */
              contract TransparentUpgradeableProxy is ERC1967Proxy {
                  /**
                   * @dev Initializes an upgradeable proxy managed by `_admin`, backed by the implementation at `_logic`, and
                   * optionally initialized with `_data` as explained in {ERC1967Proxy-constructor}.
                   */
                  constructor(
                      address _logic,
                      address admin_,
                      bytes memory _data
                  ) payable ERC1967Proxy(_logic, _data) {
                      assert(_ADMIN_SLOT == bytes32(uint256(keccak256("eip1967.proxy.admin")) - 1));
                      _changeAdmin(admin_);
                  }
                  /**
                   * @dev Modifier used internally that will delegate the call to the implementation unless the sender is the admin.
                   */
                  modifier ifAdmin() {
                      if (msg.sender == _getAdmin()) {
                          _;
                      } else {
                          _fallback();
                      }
                  }
                  /**
                   * @dev Returns the current admin.
                   *
                   * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyAdmin}.
                   *
                   * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the
                   * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.
                   * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`
                   */
                  function admin() external ifAdmin returns (address admin_) {
                      admin_ = _getAdmin();
                  }
                  /**
                   * @dev Returns the current implementation.
                   *
                   * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyImplementation}.
                   *
                   * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the
                   * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.
                   * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`
                   */
                  function implementation() external ifAdmin returns (address implementation_) {
                      implementation_ = _implementation();
                  }
                  /**
                   * @dev Changes the admin of the proxy.
                   *
                   * Emits an {AdminChanged} event.
                   *
                   * NOTE: Only the admin can call this function. See {ProxyAdmin-changeProxyAdmin}.
                   */
                  function changeAdmin(address newAdmin) external virtual ifAdmin {
                      _changeAdmin(newAdmin);
                  }
                  /**
                   * @dev Upgrade the implementation of the proxy.
                   *
                   * NOTE: Only the admin can call this function. See {ProxyAdmin-upgrade}.
                   */
                  function upgradeTo(address newImplementation) external ifAdmin {
                      _upgradeToAndCall(newImplementation, bytes(""), false);
                  }
                  /**
                   * @dev Upgrade the implementation of the proxy, and then call a function from the new implementation as specified
                   * by `data`, which should be an encoded function call. This is useful to initialize new storage variables in the
                   * proxied contract.
                   *
                   * NOTE: Only the admin can call this function. See {ProxyAdmin-upgradeAndCall}.
                   */
                  function upgradeToAndCall(address newImplementation, bytes calldata data) external payable ifAdmin {
                      _upgradeToAndCall(newImplementation, data, true);
                  }
                  /**
                   * @dev Returns the current admin.
                   */
                  function _admin() internal view virtual returns (address) {
                      return _getAdmin();
                  }
                  /**
                   * @dev Makes sure the admin cannot access the fallback function. See {Proxy-_beforeFallback}.
                   */
                  function _beforeFallback() internal virtual override {
                      require(msg.sender != _getAdmin(), "TransparentUpgradeableProxy: admin cannot fallback to proxy target");
                      super._beforeFallback();
                  }
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts v4.4.1 (proxy/ERC1967/ERC1967Proxy.sol)
              pragma solidity ^0.8.0;
              import "../Proxy.sol";
              import "./ERC1967Upgrade.sol";
              /**
               * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an
               * implementation address that can be changed. This address is stored in storage in the location specified by
               * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the
               * implementation behind the proxy.
               */
              contract ERC1967Proxy is Proxy, ERC1967Upgrade {
                  /**
                   * @dev Initializes the upgradeable proxy with an initial implementation specified by `_logic`.
                   *
                   * If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded
                   * function call, and allows initializating the storage of the proxy like a Solidity constructor.
                   */
                  constructor(address _logic, bytes memory _data) payable {
                      assert(_IMPLEMENTATION_SLOT == bytes32(uint256(keccak256("eip1967.proxy.implementation")) - 1));
                      _upgradeToAndCall(_logic, _data, false);
                  }
                  /**
                   * @dev Returns the current implementation address.
                   */
                  function _implementation() internal view virtual override returns (address impl) {
                      return ERC1967Upgrade._getImplementation();
                  }
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts (last updated v4.5.0) (proxy/Proxy.sol)
              pragma solidity ^0.8.0;
              /**
               * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM
               * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to
               * be specified by overriding the virtual {_implementation} function.
               *
               * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a
               * different contract through the {_delegate} function.
               *
               * The success and return data of the delegated call will be returned back to the caller of the proxy.
               */
              abstract contract Proxy {
                  /**
                   * @dev Delegates the current call to `implementation`.
                   *
                   * This function does not return to its internal call site, it will return directly to the external caller.
                   */
                  function _delegate(address implementation) internal virtual {
                      assembly {
                          // Copy msg.data. We take full control of memory in this inline assembly
                          // block because it will not return to Solidity code. We overwrite the
                          // Solidity scratch pad at memory position 0.
                          calldatacopy(0, 0, calldatasize())
                          // Call the implementation.
                          // out and outsize are 0 because we don't know the size yet.
                          let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)
                          // Copy the returned data.
                          returndatacopy(0, 0, returndatasize())
                          switch result
                          // delegatecall returns 0 on error.
                          case 0 {
                              revert(0, returndatasize())
                          }
                          default {
                              return(0, returndatasize())
                          }
                      }
                  }
                  /**
                   * @dev This is a virtual function that should be overriden so it returns the address to which the fallback function
                   * and {_fallback} should delegate.
                   */
                  function _implementation() internal view virtual returns (address);
                  /**
                   * @dev Delegates the current call to the address returned by `_implementation()`.
                   *
                   * This function does not return to its internall call site, it will return directly to the external caller.
                   */
                  function _fallback() internal virtual {
                      _beforeFallback();
                      _delegate(_implementation());
                  }
                  /**
                   * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other
                   * function in the contract matches the call data.
                   */
                  fallback() external payable virtual {
                      _fallback();
                  }
                  /**
                   * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data
                   * is empty.
                   */
                  receive() external payable virtual {
                      _fallback();
                  }
                  /**
                   * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`
                   * call, or as part of the Solidity `fallback` or `receive` functions.
                   *
                   * If overriden should call `super._beforeFallback()`.
                   */
                  function _beforeFallback() internal virtual {}
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol)
              pragma solidity ^0.8.2;
              import "../beacon/IBeacon.sol";
              import "../../interfaces/draft-IERC1822.sol";
              import "../../utils/Address.sol";
              import "../../utils/StorageSlot.sol";
              /**
               * @dev This abstract contract provides getters and event emitting update functions for
               * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.
               *
               * _Available since v4.1._
               *
               * @custom:oz-upgrades-unsafe-allow delegatecall
               */
              abstract contract ERC1967Upgrade {
                  // This is the keccak-256 hash of "eip1967.proxy.rollback" subtracted by 1
                  bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;
                  /**
                   * @dev Storage slot with the address of the current implementation.
                   * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is
                   * validated in the constructor.
                   */
                  bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
                  /**
                   * @dev Emitted when the implementation is upgraded.
                   */
                  event Upgraded(address indexed implementation);
                  /**
                   * @dev Returns the current implementation address.
                   */
                  function _getImplementation() internal view returns (address) {
                      return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;
                  }
                  /**
                   * @dev Stores a new address in the EIP1967 implementation slot.
                   */
                  function _setImplementation(address newImplementation) private {
                      require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract");
                      StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
                  }
                  /**
                   * @dev Perform implementation upgrade
                   *
                   * Emits an {Upgraded} event.
                   */
                  function _upgradeTo(address newImplementation) internal {
                      _setImplementation(newImplementation);
                      emit Upgraded(newImplementation);
                  }
                  /**
                   * @dev Perform implementation upgrade with additional setup call.
                   *
                   * Emits an {Upgraded} event.
                   */
                  function _upgradeToAndCall(
                      address newImplementation,
                      bytes memory data,
                      bool forceCall
                  ) internal {
                      _upgradeTo(newImplementation);
                      if (data.length > 0 || forceCall) {
                          Address.functionDelegateCall(newImplementation, data);
                      }
                  }
                  /**
                   * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.
                   *
                   * Emits an {Upgraded} event.
                   */
                  function _upgradeToAndCallUUPS(
                      address newImplementation,
                      bytes memory data,
                      bool forceCall
                  ) internal {
                      // Upgrades from old implementations will perform a rollback test. This test requires the new
                      // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing
                      // this special case will break upgrade paths from old UUPS implementation to new ones.
                      if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {
                          _setImplementation(newImplementation);
                      } else {
                          try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {
                              require(slot == _IMPLEMENTATION_SLOT, "ERC1967Upgrade: unsupported proxiableUUID");
                          } catch {
                              revert("ERC1967Upgrade: new implementation is not UUPS");
                          }
                          _upgradeToAndCall(newImplementation, data, forceCall);
                      }
                  }
                  /**
                   * @dev Storage slot with the admin of the contract.
                   * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1, and is
                   * validated in the constructor.
                   */
                  bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;
                  /**
                   * @dev Emitted when the admin account has changed.
                   */
                  event AdminChanged(address previousAdmin, address newAdmin);
                  /**
                   * @dev Returns the current admin.
                   */
                  function _getAdmin() internal view returns (address) {
                      return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;
                  }
                  /**
                   * @dev Stores a new address in the EIP1967 admin slot.
                   */
                  function _setAdmin(address newAdmin) private {
                      require(newAdmin != address(0), "ERC1967: new admin is the zero address");
                      StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;
                  }
                  /**
                   * @dev Changes the admin of the proxy.
                   *
                   * Emits an {AdminChanged} event.
                   */
                  function _changeAdmin(address newAdmin) internal {
                      emit AdminChanged(_getAdmin(), newAdmin);
                      _setAdmin(newAdmin);
                  }
                  /**
                   * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.
                   * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.
                   */
                  bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;
                  /**
                   * @dev Emitted when the beacon is upgraded.
                   */
                  event BeaconUpgraded(address indexed beacon);
                  /**
                   * @dev Returns the current beacon.
                   */
                  function _getBeacon() internal view returns (address) {
                      return StorageSlot.getAddressSlot(_BEACON_SLOT).value;
                  }
                  /**
                   * @dev Stores a new beacon in the EIP1967 beacon slot.
                   */
                  function _setBeacon(address newBeacon) private {
                      require(Address.isContract(newBeacon), "ERC1967: new beacon is not a contract");
                      require(
                          Address.isContract(IBeacon(newBeacon).implementation()),
                          "ERC1967: beacon implementation is not a contract"
                      );
                      StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;
                  }
                  /**
                   * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does
                   * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).
                   *
                   * Emits a {BeaconUpgraded} event.
                   */
                  function _upgradeBeaconToAndCall(
                      address newBeacon,
                      bytes memory data,
                      bool forceCall
                  ) internal {
                      _setBeacon(newBeacon);
                      emit BeaconUpgraded(newBeacon);
                      if (data.length > 0 || forceCall) {
                          Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);
                      }
                  }
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)
              pragma solidity ^0.8.0;
              /**
               * @dev This is the interface that {BeaconProxy} expects of its beacon.
               */
              interface IBeacon {
                  /**
                   * @dev Must return an address that can be used as a delegate call target.
                   *
                   * {BeaconProxy} will check that this address is a contract.
                   */
                  function implementation() external view returns (address);
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)
              pragma solidity ^0.8.0;
              /**
               * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified
               * proxy whose upgrades are fully controlled by the current implementation.
               */
              interface IERC1822Proxiable {
                  /**
                   * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation
                   * address.
                   *
                   * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks
                   * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this
                   * function revert if invoked through a proxy.
                   */
                  function proxiableUUID() external view returns (bytes32);
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)
              pragma solidity ^0.8.1;
              /**
               * @dev Collection of functions related to the address type
               */
              library Address {
                  /**
                   * @dev Returns true if `account` is a contract.
                   *
                   * [IMPORTANT]
                   * ====
                   * It is unsafe to assume that an address for which this function returns
                   * false is an externally-owned account (EOA) and not a contract.
                   *
                   * Among others, `isContract` will return false for the following
                   * types of addresses:
                   *
                   *  - an externally-owned account
                   *  - a contract in construction
                   *  - an address where a contract will be created
                   *  - an address where a contract lived, but was destroyed
                   * ====
                   *
                   * [IMPORTANT]
                   * ====
                   * You shouldn't rely on `isContract` to protect against flash loan attacks!
                   *
                   * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
                   * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
                   * constructor.
                   * ====
                   */
                  function isContract(address account) internal view returns (bool) {
                      // This method relies on extcodesize/address.code.length, which returns 0
                      // for contracts in construction, since the code is only stored at the end
                      // of the constructor execution.
                      return account.code.length > 0;
                  }
                  /**
                   * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
                   * `recipient`, forwarding all available gas and reverting on errors.
                   *
                   * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
                   * of certain opcodes, possibly making contracts go over the 2300 gas limit
                   * imposed by `transfer`, making them unable to receive funds via
                   * `transfer`. {sendValue} removes this limitation.
                   *
                   * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
                   *
                   * IMPORTANT: because control is transferred to `recipient`, care must be
                   * taken to not create reentrancy vulnerabilities. Consider using
                   * {ReentrancyGuard} or the
                   * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
                   */
                  function sendValue(address payable recipient, uint256 amount) internal {
                      require(address(this).balance >= amount, "Address: insufficient balance");
                      (bool success, ) = recipient.call{value: amount}("");
                      require(success, "Address: unable to send value, recipient may have reverted");
                  }
                  /**
                   * @dev Performs a Solidity function call using a low level `call`. A
                   * plain `call` is an unsafe replacement for a function call: use this
                   * function instead.
                   *
                   * If `target` reverts with a revert reason, it is bubbled up by this
                   * function (like regular Solidity function calls).
                   *
                   * Returns the raw returned data. To convert to the expected return value,
                   * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
                   *
                   * Requirements:
                   *
                   * - `target` must be a contract.
                   * - calling `target` with `data` must not revert.
                   *
                   * _Available since v3.1._
                   */
                  function functionCall(address target, bytes memory data) internal returns (bytes memory) {
                      return functionCall(target, data, "Address: low-level call failed");
                  }
                  /**
                   * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
                   * `errorMessage` as a fallback revert reason when `target` reverts.
                   *
                   * _Available since v3.1._
                   */
                  function functionCall(
                      address target,
                      bytes memory data,
                      string memory errorMessage
                  ) internal returns (bytes memory) {
                      return functionCallWithValue(target, data, 0, errorMessage);
                  }
                  /**
                   * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
                   * but also transferring `value` wei to `target`.
                   *
                   * Requirements:
                   *
                   * - the calling contract must have an ETH balance of at least `value`.
                   * - the called Solidity function must be `payable`.
                   *
                   * _Available since v3.1._
                   */
                  function functionCallWithValue(
                      address target,
                      bytes memory data,
                      uint256 value
                  ) internal returns (bytes memory) {
                      return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
                  }
                  /**
                   * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
                   * with `errorMessage` as a fallback revert reason when `target` reverts.
                   *
                   * _Available since v3.1._
                   */
                  function functionCallWithValue(
                      address target,
                      bytes memory data,
                      uint256 value,
                      string memory errorMessage
                  ) internal returns (bytes memory) {
                      require(address(this).balance >= value, "Address: insufficient balance for call");
                      require(isContract(target), "Address: call to non-contract");
                      (bool success, bytes memory returndata) = target.call{value: value}(data);
                      return verifyCallResult(success, returndata, errorMessage);
                  }
                  /**
                   * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
                   * but performing a static call.
                   *
                   * _Available since v3.3._
                   */
                  function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
                      return functionStaticCall(target, data, "Address: low-level static call failed");
                  }
                  /**
                   * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
                   * but performing a static call.
                   *
                   * _Available since v3.3._
                   */
                  function functionStaticCall(
                      address target,
                      bytes memory data,
                      string memory errorMessage
                  ) internal view returns (bytes memory) {
                      require(isContract(target), "Address: static call to non-contract");
                      (bool success, bytes memory returndata) = target.staticcall(data);
                      return verifyCallResult(success, returndata, errorMessage);
                  }
                  /**
                   * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
                   * but performing a delegate call.
                   *
                   * _Available since v3.4._
                   */
                  function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
                      return functionDelegateCall(target, data, "Address: low-level delegate call failed");
                  }
                  /**
                   * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
                   * but performing a delegate call.
                   *
                   * _Available since v3.4._
                   */
                  function functionDelegateCall(
                      address target,
                      bytes memory data,
                      string memory errorMessage
                  ) internal returns (bytes memory) {
                      require(isContract(target), "Address: delegate call to non-contract");
                      (bool success, bytes memory returndata) = target.delegatecall(data);
                      return verifyCallResult(success, returndata, errorMessage);
                  }
                  /**
                   * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
                   * revert reason using the provided one.
                   *
                   * _Available since v4.3._
                   */
                  function verifyCallResult(
                      bool success,
                      bytes memory returndata,
                      string memory errorMessage
                  ) internal pure returns (bytes memory) {
                      if (success) {
                          return returndata;
                      } else {
                          // Look for revert reason and bubble it up if present
                          if (returndata.length > 0) {
                              // The easiest way to bubble the revert reason is using memory via assembly
                              assembly {
                                  let returndata_size := mload(returndata)
                                  revert(add(32, returndata), returndata_size)
                              }
                          } else {
                              revert(errorMessage);
                          }
                      }
                  }
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts v4.4.1 (utils/StorageSlot.sol)
              pragma solidity ^0.8.0;
              /**
               * @dev Library for reading and writing primitive types to specific storage slots.
               *
               * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.
               * This library helps with reading and writing to such slots without the need for inline assembly.
               *
               * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.
               *
               * Example usage to set ERC1967 implementation slot:
               * ```
               * contract ERC1967 {
               *     bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
               *
               *     function _getImplementation() internal view returns (address) {
               *         return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;
               *     }
               *
               *     function _setImplementation(address newImplementation) internal {
               *         require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract");
               *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
               *     }
               * }
               * ```
               *
               * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._
               */
              library StorageSlot {
                  struct AddressSlot {
                      address value;
                  }
                  struct BooleanSlot {
                      bool value;
                  }
                  struct Bytes32Slot {
                      bytes32 value;
                  }
                  struct Uint256Slot {
                      uint256 value;
                  }
                  /**
                   * @dev Returns an `AddressSlot` with member `value` located at `slot`.
                   */
                  function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {
                      assembly {
                          r.slot := slot
                      }
                  }
                  /**
                   * @dev Returns an `BooleanSlot` with member `value` located at `slot`.
                   */
                  function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {
                      assembly {
                          r.slot := slot
                      }
                  }
                  /**
                   * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.
                   */
                  function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {
                      assembly {
                          r.slot := slot
                      }
                  }
                  /**
                   * @dev Returns an `Uint256Slot` with member `value` located at `slot`.
                   */
                  function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {
                      assembly {
                          r.slot := slot
                      }
                  }
              }
              

              File 3 of 5: GasRefunder
              // SPDX-License-Identifier: Apache-2.0
              /*
               * Copyright 2021, Offchain Labs, Inc.
               *
               * Licensed under the Apache License, Version 2.0 (the "License");
               * you may not use this file except in compliance with the License.
               * You may obtain a copy of the License at
               *
               *    http://www.apache.org/licenses/LICENSE-2.0
               *
               * Unless required by applicable law or agreed to in writing, software
               * distributed under the License is distributed on an "AS IS" BASIS,
               * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
               * See the License for the specific language governing permissions and
               * limitations under the License.
               */
              pragma solidity ^0.8.7;
              import "./IGasRefunder.sol";
              import "@openzeppelin/contracts-0.8/access/Ownable.sol";
              contract GasRefunder is IGasRefunder, Ownable {
                  mapping(address => bool) public allowedContracts;
                  mapping(address => bool) public allowedRefundees;
                  address public disallower;
                  struct CommonParameters {
                      uint128 maxRefundeeBalance;
                      uint32 extraGasMargin;
                      uint8 calldataCost;
                      uint64 maxGasTip;
                      uint64 maxGasCost;
                      uint32 maxSingleGasUsage;
                  }
                  CommonParameters public commonParams;
                  enum CommonParameterKey {
                      MAX_REFUNDEE_BALANCE,
                      EXTRA_GAS_MARGIN,
                      CALLDATA_COST,
                      MAX_GAS_TIP,
                      MAX_GAS_COST,
                      MAX_SINGLE_GAS_USAGE
                  }
                  enum RefundDenyReason {
                      CONTRACT_NOT_ALLOWED,
                      REFUNDEE_NOT_ALLOWED,
                      REFUNDEE_ABOVE_MAX_BALANCE,
                      OUT_OF_FUNDS
                  }
                  event RefundedGasCosts(
                      address indexed refundee,
                      address indexed contractAddress,
                      bool indexed success,
                      uint256 gas,
                      uint256 gasPrice,
                      uint256 amountPaid
                  );
                  event RefundGasCostsDenied(
                      address indexed refundee,
                      address indexed contractAddress,
                      RefundDenyReason indexed reason,
                      uint256 gas
                  );
                  event Deposited(address sender, uint256 amount);
                  event Withdrawn(address initiator, address destination, uint256 amount);
                  event ContractAllowedSet(address indexed addr, bool indexed allowed);
                  event RefundeeAllowedSet(address indexed addr, bool indexed allowed);
                  event DisallowerSet(address indexed addr);
                  event CommonParameterSet(CommonParameterKey indexed parameter, uint256 value);
                  constructor() Ownable() {
                      commonParams = CommonParameters({
                          maxRefundeeBalance: 0, // no limit
                          extraGasMargin: 4000, // 4k gas
                          calldataCost: 12, // Between 4 for zero bytes and 16 for non-zero bytes
                          maxGasTip: 2 gwei,
                          maxGasCost: 120 gwei,
                          maxSingleGasUsage: 2e6 // 2 million gas
                      });
                  }
                  function setDisallower(address addr) external onlyOwner {
                      disallower = addr;
                      emit DisallowerSet(addr);
                  }
                  function allowContracts(address[] calldata addresses) external onlyOwner {
                      setContractsAllowedImpl(addresses, true);
                  }
                  function disallowContracts(address[] calldata addresses) external {
                      require(msg.sender == owner() || msg.sender == disallower, "NOT_AUTHORIZED");
                      setContractsAllowedImpl(addresses, false);
                  }
                  function setContractsAllowedImpl(address[] calldata addresses, bool allow) internal {
                      for (uint256 i = 0; i < addresses.length; i++) {
                          address addr = addresses[i];
                          allowedContracts[addr] = allow;
                          emit ContractAllowedSet(addr, allow);
                      }
                  }
                  function allowRefundees(address[] calldata addresses) external onlyOwner {
                      setRefundeesAllowedImpl(addresses, true);
                  }
                  function disallowRefundees(address[] calldata addresses) external {
                      require(msg.sender == owner() || msg.sender == disallower, "NOT_AUTHORIZED");
                      setRefundeesAllowedImpl(addresses, false);
                  }
                  function setRefundeesAllowedImpl(address[] calldata addresses, bool allow) internal {
                      for (uint256 i = 0; i < addresses.length; i++) {
                          address addr = addresses[i];
                          allowedRefundees[addr] = allow;
                          emit RefundeeAllowedSet(addr, allow);
                      }
                  }
                  function setMaxRefundeeBalance(uint128 newValue) external onlyOwner {
                      commonParams.maxRefundeeBalance = newValue;
                      emit CommonParameterSet(CommonParameterKey.MAX_REFUNDEE_BALANCE, newValue);
                  }
                  function setExtraGasMargin(uint32 newValue) external onlyOwner {
                      commonParams.extraGasMargin = newValue;
                      emit CommonParameterSet(CommonParameterKey.EXTRA_GAS_MARGIN, newValue);
                  }
                  function setCalldataCost(uint8 newValue) external onlyOwner {
                      commonParams.calldataCost = newValue;
                      emit CommonParameterSet(CommonParameterKey.CALLDATA_COST, newValue);
                  }
                  function setMaxGasTip(uint64 newValue) external onlyOwner {
                      commonParams.maxGasTip = newValue;
                      emit CommonParameterSet(CommonParameterKey.MAX_GAS_TIP, newValue);
                  }
                  function setMaxGasCost(uint64 newValue) external onlyOwner {
                      commonParams.maxGasCost = newValue;
                      emit CommonParameterSet(CommonParameterKey.MAX_GAS_COST, newValue);
                  }
                  function setMaxSingleGasUsage(uint32 newValue) external onlyOwner {
                      commonParams.maxSingleGasUsage = newValue;
                      emit CommonParameterSet(CommonParameterKey.MAX_SINGLE_GAS_USAGE, newValue);
                  }
                  receive() external payable {
                      emit Deposited(msg.sender, msg.value);
                  }
                  function withdraw(address payable destination, uint256 amount) external onlyOwner {
                      // It's expected that destination is an EOA
                      (bool success, ) = destination.call{ value: amount }("");
                      require(success, "WITHDRAW_FAILED");
                      emit Withdrawn(msg.sender, destination, amount);
                  }
                  function onGasSpent(
                      address payable refundee,
                      uint256 gasUsed,
                      uint256 calldataSize
                  ) external override returns (bool success) {
                      uint256 startGasLeft = gasleft();
                      uint256 ownBalance = address(this).balance;
                      if (ownBalance == 0) {
                          emit RefundGasCostsDenied(refundee, msg.sender, RefundDenyReason.OUT_OF_FUNDS, gasUsed);
                          return false;
                      }
                      if (!allowedContracts[msg.sender]) {
                          emit RefundGasCostsDenied(
                              refundee,
                              msg.sender,
                              RefundDenyReason.CONTRACT_NOT_ALLOWED,
                              gasUsed
                          );
                          return false;
                      }
                      if (!allowedRefundees[refundee]) {
                          emit RefundGasCostsDenied(
                              refundee,
                              msg.sender,
                              RefundDenyReason.REFUNDEE_NOT_ALLOWED,
                              gasUsed
                          );
                          return false;
                      }
                      uint256 estGasPrice = block.basefee + commonParams.maxGasTip;
                      if (tx.gasprice < estGasPrice) {
                          estGasPrice = tx.gasprice;
                      }
                      if (commonParams.maxGasCost != 0 && estGasPrice > commonParams.maxGasCost) {
                          estGasPrice = commonParams.maxGasCost;
                      }
                      // Retrieve these variables before measuring gasleft()
                      uint256 refundeeBalance = refundee.balance;
                      uint256 maxRefundeeBalance = commonParams.maxRefundeeBalance;
                      uint256 maxSingleGasUsage = commonParams.maxSingleGasUsage;
                      // Add in a bit of a buffer for the tx costs not measured with gasleft
                      gasUsed +=
                          startGasLeft +
                          commonParams.extraGasMargin +
                          (calldataSize * commonParams.calldataCost);
                      // Split this up into two statements so that gasleft() comes after the storage loads
                      gasUsed -= gasleft();
                      if (maxSingleGasUsage != 0 && gasUsed > maxSingleGasUsage) {
                          gasUsed = maxSingleGasUsage;
                      }
                      uint256 refundAmount = estGasPrice * gasUsed;
                      if (maxRefundeeBalance != 0 && refundeeBalance + refundAmount > maxRefundeeBalance) {
                          if (refundeeBalance > maxRefundeeBalance) {
                              // The refundee is already above their max balance
                              emit RefundGasCostsDenied(
                                  refundee,
                                  msg.sender,
                                  RefundDenyReason.REFUNDEE_ABOVE_MAX_BALANCE,
                                  gasUsed
                              );
                              return false;
                          } else {
                              refundAmount = maxRefundeeBalance - refundeeBalance;
                          }
                      }
                      if (refundAmount > ownBalance) {
                          refundAmount = ownBalance;
                      }
                      // It's expected that refundee is an EOA
                      (success, ) = refundee.call{ value: refundAmount }("");
                      emit RefundedGasCosts(refundee, msg.sender, success, gasUsed, estGasPrice, refundAmount);
                  }
              }
              // SPDX-License-Identifier: Apache-2.0
              /*
               * Copyright 2021, Offchain Labs, Inc.
               *
               * Licensed under the Apache License, Version 2.0 (the "License");
               * you may not use this file except in compliance with the License.
               * You may obtain a copy of the License at
               *
               *    http://www.apache.org/licenses/LICENSE-2.0
               *
               * Unless required by applicable law or agreed to in writing, software
               * distributed under the License is distributed on an "AS IS" BASIS,
               * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
               * See the License for the specific language governing permissions and
               * limitations under the License.
               */
              pragma solidity >=0.6.11 <0.7.0 || >=0.8.7 <0.9.0;
              interface IGasRefunder {
                  function onGasSpent(
                      address payable spender,
                      uint256 gasUsed,
                      uint256 calldataSize
                  ) external returns (bool success);
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)
              pragma solidity ^0.8.0;
              import "../utils/Context.sol";
              /**
               * @dev Contract module which provides a basic access control mechanism, where
               * there is an account (an owner) that can be granted exclusive access to
               * specific functions.
               *
               * By default, the owner account will be the one that deploys the contract. This
               * can later be changed with {transferOwnership}.
               *
               * This module is used through inheritance. It will make available the modifier
               * `onlyOwner`, which can be applied to your functions to restrict their use to
               * the owner.
               */
              abstract contract Ownable is Context {
                  address private _owner;
                  event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
                  /**
                   * @dev Initializes the contract setting the deployer as the initial owner.
                   */
                  constructor() {
                      _transferOwnership(_msgSender());
                  }
                  /**
                   * @dev Returns the address of the current owner.
                   */
                  function owner() public view virtual returns (address) {
                      return _owner;
                  }
                  /**
                   * @dev Throws if called by any account other than the owner.
                   */
                  modifier onlyOwner() {
                      require(owner() == _msgSender(), "Ownable: caller is not the owner");
                      _;
                  }
                  /**
                   * @dev Leaves the contract without owner. It will not be possible to call
                   * `onlyOwner` functions anymore. Can only be called by the current owner.
                   *
                   * NOTE: Renouncing ownership will leave the contract without an owner,
                   * thereby removing any functionality that is only available to the owner.
                   */
                  function renounceOwnership() public virtual onlyOwner {
                      _transferOwnership(address(0));
                  }
                  /**
                   * @dev Transfers ownership of the contract to a new account (`newOwner`).
                   * Can only be called by the current owner.
                   */
                  function transferOwnership(address newOwner) public virtual onlyOwner {
                      require(newOwner != address(0), "Ownable: new owner is the zero address");
                      _transferOwnership(newOwner);
                  }
                  /**
                   * @dev Transfers ownership of the contract to a new account (`newOwner`).
                   * Internal function without access restriction.
                   */
                  function _transferOwnership(address newOwner) internal virtual {
                      address oldOwner = _owner;
                      _owner = newOwner;
                      emit OwnershipTransferred(oldOwner, newOwner);
                  }
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
              pragma solidity ^0.8.0;
              /**
               * @dev Provides information about the current execution context, including the
               * sender of the transaction and its data. While these are generally available
               * via msg.sender and msg.data, they should not be accessed in such a direct
               * manner, since when dealing with meta-transactions the account sending and
               * paying for execution may not be the actual sender (as far as an application
               * is concerned).
               *
               * This contract is only required for intermediate, library-like contracts.
               */
              abstract contract Context {
                  function _msgSender() internal view virtual returns (address) {
                      return msg.sender;
                  }
                  function _msgData() internal view virtual returns (bytes calldata) {
                      return msg.data;
                  }
              }
              

              File 4 of 5: SequencerInbox
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import {
                  AlreadyInit,
                  HadZeroInit,
                  NotOrigin,
                  DataTooLarge,
                  NotRollup,
                  DelayedBackwards,
                  DelayedTooFar,
                  ForceIncludeBlockTooSoon,
                  ForceIncludeTimeTooSoon,
                  IncorrectMessagePreimage,
                  NotBatchPoster,
                  BadSequencerNumber,
                  DataNotAuthenticated,
                  AlreadyValidDASKeyset,
                  NoSuchKeyset,
                  NotForked
              } from "../libraries/Error.sol";
              import "./IBridge.sol";
              import "./IInbox.sol";
              import "./ISequencerInbox.sol";
              import "../rollup/IRollupLogic.sol";
              import "./Messages.sol";
              import {L1MessageType_batchPostingReport} from "../libraries/MessageTypes.sol";
              import {GasRefundEnabled, IGasRefunder} from "../libraries/IGasRefunder.sol";
              import "../libraries/DelegateCallAware.sol";
              import {MAX_DATA_SIZE} from "../libraries/Constants.sol";
              /**
               * @title Accepts batches from the sequencer and adds them to the rollup inbox.
               * @notice Contains the inbox accumulator which is the ordering of all data and transactions to be processed by the rollup.
               * As part of submitting a batch the sequencer is also expected to include items enqueued
               * in the delayed inbox (Bridge.sol). If items in the delayed inbox are not included by a
               * sequencer within a time limit they can be force included into the rollup inbox by anyone.
               */
              contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox {
                  uint256 public totalDelayedMessagesRead;
                  IBridge public bridge;
                  /// @inheritdoc ISequencerInbox
                  uint256 public constant HEADER_LENGTH = 40;
                  /// @inheritdoc ISequencerInbox
                  bytes1 public constant DATA_AUTHENTICATED_FLAG = 0x40;
                  IOwnable public rollup;
                  mapping(address => bool) public isBatchPoster;
                  ISequencerInbox.MaxTimeVariation public maxTimeVariation;
                  mapping(bytes32 => DasKeySetInfo) public dasKeySetInfo;
                  modifier onlyRollupOwner() {
                      if (msg.sender != rollup.owner()) revert NotOwner(msg.sender, address(rollup));
                      _;
                  }
                  uint256 internal immutable deployTimeChainId = block.chainid;
                  function _chainIdChanged() internal view returns (bool) {
                      return deployTimeChainId != block.chainid;
                  }
                  function initialize(
                      IBridge bridge_,
                      ISequencerInbox.MaxTimeVariation calldata maxTimeVariation_
                  ) external onlyDelegated {
                      if (bridge != IBridge(address(0))) revert AlreadyInit();
                      if (bridge_ == IBridge(address(0))) revert HadZeroInit();
                      bridge = bridge_;
                      rollup = bridge_.rollup();
                      maxTimeVariation = maxTimeVariation_;
                  }
                  function getTimeBounds() internal view virtual returns (TimeBounds memory) {
                      TimeBounds memory bounds;
                      if (block.timestamp > maxTimeVariation.delaySeconds) {
                          bounds.minTimestamp = uint64(block.timestamp - maxTimeVariation.delaySeconds);
                      }
                      bounds.maxTimestamp = uint64(block.timestamp + maxTimeVariation.futureSeconds);
                      if (block.number > maxTimeVariation.delayBlocks) {
                          bounds.minBlockNumber = uint64(block.number - maxTimeVariation.delayBlocks);
                      }
                      bounds.maxBlockNumber = uint64(block.number + maxTimeVariation.futureBlocks);
                      return bounds;
                  }
                  /// @inheritdoc ISequencerInbox
                  function removeDelayAfterFork() external {
                      if (!_chainIdChanged()) revert NotForked();
                      maxTimeVariation = ISequencerInbox.MaxTimeVariation({
                          delayBlocks: 1,
                          futureBlocks: 1,
                          delaySeconds: 1,
                          futureSeconds: 1
                      });
                  }
                  /// @inheritdoc ISequencerInbox
                  function forceInclusion(
                      uint256 _totalDelayedMessagesRead,
                      uint8 kind,
                      uint64[2] calldata l1BlockAndTime,
                      uint256 baseFeeL1,
                      address sender,
                      bytes32 messageDataHash
                  ) external {
                      if (_totalDelayedMessagesRead <= totalDelayedMessagesRead) revert DelayedBackwards();
                      bytes32 messageHash = Messages.messageHash(
                          kind,
                          sender,
                          l1BlockAndTime[0],
                          l1BlockAndTime[1],
                          _totalDelayedMessagesRead - 1,
                          baseFeeL1,
                          messageDataHash
                      );
                      // Can only force-include after the Sequencer-only window has expired.
                      if (l1BlockAndTime[0] + maxTimeVariation.delayBlocks >= block.number)
                          revert ForceIncludeBlockTooSoon();
                      if (l1BlockAndTime[1] + maxTimeVariation.delaySeconds >= block.timestamp)
                          revert ForceIncludeTimeTooSoon();
                      // Verify that message hash represents the last message sequence of delayed message to be included
                      bytes32 prevDelayedAcc = 0;
                      if (_totalDelayedMessagesRead > 1) {
                          prevDelayedAcc = bridge.delayedInboxAccs(_totalDelayedMessagesRead - 2);
                      }
                      if (
                          bridge.delayedInboxAccs(_totalDelayedMessagesRead - 1) !=
                          Messages.accumulateInboxMessage(prevDelayedAcc, messageHash)
                      ) revert IncorrectMessagePreimage();
                      (bytes32 dataHash, TimeBounds memory timeBounds) = formEmptyDataHash(
                          _totalDelayedMessagesRead
                      );
                      uint256 __totalDelayedMessagesRead = _totalDelayedMessagesRead;
                      uint256 prevSeqMsgCount = bridge.sequencerReportedSubMessageCount();
                      uint256 newSeqMsgCount = prevSeqMsgCount +
                          _totalDelayedMessagesRead -
                          totalDelayedMessagesRead;
                      (
                          uint256 seqMessageIndex,
                          bytes32 beforeAcc,
                          bytes32 delayedAcc,
                          bytes32 afterAcc
                      ) = addSequencerL2BatchImpl(
                              dataHash,
                              __totalDelayedMessagesRead,
                              0,
                              prevSeqMsgCount,
                              newSeqMsgCount
                          );
                      emit SequencerBatchDelivered(
                          seqMessageIndex,
                          beforeAcc,
                          afterAcc,
                          delayedAcc,
                          totalDelayedMessagesRead,
                          timeBounds,
                          BatchDataLocation.NoData
                      );
                  }
                  /// @dev Deprecated in favor of the variant specifying message counts for consistency
                  function addSequencerL2BatchFromOrigin(
                      uint256 sequenceNumber,
                      bytes calldata data,
                      uint256 afterDelayedMessagesRead,
                      IGasRefunder gasRefunder
                  ) external refundsGas(gasRefunder) {
                      // solhint-disable-next-line avoid-tx-origin
                      if (msg.sender != tx.origin) revert NotOrigin();
                      if (!isBatchPoster[msg.sender]) revert NotBatchPoster();
                      (bytes32 dataHash, TimeBounds memory timeBounds) = formDataHash(
                          data,
                          afterDelayedMessagesRead
                      );
                      (
                          uint256 seqMessageIndex,
                          bytes32 beforeAcc,
                          bytes32 delayedAcc,
                          bytes32 afterAcc
                      ) = addSequencerL2BatchImpl(dataHash, afterDelayedMessagesRead, data.length, 0, 0);
                      if (seqMessageIndex != sequenceNumber)
                          revert BadSequencerNumber(seqMessageIndex, sequenceNumber);
                      emit SequencerBatchDelivered(
                          sequenceNumber,
                          beforeAcc,
                          afterAcc,
                          delayedAcc,
                          totalDelayedMessagesRead,
                          timeBounds,
                          BatchDataLocation.TxInput
                      );
                  }
                  function addSequencerL2BatchFromOrigin(
                      uint256 sequenceNumber,
                      bytes calldata data,
                      uint256 afterDelayedMessagesRead,
                      IGasRefunder gasRefunder,
                      uint256 prevMessageCount,
                      uint256 newMessageCount
                  ) external refundsGas(gasRefunder) {
                      // solhint-disable-next-line avoid-tx-origin
                      if (msg.sender != tx.origin) revert NotOrigin();
                      if (!isBatchPoster[msg.sender]) revert NotBatchPoster();
                      (bytes32 dataHash, TimeBounds memory timeBounds) = formDataHash(
                          data,
                          afterDelayedMessagesRead
                      );
                      // Reformat the stack to prevent "Stack too deep"
                      uint256 sequenceNumber_ = sequenceNumber;
                      TimeBounds memory timeBounds_ = timeBounds;
                      bytes32 dataHash_ = dataHash;
                      uint256 dataLength = data.length;
                      uint256 afterDelayedMessagesRead_ = afterDelayedMessagesRead;
                      uint256 prevMessageCount_ = prevMessageCount;
                      uint256 newMessageCount_ = newMessageCount;
                      (
                          uint256 seqMessageIndex,
                          bytes32 beforeAcc,
                          bytes32 delayedAcc,
                          bytes32 afterAcc
                      ) = addSequencerL2BatchImpl(
                              dataHash_,
                              afterDelayedMessagesRead_,
                              dataLength,
                              prevMessageCount_,
                              newMessageCount_
                          );
                      if (seqMessageIndex != sequenceNumber_ && sequenceNumber_ != ~uint256(0))
                          revert BadSequencerNumber(seqMessageIndex, sequenceNumber_);
                      emit SequencerBatchDelivered(
                          seqMessageIndex,
                          beforeAcc,
                          afterAcc,
                          delayedAcc,
                          totalDelayedMessagesRead,
                          timeBounds_,
                          BatchDataLocation.TxInput
                      );
                  }
                  function addSequencerL2Batch(
                      uint256 sequenceNumber,
                      bytes calldata data,
                      uint256 afterDelayedMessagesRead,
                      IGasRefunder gasRefunder,
                      uint256 prevMessageCount,
                      uint256 newMessageCount
                  ) external override refundsGas(gasRefunder) {
                      if (!isBatchPoster[msg.sender] && msg.sender != address(rollup)) revert NotBatchPoster();
                      (bytes32 dataHash, TimeBounds memory timeBounds) = formDataHash(
                          data,
                          afterDelayedMessagesRead
                      );
                      uint256 seqMessageIndex;
                      {
                          // Reformat the stack to prevent "Stack too deep"
                          uint256 sequenceNumber_ = sequenceNumber;
                          TimeBounds memory timeBounds_ = timeBounds;
                          bytes32 dataHash_ = dataHash;
                          uint256 afterDelayedMessagesRead_ = afterDelayedMessagesRead;
                          uint256 prevMessageCount_ = prevMessageCount;
                          uint256 newMessageCount_ = newMessageCount;
                          // we set the calldata length posted to 0 here since the caller isn't the origin
                          // of the tx, so they might have not paid tx input cost for the calldata
                          bytes32 beforeAcc;
                          bytes32 delayedAcc;
                          bytes32 afterAcc;
                          (seqMessageIndex, beforeAcc, delayedAcc, afterAcc) = addSequencerL2BatchImpl(
                              dataHash_,
                              afterDelayedMessagesRead_,
                              0,
                              prevMessageCount_,
                              newMessageCount_
                          );
                          if (seqMessageIndex != sequenceNumber_ && sequenceNumber_ != ~uint256(0))
                              revert BadSequencerNumber(seqMessageIndex, sequenceNumber_);
                          emit SequencerBatchDelivered(
                              seqMessageIndex,
                              beforeAcc,
                              afterAcc,
                              delayedAcc,
                              totalDelayedMessagesRead,
                              timeBounds_,
                              BatchDataLocation.SeparateBatchEvent
                          );
                      }
                      emit SequencerBatchData(seqMessageIndex, data);
                  }
                  modifier validateBatchData(bytes calldata data) {
                      uint256 fullDataLen = HEADER_LENGTH + data.length;
                      if (fullDataLen > MAX_DATA_SIZE) revert DataTooLarge(fullDataLen, MAX_DATA_SIZE);
                      if (data.length > 0 && (data[0] & DATA_AUTHENTICATED_FLAG) == DATA_AUTHENTICATED_FLAG) {
                          revert DataNotAuthenticated();
                      }
                      // the first byte is used to identify the type of batch data
                      // das batches expect to have the type byte set, followed by the keyset (so they should have at least 33 bytes)
                      if (data.length >= 33 && data[0] & 0x80 != 0) {
                          // we skip the first byte, then read the next 32 bytes for the keyset
                          bytes32 dasKeysetHash = bytes32(data[1:33]);
                          if (!dasKeySetInfo[dasKeysetHash].isValidKeyset) revert NoSuchKeyset(dasKeysetHash);
                      }
                      _;
                  }
                  function packHeader(uint256 afterDelayedMessagesRead)
                      internal
                      view
                      returns (bytes memory, TimeBounds memory)
                  {
                      TimeBounds memory timeBounds = getTimeBounds();
                      bytes memory header = abi.encodePacked(
                          timeBounds.minTimestamp,
                          timeBounds.maxTimestamp,
                          timeBounds.minBlockNumber,
                          timeBounds.maxBlockNumber,
                          uint64(afterDelayedMessagesRead)
                      );
                      // This must always be true from the packed encoding
                      assert(header.length == HEADER_LENGTH);
                      return (header, timeBounds);
                  }
                  function formDataHash(bytes calldata data, uint256 afterDelayedMessagesRead)
                      internal
                      view
                      validateBatchData(data)
                      returns (bytes32, TimeBounds memory)
                  {
                      (bytes memory header, TimeBounds memory timeBounds) = packHeader(afterDelayedMessagesRead);
                      bytes32 dataHash = keccak256(bytes.concat(header, data));
                      return (dataHash, timeBounds);
                  }
                  function formEmptyDataHash(uint256 afterDelayedMessagesRead)
                      internal
                      view
                      returns (bytes32, TimeBounds memory)
                  {
                      (bytes memory header, TimeBounds memory timeBounds) = packHeader(afterDelayedMessagesRead);
                      return (keccak256(header), timeBounds);
                  }
                  function addSequencerL2BatchImpl(
                      bytes32 dataHash,
                      uint256 afterDelayedMessagesRead,
                      uint256 calldataLengthPosted,
                      uint256 prevMessageCount,
                      uint256 newMessageCount
                  )
                      internal
                      returns (
                          uint256 seqMessageIndex,
                          bytes32 beforeAcc,
                          bytes32 delayedAcc,
                          bytes32 acc
                      )
                  {
                      if (afterDelayedMessagesRead < totalDelayedMessagesRead) revert DelayedBackwards();
                      if (afterDelayedMessagesRead > bridge.delayedMessageCount()) revert DelayedTooFar();
                      (seqMessageIndex, beforeAcc, delayedAcc, acc) = bridge.enqueueSequencerMessage(
                          dataHash,
                          afterDelayedMessagesRead,
                          prevMessageCount,
                          newMessageCount
                      );
                      totalDelayedMessagesRead = afterDelayedMessagesRead;
                      if (calldataLengthPosted > 0) {
                          // this msg isn't included in the current sequencer batch, but instead added to
                          // the delayed messages queue that is yet to be included
                          address batchPoster = msg.sender;
                          bytes memory spendingReportMsg = abi.encodePacked(
                              block.timestamp,
                              batchPoster,
                              dataHash,
                              seqMessageIndex,
                              block.basefee
                          );
                          uint256 msgNum = bridge.submitBatchSpendingReport(
                              batchPoster,
                              keccak256(spendingReportMsg)
                          );
                          // this is the same event used by Inbox.sol after including a message to the delayed message accumulator
                          emit InboxMessageDelivered(msgNum, spendingReportMsg);
                      }
                  }
                  function inboxAccs(uint256 index) external view returns (bytes32) {
                      return bridge.sequencerInboxAccs(index);
                  }
                  function batchCount() external view returns (uint256) {
                      return bridge.sequencerMessageCount();
                  }
                  /// @inheritdoc ISequencerInbox
                  function setMaxTimeVariation(ISequencerInbox.MaxTimeVariation memory maxTimeVariation_)
                      external
                      onlyRollupOwner
                  {
                      maxTimeVariation = maxTimeVariation_;
                      emit OwnerFunctionCalled(0);
                  }
                  /// @inheritdoc ISequencerInbox
                  function setIsBatchPoster(address addr, bool isBatchPoster_) external onlyRollupOwner {
                      isBatchPoster[addr] = isBatchPoster_;
                      emit OwnerFunctionCalled(1);
                  }
                  /// @inheritdoc ISequencerInbox
                  function setValidKeyset(bytes calldata keysetBytes) external onlyRollupOwner {
                      uint256 ksWord = uint256(keccak256(bytes.concat(hex"fe", keccak256(keysetBytes))));
                      bytes32 ksHash = bytes32(ksWord ^ (1 << 255));
                      require(keysetBytes.length < 64 * 1024, "keyset is too large");
                      if (dasKeySetInfo[ksHash].isValidKeyset) revert AlreadyValidDASKeyset(ksHash);
                      dasKeySetInfo[ksHash] = DasKeySetInfo({
                          isValidKeyset: true,
                          creationBlock: uint64(block.number)
                      });
                      emit SetValidKeyset(ksHash, keysetBytes);
                      emit OwnerFunctionCalled(2);
                  }
                  /// @inheritdoc ISequencerInbox
                  function invalidateKeysetHash(bytes32 ksHash) external onlyRollupOwner {
                      if (!dasKeySetInfo[ksHash].isValidKeyset) revert NoSuchKeyset(ksHash);
                      // we don't delete the block creation value since its used to fetch the SetValidKeyset
                      // event efficiently. The event provides the hash preimage of the key.
                      // this is still needed when syncing the chain after a keyset is invalidated.
                      dasKeySetInfo[ksHash].isValidKeyset = false;
                      emit InvalidateKeyset(ksHash);
                      emit OwnerFunctionCalled(3);
                  }
                  function isValidKeysetHash(bytes32 ksHash) external view returns (bool) {
                      return dasKeySetInfo[ksHash].isValidKeyset;
                  }
                  /// @inheritdoc ISequencerInbox
                  function getKeysetCreationBlock(bytes32 ksHash) external view returns (uint256) {
                      DasKeySetInfo memory ksInfo = dasKeySetInfo[ksHash];
                      if (ksInfo.creationBlock == 0) revert NoSuchKeyset(ksHash);
                      return uint256(ksInfo.creationBlock);
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.4;
              /// @dev Init was already called
              error AlreadyInit();
              /// Init was called with param set to zero that must be nonzero
              error HadZeroInit();
              /// @dev Thrown when non owner tries to access an only-owner function
              /// @param sender The msg.sender who is not the owner
              /// @param owner The owner address
              error NotOwner(address sender, address owner);
              /// @dev Thrown when an address that is not the rollup tries to call an only-rollup function
              /// @param sender The sender who is not the rollup
              /// @param rollup The rollup address authorized to call this function
              error NotRollup(address sender, address rollup);
              /// @dev Thrown when the contract was not called directly from the origin ie msg.sender != tx.origin
              error NotOrigin();
              /// @dev Provided data was too large
              /// @param dataLength The length of the data that is too large
              /// @param maxDataLength The max length the data can be
              error DataTooLarge(uint256 dataLength, uint256 maxDataLength);
              /// @dev The provided is not a contract and was expected to be
              /// @param addr The adddress in question
              error NotContract(address addr);
              /// @dev The merkle proof provided was too long
              /// @param actualLength The length of the merkle proof provided
              /// @param maxProofLength The max length a merkle proof can have
              error MerkleProofTooLong(uint256 actualLength, uint256 maxProofLength);
              /// @dev Thrown when an un-authorized address tries to access an admin function
              /// @param sender The un-authorized sender
              /// @param rollup The rollup, which would be authorized
              /// @param owner The rollup's owner, which would be authorized
              error NotRollupOrOwner(address sender, address rollup, address owner);
              // Bridge Errors
              /// @dev Thrown when an un-authorized address tries to access an only-inbox function
              /// @param sender The un-authorized sender
              error NotDelayedInbox(address sender);
              /// @dev Thrown when an un-authorized address tries to access an only-sequencer-inbox function
              /// @param sender The un-authorized sender
              error NotSequencerInbox(address sender);
              /// @dev Thrown when an un-authorized address tries to access an only-outbox function
              /// @param sender The un-authorized sender
              error NotOutbox(address sender);
              /// @dev the provided outbox address isn't valid
              /// @param outbox address of outbox being set
              error InvalidOutboxSet(address outbox);
              // Inbox Errors
              /// @dev The contract is paused, so cannot be paused
              error AlreadyPaused();
              /// @dev The contract is unpaused, so cannot be unpaused
              error AlreadyUnpaused();
              /// @dev The contract is paused
              error Paused();
              /// @dev msg.value sent to the inbox isn't high enough
              error InsufficientValue(uint256 expected, uint256 actual);
              /// @dev submission cost provided isn't enough to create retryable ticket
              error InsufficientSubmissionCost(uint256 expected, uint256 actual);
              /// @dev address not allowed to interact with the given contract
              error NotAllowedOrigin(address origin);
              /// @dev used to convey retryable tx data in eth calls without requiring a tx trace
              /// this follows a pattern similar to EIP-3668 where reverts surface call information
              error RetryableData(
                  address from,
                  address to,
                  uint256 l2CallValue,
                  uint256 deposit,
                  uint256 maxSubmissionCost,
                  address excessFeeRefundAddress,
                  address callValueRefundAddress,
                  uint256 gasLimit,
                  uint256 maxFeePerGas,
                  bytes data
              );
              /// @dev Thrown when a L1 chainId fork is detected
              error L1Forked();
              /// @dev Thrown when a L1 chainId fork is not detected
              error NotForked();
              // Outbox Errors
              /// @dev The provided proof was too long
              /// @param proofLength The length of the too-long proof
              error ProofTooLong(uint256 proofLength);
              /// @dev The output index was greater than the maximum
              /// @param index The output index
              /// @param maxIndex The max the index could be
              error PathNotMinimal(uint256 index, uint256 maxIndex);
              /// @dev The calculated root does not exist
              /// @param root The calculated root
              error UnknownRoot(bytes32 root);
              /// @dev The record has already been spent
              /// @param index The index of the spent record
              error AlreadySpent(uint256 index);
              /// @dev A call to the bridge failed with no return data
              error BridgeCallFailed();
              // Sequencer Inbox Errors
              /// @dev Thrown when someone attempts to read fewer messages than have already been read
              error DelayedBackwards();
              /// @dev Thrown when someone attempts to read more messages than exist
              error DelayedTooFar();
              /// @dev Force include can only read messages more blocks old than the delay period
              error ForceIncludeBlockTooSoon();
              /// @dev Force include can only read messages more seconds old than the delay period
              error ForceIncludeTimeTooSoon();
              /// @dev The message provided did not match the hash in the delayed inbox
              error IncorrectMessagePreimage();
              /// @dev This can only be called by the batch poster
              error NotBatchPoster();
              /// @dev The sequence number provided to this message was inconsistent with the number of batches already included
              error BadSequencerNumber(uint256 stored, uint256 received);
              /// @dev The sequence message number provided to this message was inconsistent with the previous one
              error BadSequencerMessageNumber(uint256 stored, uint256 received);
              /// @dev The batch data has the inbox authenticated bit set, but the batch data was not authenticated by the inbox
              error DataNotAuthenticated();
              /// @dev Tried to create an already valid Data Availability Service keyset
              error AlreadyValidDASKeyset(bytes32);
              /// @dev Tried to use or invalidate an already invalid Data Availability Service keyset
              error NoSuchKeyset(bytes32);
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              // solhint-disable-next-line compiler-version
              pragma solidity >=0.6.9 <0.9.0;
              import "./IOwnable.sol";
              interface IBridge {
                  event MessageDelivered(
                      uint256 indexed messageIndex,
                      bytes32 indexed beforeInboxAcc,
                      address inbox,
                      uint8 kind,
                      address sender,
                      bytes32 messageDataHash,
                      uint256 baseFeeL1,
                      uint64 timestamp
                  );
                  event BridgeCallTriggered(
                      address indexed outbox,
                      address indexed to,
                      uint256 value,
                      bytes data
                  );
                  event InboxToggle(address indexed inbox, bool enabled);
                  event OutboxToggle(address indexed outbox, bool enabled);
                  event SequencerInboxUpdated(address newSequencerInbox);
                  function allowedDelayedInboxList(uint256) external returns (address);
                  function allowedOutboxList(uint256) external returns (address);
                  /// @dev Accumulator for delayed inbox messages; tail represents hash of the current state; each element represents the inclusion of a new message.
                  function delayedInboxAccs(uint256) external view returns (bytes32);
                  /// @dev Accumulator for sequencer inbox messages; tail represents hash of the current state; each element represents the inclusion of a new message.
                  function sequencerInboxAccs(uint256) external view returns (bytes32);
                  function rollup() external view returns (IOwnable);
                  function sequencerInbox() external view returns (address);
                  function activeOutbox() external view returns (address);
                  function allowedDelayedInboxes(address inbox) external view returns (bool);
                  function allowedOutboxes(address outbox) external view returns (bool);
                  function sequencerReportedSubMessageCount() external view returns (uint256);
                  /**
                   * @dev Enqueue a message in the delayed inbox accumulator.
                   *      These messages are later sequenced in the SequencerInbox, either
                   *      by the sequencer as part of a normal batch, or by force inclusion.
                   */
                  function enqueueDelayedMessage(
                      uint8 kind,
                      address sender,
                      bytes32 messageDataHash
                  ) external payable returns (uint256);
                  function executeCall(
                      address to,
                      uint256 value,
                      bytes calldata data
                  ) external returns (bool success, bytes memory returnData);
                  function delayedMessageCount() external view returns (uint256);
                  function sequencerMessageCount() external view returns (uint256);
                  // ---------- onlySequencerInbox functions ----------
                  function enqueueSequencerMessage(
                      bytes32 dataHash,
                      uint256 afterDelayedMessagesRead,
                      uint256 prevMessageCount,
                      uint256 newMessageCount
                  )
                      external
                      returns (
                          uint256 seqMessageIndex,
                          bytes32 beforeAcc,
                          bytes32 delayedAcc,
                          bytes32 acc
                      );
                  /**
                   * @dev Allows the sequencer inbox to submit a delayed message of the batchPostingReport type
                   *      This is done through a separate function entrypoint instead of allowing the sequencer inbox
                   *      to call `enqueueDelayedMessage` to avoid the gas overhead of an extra SLOAD in either
                   *      every delayed inbox or every sequencer inbox call.
                   */
                  function submitBatchSpendingReport(address batchPoster, bytes32 dataHash)
                      external
                      returns (uint256 msgNum);
                  // ---------- onlyRollupOrOwner functions ----------
                  function setSequencerInbox(address _sequencerInbox) external;
                  function setDelayedInbox(address inbox, bool enabled) external;
                  function setOutbox(address inbox, bool enabled) external;
                  // ---------- initializer ----------
                  function initialize(IOwnable rollup_) external;
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              // solhint-disable-next-line compiler-version
              pragma solidity >=0.6.9 <0.9.0;
              import "./IBridge.sol";
              import "./IDelayedMessageProvider.sol";
              import "./ISequencerInbox.sol";
              interface IInbox is IDelayedMessageProvider {
                  function bridge() external view returns (IBridge);
                  function sequencerInbox() external view returns (ISequencerInbox);
                  /**
                   * @notice Send a generic L2 message to the chain
                   * @dev This method is an optimization to avoid having to emit the entirety of the messageData in a log. Instead validators are expected to be able to parse the data from the transaction's input
                   *      This method will be disabled upon L1 fork to prevent replay attacks on L2
                   * @param messageData Data of the message being sent
                   */
                  function sendL2MessageFromOrigin(bytes calldata messageData) external returns (uint256);
                  /**
                   * @notice Send a generic L2 message to the chain
                   * @dev This method can be used to send any type of message that doesn't require L1 validation
                   *      This method will be disabled upon L1 fork to prevent replay attacks on L2
                   * @param messageData Data of the message being sent
                   */
                  function sendL2Message(bytes calldata messageData) external returns (uint256);
                  function sendL1FundedUnsignedTransaction(
                      uint256 gasLimit,
                      uint256 maxFeePerGas,
                      uint256 nonce,
                      address to,
                      bytes calldata data
                  ) external payable returns (uint256);
                  function sendL1FundedContractTransaction(
                      uint256 gasLimit,
                      uint256 maxFeePerGas,
                      address to,
                      bytes calldata data
                  ) external payable returns (uint256);
                  function sendUnsignedTransaction(
                      uint256 gasLimit,
                      uint256 maxFeePerGas,
                      uint256 nonce,
                      address to,
                      uint256 value,
                      bytes calldata data
                  ) external returns (uint256);
                  function sendContractTransaction(
                      uint256 gasLimit,
                      uint256 maxFeePerGas,
                      address to,
                      uint256 value,
                      bytes calldata data
                  ) external returns (uint256);
                  /**
                   * @dev This method can only be called upon L1 fork and will not alias the caller
                   *      This method will revert if not called from origin
                   */
                  function sendL1FundedUnsignedTransactionToFork(
                      uint256 gasLimit,
                      uint256 maxFeePerGas,
                      uint256 nonce,
                      address to,
                      bytes calldata data
                  ) external payable returns (uint256);
                  /**
                   * @dev This method can only be called upon L1 fork and will not alias the caller
                   *      This method will revert if not called from origin
                   */
                  function sendUnsignedTransactionToFork(
                      uint256 gasLimit,
                      uint256 maxFeePerGas,
                      uint256 nonce,
                      address to,
                      uint256 value,
                      bytes calldata data
                  ) external returns (uint256);
                  /**
                   * @notice Send a message to initiate L2 withdrawal
                   * @dev This method can only be called upon L1 fork and will not alias the caller
                   *      This method will revert if not called from origin
                   */
                  function sendWithdrawEthToFork(
                      uint256 gasLimit,
                      uint256 maxFeePerGas,
                      uint256 nonce,
                      uint256 value,
                      address withdrawTo
                  ) external returns (uint256);
                  /**
                   * @notice Get the L1 fee for submitting a retryable
                   * @dev This fee can be paid by funds already in the L2 aliased address or by the current message value
                   * @dev This formula may change in the future, to future proof your code query this method instead of inlining!!
                   * @param dataLength The length of the retryable's calldata, in bytes
                   * @param baseFee The block basefee when the retryable is included in the chain, if 0 current block.basefee will be used
                   */
                  function calculateRetryableSubmissionFee(uint256 dataLength, uint256 baseFee)
                      external
                      view
                      returns (uint256);
                  /**
                   * @notice Deposit eth from L1 to L2 to address of the sender if sender is an EOA, and to its aliased address if the sender is a contract
                   * @dev This does not trigger the fallback function when receiving in the L2 side.
                   *      Look into retryable tickets if you are interested in this functionality.
                   * @dev This function should not be called inside contract constructors
                   */
                  function depositEth() external payable returns (uint256);
                  /**
                   * @notice Put a message in the L2 inbox that can be reexecuted for some fixed amount of time if it reverts
                   * @dev all msg.value will deposited to callValueRefundAddress on L2
                   * @dev Gas limit and maxFeePerGas should not be set to 1 as that is used to trigger the RetryableData error
                   * @param to destination L2 contract address
                   * @param l2CallValue call value for retryable L2 message
                   * @param maxSubmissionCost Max gas deducted from user's L2 balance to cover base submission fee
                   * @param excessFeeRefundAddress gasLimit x maxFeePerGas - execution cost gets credited here on L2 balance
                   * @param callValueRefundAddress l2Callvalue gets credited here on L2 if retryable txn times out or gets cancelled
                   * @param gasLimit Max gas deducted from user's L2 balance to cover L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error)
                   * @param maxFeePerGas price bid for L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error)
                   * @param data ABI encoded data of L2 message
                   * @return unique message number of the retryable transaction
                   */
                  function createRetryableTicket(
                      address to,
                      uint256 l2CallValue,
                      uint256 maxSubmissionCost,
                      address excessFeeRefundAddress,
                      address callValueRefundAddress,
                      uint256 gasLimit,
                      uint256 maxFeePerGas,
                      bytes calldata data
                  ) external payable returns (uint256);
                  /**
                   * @notice Put a message in the L2 inbox that can be reexecuted for some fixed amount of time if it reverts
                   * @dev Same as createRetryableTicket, but does not guarantee that submission will succeed by requiring the needed funds
                   * come from the deposit alone, rather than falling back on the user's L2 balance
                   * @dev Advanced usage only (does not rewrite aliases for excessFeeRefundAddress and callValueRefundAddress).
                   * createRetryableTicket method is the recommended standard.
                   * @dev Gas limit and maxFeePerGas should not be set to 1 as that is used to trigger the RetryableData error
                   * @param to destination L2 contract address
                   * @param l2CallValue call value for retryable L2 message
                   * @param maxSubmissionCost Max gas deducted from user's L2 balance to cover base submission fee
                   * @param excessFeeRefundAddress gasLimit x maxFeePerGas - execution cost gets credited here on L2 balance
                   * @param callValueRefundAddress l2Callvalue gets credited here on L2 if retryable txn times out or gets cancelled
                   * @param gasLimit Max gas deducted from user's L2 balance to cover L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error)
                   * @param maxFeePerGas price bid for L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error)
                   * @param data ABI encoded data of L2 message
                   * @return unique message number of the retryable transaction
                   */
                  function unsafeCreateRetryableTicket(
                      address to,
                      uint256 l2CallValue,
                      uint256 maxSubmissionCost,
                      address excessFeeRefundAddress,
                      address callValueRefundAddress,
                      uint256 gasLimit,
                      uint256 maxFeePerGas,
                      bytes calldata data
                  ) external payable returns (uint256);
                  // ---------- onlyRollupOrOwner functions ----------
                  /// @notice pauses all inbox functionality
                  function pause() external;
                  /// @notice unpauses all inbox functionality
                  function unpause() external;
                  // ---------- initializer ----------
                  /**
                   * @dev function to be called one time during the inbox upgrade process
                   *      this is used to fix the storage slots
                   */
                  function postUpgradeInit(IBridge _bridge) external;
                  function initialize(IBridge _bridge, ISequencerInbox _sequencerInbox) external;
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              // solhint-disable-next-line compiler-version
              pragma solidity >=0.6.9 <0.9.0;
              pragma experimental ABIEncoderV2;
              import "../libraries/IGasRefunder.sol";
              import "./IDelayedMessageProvider.sol";
              import "./IBridge.sol";
              interface ISequencerInbox is IDelayedMessageProvider {
                  struct MaxTimeVariation {
                      uint256 delayBlocks;
                      uint256 futureBlocks;
                      uint256 delaySeconds;
                      uint256 futureSeconds;
                  }
                  struct TimeBounds {
                      uint64 minTimestamp;
                      uint64 maxTimestamp;
                      uint64 minBlockNumber;
                      uint64 maxBlockNumber;
                  }
                  enum BatchDataLocation {
                      TxInput,
                      SeparateBatchEvent,
                      NoData
                  }
                  event SequencerBatchDelivered(
                      uint256 indexed batchSequenceNumber,
                      bytes32 indexed beforeAcc,
                      bytes32 indexed afterAcc,
                      bytes32 delayedAcc,
                      uint256 afterDelayedMessagesRead,
                      TimeBounds timeBounds,
                      BatchDataLocation dataLocation
                  );
                  event OwnerFunctionCalled(uint256 indexed id);
                  /// @dev a separate event that emits batch data when this isn't easily accessible in the tx.input
                  event SequencerBatchData(uint256 indexed batchSequenceNumber, bytes data);
                  /// @dev a valid keyset was added
                  event SetValidKeyset(bytes32 indexed keysetHash, bytes keysetBytes);
                  /// @dev a keyset was invalidated
                  event InvalidateKeyset(bytes32 indexed keysetHash);
                  function totalDelayedMessagesRead() external view returns (uint256);
                  function bridge() external view returns (IBridge);
                  /// @dev The size of the batch header
                  // solhint-disable-next-line func-name-mixedcase
                  function HEADER_LENGTH() external view returns (uint256);
                  /// @dev If the first batch data byte after the header has this bit set,
                  ///      the sequencer inbox has authenticated the data. Currently not used.
                  // solhint-disable-next-line func-name-mixedcase
                  function DATA_AUTHENTICATED_FLAG() external view returns (bytes1);
                  function rollup() external view returns (IOwnable);
                  function isBatchPoster(address) external view returns (bool);
                  struct DasKeySetInfo {
                      bool isValidKeyset;
                      uint64 creationBlock;
                  }
                  // https://github.com/ethereum/solidity/issues/11826
                  // function maxTimeVariation() external view returns (MaxTimeVariation calldata);
                  // function dasKeySetInfo(bytes32) external view returns (DasKeySetInfo calldata);
                  /// @notice Remove force inclusion delay after a L1 chainId fork
                  function removeDelayAfterFork() external;
                  /// @notice Force messages from the delayed inbox to be included in the chain
                  ///         Callable by any address, but message can only be force-included after maxTimeVariation.delayBlocks and
                  ///         maxTimeVariation.delaySeconds has elapsed. As part of normal behaviour the sequencer will include these
                  ///         messages so it's only necessary to call this if the sequencer is down, or not including any delayed messages.
                  /// @param _totalDelayedMessagesRead The total number of messages to read up to
                  /// @param kind The kind of the last message to be included
                  /// @param l1BlockAndTime The l1 block and the l1 timestamp of the last message to be included
                  /// @param baseFeeL1 The l1 gas price of the last message to be included
                  /// @param sender The sender of the last message to be included
                  /// @param messageDataHash The messageDataHash of the last message to be included
                  function forceInclusion(
                      uint256 _totalDelayedMessagesRead,
                      uint8 kind,
                      uint64[2] calldata l1BlockAndTime,
                      uint256 baseFeeL1,
                      address sender,
                      bytes32 messageDataHash
                  ) external;
                  function inboxAccs(uint256 index) external view returns (bytes32);
                  function batchCount() external view returns (uint256);
                  function isValidKeysetHash(bytes32 ksHash) external view returns (bool);
                  /// @notice the creation block is intended to still be available after a keyset is deleted
                  function getKeysetCreationBlock(bytes32 ksHash) external view returns (uint256);
                  // ---------- BatchPoster functions ----------
                  function addSequencerL2BatchFromOrigin(
                      uint256 sequenceNumber,
                      bytes calldata data,
                      uint256 afterDelayedMessagesRead,
                      IGasRefunder gasRefunder
                  ) external;
                  function addSequencerL2Batch(
                      uint256 sequenceNumber,
                      bytes calldata data,
                      uint256 afterDelayedMessagesRead,
                      IGasRefunder gasRefunder,
                      uint256 prevMessageCount,
                      uint256 newMessageCount
                  ) external;
                  // ---------- onlyRollupOrOwner functions ----------
                  /**
                   * @notice Set max delay for sequencer inbox
                   * @param maxTimeVariation_ the maximum time variation parameters
                   */
                  function setMaxTimeVariation(MaxTimeVariation memory maxTimeVariation_) external;
                  /**
                   * @notice Updates whether an address is authorized to be a batch poster at the sequencer inbox
                   * @param addr the address
                   * @param isBatchPoster_ if the specified address should be authorized as a batch poster
                   */
                  function setIsBatchPoster(address addr, bool isBatchPoster_) external;
                  /**
                   * @notice Makes Data Availability Service keyset valid
                   * @param keysetBytes bytes of the serialized keyset
                   */
                  function setValidKeyset(bytes calldata keysetBytes) external;
                  /**
                   * @notice Invalidates a Data Availability Service keyset
                   * @param ksHash hash of the keyset
                   */
                  function invalidateKeysetHash(bytes32 ksHash) external;
                  // ---------- initializer ----------
                  function initialize(IBridge bridge_, MaxTimeVariation calldata maxTimeVariation_) external;
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "./RollupLib.sol";
              import "./IRollupCore.sol";
              import "../bridge/ISequencerInbox.sol";
              import "../bridge/IOutbox.sol";
              import "../bridge/IOwnable.sol";
              interface IRollupUserAbs is IRollupCore, IOwnable {
                  /// @dev the user logic just validated configuration and shouldn't write to state during init
                  /// this allows the admin logic to ensure consistency on parameters.
                  function initialize(address stakeToken) external view;
                  function removeWhitelistAfterFork() external;
                  function removeWhitelistAfterValidatorAfk() external;
                  function isERC20Enabled() external view returns (bool);
                  function rejectNextNode(address stakerAddress) external;
                  function confirmNextNode(bytes32 blockHash, bytes32 sendRoot) external;
                  function stakeOnExistingNode(uint64 nodeNum, bytes32 nodeHash) external;
                  function stakeOnNewNode(
                      RollupLib.Assertion memory assertion,
                      bytes32 expectedNodeHash,
                      uint256 prevNodeInboxMaxCount
                  ) external;
                  function returnOldDeposit(address stakerAddress) external;
                  function reduceDeposit(uint256 target) external;
                  function removeZombie(uint256 zombieNum, uint256 maxNodes) external;
                  function removeOldZombies(uint256 startIndex) external;
                  function requiredStake(
                      uint256 blockNumber,
                      uint64 firstUnresolvedNodeNum,
                      uint64 latestCreatedNode
                  ) external view returns (uint256);
                  function currentRequiredStake() external view returns (uint256);
                  function countStakedZombies(uint64 nodeNum) external view returns (uint256);
                  function countZombiesStakedOnChildren(uint64 nodeNum) external view returns (uint256);
                  function requireUnresolvedExists() external view;
                  function requireUnresolved(uint256 nodeNum) external view;
                  function withdrawStakerFunds() external returns (uint256);
                  function createChallenge(
                      address[2] calldata stakers,
                      uint64[2] calldata nodeNums,
                      MachineStatus[2] calldata machineStatuses,
                      GlobalState[2] calldata globalStates,
                      uint64 numBlocks,
                      bytes32 secondExecutionHash,
                      uint256[2] calldata proposedTimes,
                      bytes32[2] calldata wasmModuleRoots
                  ) external;
              }
              interface IRollupUser is IRollupUserAbs {
                  function newStakeOnExistingNode(uint64 nodeNum, bytes32 nodeHash) external payable;
                  function newStakeOnNewNode(
                      RollupLib.Assertion calldata assertion,
                      bytes32 expectedNodeHash,
                      uint256 prevNodeInboxMaxCount
                  ) external payable;
                  function addToDeposit(address stakerAddress) external payable;
              }
              interface IRollupUserERC20 is IRollupUserAbs {
                  function newStakeOnExistingNode(
                      uint256 tokenAmount,
                      uint64 nodeNum,
                      bytes32 nodeHash
                  ) external;
                  function newStakeOnNewNode(
                      uint256 tokenAmount,
                      RollupLib.Assertion calldata assertion,
                      bytes32 expectedNodeHash,
                      uint256 prevNodeInboxMaxCount
                  ) external;
                  function addToDeposit(address stakerAddress, uint256 tokenAmount) external;
              }
              interface IRollupAdmin {
                  event OwnerFunctionCalled(uint256 indexed id);
                  function initialize(Config calldata config, ContractDependencies calldata connectedContracts)
                      external;
                  /**
                   * @notice Add a contract authorized to put messages into this rollup's inbox
                   * @param _outbox Outbox contract to add
                   */
                  function setOutbox(IOutbox _outbox) external;
                  /**
                   * @notice Disable an old outbox from interacting with the bridge
                   * @param _outbox Outbox contract to remove
                   */
                  function removeOldOutbox(address _outbox) external;
                  /**
                   * @notice Enable or disable an inbox contract
                   * @param _inbox Inbox contract to add or remove
                   * @param _enabled New status of inbox
                   */
                  function setDelayedInbox(address _inbox, bool _enabled) external;
                  /**
                   * @notice Pause interaction with the rollup contract
                   */
                  function pause() external;
                  /**
                   * @notice Resume interaction with the rollup contract
                   */
                  function resume() external;
                  /**
                   * @notice Set the addresses of the validator whitelist
                   * @dev It is expected that both arrays are same length, and validator at
                   * position i corresponds to the value at position i
                   * @param _validator addresses to set in the whitelist
                   * @param _val value to set in the whitelist for corresponding address
                   */
                  function setValidator(address[] memory _validator, bool[] memory _val) external;
                  /**
                   * @notice Set a new owner address for the rollup proxy
                   * @param newOwner address of new rollup owner
                   */
                  function setOwner(address newOwner) external;
                  /**
                   * @notice Set minimum assertion period for the rollup
                   * @param newPeriod new minimum period for assertions
                   */
                  function setMinimumAssertionPeriod(uint256 newPeriod) external;
                  /**
                   * @notice Set number of blocks until a node is considered confirmed
                   * @param newConfirmPeriod new number of blocks until a node is confirmed
                   */
                  function setConfirmPeriodBlocks(uint64 newConfirmPeriod) external;
                  /**
                   * @notice Set number of extra blocks after a challenge
                   * @param newExtraTimeBlocks new number of blocks
                   */
                  function setExtraChallengeTimeBlocks(uint64 newExtraTimeBlocks) external;
                  /**
                   * @notice Set base stake required for an assertion
                   * @param newBaseStake maximum avmgas to be used per block
                   */
                  function setBaseStake(uint256 newBaseStake) external;
                  /**
                   * @notice Set the token used for stake, where address(0) == eth
                   * @dev Before changing the base stake token, you might need to change the
                   * implementation of the Rollup User logic!
                   * @param newStakeToken address of token used for staking
                   */
                  function setStakeToken(address newStakeToken) external;
                  /**
                   * @notice Upgrades the implementation of a beacon controlled by the rollup
                   * @param beacon address of beacon to be upgraded
                   * @param newImplementation new address of implementation
                   */
                  function upgradeBeacon(address beacon, address newImplementation) external;
                  function forceResolveChallenge(address[] memory stackerA, address[] memory stackerB) external;
                  function forceRefundStaker(address[] memory stacker) external;
                  function forceCreateNode(
                      uint64 prevNode,
                      uint256 prevNodeInboxMaxCount,
                      RollupLib.Assertion memory assertion,
                      bytes32 expectedNodeHash
                  ) external;
                  function forceConfirmNode(
                      uint64 nodeNum,
                      bytes32 blockHash,
                      bytes32 sendRoot
                  ) external;
                  function setLoserStakeEscrow(address newLoserStakerEscrow) external;
                  /**
                   * @notice Set the proving WASM module root
                   * @param newWasmModuleRoot new module root
                   */
                  function setWasmModuleRoot(bytes32 newWasmModuleRoot) external;
                  /**
                   * @notice set a new sequencer inbox contract
                   * @param _sequencerInbox new address of sequencer inbox
                   */
                  function setSequencerInbox(address _sequencerInbox) external;
                  /**
                   * @notice set the validatorWhitelistDisabled flag
                   * @param _validatorWhitelistDisabled new value of validatorWhitelistDisabled, i.e. true = disabled
                   */
                  function setValidatorWhitelistDisabled(bool _validatorWhitelistDisabled) external;
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              library Messages {
                  function messageHash(
                      uint8 kind,
                      address sender,
                      uint64 blockNumber,
                      uint64 timestamp,
                      uint256 inboxSeqNum,
                      uint256 baseFeeL1,
                      bytes32 messageDataHash
                  ) internal pure returns (bytes32) {
                      return
                          keccak256(
                              abi.encodePacked(
                                  kind,
                                  sender,
                                  blockNumber,
                                  timestamp,
                                  inboxSeqNum,
                                  baseFeeL1,
                                  messageDataHash
                              )
                          );
                  }
                  function accumulateInboxMessage(bytes32 prevAcc, bytes32 message)
                      internal
                      pure
                      returns (bytes32)
                  {
                      return keccak256(abi.encodePacked(prevAcc, message));
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.4;
              uint8 constant L2_MSG = 3;
              uint8 constant L1MessageType_L2FundedByL1 = 7;
              uint8 constant L1MessageType_submitRetryableTx = 9;
              uint8 constant L1MessageType_ethDeposit = 12;
              uint8 constant L1MessageType_batchPostingReport = 13;
              uint8 constant L2MessageType_unsignedEOATx = 0;
              uint8 constant L2MessageType_unsignedContractTx = 1;
              uint8 constant ROLLUP_PROTOCOL_EVENT_TYPE = 8;
              uint8 constant INITIALIZATION_MSG_TYPE = 11;
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              // solhint-disable-next-line compiler-version
              pragma solidity >=0.6.9 <0.9.0;
              interface IGasRefunder {
                  function onGasSpent(
                      address payable spender,
                      uint256 gasUsed,
                      uint256 calldataSize
                  ) external returns (bool success);
              }
              abstract contract GasRefundEnabled {
                  /// @dev this refunds the sender for execution costs of the tx
                  /// calldata costs are only refunded if `msg.sender == tx.origin` to guarantee the value refunded relates to charging
                  /// for the `tx.input`. this avoids a possible attack where you generate large calldata from a contract and get over-refunded
                  modifier refundsGas(IGasRefunder gasRefunder) {
                      uint256 startGasLeft = gasleft();
                      _;
                      if (address(gasRefunder) != address(0)) {
                          uint256 calldataSize;
                          assembly {
                              calldataSize := calldatasize()
                          }
                          uint256 calldataWords = (calldataSize + 31) / 32;
                          // account for the CALLDATACOPY cost of the proxy contract, including the memory expansion cost
                          startGasLeft += calldataWords * 6 + (calldataWords**2) / 512;
                          // if triggered in a contract call, the spender may be overrefunded by appending dummy data to the call
                          // so we check if it is a top level call, which would mean the sender paid calldata as part of tx.input
                          // solhint-disable-next-line avoid-tx-origin
                          if (msg.sender != tx.origin) {
                              // We can't be sure if this calldata came from the top level tx,
                              // so to be safe we tell the gas refunder there was no calldata.
                              calldataSize = 0;
                          }
                          gasRefunder.onGasSpent(payable(msg.sender), startGasLeft - gasleft(), calldataSize);
                      }
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import {NotOwner} from "./Error.sol";
              /// @dev A stateless contract that allows you to infer if the current call has been delegated or not
              /// Pattern used here is from UUPS implementation by the OpenZeppelin team
              abstract contract DelegateCallAware {
                  address private immutable __self = address(this);
                  /**
                   * @dev Check that the execution is being performed through a delegate call. This allows a function to be
                   * callable on the proxy contract but not on the logic contract.
                   */
                  modifier onlyDelegated() {
                      require(address(this) != __self, "Function must be called through delegatecall");
                      _;
                  }
                  /**
                   * @dev Check that the execution is not being performed through a delegate call. This allows a function to be
                   * callable on the implementing contract but not through proxies.
                   */
                  modifier notDelegated() {
                      require(address(this) == __self, "Function must not be called through delegatecall");
                      _;
                  }
                  /// @dev Check that msg.sender is the current EIP 1967 proxy admin
                  modifier onlyProxyOwner() {
                      // Storage slot with the admin of the proxy contract
                      // This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1
                      bytes32 slot = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;
                      address admin;
                      assembly {
                          admin := sload(slot)
                      }
                      if (msg.sender != admin) revert NotOwner(msg.sender, admin);
                      _;
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.4;
              // 90% of Geth's 128KB tx size limit, leaving ~13KB for proving
              uint256 constant MAX_DATA_SIZE = 117964;
              uint64 constant NO_CHAL_INDEX = 0;
              // Expected seconds per block in Ethereum PoS
              uint256 constant ETH_POS_BLOCK_TIME = 12;
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              // solhint-disable-next-line compiler-version
              pragma solidity >=0.4.21 <0.9.0;
              interface IOwnable {
                  function owner() external view returns (address);
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              // solhint-disable-next-line compiler-version
              pragma solidity >=0.6.9 <0.9.0;
              interface IDelayedMessageProvider {
                  /// @dev event emitted when a inbox message is added to the Bridge's delayed accumulator
                  event InboxMessageDelivered(uint256 indexed messageNum, bytes data);
                  /// @dev event emitted when a inbox message is added to the Bridge's delayed accumulator
                  /// same as InboxMessageDelivered but the batch data is available in tx.input
                  event InboxMessageDeliveredFromOrigin(uint256 indexed messageNum);
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "../challenge/IChallengeManager.sol";
              import "../challenge/ChallengeLib.sol";
              import "../state/GlobalState.sol";
              import "../bridge/ISequencerInbox.sol";
              import "../bridge/IBridge.sol";
              import "../bridge/IOutbox.sol";
              import "../bridge/IInbox.sol";
              import "./IRollupEventInbox.sol";
              import "./IRollupLogic.sol";
              struct Config {
                  uint64 confirmPeriodBlocks;
                  uint64 extraChallengeTimeBlocks;
                  address stakeToken;
                  uint256 baseStake;
                  bytes32 wasmModuleRoot;
                  address owner;
                  address loserStakeEscrow;
                  uint256 chainId;
                  uint64 genesisBlockNum;
                  ISequencerInbox.MaxTimeVariation sequencerInboxMaxTimeVariation;
              }
              struct ContractDependencies {
                  IBridge bridge;
                  ISequencerInbox sequencerInbox;
                  IInbox inbox;
                  IOutbox outbox;
                  IRollupEventInbox rollupEventInbox;
                  IChallengeManager challengeManager;
                  IRollupAdmin rollupAdminLogic;
                  IRollupUser rollupUserLogic;
                  // misc contracts that are useful when interacting with the rollup
                  address validatorUtils;
                  address validatorWalletCreator;
              }
              library RollupLib {
                  using GlobalStateLib for GlobalState;
                  struct ExecutionState {
                      GlobalState globalState;
                      MachineStatus machineStatus;
                  }
                  function stateHash(ExecutionState calldata execState, uint256 inboxMaxCount)
                      internal
                      pure
                      returns (bytes32)
                  {
                      return
                          keccak256(
                              abi.encodePacked(
                                  execState.globalState.hash(),
                                  inboxMaxCount,
                                  execState.machineStatus
                              )
                          );
                  }
                  /// @dev same as stateHash but expects execState in memory instead of calldata
                  function stateHashMem(ExecutionState memory execState, uint256 inboxMaxCount)
                      internal
                      pure
                      returns (bytes32)
                  {
                      return
                          keccak256(
                              abi.encodePacked(
                                  execState.globalState.hash(),
                                  inboxMaxCount,
                                  execState.machineStatus
                              )
                          );
                  }
                  struct Assertion {
                      ExecutionState beforeState;
                      ExecutionState afterState;
                      uint64 numBlocks;
                  }
                  function executionHash(Assertion memory assertion) internal pure returns (bytes32) {
                      MachineStatus[2] memory statuses;
                      statuses[0] = assertion.beforeState.machineStatus;
                      statuses[1] = assertion.afterState.machineStatus;
                      GlobalState[2] memory globalStates;
                      globalStates[0] = assertion.beforeState.globalState;
                      globalStates[1] = assertion.afterState.globalState;
                      // TODO: benchmark how much this abstraction adds of gas overhead
                      return executionHash(statuses, globalStates, assertion.numBlocks);
                  }
                  function executionHash(
                      MachineStatus[2] memory statuses,
                      GlobalState[2] memory globalStates,
                      uint64 numBlocks
                  ) internal pure returns (bytes32) {
                      bytes32[] memory segments = new bytes32[](2);
                      segments[0] = ChallengeLib.blockStateHash(statuses[0], globalStates[0].hash());
                      segments[1] = ChallengeLib.blockStateHash(statuses[1], globalStates[1].hash());
                      return ChallengeLib.hashChallengeState(0, numBlocks, segments);
                  }
                  function challengeRootHash(
                      bytes32 execution,
                      uint256 proposedTime,
                      bytes32 wasmModuleRoot
                  ) internal pure returns (bytes32) {
                      return keccak256(abi.encodePacked(execution, proposedTime, wasmModuleRoot));
                  }
                  function confirmHash(Assertion memory assertion) internal pure returns (bytes32) {
                      return
                          confirmHash(
                              assertion.afterState.globalState.getBlockHash(),
                              assertion.afterState.globalState.getSendRoot()
                          );
                  }
                  function confirmHash(bytes32 blockHash, bytes32 sendRoot) internal pure returns (bytes32) {
                      return keccak256(abi.encodePacked(blockHash, sendRoot));
                  }
                  function nodeHash(
                      bool hasSibling,
                      bytes32 lastHash,
                      bytes32 assertionExecHash,
                      bytes32 inboxAcc,
                      bytes32 wasmModuleRoot
                  ) internal pure returns (bytes32) {
                      uint8 hasSiblingInt = hasSibling ? 1 : 0;
                      return
                          keccak256(
                              abi.encodePacked(
                                  hasSiblingInt,
                                  lastHash,
                                  assertionExecHash,
                                  inboxAcc,
                                  wasmModuleRoot
                              )
                          );
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "./Node.sol";
              import "./RollupLib.sol";
              interface IRollupCore {
                  struct Staker {
                      uint256 amountStaked;
                      uint64 index;
                      uint64 latestStakedNode;
                      // currentChallenge is 0 if staker is not in a challenge
                      uint64 currentChallenge;
                      bool isStaked;
                  }
                  event RollupInitialized(bytes32 machineHash, uint256 chainId);
                  event NodeCreated(
                      uint64 indexed nodeNum,
                      bytes32 indexed parentNodeHash,
                      bytes32 indexed nodeHash,
                      bytes32 executionHash,
                      RollupLib.Assertion assertion,
                      bytes32 afterInboxBatchAcc,
                      bytes32 wasmModuleRoot,
                      uint256 inboxMaxCount
                  );
                  event NodeConfirmed(uint64 indexed nodeNum, bytes32 blockHash, bytes32 sendRoot);
                  event NodeRejected(uint64 indexed nodeNum);
                  event RollupChallengeStarted(
                      uint64 indexed challengeIndex,
                      address asserter,
                      address challenger,
                      uint64 challengedNode
                  );
                  event UserStakeUpdated(address indexed user, uint256 initialBalance, uint256 finalBalance);
                  event UserWithdrawableFundsUpdated(
                      address indexed user,
                      uint256 initialBalance,
                      uint256 finalBalance
                  );
                  function confirmPeriodBlocks() external view returns (uint64);
                  function extraChallengeTimeBlocks() external view returns (uint64);
                  function chainId() external view returns (uint256);
                  function baseStake() external view returns (uint256);
                  function wasmModuleRoot() external view returns (bytes32);
                  function bridge() external view returns (IBridge);
                  function sequencerInbox() external view returns (ISequencerInbox);
                  function outbox() external view returns (IOutbox);
                  function rollupEventInbox() external view returns (IRollupEventInbox);
                  function challengeManager() external view returns (IChallengeManager);
                  function loserStakeEscrow() external view returns (address);
                  function stakeToken() external view returns (address);
                  function minimumAssertionPeriod() external view returns (uint256);
                  function isValidator(address) external view returns (bool);
                  function validatorWhitelistDisabled() external view returns (bool);
                  /**
                   * @notice Get the Node for the given index.
                   */
                  function getNode(uint64 nodeNum) external view returns (Node memory);
                  /**
                   * @notice Check if the specified node has been staked on by the provided staker.
                   * Only accurate at the latest confirmed node and afterwards.
                   */
                  function nodeHasStaker(uint64 nodeNum, address staker) external view returns (bool);
                  /**
                   * @notice Get the address of the staker at the given index
                   * @param stakerNum Index of the staker
                   * @return Address of the staker
                   */
                  function getStakerAddress(uint64 stakerNum) external view returns (address);
                  /**
                   * @notice Check whether the given staker is staked
                   * @param staker Staker address to check
                   * @return True or False for whether the staker was staked
                   */
                  function isStaked(address staker) external view returns (bool);
                  /**
                   * @notice Get the latest staked node of the given staker
                   * @param staker Staker address to lookup
                   * @return Latest node staked of the staker
                   */
                  function latestStakedNode(address staker) external view returns (uint64);
                  /**
                   * @notice Get the current challenge of the given staker
                   * @param staker Staker address to lookup
                   * @return Current challenge of the staker
                   */
                  function currentChallenge(address staker) external view returns (uint64);
                  /**
                   * @notice Get the amount staked of the given staker
                   * @param staker Staker address to lookup
                   * @return Amount staked of the staker
                   */
                  function amountStaked(address staker) external view returns (uint256);
                  /**
                   * @notice Retrieves stored information about a requested staker
                   * @param staker Staker address to retrieve
                   * @return A structure with information about the requested staker
                   */
                  function getStaker(address staker) external view returns (Staker memory);
                  /**
                   * @notice Get the original staker address of the zombie at the given index
                   * @param zombieNum Index of the zombie to lookup
                   * @return Original staker address of the zombie
                   */
                  function zombieAddress(uint256 zombieNum) external view returns (address);
                  /**
                   * @notice Get Latest node that the given zombie at the given index is staked on
                   * @param zombieNum Index of the zombie to lookup
                   * @return Latest node that the given zombie is staked on
                   */
                  function zombieLatestStakedNode(uint256 zombieNum) external view returns (uint64);
                  /// @return Current number of un-removed zombies
                  function zombieCount() external view returns (uint256);
                  function isZombie(address staker) external view returns (bool);
                  /**
                   * @notice Get the amount of funds withdrawable by the given address
                   * @param owner Address to check the funds of
                   * @return Amount of funds withdrawable by owner
                   */
                  function withdrawableFunds(address owner) external view returns (uint256);
                  /**
                   * @return Index of the first unresolved node
                   * @dev If all nodes have been resolved, this will be latestNodeCreated + 1
                   */
                  function firstUnresolvedNode() external view returns (uint64);
                  /// @return Index of the latest confirmed node
                  function latestConfirmed() external view returns (uint64);
                  /// @return Index of the latest rollup node created
                  function latestNodeCreated() external view returns (uint64);
                  /// @return Ethereum block that the most recent stake was created
                  function lastStakeBlock() external view returns (uint64);
                  /// @return Number of active stakers currently staked
                  function stakerCount() external view returns (uint64);
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              // solhint-disable-next-line compiler-version
              pragma solidity >=0.6.9 <0.9.0;
              import "./IBridge.sol";
              interface IOutbox {
                  event SendRootUpdated(bytes32 indexed outputRoot, bytes32 indexed l2BlockHash);
                  event OutBoxTransactionExecuted(
                      address indexed to,
                      address indexed l2Sender,
                      uint256 indexed zero,
                      uint256 transactionIndex
                  );
                  function rollup() external view returns (address); // the rollup contract
                  function bridge() external view returns (IBridge); // the bridge contract
                  function spent(uint256) external view returns (bytes32); // packed spent bitmap
                  function roots(bytes32) external view returns (bytes32); // maps root hashes => L2 block hash
                  // solhint-disable-next-line func-name-mixedcase
                  function OUTBOX_VERSION() external view returns (uint128); // the outbox version
                  function updateSendRoot(bytes32 sendRoot, bytes32 l2BlockHash) external;
                  /// @notice When l2ToL1Sender returns a nonzero address, the message was originated by an L2 account
                  ///         When the return value is zero, that means this is a system message
                  /// @dev the l2ToL1Sender behaves as the tx.origin, the msg.sender should be validated to protect against reentrancies
                  function l2ToL1Sender() external view returns (address);
                  /// @return l2Block return L2 block when the L2 tx was initiated or 0 if no L2 to L1 transaction is active
                  function l2ToL1Block() external view returns (uint256);
                  /// @return l1Block return L1 block when the L2 tx was initiated or 0 if no L2 to L1 transaction is active
                  function l2ToL1EthBlock() external view returns (uint256);
                  /// @return timestamp return L2 timestamp when the L2 tx was initiated or 0 if no L2 to L1 transaction is active
                  function l2ToL1Timestamp() external view returns (uint256);
                  /// @return outputId returns the unique output identifier of the L2 to L1 tx or 0 if no L2 to L1 transaction is active
                  function l2ToL1OutputId() external view returns (bytes32);
                  /**
                   * @notice Executes a messages in an Outbox entry.
                   * @dev Reverts if dispute period hasn't expired, since the outbox entry
                   *      is only created once the rollup confirms the respective assertion.
                   * @dev it is not possible to execute any L2-to-L1 transaction which contains data
                   *      to a contract address without any code (as enforced by the Bridge contract).
                   * @param proof Merkle proof of message inclusion in send root
                   * @param index Merkle path to message
                   * @param l2Sender sender if original message (i.e., caller of ArbSys.sendTxToL1)
                   * @param to destination address for L1 contract call
                   * @param l2Block l2 block number at which sendTxToL1 call was made
                   * @param l1Block l1 block number at which sendTxToL1 call was made
                   * @param l2Timestamp l2 Timestamp at which sendTxToL1 call was made
                   * @param value wei in L1 message
                   * @param data abi-encoded L1 message data
                   */
                  function executeTransaction(
                      bytes32[] calldata proof,
                      uint256 index,
                      address l2Sender,
                      address to,
                      uint256 l2Block,
                      uint256 l1Block,
                      uint256 l2Timestamp,
                      uint256 value,
                      bytes calldata data
                  ) external;
                  /**
                   *  @dev function used to simulate the result of a particular function call from the outbox
                   *       it is useful for things such as gas estimates. This function includes all costs except for
                   *       proof validation (which can be considered offchain as a somewhat of a fixed cost - it's
                   *       not really a fixed cost, but can be treated as so with a fixed overhead for gas estimation).
                   *       We can't include the cost of proof validation since this is intended to be used to simulate txs
                   *       that are included in yet-to-be confirmed merkle roots. The simulation entrypoint could instead pretend
                   *       to confirm a pending merkle root, but that would be less practical for integrating with tooling.
                   *       It is only possible to trigger it when the msg sender is address zero, which should be impossible
                   *       unless under simulation in an eth_call or eth_estimateGas
                   */
                  function executeTransactionSimulation(
                      uint256 index,
                      address l2Sender,
                      address to,
                      uint256 l2Block,
                      uint256 l1Block,
                      uint256 l2Timestamp,
                      uint256 value,
                      bytes calldata data
                  ) external;
                  /**
                   * @param index Merkle path to message
                   * @return true if the message has been spent
                   */
                  function isSpent(uint256 index) external view returns (bool);
                  function calculateItemHash(
                      address l2Sender,
                      address to,
                      uint256 l2Block,
                      uint256 l1Block,
                      uint256 l2Timestamp,
                      uint256 value,
                      bytes calldata data
                  ) external pure returns (bytes32);
                  function calculateMerkleRoot(
                      bytes32[] memory proof,
                      uint256 path,
                      bytes32 item
                  ) external pure returns (bytes32);
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "../state/Machine.sol";
              import "../bridge/IBridge.sol";
              import "../bridge/ISequencerInbox.sol";
              import "../osp/IOneStepProofEntry.sol";
              import "./IChallengeResultReceiver.sol";
              import "./ChallengeLib.sol";
              interface IChallengeManager {
                  enum ChallengeTerminationType {
                      TIMEOUT,
                      BLOCK_PROOF,
                      EXECUTION_PROOF,
                      CLEARED
                  }
                  event InitiatedChallenge(
                      uint64 indexed challengeIndex,
                      GlobalState startState,
                      GlobalState endState
                  );
                  event Bisected(
                      uint64 indexed challengeIndex,
                      bytes32 indexed challengeRoot,
                      uint256 challengedSegmentStart,
                      uint256 challengedSegmentLength,
                      bytes32[] chainHashes
                  );
                  event ExecutionChallengeBegun(uint64 indexed challengeIndex, uint256 blockSteps);
                  event OneStepProofCompleted(uint64 indexed challengeIndex);
                  event ChallengeEnded(uint64 indexed challengeIndex, ChallengeTerminationType kind);
                  function initialize(
                      IChallengeResultReceiver resultReceiver_,
                      ISequencerInbox sequencerInbox_,
                      IBridge bridge_,
                      IOneStepProofEntry osp_
                  ) external;
                  function createChallenge(
                      bytes32 wasmModuleRoot_,
                      MachineStatus[2] calldata startAndEndMachineStatuses_,
                      GlobalState[2] calldata startAndEndGlobalStates_,
                      uint64 numBlocks,
                      address asserter_,
                      address challenger_,
                      uint256 asserterTimeLeft_,
                      uint256 challengerTimeLeft_
                  ) external returns (uint64);
                  function challengeInfo(uint64 challengeIndex_)
                      external
                      view
                      returns (ChallengeLib.Challenge memory);
                  function currentResponder(uint64 challengeIndex) external view returns (address);
                  function isTimedOut(uint64 challengeIndex) external view returns (bool);
                  function clearChallenge(uint64 challengeIndex_) external;
                  function timeout(uint64 challengeIndex_) external;
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "../state/Machine.sol";
              import "../state/GlobalState.sol";
              library ChallengeLib {
                  using MachineLib for Machine;
                  using ChallengeLib for Challenge;
                  /// @dev It's assumed that that uninitialzed challenges have mode NONE
                  enum ChallengeMode {
                      NONE,
                      BLOCK,
                      EXECUTION
                  }
                  struct Participant {
                      address addr;
                      uint256 timeLeft;
                  }
                  struct Challenge {
                      Participant current;
                      Participant next;
                      uint256 lastMoveTimestamp;
                      bytes32 wasmModuleRoot;
                      bytes32 challengeStateHash;
                      uint64 maxInboxMessages;
                      ChallengeMode mode;
                  }
                  struct SegmentSelection {
                      uint256 oldSegmentsStart;
                      uint256 oldSegmentsLength;
                      bytes32[] oldSegments;
                      uint256 challengePosition;
                  }
                  function timeUsedSinceLastMove(Challenge storage challenge) internal view returns (uint256) {
                      return block.timestamp - challenge.lastMoveTimestamp;
                  }
                  function isTimedOut(Challenge storage challenge) internal view returns (bool) {
                      return challenge.timeUsedSinceLastMove() > challenge.current.timeLeft;
                  }
                  function getStartMachineHash(bytes32 globalStateHash, bytes32 wasmModuleRoot)
                      internal
                      pure
                      returns (bytes32)
                  {
                      // Start the value stack with the function call ABI for the entrypoint
                      Value[] memory startingValues = new Value[](3);
                      startingValues[0] = ValueLib.newRefNull();
                      startingValues[1] = ValueLib.newI32(0);
                      startingValues[2] = ValueLib.newI32(0);
                      ValueArray memory valuesArray = ValueArray({inner: startingValues});
                      ValueStack memory values = ValueStack({proved: valuesArray, remainingHash: 0});
                      ValueStack memory internalStack;
                      StackFrameWindow memory frameStack;
                      Machine memory mach = Machine({
                          status: MachineStatus.RUNNING,
                          valueStack: values,
                          internalStack: internalStack,
                          frameStack: frameStack,
                          globalStateHash: globalStateHash,
                          moduleIdx: 0,
                          functionIdx: 0,
                          functionPc: 0,
                          modulesRoot: wasmModuleRoot
                      });
                      return mach.hash();
                  }
                  function getEndMachineHash(MachineStatus status, bytes32 globalStateHash)
                      internal
                      pure
                      returns (bytes32)
                  {
                      if (status == MachineStatus.FINISHED) {
                          return keccak256(abi.encodePacked("Machine finished:", globalStateHash));
                      } else if (status == MachineStatus.ERRORED) {
                          return keccak256(abi.encodePacked("Machine errored:"));
                      } else if (status == MachineStatus.TOO_FAR) {
                          return keccak256(abi.encodePacked("Machine too far:"));
                      } else {
                          revert("BAD_BLOCK_STATUS");
                      }
                  }
                  function extractChallengeSegment(SegmentSelection calldata selection)
                      internal
                      pure
                      returns (uint256 segmentStart, uint256 segmentLength)
                  {
                      uint256 oldChallengeDegree = selection.oldSegments.length - 1;
                      segmentLength = selection.oldSegmentsLength / oldChallengeDegree;
                      // Intentionally done before challengeLength is potentially added to for the final segment
                      segmentStart = selection.oldSegmentsStart + segmentLength * selection.challengePosition;
                      if (selection.challengePosition == selection.oldSegments.length - 2) {
                          segmentLength += selection.oldSegmentsLength % oldChallengeDegree;
                      }
                  }
                  function hashChallengeState(
                      uint256 segmentsStart,
                      uint256 segmentsLength,
                      bytes32[] memory segments
                  ) internal pure returns (bytes32) {
                      return keccak256(abi.encodePacked(segmentsStart, segmentsLength, segments));
                  }
                  function blockStateHash(MachineStatus status, bytes32 globalStateHash)
                      internal
                      pure
                      returns (bytes32)
                  {
                      if (status == MachineStatus.FINISHED) {
                          return keccak256(abi.encodePacked("Block state:", globalStateHash));
                      } else if (status == MachineStatus.ERRORED) {
                          return keccak256(abi.encodePacked("Block state, errored:", globalStateHash));
                      } else if (status == MachineStatus.TOO_FAR) {
                          return keccak256(abi.encodePacked("Block state, too far:"));
                      } else {
                          revert("BAD_BLOCK_STATUS");
                      }
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              struct GlobalState {
                  bytes32[2] bytes32Vals;
                  uint64[2] u64Vals;
              }
              library GlobalStateLib {
                  uint16 internal constant BYTES32_VALS_NUM = 2;
                  uint16 internal constant U64_VALS_NUM = 2;
                  function hash(GlobalState memory state) internal pure returns (bytes32) {
                      return
                          keccak256(
                              abi.encodePacked(
                                  "Global state:",
                                  state.bytes32Vals[0],
                                  state.bytes32Vals[1],
                                  state.u64Vals[0],
                                  state.u64Vals[1]
                              )
                          );
                  }
                  function getBlockHash(GlobalState memory state) internal pure returns (bytes32) {
                      return state.bytes32Vals[0];
                  }
                  function getSendRoot(GlobalState memory state) internal pure returns (bytes32) {
                      return state.bytes32Vals[1];
                  }
                  function getInboxPosition(GlobalState memory state) internal pure returns (uint64) {
                      return state.u64Vals[0];
                  }
                  function getPositionInMessage(GlobalState memory state) internal pure returns (uint64) {
                      return state.u64Vals[1];
                  }
                  function isEmpty(GlobalState calldata state) internal pure returns (bool) {
                      return (state.bytes32Vals[0] == bytes32(0) &&
                          state.bytes32Vals[1] == bytes32(0) &&
                          state.u64Vals[0] == 0 &&
                          state.u64Vals[1] == 0);
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "../bridge/IBridge.sol";
              interface IRollupEventInbox {
                  function bridge() external view returns (IBridge);
                  function initialize(IBridge _bridge) external;
                  function rollup() external view returns (address);
                  function rollupInitialized(uint256 chainId) external;
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "./ValueStack.sol";
              import "./Instructions.sol";
              import "./StackFrame.sol";
              enum MachineStatus {
                  RUNNING,
                  FINISHED,
                  ERRORED,
                  TOO_FAR
              }
              struct Machine {
                  MachineStatus status;
                  ValueStack valueStack;
                  ValueStack internalStack;
                  StackFrameWindow frameStack;
                  bytes32 globalStateHash;
                  uint32 moduleIdx;
                  uint32 functionIdx;
                  uint32 functionPc;
                  bytes32 modulesRoot;
              }
              library MachineLib {
                  using StackFrameLib for StackFrameWindow;
                  using ValueStackLib for ValueStack;
                  function hash(Machine memory mach) internal pure returns (bytes32) {
                      // Warning: the non-running hashes are replicated in Challenge
                      if (mach.status == MachineStatus.RUNNING) {
                          return
                              keccak256(
                                  abi.encodePacked(
                                      "Machine running:",
                                      mach.valueStack.hash(),
                                      mach.internalStack.hash(),
                                      mach.frameStack.hash(),
                                      mach.globalStateHash,
                                      mach.moduleIdx,
                                      mach.functionIdx,
                                      mach.functionPc,
                                      mach.modulesRoot
                                  )
                              );
                      } else if (mach.status == MachineStatus.FINISHED) {
                          return keccak256(abi.encodePacked("Machine finished:", mach.globalStateHash));
                      } else if (mach.status == MachineStatus.ERRORED) {
                          return keccak256(abi.encodePacked("Machine errored:"));
                      } else if (mach.status == MachineStatus.TOO_FAR) {
                          return keccak256(abi.encodePacked("Machine too far:"));
                      } else {
                          revert("BAD_MACH_STATUS");
                      }
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "./IOneStepProver.sol";
              library OneStepProofEntryLib {
                  uint256 internal constant MAX_STEPS = 1 << 43;
              }
              interface IOneStepProofEntry {
                  function proveOneStep(
                      ExecutionContext calldata execCtx,
                      uint256 machineStep,
                      bytes32 beforeHash,
                      bytes calldata proof
                  ) external view returns (bytes32 afterHash);
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              interface IChallengeResultReceiver {
                  function completeChallenge(
                      uint256 challengeIndex,
                      address winner,
                      address loser
                  ) external;
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "./Value.sol";
              import "./ValueArray.sol";
              struct ValueStack {
                  ValueArray proved;
                  bytes32 remainingHash;
              }
              library ValueStackLib {
                  using ValueLib for Value;
                  using ValueArrayLib for ValueArray;
                  function hash(ValueStack memory stack) internal pure returns (bytes32 h) {
                      h = stack.remainingHash;
                      uint256 len = stack.proved.length();
                      for (uint256 i = 0; i < len; i++) {
                          h = keccak256(abi.encodePacked("Value stack:", stack.proved.get(i).hash(), h));
                      }
                  }
                  function peek(ValueStack memory stack) internal pure returns (Value memory) {
                      uint256 len = stack.proved.length();
                      return stack.proved.get(len - 1);
                  }
                  function pop(ValueStack memory stack) internal pure returns (Value memory) {
                      return stack.proved.pop();
                  }
                  function push(ValueStack memory stack, Value memory val) internal pure {
                      return stack.proved.push(val);
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              struct Instruction {
                  uint16 opcode;
                  uint256 argumentData;
              }
              library Instructions {
                  uint16 internal constant UNREACHABLE = 0x00;
                  uint16 internal constant NOP = 0x01;
                  uint16 internal constant RETURN = 0x0F;
                  uint16 internal constant CALL = 0x10;
                  uint16 internal constant CALL_INDIRECT = 0x11;
                  uint16 internal constant LOCAL_GET = 0x20;
                  uint16 internal constant LOCAL_SET = 0x21;
                  uint16 internal constant GLOBAL_GET = 0x23;
                  uint16 internal constant GLOBAL_SET = 0x24;
                  uint16 internal constant I32_LOAD = 0x28;
                  uint16 internal constant I64_LOAD = 0x29;
                  uint16 internal constant F32_LOAD = 0x2A;
                  uint16 internal constant F64_LOAD = 0x2B;
                  uint16 internal constant I32_LOAD8_S = 0x2C;
                  uint16 internal constant I32_LOAD8_U = 0x2D;
                  uint16 internal constant I32_LOAD16_S = 0x2E;
                  uint16 internal constant I32_LOAD16_U = 0x2F;
                  uint16 internal constant I64_LOAD8_S = 0x30;
                  uint16 internal constant I64_LOAD8_U = 0x31;
                  uint16 internal constant I64_LOAD16_S = 0x32;
                  uint16 internal constant I64_LOAD16_U = 0x33;
                  uint16 internal constant I64_LOAD32_S = 0x34;
                  uint16 internal constant I64_LOAD32_U = 0x35;
                  uint16 internal constant I32_STORE = 0x36;
                  uint16 internal constant I64_STORE = 0x37;
                  uint16 internal constant F32_STORE = 0x38;
                  uint16 internal constant F64_STORE = 0x39;
                  uint16 internal constant I32_STORE8 = 0x3A;
                  uint16 internal constant I32_STORE16 = 0x3B;
                  uint16 internal constant I64_STORE8 = 0x3C;
                  uint16 internal constant I64_STORE16 = 0x3D;
                  uint16 internal constant I64_STORE32 = 0x3E;
                  uint16 internal constant MEMORY_SIZE = 0x3F;
                  uint16 internal constant MEMORY_GROW = 0x40;
                  uint16 internal constant DROP = 0x1A;
                  uint16 internal constant SELECT = 0x1B;
                  uint16 internal constant I32_CONST = 0x41;
                  uint16 internal constant I64_CONST = 0x42;
                  uint16 internal constant F32_CONST = 0x43;
                  uint16 internal constant F64_CONST = 0x44;
                  uint16 internal constant I32_EQZ = 0x45;
                  uint16 internal constant I32_RELOP_BASE = 0x46;
                  uint16 internal constant IRELOP_EQ = 0;
                  uint16 internal constant IRELOP_NE = 1;
                  uint16 internal constant IRELOP_LT_S = 2;
                  uint16 internal constant IRELOP_LT_U = 3;
                  uint16 internal constant IRELOP_GT_S = 4;
                  uint16 internal constant IRELOP_GT_U = 5;
                  uint16 internal constant IRELOP_LE_S = 6;
                  uint16 internal constant IRELOP_LE_U = 7;
                  uint16 internal constant IRELOP_GE_S = 8;
                  uint16 internal constant IRELOP_GE_U = 9;
                  uint16 internal constant IRELOP_LAST = IRELOP_GE_U;
                  uint16 internal constant I64_EQZ = 0x50;
                  uint16 internal constant I64_RELOP_BASE = 0x51;
                  uint16 internal constant I32_UNOP_BASE = 0x67;
                  uint16 internal constant IUNOP_CLZ = 0;
                  uint16 internal constant IUNOP_CTZ = 1;
                  uint16 internal constant IUNOP_POPCNT = 2;
                  uint16 internal constant IUNOP_LAST = IUNOP_POPCNT;
                  uint16 internal constant I32_ADD = 0x6A;
                  uint16 internal constant I32_SUB = 0x6B;
                  uint16 internal constant I32_MUL = 0x6C;
                  uint16 internal constant I32_DIV_S = 0x6D;
                  uint16 internal constant I32_DIV_U = 0x6E;
                  uint16 internal constant I32_REM_S = 0x6F;
                  uint16 internal constant I32_REM_U = 0x70;
                  uint16 internal constant I32_AND = 0x71;
                  uint16 internal constant I32_OR = 0x72;
                  uint16 internal constant I32_XOR = 0x73;
                  uint16 internal constant I32_SHL = 0x74;
                  uint16 internal constant I32_SHR_S = 0x75;
                  uint16 internal constant I32_SHR_U = 0x76;
                  uint16 internal constant I32_ROTL = 0x77;
                  uint16 internal constant I32_ROTR = 0x78;
                  uint16 internal constant I64_UNOP_BASE = 0x79;
                  uint16 internal constant I64_ADD = 0x7C;
                  uint16 internal constant I64_SUB = 0x7D;
                  uint16 internal constant I64_MUL = 0x7E;
                  uint16 internal constant I64_DIV_S = 0x7F;
                  uint16 internal constant I64_DIV_U = 0x80;
                  uint16 internal constant I64_REM_S = 0x81;
                  uint16 internal constant I64_REM_U = 0x82;
                  uint16 internal constant I64_AND = 0x83;
                  uint16 internal constant I64_OR = 0x84;
                  uint16 internal constant I64_XOR = 0x85;
                  uint16 internal constant I64_SHL = 0x86;
                  uint16 internal constant I64_SHR_S = 0x87;
                  uint16 internal constant I64_SHR_U = 0x88;
                  uint16 internal constant I64_ROTL = 0x89;
                  uint16 internal constant I64_ROTR = 0x8A;
                  uint16 internal constant I32_WRAP_I64 = 0xA7;
                  uint16 internal constant I64_EXTEND_I32_S = 0xAC;
                  uint16 internal constant I64_EXTEND_I32_U = 0xAD;
                  uint16 internal constant I32_REINTERPRET_F32 = 0xBC;
                  uint16 internal constant I64_REINTERPRET_F64 = 0xBD;
                  uint16 internal constant F32_REINTERPRET_I32 = 0xBE;
                  uint16 internal constant F64_REINTERPRET_I64 = 0xBF;
                  uint16 internal constant I32_EXTEND_8S = 0xC0;
                  uint16 internal constant I32_EXTEND_16S = 0xC1;
                  uint16 internal constant I64_EXTEND_8S = 0xC2;
                  uint16 internal constant I64_EXTEND_16S = 0xC3;
                  uint16 internal constant I64_EXTEND_32S = 0xC4;
                  uint16 internal constant INIT_FRAME = 0x8002;
                  uint16 internal constant ARBITRARY_JUMP = 0x8003;
                  uint16 internal constant ARBITRARY_JUMP_IF = 0x8004;
                  uint16 internal constant MOVE_FROM_STACK_TO_INTERNAL = 0x8005;
                  uint16 internal constant MOVE_FROM_INTERNAL_TO_STACK = 0x8006;
                  uint16 internal constant DUP = 0x8008;
                  uint16 internal constant CROSS_MODULE_CALL = 0x8009;
                  uint16 internal constant CALLER_MODULE_INTERNAL_CALL = 0x800A;
                  uint16 internal constant GET_GLOBAL_STATE_BYTES32 = 0x8010;
                  uint16 internal constant SET_GLOBAL_STATE_BYTES32 = 0x8011;
                  uint16 internal constant GET_GLOBAL_STATE_U64 = 0x8012;
                  uint16 internal constant SET_GLOBAL_STATE_U64 = 0x8013;
                  uint16 internal constant READ_PRE_IMAGE = 0x8020;
                  uint16 internal constant READ_INBOX_MESSAGE = 0x8021;
                  uint16 internal constant HALT_AND_SET_FINISHED = 0x8022;
                  uint256 internal constant INBOX_INDEX_SEQUENCER = 0;
                  uint256 internal constant INBOX_INDEX_DELAYED = 1;
                  function hash(Instruction memory inst) internal pure returns (bytes32) {
                      return keccak256(abi.encodePacked("Instruction:", inst.opcode, inst.argumentData));
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "./Value.sol";
              struct StackFrame {
                  Value returnPc;
                  bytes32 localsMerkleRoot;
                  uint32 callerModule;
                  uint32 callerModuleInternals;
              }
              struct StackFrameWindow {
                  StackFrame[] proved;
                  bytes32 remainingHash;
              }
              library StackFrameLib {
                  using ValueLib for Value;
                  function hash(StackFrame memory frame) internal pure returns (bytes32) {
                      return
                          keccak256(
                              abi.encodePacked(
                                  "Stack frame:",
                                  frame.returnPc.hash(),
                                  frame.localsMerkleRoot,
                                  frame.callerModule,
                                  frame.callerModuleInternals
                              )
                          );
                  }
                  function hash(StackFrameWindow memory window) internal pure returns (bytes32 h) {
                      h = window.remainingHash;
                      for (uint256 i = 0; i < window.proved.length; i++) {
                          h = keccak256(abi.encodePacked("Stack frame stack:", hash(window.proved[i]), h));
                      }
                  }
                  function peek(StackFrameWindow memory window) internal pure returns (StackFrame memory) {
                      require(window.proved.length == 1, "BAD_WINDOW_LENGTH");
                      return window.proved[0];
                  }
                  function pop(StackFrameWindow memory window) internal pure returns (StackFrame memory frame) {
                      require(window.proved.length == 1, "BAD_WINDOW_LENGTH");
                      frame = window.proved[0];
                      window.proved = new StackFrame[](0);
                  }
                  function push(StackFrameWindow memory window, StackFrame memory frame) internal pure {
                      StackFrame[] memory newProved = new StackFrame[](window.proved.length + 1);
                      for (uint256 i = 0; i < window.proved.length; i++) {
                          newProved[i] = window.proved[i];
                      }
                      newProved[window.proved.length] = frame;
                      window.proved = newProved;
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              enum ValueType {
                  I32,
                  I64,
                  F32,
                  F64,
                  REF_NULL,
                  FUNC_REF,
                  INTERNAL_REF
              }
              struct Value {
                  ValueType valueType;
                  uint256 contents;
              }
              library ValueLib {
                  function hash(Value memory val) internal pure returns (bytes32) {
                      return keccak256(abi.encodePacked("Value:", val.valueType, val.contents));
                  }
                  function maxValueType() internal pure returns (ValueType) {
                      return ValueType.INTERNAL_REF;
                  }
                  function assumeI32(Value memory val) internal pure returns (uint32) {
                      uint256 uintval = uint256(val.contents);
                      require(val.valueType == ValueType.I32, "NOT_I32");
                      require(uintval < (1 << 32), "BAD_I32");
                      return uint32(uintval);
                  }
                  function assumeI64(Value memory val) internal pure returns (uint64) {
                      uint256 uintval = uint256(val.contents);
                      require(val.valueType == ValueType.I64, "NOT_I64");
                      require(uintval < (1 << 64), "BAD_I64");
                      return uint64(uintval);
                  }
                  function newRefNull() internal pure returns (Value memory) {
                      return Value({valueType: ValueType.REF_NULL, contents: 0});
                  }
                  function newI32(uint32 x) internal pure returns (Value memory) {
                      return Value({valueType: ValueType.I32, contents: uint256(x)});
                  }
                  function newI64(uint64 x) internal pure returns (Value memory) {
                      return Value({valueType: ValueType.I64, contents: uint256(x)});
                  }
                  function newBoolean(bool x) internal pure returns (Value memory) {
                      if (x) {
                          return newI32(uint32(1));
                      } else {
                          return newI32(uint32(0));
                      }
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "./Value.sol";
              struct ValueArray {
                  Value[] inner;
              }
              library ValueArrayLib {
                  function get(ValueArray memory arr, uint256 index) internal pure returns (Value memory) {
                      return arr.inner[index];
                  }
                  function set(
                      ValueArray memory arr,
                      uint256 index,
                      Value memory val
                  ) internal pure {
                      arr.inner[index] = val;
                  }
                  function length(ValueArray memory arr) internal pure returns (uint256) {
                      return arr.inner.length;
                  }
                  function push(ValueArray memory arr, Value memory val) internal pure {
                      Value[] memory newInner = new Value[](arr.inner.length + 1);
                      for (uint256 i = 0; i < arr.inner.length; i++) {
                          newInner[i] = arr.inner[i];
                      }
                      newInner[arr.inner.length] = val;
                      arr.inner = newInner;
                  }
                  function pop(ValueArray memory arr) internal pure returns (Value memory popped) {
                      popped = arr.inner[arr.inner.length - 1];
                      Value[] memory newInner = new Value[](arr.inner.length - 1);
                      for (uint256 i = 0; i < newInner.length; i++) {
                          newInner[i] = arr.inner[i];
                      }
                      arr.inner = newInner;
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "../state/Machine.sol";
              import "../state/Module.sol";
              import "../state/Instructions.sol";
              import "../bridge/ISequencerInbox.sol";
              import "../bridge/IBridge.sol";
              struct ExecutionContext {
                  uint256 maxInboxMessagesRead;
                  IBridge bridge;
              }
              abstract contract IOneStepProver {
                  function executeOneStep(
                      ExecutionContext memory execCtx,
                      Machine calldata mach,
                      Module calldata mod,
                      Instruction calldata instruction,
                      bytes calldata proof
                  ) external view virtual returns (Machine memory result, Module memory resultMod);
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "./ModuleMemory.sol";
              struct Module {
                  bytes32 globalsMerkleRoot;
                  ModuleMemory moduleMemory;
                  bytes32 tablesMerkleRoot;
                  bytes32 functionsMerkleRoot;
                  uint32 internalsOffset;
              }
              library ModuleLib {
                  using ModuleMemoryLib for ModuleMemory;
                  function hash(Module memory mod) internal pure returns (bytes32) {
                      return
                          keccak256(
                              abi.encodePacked(
                                  "Module:",
                                  mod.globalsMerkleRoot,
                                  mod.moduleMemory.hash(),
                                  mod.tablesMerkleRoot,
                                  mod.functionsMerkleRoot,
                                  mod.internalsOffset
                              )
                          );
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "./MerkleProof.sol";
              import "./Deserialize.sol";
              struct ModuleMemory {
                  uint64 size;
                  uint64 maxSize;
                  bytes32 merkleRoot;
              }
              library ModuleMemoryLib {
                  using MerkleProofLib for MerkleProof;
                  function hash(ModuleMemory memory mem) internal pure returns (bytes32) {
                      return keccak256(abi.encodePacked("Memory:", mem.size, mem.maxSize, mem.merkleRoot));
                  }
                  function proveLeaf(
                      ModuleMemory memory mem,
                      uint256 leafIdx,
                      bytes calldata proof,
                      uint256 startOffset
                  )
                      internal
                      pure
                      returns (
                          bytes32 contents,
                          uint256 offset,
                          MerkleProof memory merkle
                      )
                  {
                      offset = startOffset;
                      (contents, offset) = Deserialize.b32(proof, offset);
                      (merkle, offset) = Deserialize.merkleProof(proof, offset);
                      bytes32 recomputedRoot = merkle.computeRootFromMemory(leafIdx, contents);
                      require(recomputedRoot == mem.merkleRoot, "WRONG_MEM_ROOT");
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "./Value.sol";
              import "./Instructions.sol";
              import "./Module.sol";
              struct MerkleProof {
                  bytes32[] counterparts;
              }
              library MerkleProofLib {
                  using ModuleLib for Module;
                  using ValueLib for Value;
                  function computeRootFromValue(
                      MerkleProof memory proof,
                      uint256 index,
                      Value memory leaf
                  ) internal pure returns (bytes32) {
                      return computeRootUnsafe(proof, index, leaf.hash(), "Value merkle tree:");
                  }
                  function computeRootFromInstruction(
                      MerkleProof memory proof,
                      uint256 index,
                      Instruction memory inst
                  ) internal pure returns (bytes32) {
                      return computeRootUnsafe(proof, index, Instructions.hash(inst), "Instruction merkle tree:");
                  }
                  function computeRootFromFunction(
                      MerkleProof memory proof,
                      uint256 index,
                      bytes32 codeRoot
                  ) internal pure returns (bytes32) {
                      bytes32 h = keccak256(abi.encodePacked("Function:", codeRoot));
                      return computeRootUnsafe(proof, index, h, "Function merkle tree:");
                  }
                  function computeRootFromMemory(
                      MerkleProof memory proof,
                      uint256 index,
                      bytes32 contents
                  ) internal pure returns (bytes32) {
                      bytes32 h = keccak256(abi.encodePacked("Memory leaf:", contents));
                      return computeRootUnsafe(proof, index, h, "Memory merkle tree:");
                  }
                  function computeRootFromElement(
                      MerkleProof memory proof,
                      uint256 index,
                      bytes32 funcTypeHash,
                      Value memory val
                  ) internal pure returns (bytes32) {
                      bytes32 h = keccak256(abi.encodePacked("Table element:", funcTypeHash, val.hash()));
                      return computeRootUnsafe(proof, index, h, "Table element merkle tree:");
                  }
                  function computeRootFromTable(
                      MerkleProof memory proof,
                      uint256 index,
                      uint8 tableType,
                      uint64 tableSize,
                      bytes32 elementsRoot
                  ) internal pure returns (bytes32) {
                      bytes32 h = keccak256(abi.encodePacked("Table:", tableType, tableSize, elementsRoot));
                      return computeRootUnsafe(proof, index, h, "Table merkle tree:");
                  }
                  function computeRootFromModule(
                      MerkleProof memory proof,
                      uint256 index,
                      Module memory mod
                  ) internal pure returns (bytes32) {
                      return computeRootUnsafe(proof, index, mod.hash(), "Module merkle tree:");
                  }
                  // WARNING: leafHash must be computed in such a way that it cannot be a non-leaf hash.
                  function computeRootUnsafe(
                      MerkleProof memory proof,
                      uint256 index,
                      bytes32 leafHash,
                      string memory prefix
                  ) internal pure returns (bytes32 h) {
                      h = leafHash;
                      for (uint256 layer = 0; layer < proof.counterparts.length; layer++) {
                          if (index & 1 == 0) {
                              h = keccak256(abi.encodePacked(prefix, h, proof.counterparts[layer]));
                          } else {
                              h = keccak256(abi.encodePacked(prefix, proof.counterparts[layer], h));
                          }
                          index >>= 1;
                      }
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "./Value.sol";
              import "./ValueStack.sol";
              import "./Machine.sol";
              import "./Instructions.sol";
              import "./StackFrame.sol";
              import "./MerkleProof.sol";
              import "./ModuleMemory.sol";
              import "./Module.sol";
              import "./GlobalState.sol";
              library Deserialize {
                  function u8(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (uint8 ret, uint256 offset)
                  {
                      offset = startOffset;
                      ret = uint8(proof[offset]);
                      offset++;
                  }
                  function u16(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (uint16 ret, uint256 offset)
                  {
                      offset = startOffset;
                      for (uint256 i = 0; i < 16 / 8; i++) {
                          ret <<= 8;
                          ret |= uint8(proof[offset]);
                          offset++;
                      }
                  }
                  function u32(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (uint32 ret, uint256 offset)
                  {
                      offset = startOffset;
                      for (uint256 i = 0; i < 32 / 8; i++) {
                          ret <<= 8;
                          ret |= uint8(proof[offset]);
                          offset++;
                      }
                  }
                  function u64(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (uint64 ret, uint256 offset)
                  {
                      offset = startOffset;
                      for (uint256 i = 0; i < 64 / 8; i++) {
                          ret <<= 8;
                          ret |= uint8(proof[offset]);
                          offset++;
                      }
                  }
                  function u256(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (uint256 ret, uint256 offset)
                  {
                      offset = startOffset;
                      for (uint256 i = 0; i < 256 / 8; i++) {
                          ret <<= 8;
                          ret |= uint8(proof[offset]);
                          offset++;
                      }
                  }
                  function b32(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (bytes32 ret, uint256 offset)
                  {
                      offset = startOffset;
                      uint256 retInt;
                      (retInt, offset) = u256(proof, offset);
                      ret = bytes32(retInt);
                  }
                  function value(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (Value memory val, uint256 offset)
                  {
                      offset = startOffset;
                      uint8 typeInt = uint8(proof[offset]);
                      offset++;
                      require(typeInt <= uint8(ValueLib.maxValueType()), "BAD_VALUE_TYPE");
                      uint256 contents;
                      (contents, offset) = u256(proof, offset);
                      val = Value({valueType: ValueType(typeInt), contents: contents});
                  }
                  function valueStack(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (ValueStack memory stack, uint256 offset)
                  {
                      offset = startOffset;
                      bytes32 remainingHash;
                      (remainingHash, offset) = b32(proof, offset);
                      uint256 provedLength;
                      (provedLength, offset) = u256(proof, offset);
                      Value[] memory proved = new Value[](provedLength);
                      for (uint256 i = 0; i < proved.length; i++) {
                          (proved[i], offset) = value(proof, offset);
                      }
                      stack = ValueStack({proved: ValueArray(proved), remainingHash: remainingHash});
                  }
                  function instruction(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (Instruction memory inst, uint256 offset)
                  {
                      offset = startOffset;
                      uint16 opcode;
                      uint256 data;
                      (opcode, offset) = u16(proof, offset);
                      (data, offset) = u256(proof, offset);
                      inst = Instruction({opcode: opcode, argumentData: data});
                  }
                  function stackFrame(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (StackFrame memory window, uint256 offset)
                  {
                      offset = startOffset;
                      Value memory returnPc;
                      bytes32 localsMerkleRoot;
                      uint32 callerModule;
                      uint32 callerModuleInternals;
                      (returnPc, offset) = value(proof, offset);
                      (localsMerkleRoot, offset) = b32(proof, offset);
                      (callerModule, offset) = u32(proof, offset);
                      (callerModuleInternals, offset) = u32(proof, offset);
                      window = StackFrame({
                          returnPc: returnPc,
                          localsMerkleRoot: localsMerkleRoot,
                          callerModule: callerModule,
                          callerModuleInternals: callerModuleInternals
                      });
                  }
                  function stackFrameWindow(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (StackFrameWindow memory window, uint256 offset)
                  {
                      offset = startOffset;
                      bytes32 remainingHash;
                      (remainingHash, offset) = b32(proof, offset);
                      StackFrame[] memory proved;
                      if (proof[offset] != 0) {
                          offset++;
                          proved = new StackFrame[](1);
                          (proved[0], offset) = stackFrame(proof, offset);
                      } else {
                          offset++;
                          proved = new StackFrame[](0);
                      }
                      window = StackFrameWindow({proved: proved, remainingHash: remainingHash});
                  }
                  function moduleMemory(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (ModuleMemory memory mem, uint256 offset)
                  {
                      offset = startOffset;
                      uint64 size;
                      uint64 maxSize;
                      bytes32 root;
                      (size, offset) = u64(proof, offset);
                      (maxSize, offset) = u64(proof, offset);
                      (root, offset) = b32(proof, offset);
                      mem = ModuleMemory({size: size, maxSize: maxSize, merkleRoot: root});
                  }
                  function module(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (Module memory mod, uint256 offset)
                  {
                      offset = startOffset;
                      bytes32 globalsMerkleRoot;
                      ModuleMemory memory mem;
                      bytes32 tablesMerkleRoot;
                      bytes32 functionsMerkleRoot;
                      uint32 internalsOffset;
                      (globalsMerkleRoot, offset) = b32(proof, offset);
                      (mem, offset) = moduleMemory(proof, offset);
                      (tablesMerkleRoot, offset) = b32(proof, offset);
                      (functionsMerkleRoot, offset) = b32(proof, offset);
                      (internalsOffset, offset) = u32(proof, offset);
                      mod = Module({
                          globalsMerkleRoot: globalsMerkleRoot,
                          moduleMemory: mem,
                          tablesMerkleRoot: tablesMerkleRoot,
                          functionsMerkleRoot: functionsMerkleRoot,
                          internalsOffset: internalsOffset
                      });
                  }
                  function globalState(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (GlobalState memory state, uint256 offset)
                  {
                      offset = startOffset;
                      // using constant ints for array size requires newer solidity
                      bytes32[2] memory bytes32Vals;
                      uint64[2] memory u64Vals;
                      for (uint8 i = 0; i < GlobalStateLib.BYTES32_VALS_NUM; i++) {
                          (bytes32Vals[i], offset) = b32(proof, offset);
                      }
                      for (uint8 i = 0; i < GlobalStateLib.U64_VALS_NUM; i++) {
                          (u64Vals[i], offset) = u64(proof, offset);
                      }
                      state = GlobalState({bytes32Vals: bytes32Vals, u64Vals: u64Vals});
                  }
                  function machine(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (Machine memory mach, uint256 offset)
                  {
                      offset = startOffset;
                      MachineStatus status;
                      {
                          uint8 statusU8;
                          (statusU8, offset) = u8(proof, offset);
                          if (statusU8 == 0) {
                              status = MachineStatus.RUNNING;
                          } else if (statusU8 == 1) {
                              status = MachineStatus.FINISHED;
                          } else if (statusU8 == 2) {
                              status = MachineStatus.ERRORED;
                          } else if (statusU8 == 3) {
                              status = MachineStatus.TOO_FAR;
                          } else {
                              revert("UNKNOWN_MACH_STATUS");
                          }
                      }
                      ValueStack memory values;
                      ValueStack memory internalStack;
                      bytes32 globalStateHash;
                      uint32 moduleIdx;
                      uint32 functionIdx;
                      uint32 functionPc;
                      StackFrameWindow memory frameStack;
                      bytes32 modulesRoot;
                      (values, offset) = valueStack(proof, offset);
                      (internalStack, offset) = valueStack(proof, offset);
                      (frameStack, offset) = stackFrameWindow(proof, offset);
                      (globalStateHash, offset) = b32(proof, offset);
                      (moduleIdx, offset) = u32(proof, offset);
                      (functionIdx, offset) = u32(proof, offset);
                      (functionPc, offset) = u32(proof, offset);
                      (modulesRoot, offset) = b32(proof, offset);
                      mach = Machine({
                          status: status,
                          valueStack: values,
                          internalStack: internalStack,
                          frameStack: frameStack,
                          globalStateHash: globalStateHash,
                          moduleIdx: moduleIdx,
                          functionIdx: functionIdx,
                          functionPc: functionPc,
                          modulesRoot: modulesRoot
                      });
                  }
                  function merkleProof(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (MerkleProof memory merkle, uint256 offset)
                  {
                      offset = startOffset;
                      uint8 length;
                      (length, offset) = u8(proof, offset);
                      bytes32[] memory counterparts = new bytes32[](length);
                      for (uint8 i = 0; i < length; i++) {
                          (counterparts[i], offset) = b32(proof, offset);
                      }
                      merkle = MerkleProof(counterparts);
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              struct Node {
                  // Hash of the state of the chain as of this node
                  bytes32 stateHash;
                  // Hash of the data that can be challenged
                  bytes32 challengeHash;
                  // Hash of the data that will be committed if this node is confirmed
                  bytes32 confirmData;
                  // Index of the node previous to this one
                  uint64 prevNum;
                  // Deadline at which this node can be confirmed
                  uint64 deadlineBlock;
                  // Deadline at which a child of this node can be confirmed
                  uint64 noChildConfirmedBeforeBlock;
                  // Number of stakers staked on this node. This includes real stakers and zombies
                  uint64 stakerCount;
                  // Number of stakers staked on a child node. This includes real stakers and zombies
                  uint64 childStakerCount;
                  // This value starts at zero and is set to a value when the first child is created. After that it is constant until the node is destroyed or the owner destroys pending nodes
                  uint64 firstChildBlock;
                  // The number of the latest child of this node to be created
                  uint64 latestChildNumber;
                  // The block number when this node was created
                  uint64 createdAtBlock;
                  // A hash of all the data needed to determine this node's validity, to protect against reorgs
                  bytes32 nodeHash;
              }
              /**
               * @notice Utility functions for Node
               */
              library NodeLib {
                  /**
                   * @notice Initialize a Node
                   * @param _stateHash Initial value of stateHash
                   * @param _challengeHash Initial value of challengeHash
                   * @param _confirmData Initial value of confirmData
                   * @param _prevNum Initial value of prevNum
                   * @param _deadlineBlock Initial value of deadlineBlock
                   * @param _nodeHash Initial value of nodeHash
                   */
                  function createNode(
                      bytes32 _stateHash,
                      bytes32 _challengeHash,
                      bytes32 _confirmData,
                      uint64 _prevNum,
                      uint64 _deadlineBlock,
                      bytes32 _nodeHash
                  ) internal view returns (Node memory) {
                      Node memory node;
                      node.stateHash = _stateHash;
                      node.challengeHash = _challengeHash;
                      node.confirmData = _confirmData;
                      node.prevNum = _prevNum;
                      node.deadlineBlock = _deadlineBlock;
                      node.noChildConfirmedBeforeBlock = _deadlineBlock;
                      node.createdAtBlock = uint64(block.number);
                      node.nodeHash = _nodeHash;
                      return node;
                  }
                  /**
                   * @notice Update child properties
                   * @param number The child number to set
                   */
                  function childCreated(Node storage self, uint64 number) internal {
                      if (self.firstChildBlock == 0) {
                          self.firstChildBlock = uint64(block.number);
                      }
                      self.latestChildNumber = number;
                  }
                  /**
                   * @notice Update the child confirmed deadline
                   * @param deadline The new deadline to set
                   */
                  function newChildConfirmDeadline(Node storage self, uint64 deadline) internal {
                      self.noChildConfirmedBeforeBlock = deadline;
                  }
                  /**
                   * @notice Check whether the current block number has met or passed the node's deadline
                   */
                  function requirePastDeadline(Node memory self) internal view {
                      require(block.number >= self.deadlineBlock, "BEFORE_DEADLINE");
                  }
                  /**
                   * @notice Check whether the current block number has met or passed deadline for children of this node to be confirmed
                   */
                  function requirePastChildConfirmDeadline(Node memory self) internal view {
                      require(block.number >= self.noChildConfirmedBeforeBlock, "CHILD_TOO_RECENT");
                  }
              }
              

              File 5 of 5: Bridge
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.4;
              import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
              import "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol";
              import {
                  NotContract,
                  NotRollupOrOwner,
                  NotDelayedInbox,
                  NotSequencerInbox,
                  NotOutbox,
                  InvalidOutboxSet,
                  BadSequencerMessageNumber
              } from "../libraries/Error.sol";
              import "./IBridge.sol";
              import "./Messages.sol";
              import "../libraries/DelegateCallAware.sol";
              import {L1MessageType_batchPostingReport} from "../libraries/MessageTypes.sol";
              /**
               * @title Staging ground for incoming and outgoing messages
               * @notice Holds the inbox accumulator for sequenced and delayed messages.
               * It is also the ETH escrow for value sent with these messages.
               * Since the escrow is held here, this contract also contains a list of allowed
               * outboxes that can make calls from here and withdraw this escrow.
               */
              contract Bridge is Initializable, DelegateCallAware, IBridge {
                  using AddressUpgradeable for address;
                  struct InOutInfo {
                      uint256 index;
                      bool allowed;
                  }
                  mapping(address => InOutInfo) private allowedDelayedInboxesMap;
                  mapping(address => InOutInfo) private allowedOutboxesMap;
                  address[] public allowedDelayedInboxList;
                  address[] public allowedOutboxList;
                  address private _activeOutbox;
                  /// @inheritdoc IBridge
                  bytes32[] public delayedInboxAccs;
                  /// @inheritdoc IBridge
                  bytes32[] public sequencerInboxAccs;
                  IOwnable public rollup;
                  address public sequencerInbox;
                  uint256 public override sequencerReportedSubMessageCount;
                  address private constant EMPTY_ACTIVEOUTBOX = address(type(uint160).max);
                  function initialize(IOwnable rollup_) external initializer onlyDelegated {
                      _activeOutbox = EMPTY_ACTIVEOUTBOX;
                      rollup = rollup_;
                  }
                  modifier onlyRollupOrOwner() {
                      if (msg.sender != address(rollup)) {
                          address rollupOwner = rollup.owner();
                          if (msg.sender != rollupOwner) {
                              revert NotRollupOrOwner(msg.sender, address(rollup), rollupOwner);
                          }
                      }
                      _;
                  }
                  /// @dev returns the address of current active Outbox, or zero if no outbox is active
                  function activeOutbox() public view returns (address) {
                      address outbox = _activeOutbox;
                      // address zero is returned if no outbox is set, but the value used in storage
                      // is non-zero to save users some gas (as storage refunds are usually maxed out)
                      // EIP-1153 would help here.
                      // we don't return `EMPTY_ACTIVEOUTBOX` to avoid a breaking change on the current api
                      if (outbox == EMPTY_ACTIVEOUTBOX) return address(0);
                      return outbox;
                  }
                  function allowedDelayedInboxes(address inbox) external view returns (bool) {
                      return allowedDelayedInboxesMap[inbox].allowed;
                  }
                  function allowedOutboxes(address outbox) external view returns (bool) {
                      return allowedOutboxesMap[outbox].allowed;
                  }
                  modifier onlySequencerInbox() {
                      if (msg.sender != sequencerInbox) revert NotSequencerInbox(msg.sender);
                      _;
                  }
                  function enqueueSequencerMessage(
                      bytes32 dataHash,
                      uint256 afterDelayedMessagesRead,
                      uint256 prevMessageCount,
                      uint256 newMessageCount
                  )
                      external
                      onlySequencerInbox
                      returns (
                          uint256 seqMessageIndex,
                          bytes32 beforeAcc,
                          bytes32 delayedAcc,
                          bytes32 acc
                      )
                  {
                      if (
                          sequencerReportedSubMessageCount != prevMessageCount &&
                          prevMessageCount != 0 &&
                          sequencerReportedSubMessageCount != 0
                      ) {
                          revert BadSequencerMessageNumber(sequencerReportedSubMessageCount, prevMessageCount);
                      }
                      sequencerReportedSubMessageCount = newMessageCount;
                      seqMessageIndex = sequencerInboxAccs.length;
                      if (sequencerInboxAccs.length > 0) {
                          beforeAcc = sequencerInboxAccs[sequencerInboxAccs.length - 1];
                      }
                      if (afterDelayedMessagesRead > 0) {
                          delayedAcc = delayedInboxAccs[afterDelayedMessagesRead - 1];
                      }
                      acc = keccak256(abi.encodePacked(beforeAcc, dataHash, delayedAcc));
                      sequencerInboxAccs.push(acc);
                  }
                  /// @inheritdoc IBridge
                  function submitBatchSpendingReport(address sender, bytes32 messageDataHash)
                      external
                      onlySequencerInbox
                      returns (uint256)
                  {
                      return
                          addMessageToDelayedAccumulator(
                              L1MessageType_batchPostingReport,
                              sender,
                              uint64(block.number),
                              uint64(block.timestamp), // solhint-disable-line not-rely-on-time,
                              block.basefee,
                              messageDataHash
                          );
                  }
                  /// @inheritdoc IBridge
                  function enqueueDelayedMessage(
                      uint8 kind,
                      address sender,
                      bytes32 messageDataHash
                  ) external payable returns (uint256) {
                      if (!allowedDelayedInboxesMap[msg.sender].allowed) revert NotDelayedInbox(msg.sender);
                      return
                          addMessageToDelayedAccumulator(
                              kind,
                              sender,
                              uint64(block.number),
                              uint64(block.timestamp), // solhint-disable-line not-rely-on-time
                              block.basefee,
                              messageDataHash
                          );
                  }
                  function addMessageToDelayedAccumulator(
                      uint8 kind,
                      address sender,
                      uint64 blockNumber,
                      uint64 blockTimestamp,
                      uint256 baseFeeL1,
                      bytes32 messageDataHash
                  ) internal returns (uint256) {
                      uint256 count = delayedInboxAccs.length;
                      bytes32 messageHash = Messages.messageHash(
                          kind,
                          sender,
                          blockNumber,
                          blockTimestamp,
                          count,
                          baseFeeL1,
                          messageDataHash
                      );
                      bytes32 prevAcc = 0;
                      if (count > 0) {
                          prevAcc = delayedInboxAccs[count - 1];
                      }
                      delayedInboxAccs.push(Messages.accumulateInboxMessage(prevAcc, messageHash));
                      emit MessageDelivered(
                          count,
                          prevAcc,
                          msg.sender,
                          kind,
                          sender,
                          messageDataHash,
                          baseFeeL1,
                          blockTimestamp
                      );
                      return count;
                  }
                  function executeCall(
                      address to,
                      uint256 value,
                      bytes calldata data
                  ) external returns (bool success, bytes memory returnData) {
                      if (!allowedOutboxesMap[msg.sender].allowed) revert NotOutbox(msg.sender);
                      if (data.length > 0 && !to.isContract()) revert NotContract(to);
                      address prevOutbox = _activeOutbox;
                      _activeOutbox = msg.sender;
                      // We set and reset active outbox around external call so activeOutbox remains valid during call
                      // We use a low level call here since we want to bubble up whether it succeeded or failed to the caller
                      // rather than reverting on failure as well as allow contract and non-contract calls
                      // solhint-disable-next-line avoid-low-level-calls
                      (success, returnData) = to.call{value: value}(data);
                      _activeOutbox = prevOutbox;
                      emit BridgeCallTriggered(msg.sender, to, value, data);
                  }
                  function setSequencerInbox(address _sequencerInbox) external onlyRollupOrOwner {
                      sequencerInbox = _sequencerInbox;
                      emit SequencerInboxUpdated(_sequencerInbox);
                  }
                  function setDelayedInbox(address inbox, bool enabled) external onlyRollupOrOwner {
                      InOutInfo storage info = allowedDelayedInboxesMap[inbox];
                      bool alreadyEnabled = info.allowed;
                      emit InboxToggle(inbox, enabled);
                      if ((alreadyEnabled && enabled) || (!alreadyEnabled && !enabled)) {
                          return;
                      }
                      if (enabled) {
                          allowedDelayedInboxesMap[inbox] = InOutInfo(allowedDelayedInboxList.length, true);
                          allowedDelayedInboxList.push(inbox);
                      } else {
                          allowedDelayedInboxList[info.index] = allowedDelayedInboxList[
                              allowedDelayedInboxList.length - 1
                          ];
                          allowedDelayedInboxesMap[allowedDelayedInboxList[info.index]].index = info.index;
                          allowedDelayedInboxList.pop();
                          delete allowedDelayedInboxesMap[inbox];
                      }
                  }
                  function setOutbox(address outbox, bool enabled) external onlyRollupOrOwner {
                      if (outbox == EMPTY_ACTIVEOUTBOX) revert InvalidOutboxSet(outbox);
                      InOutInfo storage info = allowedOutboxesMap[outbox];
                      bool alreadyEnabled = info.allowed;
                      emit OutboxToggle(outbox, enabled);
                      if ((alreadyEnabled && enabled) || (!alreadyEnabled && !enabled)) {
                          return;
                      }
                      if (enabled) {
                          allowedOutboxesMap[outbox] = InOutInfo(allowedOutboxList.length, true);
                          allowedOutboxList.push(outbox);
                      } else {
                          allowedOutboxList[info.index] = allowedOutboxList[allowedOutboxList.length - 1];
                          allowedOutboxesMap[allowedOutboxList[info.index]].index = info.index;
                          allowedOutboxList.pop();
                          delete allowedOutboxesMap[outbox];
                      }
                  }
                  function setSequencerReportedSubMessageCount(uint256 newMsgCount) external onlyRollupOrOwner {
                      sequencerReportedSubMessageCount = newMsgCount;
                  }
                  function delayedMessageCount() external view override returns (uint256) {
                      return delayedInboxAccs.length;
                  }
                  function sequencerMessageCount() external view returns (uint256) {
                      return sequencerInboxAccs.length;
                  }
                  /// @dev For the classic -> nitro migration. TODO: remove post-migration.
                  function acceptFundsFromOldBridge() external payable {}
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts (last updated v4.5.0) (proxy/utils/Initializable.sol)
              pragma solidity ^0.8.0;
              import "../../utils/AddressUpgradeable.sol";
              /**
               * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
               * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an
               * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
               * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
               *
               * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
               * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
               *
               * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
               * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
               *
               * [CAUTION]
               * ====
               * Avoid leaving a contract uninitialized.
               *
               * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation
               * contract, which may impact the proxy. To initialize the implementation contract, you can either invoke the
               * initializer manually, or you can include a constructor to automatically mark it as initialized when it is deployed:
               *
               * [.hljs-theme-light.nopadding]
               * ```
               * /// @custom:oz-upgrades-unsafe-allow constructor
               * constructor() initializer {}
               * ```
               * ====
               */
              abstract contract Initializable {
                  /**
                   * @dev Indicates that the contract has been initialized.
                   */
                  bool private _initialized;
                  /**
                   * @dev Indicates that the contract is in the process of being initialized.
                   */
                  bool private _initializing;
                  /**
                   * @dev Modifier to protect an initializer function from being invoked twice.
                   */
                  modifier initializer() {
                      // If the contract is initializing we ignore whether _initialized is set in order to support multiple
                      // inheritance patterns, but we only do this in the context of a constructor, because in other contexts the
                      // contract may have been reentered.
                      require(_initializing ? _isConstructor() : !_initialized, "Initializable: contract is already initialized");
                      bool isTopLevelCall = !_initializing;
                      if (isTopLevelCall) {
                          _initializing = true;
                          _initialized = true;
                      }
                      _;
                      if (isTopLevelCall) {
                          _initializing = false;
                      }
                  }
                  /**
                   * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the
                   * {initializer} modifier, directly or indirectly.
                   */
                  modifier onlyInitializing() {
                      require(_initializing, "Initializable: contract is not initializing");
                      _;
                  }
                  function _isConstructor() private view returns (bool) {
                      return !AddressUpgradeable.isContract(address(this));
                  }
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)
              pragma solidity ^0.8.1;
              /**
               * @dev Collection of functions related to the address type
               */
              library AddressUpgradeable {
                  /**
                   * @dev Returns true if `account` is a contract.
                   *
                   * [IMPORTANT]
                   * ====
                   * It is unsafe to assume that an address for which this function returns
                   * false is an externally-owned account (EOA) and not a contract.
                   *
                   * Among others, `isContract` will return false for the following
                   * types of addresses:
                   *
                   *  - an externally-owned account
                   *  - a contract in construction
                   *  - an address where a contract will be created
                   *  - an address where a contract lived, but was destroyed
                   * ====
                   *
                   * [IMPORTANT]
                   * ====
                   * You shouldn't rely on `isContract` to protect against flash loan attacks!
                   *
                   * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
                   * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
                   * constructor.
                   * ====
                   */
                  function isContract(address account) internal view returns (bool) {
                      // This method relies on extcodesize/address.code.length, which returns 0
                      // for contracts in construction, since the code is only stored at the end
                      // of the constructor execution.
                      return account.code.length > 0;
                  }
                  /**
                   * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
                   * `recipient`, forwarding all available gas and reverting on errors.
                   *
                   * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
                   * of certain opcodes, possibly making contracts go over the 2300 gas limit
                   * imposed by `transfer`, making them unable to receive funds via
                   * `transfer`. {sendValue} removes this limitation.
                   *
                   * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
                   *
                   * IMPORTANT: because control is transferred to `recipient`, care must be
                   * taken to not create reentrancy vulnerabilities. Consider using
                   * {ReentrancyGuard} or the
                   * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
                   */
                  function sendValue(address payable recipient, uint256 amount) internal {
                      require(address(this).balance >= amount, "Address: insufficient balance");
                      (bool success, ) = recipient.call{value: amount}("");
                      require(success, "Address: unable to send value, recipient may have reverted");
                  }
                  /**
                   * @dev Performs a Solidity function call using a low level `call`. A
                   * plain `call` is an unsafe replacement for a function call: use this
                   * function instead.
                   *
                   * If `target` reverts with a revert reason, it is bubbled up by this
                   * function (like regular Solidity function calls).
                   *
                   * Returns the raw returned data. To convert to the expected return value,
                   * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
                   *
                   * Requirements:
                   *
                   * - `target` must be a contract.
                   * - calling `target` with `data` must not revert.
                   *
                   * _Available since v3.1._
                   */
                  function functionCall(address target, bytes memory data) internal returns (bytes memory) {
                      return functionCall(target, data, "Address: low-level call failed");
                  }
                  /**
                   * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
                   * `errorMessage` as a fallback revert reason when `target` reverts.
                   *
                   * _Available since v3.1._
                   */
                  function functionCall(
                      address target,
                      bytes memory data,
                      string memory errorMessage
                  ) internal returns (bytes memory) {
                      return functionCallWithValue(target, data, 0, errorMessage);
                  }
                  /**
                   * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
                   * but also transferring `value` wei to `target`.
                   *
                   * Requirements:
                   *
                   * - the calling contract must have an ETH balance of at least `value`.
                   * - the called Solidity function must be `payable`.
                   *
                   * _Available since v3.1._
                   */
                  function functionCallWithValue(
                      address target,
                      bytes memory data,
                      uint256 value
                  ) internal returns (bytes memory) {
                      return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
                  }
                  /**
                   * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
                   * with `errorMessage` as a fallback revert reason when `target` reverts.
                   *
                   * _Available since v3.1._
                   */
                  function functionCallWithValue(
                      address target,
                      bytes memory data,
                      uint256 value,
                      string memory errorMessage
                  ) internal returns (bytes memory) {
                      require(address(this).balance >= value, "Address: insufficient balance for call");
                      require(isContract(target), "Address: call to non-contract");
                      (bool success, bytes memory returndata) = target.call{value: value}(data);
                      return verifyCallResult(success, returndata, errorMessage);
                  }
                  /**
                   * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
                   * but performing a static call.
                   *
                   * _Available since v3.3._
                   */
                  function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
                      return functionStaticCall(target, data, "Address: low-level static call failed");
                  }
                  /**
                   * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
                   * but performing a static call.
                   *
                   * _Available since v3.3._
                   */
                  function functionStaticCall(
                      address target,
                      bytes memory data,
                      string memory errorMessage
                  ) internal view returns (bytes memory) {
                      require(isContract(target), "Address: static call to non-contract");
                      (bool success, bytes memory returndata) = target.staticcall(data);
                      return verifyCallResult(success, returndata, errorMessage);
                  }
                  /**
                   * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
                   * revert reason using the provided one.
                   *
                   * _Available since v4.3._
                   */
                  function verifyCallResult(
                      bool success,
                      bytes memory returndata,
                      string memory errorMessage
                  ) internal pure returns (bytes memory) {
                      if (success) {
                          return returndata;
                      } else {
                          // Look for revert reason and bubble it up if present
                          if (returndata.length > 0) {
                              // The easiest way to bubble the revert reason is using memory via assembly
                              assembly {
                                  let returndata_size := mload(returndata)
                                  revert(add(32, returndata), returndata_size)
                              }
                          } else {
                              revert(errorMessage);
                          }
                      }
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.4;
              /// @dev Init was already called
              error AlreadyInit();
              /// Init was called with param set to zero that must be nonzero
              error HadZeroInit();
              /// @dev Thrown when non owner tries to access an only-owner function
              /// @param sender The msg.sender who is not the owner
              /// @param owner The owner address
              error NotOwner(address sender, address owner);
              /// @dev Thrown when an address that is not the rollup tries to call an only-rollup function
              /// @param sender The sender who is not the rollup
              /// @param rollup The rollup address authorized to call this function
              error NotRollup(address sender, address rollup);
              /// @dev Thrown when the contract was not called directly from the origin ie msg.sender != tx.origin
              error NotOrigin();
              /// @dev Provided data was too large
              /// @param dataLength The length of the data that is too large
              /// @param maxDataLength The max length the data can be
              error DataTooLarge(uint256 dataLength, uint256 maxDataLength);
              /// @dev The provided is not a contract and was expected to be
              /// @param addr The adddress in question
              error NotContract(address addr);
              /// @dev The merkle proof provided was too long
              /// @param actualLength The length of the merkle proof provided
              /// @param maxProofLength The max length a merkle proof can have
              error MerkleProofTooLong(uint256 actualLength, uint256 maxProofLength);
              /// @dev Thrown when an un-authorized address tries to access an admin function
              /// @param sender The un-authorized sender
              /// @param rollup The rollup, which would be authorized
              /// @param owner The rollup's owner, which would be authorized
              error NotRollupOrOwner(address sender, address rollup, address owner);
              // Bridge Errors
              /// @dev Thrown when an un-authorized address tries to access an only-inbox function
              /// @param sender The un-authorized sender
              error NotDelayedInbox(address sender);
              /// @dev Thrown when an un-authorized address tries to access an only-sequencer-inbox function
              /// @param sender The un-authorized sender
              error NotSequencerInbox(address sender);
              /// @dev Thrown when an un-authorized address tries to access an only-outbox function
              /// @param sender The un-authorized sender
              error NotOutbox(address sender);
              /// @dev the provided outbox address isn't valid
              /// @param outbox address of outbox being set
              error InvalidOutboxSet(address outbox);
              // Inbox Errors
              /// @dev The contract is paused, so cannot be paused
              error AlreadyPaused();
              /// @dev The contract is unpaused, so cannot be unpaused
              error AlreadyUnpaused();
              /// @dev The contract is paused
              error Paused();
              /// @dev msg.value sent to the inbox isn't high enough
              error InsufficientValue(uint256 expected, uint256 actual);
              /// @dev submission cost provided isn't enough to create retryable ticket
              error InsufficientSubmissionCost(uint256 expected, uint256 actual);
              /// @dev address not allowed to interact with the given contract
              error NotAllowedOrigin(address origin);
              /// @dev used to convey retryable tx data in eth calls without requiring a tx trace
              /// this follows a pattern similar to EIP-3668 where reverts surface call information
              error RetryableData(
                  address from,
                  address to,
                  uint256 l2CallValue,
                  uint256 deposit,
                  uint256 maxSubmissionCost,
                  address excessFeeRefundAddress,
                  address callValueRefundAddress,
                  uint256 gasLimit,
                  uint256 maxFeePerGas,
                  bytes data
              );
              // Outbox Errors
              /// @dev The provided proof was too long
              /// @param proofLength The length of the too-long proof
              error ProofTooLong(uint256 proofLength);
              /// @dev The output index was greater than the maximum
              /// @param index The output index
              /// @param maxIndex The max the index could be
              error PathNotMinimal(uint256 index, uint256 maxIndex);
              /// @dev The calculated root does not exist
              /// @param root The calculated root
              error UnknownRoot(bytes32 root);
              /// @dev The record has already been spent
              /// @param index The index of the spent record
              error AlreadySpent(uint256 index);
              /// @dev A call to the bridge failed with no return data
              error BridgeCallFailed();
              // Sequencer Inbox Errors
              /// @dev Thrown when someone attempts to read fewer messages than have already been read
              error DelayedBackwards();
              /// @dev Thrown when someone attempts to read more messages than exist
              error DelayedTooFar();
              /// @dev Force include can only read messages more blocks old than the delay period
              error ForceIncludeBlockTooSoon();
              /// @dev Force include can only read messages more seconds old than the delay period
              error ForceIncludeTimeTooSoon();
              /// @dev The message provided did not match the hash in the delayed inbox
              error IncorrectMessagePreimage();
              /// @dev This can only be called by the batch poster
              error NotBatchPoster();
              /// @dev The sequence number provided to this message was inconsistent with the number of batches already included
              error BadSequencerNumber(uint256 stored, uint256 received);
              /// @dev The sequence message number provided to this message was inconsistent with the previous one
              error BadSequencerMessageNumber(uint256 stored, uint256 received);
              /// @dev The batch data has the inbox authenticated bit set, but the batch data was not authenticated by the inbox
              error DataNotAuthenticated();
              /// @dev Tried to create an already valid Data Availability Service keyset
              error AlreadyValidDASKeyset(bytes32);
              /// @dev Tried to use or invalidate an already invalid Data Availability Service keyset
              error NoSuchKeyset(bytes32);
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              // solhint-disable-next-line compiler-version
              pragma solidity >=0.6.9 <0.9.0;
              import "./IOwnable.sol";
              interface IBridge {
                  event MessageDelivered(
                      uint256 indexed messageIndex,
                      bytes32 indexed beforeInboxAcc,
                      address inbox,
                      uint8 kind,
                      address sender,
                      bytes32 messageDataHash,
                      uint256 baseFeeL1,
                      uint64 timestamp
                  );
                  event BridgeCallTriggered(
                      address indexed outbox,
                      address indexed to,
                      uint256 value,
                      bytes data
                  );
                  event InboxToggle(address indexed inbox, bool enabled);
                  event OutboxToggle(address indexed outbox, bool enabled);
                  event SequencerInboxUpdated(address newSequencerInbox);
                  function allowedDelayedInboxList(uint256) external returns (address);
                  function allowedOutboxList(uint256) external returns (address);
                  /// @dev Accumulator for delayed inbox messages; tail represents hash of the current state; each element represents the inclusion of a new message.
                  function delayedInboxAccs(uint256) external view returns (bytes32);
                  /// @dev Accumulator for sequencer inbox messages; tail represents hash of the current state; each element represents the inclusion of a new message.
                  function sequencerInboxAccs(uint256) external view returns (bytes32);
                  function rollup() external view returns (IOwnable);
                  function sequencerInbox() external view returns (address);
                  function activeOutbox() external view returns (address);
                  function allowedDelayedInboxes(address inbox) external view returns (bool);
                  function allowedOutboxes(address outbox) external view returns (bool);
                  function sequencerReportedSubMessageCount() external view returns (uint256);
                  /**
                   * @dev Enqueue a message in the delayed inbox accumulator.
                   *      These messages are later sequenced in the SequencerInbox, either
                   *      by the sequencer as part of a normal batch, or by force inclusion.
                   */
                  function enqueueDelayedMessage(
                      uint8 kind,
                      address sender,
                      bytes32 messageDataHash
                  ) external payable returns (uint256);
                  function executeCall(
                      address to,
                      uint256 value,
                      bytes calldata data
                  ) external returns (bool success, bytes memory returnData);
                  function delayedMessageCount() external view returns (uint256);
                  function sequencerMessageCount() external view returns (uint256);
                  // ---------- onlySequencerInbox functions ----------
                  function enqueueSequencerMessage(
                      bytes32 dataHash,
                      uint256 afterDelayedMessagesRead,
                      uint256 prevMessageCount,
                      uint256 newMessageCount
                  )
                      external
                      returns (
                          uint256 seqMessageIndex,
                          bytes32 beforeAcc,
                          bytes32 delayedAcc,
                          bytes32 acc
                      );
                  /**
                   * @dev Allows the sequencer inbox to submit a delayed message of the batchPostingReport type
                   *      This is done through a separate function entrypoint instead of allowing the sequencer inbox
                   *      to call `enqueueDelayedMessage` to avoid the gas overhead of an extra SLOAD in either
                   *      every delayed inbox or every sequencer inbox call.
                   */
                  function submitBatchSpendingReport(address batchPoster, bytes32 dataHash)
                      external
                      returns (uint256 msgNum);
                  // ---------- onlyRollupOrOwner functions ----------
                  function setSequencerInbox(address _sequencerInbox) external;
                  function setDelayedInbox(address inbox, bool enabled) external;
                  function setOutbox(address inbox, bool enabled) external;
                  // ---------- initializer ----------
                  function initialize(IOwnable rollup_) external;
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              library Messages {
                  function messageHash(
                      uint8 kind,
                      address sender,
                      uint64 blockNumber,
                      uint64 timestamp,
                      uint256 inboxSeqNum,
                      uint256 baseFeeL1,
                      bytes32 messageDataHash
                  ) internal pure returns (bytes32) {
                      return
                          keccak256(
                              abi.encodePacked(
                                  kind,
                                  sender,
                                  blockNumber,
                                  timestamp,
                                  inboxSeqNum,
                                  baseFeeL1,
                                  messageDataHash
                              )
                          );
                  }
                  function accumulateInboxMessage(bytes32 prevAcc, bytes32 message)
                      internal
                      pure
                      returns (bytes32)
                  {
                      return keccak256(abi.encodePacked(prevAcc, message));
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import {NotOwner} from "./Error.sol";
              /// @dev A stateless contract that allows you to infer if the current call has been delegated or not
              /// Pattern used here is from UUPS implementation by the OpenZeppelin team
              abstract contract DelegateCallAware {
                  address private immutable __self = address(this);
                  /**
                   * @dev Check that the execution is being performed through a delegate call. This allows a function to be
                   * callable on the proxy contract but not on the logic contract.
                   */
                  modifier onlyDelegated() {
                      require(address(this) != __self, "Function must be called through delegatecall");
                      _;
                  }
                  /**
                   * @dev Check that the execution is not being performed through a delegate call. This allows a function to be
                   * callable on the implementing contract but not through proxies.
                   */
                  modifier notDelegated() {
                      require(address(this) == __self, "Function must not be called through delegatecall");
                      _;
                  }
                  /// @dev Check that msg.sender is the current EIP 1967 proxy admin
                  modifier onlyProxyOwner() {
                      // Storage slot with the admin of the proxy contract
                      // This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1
                      bytes32 slot = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;
                      address admin;
                      assembly {
                          admin := sload(slot)
                      }
                      if (msg.sender != admin) revert NotOwner(msg.sender, admin);
                      _;
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.4;
              uint8 constant L2_MSG = 3;
              uint8 constant L1MessageType_L2FundedByL1 = 7;
              uint8 constant L1MessageType_submitRetryableTx = 9;
              uint8 constant L1MessageType_ethDeposit = 12;
              uint8 constant L1MessageType_batchPostingReport = 13;
              uint8 constant L2MessageType_unsignedEOATx = 0;
              uint8 constant L2MessageType_unsignedContractTx = 1;
              uint8 constant ROLLUP_PROTOCOL_EVENT_TYPE = 8;
              uint8 constant INITIALIZATION_MSG_TYPE = 11;
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              // solhint-disable-next-line compiler-version
              pragma solidity >=0.4.21 <0.9.0;
              interface IOwnable {
                  function owner() external view returns (address);
              }