ETH Price: $2,090.41 (-2.64%)

Transaction Decoder

Block:
18580384 at Nov-15-2023 10:51:35 PM +UTC
Transaction Fee:
0.063934102602248652 ETH $133.65
Gas Used:
1,824,948 Gas / 35.033383199 Gwei

Emitted Events:

296 TransparentUpgradeableProxy.0x5e3c1311ea442664e8b1611bfabef659120ea7a0a2cfc0667700bebc69cbffe1( 0x5e3c1311ea442664e8b1611bfabef659120ea7a0a2cfc0667700bebc69cbffe1, 0x0000000000000000000000000000000000000000000000000000000000121442, 0xf759b596cb92444cd5e31f5a33fa5770d45d3a2cc03f17368f62095de47a4002, 0000000000000000000000001c479675ad559dc151f6ec7ed3fbf8cee79582b6, 000000000000000000000000000000000000000000000000000000000000000d, 000000000000000000000000c1b634853cb333d3ad8663715b08f41a3aec47cc, f829bbf7a37183ede66557eced930052f69312974b27390d94581d4550ed0508, 00000000000000000000000000000000000000000000000000000008252c109f, 0000000000000000000000000000000000000000000000000000000065554b77 )
297 TransparentUpgradeableProxy.0xff64905f73a67fb594e0f940a8075a860db489ad991e032f48c81123eb52d60b( 0xff64905f73a67fb594e0f940a8075a860db489ad991e032f48c81123eb52d60b, 0x0000000000000000000000000000000000000000000000000000000000121442, 0000000000000000000000000000000000000000000000000000000000000020, 0000000000000000000000000000000000000000000000000000000000000094, 0000000000000000000000000000000000000000000000000000000065554b77, c1b634853cb333d3ad8663715b08f41a3aec47cc7830b5474affc727ec0ac420, bdc5956584c67c19b0729262840976985865c62a000000000000000000000000, 00000000000000000000000000000000000633e7000000000000000000000000, 00000000000000000000000000000008252c109f000000000000000000000000 )
298 TransparentUpgradeableProxy.0x7394f4a19a13c7b92b5bb71033245305946ef78452f7b4986ac1390b5df4ebd7( 0x7394f4a19a13c7b92b5bb71033245305946ef78452f7b4986ac1390b5df4ebd7, 0x00000000000000000000000000000000000000000000000000000000000633e7, 0x7296055b5347a20b0dc3e78113fce040b031c1449a5ade3911e5107b00295ddc, 0xe9c77cd47287146891660331c4a8d23adf98411bf84ff99c38895ab73341dffb, c41634b446e620336b0fb3bb241bb2f764c2460a151830c7406fac2a634bd873, 0000000000000000000000000000000000000000000000000000000000121433, 000000000000000000000000000000000000000000000000000000006553f9f7, 0000000000000000000000000000000000000000000000000000000065555987, 00000000000000000000000000000000000000000000000000000000011b6d20, 00000000000000000000000000000000000000000000000000000000011b83ac, 0000000000000000000000000000000000000000000000000000000000000000 )
299 GasRefunder.RefundedGasCosts( refundee=[Sender] 0xc1b634853cb333d3ad8663715b08f41a3aec47cc, contractAddress=[Receiver] TransparentUpgradeableProxy, success=True, gas=1861628, gasPrice=35033383199, amountPaid=64031880774757061 )

Account State Difference:

  Address   Before After State Difference Code
1.858703726955156431 Eth1.858794974355156431 Eth0.0000912474
0x8315177a...4DBd7ed3a
(Arbitrum: Bridge)
0xC1b63485...A3Aec47cc
(Arbitrum: Batch Submitter)
10.001601516079559086 Eth
Nonce: 355289
10.001699294252067495 Eth
Nonce: 355290
0.000097778172508409
0xe64a54E2...80E2E4eb5 779.406960331992719949 Eth779.342928451217962888 Eth0.064031880774757061

Execution Trace

TransparentUpgradeableProxy.8f111f3c( )
  • SequencerInbox.addSequencerL2BatchFromOrigin( sequenceNumber=406503, data=0x005B81ED33996EEE947A0328947FDBF6822F8A5255FB95232A6A3D32FECB029E8858E89F11D5848034425955BCA8616BDCA858EE2ADE2AD2D650726D350654F0783DDF748750D539B39E8FAA362A9E963FDB2E2EFC87F02FCD4F7DFBE2111AFB24F7E7F9B9FD39F7DE571BDBC81852A50892314AFD82A0FD51C1C04ACCC9102C306B76C22C667461637E1DEA9721B0DBFDFB47E64C66C6CAD8199F95648C999D1DBBCF58C95821E36597B1B2E351E68AFD5656192B2B06E89AFF1FE50560C98B5E7D90AEBCACB5565EE0565E00D71AA06B7EB0B8845597C8B5E005AE1616BCFF87907862F78EC66CB27FB456C14CE00A55A882252F34E362CCE007D4CE63CCB665B0C7EB656675CC3432199BFF7F75D6AF9E8C1CD9988919F241D9C2764F320DF8F89172F4244F460FC88EC0C727627C38EB7431D53E13EBE278B030C908488569661AF656B325E029C9D5F58538421062C3C4658AF1788B09534C3C05874927B34D326984B0A5822CC1897039BBEC7698D285DE433B079C52FD9E46E7D8F296A6B33299229B7CE0E96C8529ED0B4FFFDDF2BB67CFFFFEFDECFE95066CEDFFFBB9FDAFF20F7531D7937740873B1341CC69511248A6D9128489FC130EE34002B5F8E757CF76EE1B55F4838C20481B8BA0DD3E83FFA97AF7C868F7EBF8ADC9DAD8C51189718410631AED051AD3E71FDDEAEF7D19E79796DF9AF9CD75CF5AF83BEAA0838A8A9DA15828227508098490421A748B8D55D0481B2D79AC68D84830417858570F88414DFBA1E5CDE170CCA91186B62CA0F2628D3B90CE02563C83AE56FC53FD50063A6C0622F0B7F48EA9BB9DECAFD02E19DDCDB6BF6020A412D10905C9976FFF6B827010B0F85750B1BE0906051D1CE8B80C041B2EFB9CD23381B5FC59841B9BBA3DE9F6C28B588272281460AF38F1EAFF895E73207EFF03EB07B2985ECD91552FADEE7ABB213E724B81360F6098ED762F641BBE18B2FD8742E5F17EB0C7B32958581A7243A6FF516544CB05ACAB550F62C7D5162B340211E1D36004DAED940CD4580C1BB3BBC6C4BC6FC3D6390AA15BDDD513E7A15D3270A695AD20D2C3BE16C631427D2F2EEFF0D349E512B6058994EFAC202C4933D8236A14B471B0338360406E63EDF5CA17E8D35C39757136A76A8FF01FDEFA5D7718EBBFB6476CD0EB5B7700D45ABAB6DAE4EDD78F318CE9E6E887712DABBB7837869D79339685A1490EBDF95018B032D82BDF931834326C57311A874E39A3B140DD1EF10CB24A15F22C2298D93B3EC98E78F9B1AA661226380E8101E2ECBD5EA66AADD90A92756CB06C28747C1B0C1B7B04150529F9F35128A5453A00EB7A8CF61F4B9349C94775E102A90D0CB59C8C4ECFAAB7B8BEF63214B040EBCAAE6A813F020CDAC8D18415D58641F535B87442852169C18E7D51CE76D7CC56FF124ED758A8EF07A319CBA261011739CA021858514586D61C9014D4800205140A41F23F05FD8048F045528324BF1C939E5A1C86170BFCFF539FB05B804C2D149E6B6B47CC00C6970A2E1E60D1E9AC733F702AE6046E252BD23E2483D52B19DF8569A336F3EC5534BD7B0BE48D1EDDD1272D85A4485552EA99B9F71A51BFE124A1537943D670E20EE77F56993F228128458877AF5682C994F8D90709D00B79FF815EFE3E5F2FC0ED2B1B3A47A915A48B6EA2ADC0A844D7EB7C97D67D3200463B6E7668653DE6375B00189D5C7913A81E7B0A9218056BC2583A02F17D5B3662D402AEC9470C31C2BC67D1AAF5AD1797C1D9BCC6B8B90406566334C9F8C1C45258DE00B580EC0FDAFF35A72349A0629F330CF4E57C3E310362324363D3F1A384C218CCAE600F4D8CF9D61C8E341517E1CB95012AD744278274523F6D06A630BCEFB00D51ED6FA99C774475678710132AA558B086705EEA4B4690D6080620EC1E3012385A8F69965950AC6EBC47072F079108C1C12505A067F3754BE27802BCF5BB144568A873A50F511A53E611387651D42EAB7A0E30A7F8E292098A45BFC261C00C903E7F1D443A92C89F5C53682FDC330C8770B3B46E62F1A8AF4542B55B08252F5230BBA3C13ECAA3F8E34DDD10C9E649273AD07A5336B219A04058ACC059266174AC21DCBF6E3805C50D5726FAA5F6D93F31BA5DD98C6D127D6819CC26003AFBEF55A10FDD04FB0395267AF7765570C6972892C0A76B9680844BC50B00518C64629634398D9086CE9EFE8CE895E9279E516BFE2E6362ACD2C12BFA4C9AA8B6C645FC0EB62053C7E417367D8344C4B23F0918F415A333D2C1A6E8D2FF441DD81583FCACF417954FBA2B27EB6D9A8A84DB5DB81B8C016257885E96DB1F019FEC1B1A81F3129A71EC76D18F3A67A86FEE628CAD3382BD201B782911DA55EE9773309222282D1D2B410352AC2F8FAD912E473F332C5A1A92CA8FAD7428170DF0B00BAFA1FD297992F29684A62A580E6F59D4FFEAD01FF59CED965B272DF8330310A0525D19DB231097969B6612BAA18F933C1B971F615FB62D95FFD06C108827EF6A01B1CB1D50304E04DCE33390CE469820E31DF6CBE4BCA12CD15C41E4D9B16FF15047F15477CA4ACBEE0E0A0AD50F6778EEB6D1BFE4713C236912FE35B0665166D9CA08B05C14B0B4376B93FDCFA8B95057A4C9248C733B3113E1528DDB3CCCB4BAB2D32ACA490B50912792782665623EBF8F271FCDAE33B054C834F1EE0F4439EE340974F4AB09EC065BACDEA98360CFFD95F4305AC93499D15D1A584E67218AD3CC2ED8FBFDCDA933252E217E25470AD2767C09EB274CD124AD81C49B536EF7B1F393722AA5F42D7474AB946722FBA23DDF2B0D2B0058F26B01EA5F1386E5F3725D505391AA26CF87BF5FB86078B22509CB7E75C3FE53AE597BD8CBCE70B0B25C24C2D51048E7AA9895D1183367751698384291CE307ED15ACE4D9D6CC016DA25530DF5B317B4DC6A05B52A64D1E7BEDF3DC43DF68B88F1457C6818C9CCDF76E826ACDF8F1D9AF8BEE8502BE35499678422FAF9706D05BD9E1BB124A4E87723612BE703E0C9B4EDBF32E68C5B68EC5485E152104ADDFB4D2077B23608BAF8358D0396671AE7BE80819BE640CB9B2191227993D1647DAF2C22C808FCF9332736B56C50955B296CE8A4D50B5C707335B4BCD3E25E01246DC9DE77080C08390D169A35D8B9CFBB47C3FAF7FC447F30BE7F010DFBBA0CADAABAE98A82F511106C748F121B34FEBBEC5EC8EE88E2013A90DE34E2E57B65BC4695989436FA57221C02ACB62DD125EE6C8008AEBFCF31D66B339C2AB7057AAAE9732999348369BBE6C90F0950FD43BB64582B8AF34082D64B7F4760C9BD6D216C00FB8FB8570D0E652C4183DE4B7BFD3946562255A984E1597DA1F05B6565D5E2D0E2B11A2A319AEE20C78333BD91E23F10B2AA80896FAEA6F21A124E0CBEA659E6E86AF7F5C3F81CDA036083C77FAE28EB5FEAD5E509629743A0F5813F8A45B72A26CD18D3F6C84A5C716DDEFA5F09119234AED65FCF608CC1C2132DF99102D29AD516E09AD32CBD471FD1CFF48623F84D87E8C309EBD71C6A7F31647150A58721E938030615F705DB83065F5D3A8EC1E4DBAA61C7165A089F1374D4940712E73BDF4784BA168D465C4E427F64342D8C54C6FF6605A77525183753F55221B6F5C19A7768C33F06B2B6634F3A8756759DF985D9412B0F48D6E376F83C24D0141B6BE2C2416819CEA6F39AF233A443A1C037358510A60229851094DE7B44E44A1F9A842971C9C1DCB92B41FEA077CD8772C09D0C3AB51CF14481CC97217571364D6ECFCE9151C2470D5976FD622C89B1EE4B38441D5A4093339E7D59608255335ACE09964B159937DDF32BFB57B772F4FDB8E61EAD0A5B128FE4A783A1405B2DF2E6068AE715C2A6048B6EA6060464DFEF153B774AD5F20751131ADABA4A80CF1B88D4477EB6BC38AA12DFDAAB462F96DFD047FC258A488799DC327593AAD00DC69B210521B70627CA0C8E354607A083E6AFAD7DD0621DFF2BE30AD7FB828452451F1723986ADF0C93C257AE05263247514B4B20A356E6A950CCA1AB95961CDBE2E4AC3325FF023948FE006052EDB65053D05F32E272E529F1C8CC6FA69CAC86DBEA04AC6B0F9881D70F265F85A96783B82AC34B8E8C2726319B173A4FBF76697E3E38C18FB3BFC62F904EBBA090C4E725BFB1C248F65AC37085E66290764BB55DFA03A79995068EB95C8ABB6816C35A55081065C32CB4FBA3B9802138DB7B9257E44CF36B6FDC843D4458AB56A0AFA1441C8E06BF1409DC19A116D29D3D465BDBE06518B025CCD4A051E65BBEFD0EC250AA9431D62290F145CA93A3D1B1C8482A94CD0EA7030FB248FA69E6729A51E69C550AD2ADC656772A0C779BD9A06A33A5436080669BB904148F9F4380A4CC30864204E43162B8E9DF05934312CBFF2E5404421F00AC8F74349A1DB84A7D9F5951DED791F4C4D971BF067B981D668D159F743929B66E98B55BA5A573FE51F076958DEDD77CC6790246C817FF9949C85B5306D3919D410717C47E68378C2557BA9E620A330000A0A7A220301B28E06120B177CA4C4744A5BDD30B99EE9368B33282295061288B692B0DA96F90679A9C91980AC2B3B24645C9A07898A3FECC7E34ED07752975919EE60F4E5D083D9544A7BD98B566917F2DB3D7C06DC33F030C215688F45E8C12F6776D130EF11ACFA9E8930D86304CCD57C8D71134A84A135C8606A6B4892130E02072ABE35C89EC8F31A2E1171C6422D9BD7E2685D0F264A0FFB55EFD8B548833E08BF94BE65149B3B49D097F57A0DAE162857F59CC74F1789B5CE75D960D69E673D8E335AD7B97DB2423A1C519452390C9A732EC92D63A9C301A150F11FF3D5647615237276AAF253B5A6A891F23EE02F18B7AF425BA5E16FA307A246240A16C86B93D5695C2700BB28F6A91AC15F277BF96A199BA23F520A0FF59F7D29026737F2051FD21F9B54B9621F81E7008559752DB4B5FD5BE5ED1032F3DD062E75DE3168952BC5E231BD694F7F099ED860DB4552D6DF45144F3515009D2F3C261FD2903E9DC2BD2327E5A8AB7956931C7E0E44EBBF9F76FC8D4A27DC532B46467AD01F1AD9A3BE9309E9E8868AF2BFE3A33B9B9819F15529690CD13787C0D3726BDFE42940D45247B5134829916EBB8441A16799A95FF71F1B3D2758DB4281CC848DBA7AA5F8B58972E10FD8CCEDE10F9C48935114D151367CD533CCBD156171CAC1246040C6C01A6348C36C77C3C916C8CA4FE5737274A67E394E5089149EC1572DA1657806AFE5FA5BCDDC07FC9C9F7F624E6D79262E96073D9F6D2B8D7CE7166B1B8E83E8EDDC7C04DBB2AF211484A29778E2486191D7430D2B2ACEF774A086B613F964F517756D679C2D7014A1BC4FDA7ABF5A8110F0DF066F6A39AE0C9EE45E52EBA2793ADC7902BA4BDA53A47ACBF6E84734275007F0B4E6BE22F70470657F93B0D27F43742E93C7546E127D91C83BFA5B59D6153DDA8019571D8DE16A32033673C8BC89638C6413640759D396E5600F6F804E45906B58CC625176C48BAACDFFC4319AEADD46DEB9027B67FFD3C1D4A01AD69047DEB940B555EF0FB84EF04B0231B9463E8EB0682C0599E653C5EB6883B4826CABD68805C18B0168A40836E74EB3F351933D84FE9DEEAF04D383E0B01B18F3D090A2F6BD66E2244913CAEF69A13604F00BEBA8D10B7D212AF8AB77453C0ED90D3F64144177ED86452382DBE2AF760EB856E988495E4F23C55759A1C6149647DC80602C9AF397F565F0B2B366E696E3E0E1E2E2E7656337356360E1E1E0B2B1E715E5E6B2E71315E094E5E695E496E194E2A12522C9151365D1441C9E28C56960CFF1626EAAF22866F18F10119CE80FA875F32940267359D784C84C4AFF8A37E8406FE00C028EFD32DC4C756E5FA8AB4ABAC7ECFA618B888AA63C190F8564834A4BEF172C2DE70FB686377BB976386F34B442DBD696F2F056A79FF691B481A34D1D048AA98F4C46F0A7D306296609B26AE6D8C8169A80C504CA4C5B6533F8BF088557561FCFB219B9FFE8EA2C2142FA294E1FB655EF5C0605E8899671E32D9742D89148764869B8B8E0C37D4CD25A21B039A962209A4DA043E2ADCB1A94DD919E1AE744DD592D03997056B5F472D0D49891E6B5B50FF473C2FD756AA369E3D7417F8EF3C5471512ED2AB743E22F7687105EF5F5813E0CB10D7113504B9FB38CE710ACEE3A96EAFF76A3F87D4191290262A7A90315DEFEA1AA120F64E1906FD2367A504410B0AD602A1F5BCCE08612347A5ADD8648711C6D88907ED726C4C612B2E147083A1C018D4A6329A19EC11F1B1E40DE614CFB2EAB43EBF6F1B373B15D873CC24021D221072A2FDA830CA7FD8D9E5E7A7212453FB7375745771A45CB6B7FC13FAB13399E4148E60F07B103ECC0815371BACB8CA2906439B312BE04F0CF31BDCE95C0465D7243CDA8A4AB98812DA0D8EC45653E8693F2143C4D02E3E70371B6D9D1E0E276D33DFBA45CDCEE1B5E5C36197EF2D2B37C53CE65EBC9D7B4208180FD363D7C4A941EB2F9A60A673F59DA0B42D33AC6E1A83CD39D187420D9D6FE5D02B4DED6219DE0F37311548F5988FE12019C305112F8ACD07BBD62D899EC3F8394C2C6706C6EB2EBF6D12FC99CE538F7EC91F9B5382FAE93BACE49B74F75BBB409D97162B9D7A50D0715A92B093ACF200FC8802A5CEE9F4DEEBFCF992B398C4E86FC736010900570CB7607C9B4FA1181E6D3630A20D7EB5C9C5DF541226C6CD33D5B6B66F61AC2B18C42E4BA1543891ECAC249211841DEB1976FCE4561EC835C46F39C112B737D2C7F12612B011881FDFA112C0601AA400D9AC75EE42AC1671C5696E45FFEACBDCD236FD059807497DEF1239443E81246499B04FF969F853C074D9A6DB59C7DCF4A6E9F34D00C084CE5006A3F584C2F5BCE87B9A30C98AD7D94D87072D8CFF54AB32BE572463204C6D38D9922134E083B52920F47216A3E58701D30BEC5EED5D0D0106AAF6FD89599BE3B33F1FCDE455971BC9512B220D51009BB8657B029CBE05B0505122D1F79E50B62281E7165B1440C780682F4B475BA368E539F57122FBF1C2216B94D5FA07C0CA91C44839838BC556BEFBC2DF82AC58F496DF8CCDC196A86821B41B853243D845BE5D5F003855B3606BC5C5E5D628D0F1F6547F5C17EB3D62896DEDFADE17673AE513F1C9E988E898361D09E827A14010592156AA6490645064D02430542820C3F4061C2448D18B4CE5C4998D19903832058ABE1E4CAD40BCA3BBC4646FFBB254A38E8040776F9991AE73A6E58B3E69DC833035FF7B2166A39CBE110C520CF934101C8E06872D90D53E4C6D626399382AA53AEE26E91A9968E3E5FF07EA1F9C83E8A66DACA7A8E0D41128FB1924C62D043F1E8CAA4A816247EE35C91B24E2EDB7E7E4FF2B0FF2663C55A49CD4E611F74132A6FA12632BF148B80B10E78ED5062DDEB7D2E79FAE7AE174997ABD66757D0CFB2964F2BE43F1BDEE84695DF04C2653E4509967C2F835F76596676F4CDD621ABACF460C9465AD08265FA3C62ECDFD1E126FC25BD142837EF0F0BECABC6BFCE3FC5C4F9EB9FAE509EC7B6EA6A926EF3AE665F88F39551904823B5427ED0ADAC6D830D046294E6B6C043BF7FF45BA91A5E4F4C23E71E1F6C8AB47D050D4D4EBA90FCE3F7C3FE604C772991BEEB51D45A404676D1845D9B7A65F8C2B8DC9E99029C887AF4B71BF8635E6AB16BB37D2A649AD1454FD0CDD6AC11A3CAD439A22E415721FFE959B0787BAF0B1BEDDB0C350655AE6F94C8877478467648CA8412BB618F7B7188A0759DF150F8BCB7477823243CA2BED5FD41481C7DDBBE71C7DB1FD39475CCF8B1DD323F13331CC0EAD40EDA4B1EE31A77F63E24270B79882A853DFC83447EBA643842C41B54E262D099612A746B658F3CFFD9E632C1991E5966FC8A36D4D34156977C4FB27C890184F69EE4211A13477FEDD7040B80BEFFADAE7AD152153E9114F921DCFB886B087B5EF1FF441CDEFFD5E530B01D50481204C810890B92385EBF52A2C8CA865A530F3FF934534FA1683902A9C3D8919B9B370517E8DA2B949E719E340B4D19B66E7F88AE133DE93801171C03BAA9027E4402433A66EBE7F6B1A15FBBB44998B35F469A2B6546A7FC2D34E0E15DA6596BF40A9C43B03A36D4643B3074638A77B0261CAD828731992B74C470036821CECE3795A7EA4628B1EA5290D03BF2C30BE91D6424B653FA3A0DE8929CCE94160F2D3CAD41BA63F2E3273674CCDEDE7643CAC71E01871B93060F2D74AFD3D1A6F0E24932F7C813CD6BD6C3E8E128DA8E05E09E224F8E729EF804D303DEF556829B9CFE8B0FB0D9A9ABBC9A5DAB41231AC49B72FA90B175C72BBA25C5619DC7476285A79761A0C48AC87933F979B0FEB0E85022B02A73F5D69960B8FAC16173E34ED98AE45E0D88F4CE4608E3EF5A061FC6BFB0D607B87916AEAD7626D8EDD89EAFF98707AD341513A5DA0342851C4FBD56F09B682B4FD60CFBDA10C7A0FEA0D9C2E6862304379EF2CFEE19C4802C1D1D544390582B78DC97321144C08ACE1BCFADEE74167827DBA7E0D2871EBFC0F20D0393019B4527484BAA8FEE76F0C98DE761DE91DE26B9D8968BA85D25E1ABE41CDED2B9BE9C622FB7075BB904FC3BC7B385A4EA3769A46F2FFA9F0D453603D68AFE3782E0EDC24CDAB0A0480013FCC7711887D01665AE28391D0B5CDD4748DA26AEEC5A40C6BC8A99ED45D7640B4BDEF133DD74E5EBC77FFEED515C6A85196EE1DE72EE90F1FC7212146838243F0868E1904B58A9F3DBAA896299C19D569D4B923D4EF12B7144BA58A227573554C4567A191A0CBF71D39A77CB3AF36E415DC64A1344569BF7B7C2062A8C3332C642E938E9C6BFB9EEEED905B9C18C047B6B34ACA996265EC9676CAE76BD8FC5E7D228F1057C85559840A515A831BFC1421F4FC265BA52A6574A0E458A94F08CC43EE6229B195D1620A973901DDEE946C53595E8E4864FD5EBA9341E212D5BDFAB72642E4F9EA30CA6C0D5DC1393AF4F5E0842FC0353886E1E5A5B7CA8AB79B375E45D20782692D3BFE490C117A50EE78FC16FE056783BA902FA81E01DE8F3B8FE54A9BAE4B5268867DABB42EC7BB7B15F2FC7DD4CEF1647F94CD875468D73EE4B15163EF11749A1302A7C233D2F24C23234558E78831EECEEC65EA5768DF721B3C36AFACD4E221144D8CE60EE5D3712733C10382E66DDD671710E3EC955F95D3EAB07857EB6B36AE9E2DAE6F3807AAFF3B2A8E45679DE9034CF2F063271B2314899B432CBA036A0834099EE0EF50B961A0132E979B770FCFBC63C2C179091E2FE22862C98C9A3DDAF69A0134492E84A9DF1598CAAA8241B0AFDA88CADB0661B21F3FF584D2685D048C18C13F45A0FA684D24ABFA2A186264B0C6696DAFCFCF0C01505391D37234F20FA3DDC5BAFE1054B5984B7A9A4F37311D2439AF335622796CFD14E1E4D85EAEDFCC43EB2496056094F50B3DEB1361E654070EF6607FEDADD07ED0B421320FED751DFD6A38EAB41E0DF27612D5BFD3FD1536781E544E40D9E73D69BC35316EC23EB7D91BAA0FC0653588D28F1512A8369C25D22EE7A4B8B7FA0758261BFA2C68FCA4D5389EA4E6CA2A0142EC6A1D32E4E5590301E95704440B0DE2A67163DD7BD8EA4E47D5B4C0F2D1A8EAE5E24AFD015763E409EFA3C988F9A0FD37719C943871E6ABD6556D49E901D4A75129885BDB56FE972FCCE1C238FF71665A27511D5D740DD332596EF814B3A145BA4E43026FC27030595904D9BC0DE85FEB3D5DCF61A10CFC377FD8C64C31D688FEF1BAAC390BB26EB6BB97D0AEF2EF04A081549DA095BE3B61C43E68048DD512D514903E66915C5FD2A934DC8FB764D13612C97A5E636C00204FBD793343A11D5DB44C37A38ED790FD987657032092117871B130F9A782D97B568C4775E164709923FD089164297FE7A0C2DCFCFD757D6A901C7846B40B03130C01DCCF929E02E5BB17CA69AA622B91F19EDD1A31797382AAA00534A9885886E90B0C3DA3837F4FCDC1DAC0FA77876A758D1AB471B38595ECF96A025632D96A5BFFE2992997D63DFACD5220FF20FDD9D9DBC1D956B02D897CB665A386866CC195508F7FA11637D2C2F7FF0C65F046C4958E7697C88063AD8A50A368A1DC35A0C58A54FF76E8E35C143D046D6A76DEE1EE91C45EC655F666EA753259009225E39D9AF1BA0846E9D2CBEAF21E819B04A8B43BB585A6A1B235CBF349A00459DF369A7CC91A4A0807B918BE3834ADE12BC7462AD24AC51A31506001FC33F40EE06831F72B4B9EC4E9EE06E381272B6DC3443DEF23B746EFDE48350708226741E42A097F12536EE8716DA7766FEA904890618A3202CC0019422691849541509392F4ADD217D7B47E111F91393416C1861F05D8D4ED4C033AB57421CEBE3838F54243548AC15060FDF94AA3E016CC1681B1DA80F1FA1F9899B0FCB655DD21D526431ADFF0C84919A0798E91B61C52A4631FE5BD14D36189AA247576615B83A8AA4C2AA0EB858857042D060650C27B02A85357243C9487C4BF163F821C6B2A4373925676223ECBCCFACD3F26CAACC82752953E24B41B0C399A485584E8A4D513AE9A93550EDD1F03BF30B9051F51978749CAA4192D42B6968D194BB14839B185E4DE209C5395F4B0CE74418066FF4C61D41BABC0C3963A789388F6DF42F5ADF40E8357F78E9EB5C7DB2A73F2B4FF804565FDDDAD049C6AB1D91AA6D6BC8AC5A18AF568FAED1B8F607549AE1D54E446CD2D1C8FF125124C10CD38D45EF0909CA452305311A14B8A86994763200AC075F5961ED79B4F332AC0C7FDD6D0F1F9D6F4108E68F9A12C1FD62C91A35D760C88429194FDDE31A748D827AF962639415F7CF7D34F9677F460A27F76A053811F2D07FC5ABE244FB2CF8195E28A23D1C28E1D158E6D77684AE53281BA289152D306C1884030B3748B9F4B5F58D1A0E91087332D4F3943AF58B828D267B63C4DEE2D7D793140F5C411E1ADD35FE8F6C9E6764BCF80883FE5EF54C2B8B3B79325E23D828B5699EC0B8CAAF5E52A313C38C0282A803EB73FF7351C83E68713EAF390B5BB9EA66E224F44D590547253C18B510D1E4C7E70F507ADD5A49A1EF75252E1D1A273C09A8EEA25E68C9A8CE3269A7012AC17D3D713BC256975C5A333026E51BC7B6F41B1BA4DC3B10EB41A621C33CDC6529277618853286B4DB59E8247F713D102B81DAD35A83C0634AE7A74AA648A08CB548007B0BC017CE44A42327ED677D492FD67C2FED56B26D0F1EB4DBD710AE3BFE2EEB6164B00F32E2F15DEC70A0342893383F9A7500F937BE585531BAC5444D2A31485836B2E1C89B4F3ED368130BECC75AB0E0103F81017F7EF11D32BE1C809873005997E29A2DA36094115FE01CD3BA82A84B92E34CBF4860C188720096E82AB9C105072519261EB691DF430C4691B7F10A1A778D6009F4553CAEBEB80A5FE30152D1E5E3098D396EFE8A43E92443584AA8080D7AB03D85DFFD83AEF878B837CE1673F9AF669FE43CC4CE3DDF231FDC93C460580514203D9190A26933C5A5EDCA71071AEE870F20E218FE26F0D23D3C98BF8FF80FBCE4D6BAA7E14E6803A12CCC6169A3CBCB1A8390AA2194D7BDCCEAA7FEF0D4FC55EFDECA25173A0DB816AA145200009A0DA6ABC29BF0110291DF924DD7F4D818163484289E85028B0A5981720F7DF53795BF490C1AA1DF84C6B068FE66BE1B3731F0B26372325D9024CE8B5ADEBC6DF0DB66FF8B3E51B08AB1ED970D32A0A3E90B529BE575D27889F8C9DC7C04DB35A7DF9023B71FC25170AC1709327C801F3CFF41D1048EFFFBDFF508C6A834061E6D8AB24EB9341C2BF14A744A48EF35AE91BA96AEE87B2F61A21E71F1458E8579B9EDEDFFC07907D0A96CB1032C8D320C29D932B25E75E505AC21535A6830FF46891C25E7D796598FF46E33E274B40566E1719858C93B44FFEF0E7274C47173724B807788150517896E5B750490A0F719D1E18E7D26509CFE6EAA0B80089D2E744D6FB9BFF1CA71B9F25AF1DFC612EC4F2BB9A50FEB0449A9E04D28293213F60059635B9F6B778B90E05D1901F62828560015B3D1AF01FB4FBA5B93A4C33BB6C968BF6A8EA03A9F21C54AC7AC79541C6E29B1042B5D634FDD1D9E73B46DE38D082A6203DDC2DACFEFE51E94FD751011CCBEAA9DBB7340D49AC04A428A390C6D03C624D8B692858A4DDA2A9F4CD5C7E0D4B5AC9888110C8C17223185089B9FFA69F1E88F8B023849AD18F9D741851B40322C6FE73D4A72473714D391F803798493651A547F93FB58C46BBF022CEDA14C329C0CA111BB131AC558DD227B1ECF61F308E2610DD913175F6B42156C7C027DD4480C643503024695A70080C6C8753A64FDC6E93D123BB712C42D239FBDDE14ECA6129F6B4AD60F648DA4BAD019652FD3A568E8D1E69F493022F0F9E61744F0406AA64C51434F72151EC71C18E36827082A50EE50D8612E9E0CC2A05C35E3DD033707CDC55E6E608A7E4F4424AC8FBDC8134183DBCD4791307DE64A4F339A86A5C8938078EE879EC7FFBF5538E003FDE80AA8A0471A4590853DCC8101A5EA4A7E3B2D752BE6DCAC0B96FCD0BEF8546F09DBCA60378700189665516363FC2EE3D97D80FC60C8C46D112763FA9387062778BC94DD7BA2183202AC64E65E0A672CBCA3265F8B7486456538A65B1213C07EAB83EA65026F05F9223F968080C289B957864C6DAEC37DC0D054DA2C3311C19E5A9A9AB1E94DD7FE1434BAF6C7F03F8992837E16AA2501ECB7E6B99BF83DB84284CCA72D89835B57099FFF16BA7A8EB80FFB127E4F39F70F58F48142A9BCA08FC8AB50C048FEB218904E6BB1F235C2D64F063FEE8A38843A15D69649A5D9C7E65A49C8992DCAF1BB592273339DC3DE73B77CC76B6014B8436EB7181D6E4896A555ED1ADF45C739D36876F4F4A5973F39478AAC4BDBB87F77A5F4308ADB4E465C1112B9B5B13CF97084FF990ABE4B57812EAAB16681B25EE67430BFE2A776EA40C29DF8347D0E0B49C99B8F734B002E72AC9B606AA0556156F386A5A40E566D07521704C22EFE21EC6DD0C03A0F0BBE0432AE29111273E6533A1DF619AD41CDF397AA34328A16EF4559B46C2AA5CFD1356787DBEA89E68661084504545EABB9057812104277EB23CDE7DEF0EFE616F6136F7026C3C9FFDA355D6718E10DAD67B574540218590CE1740FFA831DE1E3576EC231385AF2AD46684F8644526069BDF0C457DDE24161CB185F140C75EB4D0C8C1499D15711CC1461F9AD144FA6E6425E28D5DEC386FF6846F3CE1C79ECA1B9A0D078BA4F2C626464E96A1C9677D0944411EE802B9FFCACC9F267DECDAAE40B32D905DC3A338FAB0F6356F19792BEBF5980E4B0C9DC6686604F4F95BE3FF64D3CD590ADD9DCF12EA646791374144A227E5B8974770A377DC9B269A9E0C9CF478BFB054B8916C66EAFEF271CF4F0C3DE97078614FFD83FB69734A93120C7CE4E8A92E5C263B85FAD7AB252615F3AADD03A968FFD2315A4C02B413293C7DE22AB68C709CDE7496D59AECE0A59CBAFFBA627DF3730E9CBA217BA185AB996F17BFDE4DEE4A1687E2E456F3409C2CA7CFC02919F7D514210D791855D00E7A8060F74717DA00F63063184AD2D655C4BFFF0D28AD110AB47E4A0C510E8EE5042B9FB4445F7DB752F61A4FE9344A3B0ED5F8DA8F0B1739FF2240897E429F21987F96498295DCDC51B42D60FE92773F70266DFB1E74BA2797472C88AA8069E4C3F8B93CC8B33C1C7DB68EA5DE630676805AF22888BB847DBC73D8225DFEEF32F7FEC4C5642A76811B4D76BA642503DECEE37D3CE29547AC80BB61FB674EFBD9BFD676D5B25F3F53DAC5A86FD48EB103A6F9970E87AA8AE9B5035BD89AEA080181F665B98CA62CFE519A44CFA7AB292C007B4A2BFD266C00DF38B253D86CBB8E6A9F8CE3A2392BC354ECCF5791343D5B0C3FCDD5A6F1EB3099E63DABA773E14CC0CF7EB8C657E515FB8C7CAE4C641F693ABC63793CEAABA02D06602BEC13E418FC1CEF2062B26E64E6DDE7E26FFA77D2FCCFAA9F1D4C33CB0204A5876305A04C31BDF0FB59FF62A845800C6A628A91B7461BDAD06008F13D94B77D38A26DB244C29AC3466064EE34C9752E6BF11B1333C04630C1B3B14376FE67419CABEE7AAE51A55DDA21D5868457584EF988FDEDA31C996821A7DFE4BDC8B67ECE9D7AB13A9E8B06226E120AAFE2A061382D0A44D1161354AC4352E478955F7D15B46D0708EE27F1FB879E75224499256BF383B0143BE8E6731F6C62A5F9B11B0E9B1B0DAADE1EE01E67D7489D2498C72AACD9DA6CC81AAEE57CBC356A7831E6E852F3C7CB6212AC3165FD1F9BB50E2DCAE4EA3D82911B03E934E68EE4A9E6E57920646803C9F9F2E8FF0C860251F8561762E3F38ED2C4FB1CDAC35DAFC18A3769702FEFAD08A3DB3A2368C5CD019360FB0094589B74D7D5148DE33DF3F99D55CDF416392BB0B7C39AB8692AEE69DDE00050DB895849EBF43F815268B506D39647EFBBF4578734A19A20001B889F63DCC74ECE4E2FF6D4774317DE96721E7D5E3721E5052EF9331EBED61690BA148F0E50AEA2EBD0E9A22C2884EA6AA763CA99AB6DF5FB68A9040B4DE6C975C3E7C5342D7EBC23449A46708339F0AFDA43E71A339E51E4F2FCACFF27496D5B31976A5AD9FBA701926558683798925D69E0C7449DA9A0110A2DFFDA281CCCE69CC1C0A4A7B770620AD4E2E3E2517F5228C5DD81FA8F42A15EFAB5A3DCCF45DE30B0DC1C8E6654B75CB6C90F6CD1EEB8C7D10238E35AB62FADF9DBBAF8479C0B7919982BD243E18D84B83422D415B9EF18F283DAC7F79D95D97B651D335A42B81CC6BA8F7A778AC5200863F5482EB89C9FE2821B70CE778A5EF42AF4D711131B1445F413D4D2EB72849E1914CED1E61D9FDD4CBB63D630BB49AB1EAA87CC9105BCDD8B2D4293CD28E4DD8FDBD6C743F745996210D3FABF3B04897F7E17BF4AD34F49FB6C15DC725F9472D34AB0980E318BC51761DA9006E0606B3A53D6BA4D779FFE8C729A09A75454D749185B9577867DDC4A724ACAAA80DF467424B90D695E5398389132FADF5B6D0D83223C379C344985D91EC71C8B70D063E01B1CD289C7CDBAC124D552B4B9C1447FB20B0D856CC30A4B5027180F0D09D42BFD39ADD52035B32DCB74FA190AC8D8631068828F48770BE3C703B7677909D7BE3809A62A0EAE3EDB07EA93E3F45915E6C0AAFB23FBCDC60BC11FFF8C417ABFEA2E9E15815BC24AD6DD628942B18EF0347A6B9248C12AE7E5A7119F999771253D1B877D65BFA096CEFD035739FBF1466714153080CD4DB68ABBDE1ECD8D52497DD6063CAC8676C35A0E3617840E494B648C3569B61756EDF66F8A08D8C52155274E002577136FC634DC56835C2699842205DB45CEB754FB799C0DE573F97C222B44463D09CED74C2F348479136D66E8FFB412299ED4E76F7D61B8F96ED33EA1193E5A2248EAAB9D2B739AF2FA9AC54DA2A4CEB7849B417203719E19FC29EB1C3C4B10A4CC6369B6A9E132FF4160AA2EC5FA6A14A7296FA0D95A2C54A6C074B45659DF3D0DCEA182F9A52B18C6AF8416FF8911C95251A664184256970453B93FE3F63AEA8A3DB753A4E285ECDBD7ECAD04BAD8E230562AFA4345B65C58BE2AB8944309FEEA2B1A8E1047A71BA75F397E18FC5293B754B978BAF8DA591C2F174E20B107B7EBEF843C3F6FD54787A4A83483C608A0CEEEC0B14FE89E15114517FB3FD60F62C099DB0525C38DAA4ADDC95E3633E01F683C196600FF951CD16A28DBD059A356EB4755052760D2E9CBF1153E7350127E508A026E19C8DBF165FF6DA53AD8B21FA8D729DB580C08C15C594B7B6CC0F84455FA13645BB0FCE93761B1527AEDC3DA76C0FC29FB798C949B0CDC74753F09C1CF5CE0791815293BE02E6BF1486664905DFA3187ADD92C8379BF937620CEDACC177A465E443FA2F53A0BEDAAB2198E5867D43C4E134CE84EF280E4261CA32C84F43ED787ECB9C45435D45BDE350CFF2D075FEC86EBE86B292171E310D9E902365EF10A018C9419431C5FFAFF0BBD7ED3E4DC4F4C36EF0B3CB6FF900BB1C1B4FD1C00A21C280CD8BE2833925FDC1782CF17250F56BE545ABEEE995A808735A9DBADF6172CC89B6E5BDB5DCB103644079ABF0E8101D4615E679750DF8CF73A47558CECFF0218AFB7D97CB26114826428A7079DA4420161A928A254ED1F1B8C79C2AB9F2306304E9B4E58507F3B26B771FABFF77F556DEBF217C4081E2348ADBF53A9444F3330C57C384116E6971885F1B04A5FB4DB5D2D71733118FF366B67CF41E50F1CD4A587C080F6D5BDB7BD33AEEE7E24DC02505739CA91134A9D4986919DA05155B9B99E5B7620489F58A9FB871AA8722E6A73FBB01E84DE249A77E5F4C8AB0B65362319FC6E785706A833AF37F20774876999DAAFE3A9A2BEA72B0FB031768F0B93871A8250208E81C20A0FD3BA6D66A5ACB5F7963D180AE692DD8638847CEC83D37CB3CB640A108C7072C47F37312E3233A079618C7DD90835E7B383F49828FED2FCD033FFD0593CD6FF8821B0E131B5C77AEC27F6726CB74FB71C13157D9531EA7951934B9BD97A30084AE8F0177A73FD379C9288CE19564D6493BE5F8B787344EBAA0D515FF95E6486496F71DA3F98909927B67FA74EEF5DA1862000EFFDC8EDFB419738EFD4EC71667619AAE8B6632F438FE747089EB9874F643B0CF01B65DDB85CDD9F3FF0AD5421537A3B292E2792DC22D775AEFC2FB41D623338EE8614B5D8D25DB3177C2C034B59975BEDF3E74B4671F172AD53D2E21B3D9D896F79AFD2B844CDE3510CAC84E5782F080C18291F0D6542CB98645CEFED9FFEE740FC48D81F2B2620D99E0022A71178435DB96DA63BEEEDA2432089F66EE07837AF7B38404C2E0E5E476A87E6FE770E83D8CABA835FEB46011E1532E8AF173873CBA070F1E65FDBB4A563A6DE55008620E1E2B4DCDD792C678DB0D7A87519CEF6EC6D2BEB83E9751B3FF52594F5B247A7F7DDE49C3B4983976312EBF08E1818755F4380BBD98D6967AABECF730A18F20A812A5732E56981FAF3142EB2493F4873A7D13A3E8403E46882114CA8FE80CECCB63B82F255B7AA1B4FA71DA8BFA9E9FF8DBB9F3D2D87293D86FB23457F0758D8DFE2F04D3522F57BFE62F08DC52B9A475186F1B429BF7A3E56DBF493B5E8D2BD8E6F4E57EB03600CA381FEC7493B5FEE035AFAF75C0A0642A029DC3C2AA501165DAF29A174B959378467D77CFAE130886930B4AC191C15C1B6210B05924BFD26AEB68C26FC844E3F84F567C6407FCD88C614E25D4732BF3D59BFC8093733F4366F5CF12444B49AA4EB595900C51D31F3DF734F952732B40CC110606E3B4BBF20F6A7341373D620C79558DA0A678E8C9D83C9BEFE14D443B62817ACA684F0F7237184833B0623116FAF8586130FBE65685227831C471E8484C80F2F294F1A335E49696A43BB86E59B965364C8CF425C9931F6D95E25B3CBEC253A52558AC93BD29C96E3DE089C9EBE6D32F194D156CAD7281E2499DF06DEE0E274D061EE8AA8C7E82210DB69CA8F8AEF2709213708F04C4D2F614D81752FF317B4E269D274940E1525268261A3F659113C2D852B3609E757FD2E6E3664897580F86FB9BAAD878A76EF646BE54B440BEF69FE9FC69F70D791F8448EEA21D1BF264FF11B88C661BAEB3F1B4BC19381D4CFCC31E62BFD0DD3F5654139D608624C293951A9034B524BCB24E45B79DC65FA942DA2DE5B26459253692ABA42F960F3313450301EF25B25DF604F3820BCDB3493A1D7C87860DF1F385DD63930E2D4AB4DA9414182C962F1AB0923B9F5F3C06354A5B2850FE7CDFD2B7FB0AF673B6523435097F5A3D85977E6B29304225931CDA13609E079D17DC27FFFABB1B764F95B1C97048CB52EFA953E59CCB541FEC70A686E485237981BC4AE900B0A26ACFC0FF73247CBC0DAB48FAE79D3A2E3D3F1A3CB7493EE993F0B2E3CB46BFC580E9C7D61A4C2079ED04589CEF61DF57331F2F29DB9820649766DF186AFC21EA5732A38E9EC32D93D140BBCA37371875AE67A5A7B7F8A9B5D7E50060459E3EF5BF4CA341BA8093A52382231D619F1A560A8D3957E23713F315D6D98E58AB6D9FEAD199585635D14FFF015A6240CA2D7F67DD048BFFC2FA398C97E84E7BC2969FF1A808CD23145BD1B2C3070116388117A31B9D03BC0FC62929463AC040C09CA0B5CBFDE1451DF47E6FCCAEF88782D1B8119FDBDDB06459877193AFA3F0AD0F14CF3A3C0980D1A54CA19C363707A71A0F25229222C80FE6B36EA8F77EDA007C9745F61CF9F22E082CE36E8CCD9C374A266312742BB220C9AF2630B28CA0355CCAB838B95569428BF40A00A4646CC2F2E626522E9E9F85EF633A793F0B297E279BADA69ABA8909CAA598A04DF5BF5270021B99BB7F143F38767FF634B4D4F29CB37C4F1E3EFC14FF9F259F3EA91DC8289FEDC5D21BEBCD963AAA0B02A7762FD6E2D749031C0725ABAB658F0CB3B8547FB2619D180509F9135B4BC86236E1141720C29DAAEA6965F7A78BE0CA6E1B7CAFE0DCF6F716474FDF1E0467C075B588F2455A86B2E873F0B9810780FB3C74303F692C58ED26DC8C64A395B50204B1036F626FFEC20056C7C518BB3C191981F0D25667C6A32677B78460D436067AA72B0166686733563F71607E329E63FA799652C9BA5B6876394C7DDD79D03A1CE4DA5DC17A79288174A6C500B65D64095B8B91040AB2955E5AE19568A41AA02E6FAAC757C6BB0FF35F9DE422121AFCF7B3276CE600E9D184B858964E139A6F2CE490D2C3603ABF79BD43FECA16792A37A528317CAE7FE0EB9626B9D4A4374B09C1679080B992AB9D734BFBC8D965809F2A4DE521C4052BB5DEE7D5874FB3DC7D46E2A385A870DA888A9DE5F7CF0D057EB7DAAF50D7743DA40EC8A344245FF46C0239E348FD06B10CD20A0E9A3E4B2040DFCA3A33C076397F2DCF3E25310DA0D91C40C53059F218438608F7E8FA00FE83B851BFA9D014BADFB6FB28D4CE75F56E7DDA807D430BA1CA90047A6C82512E8FA055E4132208725BD360FC3C294F6D92F32840C81C93480F02D46105112658F0E28BB50F762846E8BFE4DA41A0480253FD89F5D8D880072082014083E0085210810E4F845A9CB297E5139DAEABE5ACC7F975AB006C752A6707F96F9211CF2621B45DC9EDF7FE62C7A73524DAF44C4E8F8324D8DEF56398A55BAEA8A4CE2920C7CABF32249C12BDB72D902A5B30388CD751B8A9EB56A96A2E9CDBA2779347A7EEBED7247C9522AC139E46A0AC71265A17074E686EF9F7545D0E233A57B7AB5CBECEEBCE06EB933881BD273D49BD57EB79CE86E11D7AF23BF07021D7720D40A16F5220648EB19995D76B179CDBB92C33D5CDA976260B04D8806BB16F02EB77B32DAA75133A3DBA4BDD96EDDD809923AE8FBD50C3E5D61C5ED51B1AC6BDB0F0EB59A6BA32B6D2211517F49F22999B3E3AD3E42B72A0B74748A171607021E024C04027F1ADF0F8FB74FD8C0985CF15FF1A1F7BC68E108251C7A7AE46EC2BC399CF7F861421B6218F4E09BBE4D9158006EF77DBF2D31D7DF866DC7BA4DD2A428E772D599307E7A90CE85C4F4F8A5247A8585C447DB4CBDD621934CC443936BAC6F32969D956B2966C3EED96C5FFFAB635D4102F226E78EF7E0C8666948E51CFF53C1203A85ADBDEB3B594637B9E36CAF976E5B7023C1C57E870BE5A66361D042B53902E54324B04F94DA6B60E6828772829F490D4B05794CBA204286BCC972D97571A1F61D48EFCF51AEBB97D6617B2B14E5BF83963D52B27C785EC9CEE9E5B9B91B43AAA8878B163E91A742E227961A98F1E6A3C3325112B0E9C24AB63DE8C87776A111D8CEC4730D4397CB6F8F21175EA0B4934B2570C455FD3D6E2650ECF2F7B664D2F185027685C67AB272549FF16C6DF48F83FE0771FE0F63163575FFBF10DA2A74052F56623FECCA933146E7FE93CA657AB05732132C82367F1D6FD96C683BCDD9DF4316D7AD6EE2EEA0C72121ECA0010A2823CE692F537B4A40B4A8744BC19B8F1D16DAB3A6440F0B7D9AE8363416A16C34D34C1F85B7FF33580D8260B1C66198E1B07BE78D57A36580ED8C0C3610541527F54A7A1A0C4CE5A50F69BC76412B95306513A1DE7C8337FA59AD5D96B0F112DEB5E3AEEC9F8A7942BD029B54FF7F6B816D8FA23E0531C23C6810071591A74C120499420965254C3DF04D8C035595A689D6F3573AD96E5954E902BC0FDA28DBB838908DAA1B88E6C1687BC27A1E820A0377D24D49EF17EB7FA00E90686977CFCAFF4C104AFAB925F42A2522995EB262EDFD2547DCB952A0B59E661D34944F8ADE093F7A192B1B62C41CC79927727587766B47D99AC460D75F048D700EFCED77127DE11BF45CC8F2B183ED0E2937DB4EE96387845EEF40E2447A837A3D5A1050672F373EB1F5F31DB8AD7ECB88109F67F5357086F61210D474A5D7B0AA204D58A416355F2C137255CFE84BC75FA763C570BCD650031A1D0B034E28F982E7A5FBA237180C9BCD0C1836D4487F38FB6376C414EA0D70B6EB940A48690F6AE66090A167BB5A1289D5F29BF4952B5EE8FCA554A424DC40810CEF5ABB4497284922FAF9ABEA33FA7BBA2BCC52D6D227A91EA2CEF5A44C8305F3A82EAC51D4BF22C864EA143A36F8FF1AE419786FFFDE442D324A0E37F16F5CA7E75A52D29E34270F709364EE6A0A9D15FADB8321E9CA58D25F1FF8782D4DF7A76376D474887CBA69AEAB55CACE7098FAB8C760002123B67DA4E5C1CCEEBFF8AF87E4B33BF17A7E23337734D4A131219986993A5E43CD10E1A14732E4E0D8C294B4805C6982C4E7CB93D3FA74E9C3639E0FE5148AB5F5006A94EC362BC54468BAF867728A0A5BBE090F2478433375CEB6DAEB4E89EDD2BDDDE07550CBA90358B9DC5CA4CD19651685D7D9AC0F7B355FC2DA96BD2DE505EC290B5094DD025E0E49DB908959301924C1A6D7C024F70CFA42DC5E6DEEB2AB32B914F1137654CD092F886F36C91928269798846E856D3E701742AABA776292125273B629D9BC8EA22C1D78137002FD3DD65BCDA1CE5CFF338F204250F70B117F36A327E49CA2516EA2FDF8DEA4BF7F45FA4815AA02D355D4922F2D49F90F60D8A6315E5AD34DD8194DFF5A4B57E266105466149CA8E47A9EFE62E7615D733CB0D55FC0A0D7EDA40B54D35DF38280168A33F677D282108A9F64FED7F07C232918C2AA09BFA65F34B282AD07DF7804F41C5A85B6AEBA117676945B00817B09FB645B0887D60FBFB383262B71E7CC9C6B501F92BFF8B98084E03133D0FEAD4D05752284C0E91A6DA72797C1EF64DA272A45711FB66660E4B239D0D2AA30BB4E19491149995ED1F4BE0D7350B7B875D97F27BA0282BDBC121004339279DACD9883DE837FC94CBDC9A4D267758FBC14900121E2D9D6E38E6B4530C8DEC30D4449B6FD7FBAA9C1E45437B94D17A45BF258AAB7E914095A9447E27A2B6FEC001443B3FF903DF6E0C6E15AAE0731BAA1D1E7C619B08D68C039E5785E84C728D1D03D143504865417B73AA5541AFD75092B8B9E44F90AC51CA044A398F72070AA334FC4BCD008DFE54C1D08C1C96828A54E9BC969B932B095EBF20531FCEB311CDCA7031681E0A1271A81588D977109C0F473A575978F76FFFE3DBFD776E140DAE91D8343BA181C78705077C51B6C5BE9881C9205F835FF6FFBFBA7E861389BE57016B79D873AA54D9258F32E185000FF613A2C7B7747C56428676A7AFBEDA550D8FEECA5F1C64260EEFB6F84123BEF73C0367F794A48DB5846939BF5926538C8945149094172EA929E62DFCED2A91F2F05999B6D9633949FE71569A6298E6D358B921CC08FBB0ABD680B1EA90700E766E406259BDDDB0A1A0CF0E472D68F6131F1514B9FEFFA34E58D8AAE190675CEDA6336CA3D550410B8CA00B4036D9E89EDB71B621074F3DD6BFFD579FB0DA02FB43C4859886B0D0C3B9CEEBAC1D3DDCDC9C3500CB2F20D7C81E3CFB7E4D428CD350AD8CC3EFC894211A1227B04CE8B1FDA0DD62D910761F66093EF17F3A4F872D9CC786FC05549DBE17ECA70EB660E9494A7D522971C7454C61BB71F962213993769AE5CE8A8C5F2072DFE7574FCAE8EA05B23A690169F439694D3F4B6FE361195A8174E172B5C2A16A54F3D79DD35B2445CB2A112F7BD0FF11F2327921F74605E62BDA770D066209F5B4832F9914A8DE1678FC1E41F8B7BA27D8E8EAF03D505496BD0FCF01019507FB87562215E0F75D4D4310E0FC3587C5D187AF163BDA9B17B2F25355D2906F0FE2DA92B37896DFC986D95CC36B3C4959B4F7B527C7975407C3A8AF64BC6EDB81B361244F7E6EA00E67638DCC5E70CACD7C410F1529BADB65BD0F5FFC74CDF258D2FAA402BE662BF7754C8104DF312C457267FF55CF8BD5B1FA24755EB3924971BC7E0A4F5BF9A701EDABF64F1DB2B8286BF6BA2B966FA63BFD7345575E01C49A83515BCA5060881C9CB1C7E3CAD7A4C249891FE35BF45D9A9DFD15C41F53C4216BE5B9EE6F8C3B19F6110D307D757D9112BF0A022A4526A41BA61AE471920006039992B1D207FF711F2D0FCB72FE68DD0AEAF2A9DAFC63048070B616100A2DB37ED32E133127497DFDFBD407573DBFA55644100C80B427871AC3B20C4A0A5A2195C38D2729042F847F3BFA0D678129097EE54D9D13E3F62D2577656F4A763F2FE07F50FF81EA7E52130A0CA9743FB4B24003F452BA64968E61F4EC57FF8C996550C91FB2F833B35FE0138409322C179D589ED728006833E819D8C1EB427FD10FF4F823DF5FC975CCF6C355DC74E14F0B904CBD87030B73478E371E1C2C373BA673290D4427C3BEA74ED5FB3AE85B85F0D2C6D2A5AFB43BB06D63457D31F1EF4E6A00EB04EA2F0C760888B8281AB9974E2A6A5356360E4AD9A1B0A76B8D0DCF94402DB3128623B2F754CC89A9BE1767602778A705D754EF6EC0DDB92BC815F1A1D8DC1EFD689A236E0C6E68762E6EF8C23B6FCD3093DBC658DE7BFB26D3CB3E233385A9D32EE8668F05283E811D5A26BAA2F2F1058B248CDA8D892129396DDF422A925F587D09AA15D0039E688D7CC67127C76074B15A6B097B270B07A572402B7866884101C687EF9CDEFEC1B6C38C2D573DAF15A14E6762185CEC5D01C301401000A990246247814098290F66FC3C188219BFDF0C320CF7D4347F2770BDC96EA10164E6D11E5E01C59A562328B206FD99E0E7380894119DE58BE53F234D522CC86CB72F8FFCA9C44AB64FBA784BC8AE7E1ACF9C027A3A469D61E0BF5582876D126E10B02BF60FD0A374B674C5BD64194C6683E564949F8FCD2E3B31561AC474B8FD0315D9F785D40F997B8B016F9811EE4C8888C001649109B03FB00B2D065990B077DB4498E6282F2C8236010D3106859B3CB28D80F0F92C24306C704C1054F39030665E0A10EEB939D2169EBC0FF1824C1C63AC75090D6180A8831A693ECA3BD4EC8A20D1647C60C2541214AA1D5174BE99638A1D29C32A25007ACA8EAE6A721162290C8B5733C24D5EEF31BD5A3F15BE8C1C6D12A7E53375B6EEDBD2DD03219431F3123DB4B2B8A13C2F5FE909B034BDA8E40B9132AA3599148E20BBB26CCE3089404D10D7592A0AA503EA82936FC6D60B3C56A35F0923D22794232DBEDD5879352A5C6A73C325D7F0DE00CC828F40CBC4ADEDF6A5714946B67414CDB8AF4CA9B40AA08CC03978E3BB8EF7207B1CB8150F085151A46BA36659C14D65BFF688915237C534E3EEF08E4D261A2921221DB6AA26DAE8A1720DE949C6058E683FFD793503B832EE19C2CC9C74C815B3D95407B77E81CB20D503D4E761EBA66FDDA9FE1BBC0D18559CC4C5E083A71130F53AA75C4AC506134A8651DC6E7BDD38D843D0F0B879221DA4D1FC4E4C5594AE7622CE4834662148A90218BCFF95B97F3DD3E5A06697F3B1C94652E73D31E2156AEE16BE767BF36A5E545BA039FA6C78EBD1434772CC5016FD3F07FBF0092399476D70337AC7FD05AA10D1CAA1BDE03DB2B99E8A735726F1B80596DA3FB2069CFF727C0CE172CF1E44310992594DC2A96279CFF1331485423B728A60EDDB0CEE75BC6650BD7A58595B55F251A4C043AE73A0A035CF131C543D4B72479E45A9C1BB0332FBA0009AA2EC6B575A5AB77749421B9C24B655DE2A01123A9C421CBAC1F115DA145725D0F658E6810301A4D526D912160198DA550D090C1CA2740D83A4FCC91D9C4F662DF44A8FC5647104B742AB7AED2E974D062C88BCB4A575A8420505F91DE54CFDC88E3B6906FB0185AB0668A6432FADFD9881B9A9DE1E76DC539736AD7B0D3FA3F4E41EB1E80675984979FE4761D9AE80DE266C6A46A2F16FAE6582D9EEB649D0DF412E7D45CD7EB2D20FE13F0DC40220B51C878FAC814F40F7FE796C97963BE7BB17D14FB53EF1803870E219898ADEE8A1814122451F0B598F39AF352346BAD11F67CCB0E69DA075D024DF8BEE9370AB42414FA07FA661428DB316B99937EFFC800463AB2A7D75552E121BD42F13648EF280EC778991AB46B29EF8F790D15F2F6DA6E44BA8AA3D97DD288A1258DA27C41FD0A242D4753BC4A1062C29E0E53A2D93F77FA23664C6557A09B5F9D9A2CFB0CB3612B1468F0B0F1983A7EF28129635E10EE084A094D65AAFD240A8950811307E886838F7472398984F635908949A559DB5D6730C019CDAE4EC6897E86E9CD245CC70844D2A664BED85871DA1C902F49CD563D21302C9CF72E9EDA8427E3CB08BC05F7C0D461BA391237CCDE4E3E697520DF9F7F6E7B72B13163DFA40B8D6E8D54378C031C4F46C34824CC6E890F4EBF6BA593820B34CA7F59E3B9CB373B5148A492E188FA2A51E23562E28419E5E011FBDB0ADAEF8BE8E5C5289BF4012958DE1A1B52538351094AF576C95AE7F1ECD25B78D1A9039697D5122D9C9A747B8109304215C7452A7FEC834B59089272CB65A49775CFCD4E597DBB9403D709A35A16C2B86804F9823AFC7EFA064310C456C677EADBBBC8BEA94BEAA4BB98F2E2078AA40561D158DCBC4F571EA30CC15DC76898F3CC2019BE169C925F942667A0A933DFD43564C7B837C58709170D8E067C62C83EF7401C4C7708142BF6FE360F39A6B220BDACB50386667FDC580B826A6369DBD80CAB94AD94A4EC2FEF61404457E5705D82AA981A1CA53960119B81595C1951FAD33EFD5F92FC6934C113B59AD4585B2C59FC2676B12BEBCB0A9E0E3E4BDBBB470B3364E37BEF967D949242EF6B4FB2D0E01CCB2ED12370B7B6D197E96195406897539A2CF94B9D98E21866B21E168FA85E45D3DB21EC94F15BD93800919C475DAC8385C4AE1CBCEC13E8D83B38D5FDF8537C2093B804AD25D9B9CF06F30FB64D7D86B09FCA982EF65555045D2D76FA986251C41A0495EEE24388347F0E8FA980782EAA18082A2C8CFF46902605D5204D0DEEA654E87DB088353602B27AF009C95251C6361B9452717F88E1B9848F7CBDA3EC85C7BDF407161701F69269AECD7C427D66DA5FDEEFE74AA2FA6F783F96F9859904323C3E5D3ECC33BD13EA8676AB09C1AC1446539714840815F767EC90C8747AF4B813AF30ED148592DE0104F77C723983593E047775289EE1A896C87FE5766AB76E496FAA8D712ECF5B7578EF5413C88FB4EF01E5BDE4BC9EF5B384B00567C01FB245EF9F229973376A3765E8B55150C9F0DFBD2BD466F416966EFEF60D5211C0664F49C9DEED955AC9EF7C74331CC9C73917AB77645D302115760B1C9FFA6FAE2399E703E29728C9E578EB55B9F78E951E5553B44CBC78624BEB675C3E11A3467BC884025B88023C56B225D42043F599683E4BB11E9FA8BCE5B644F81BC4A848DB57A00865709201012AA4047315140B1AB4BFCBDE263FC24F40C5412FC666A3E8FFE98804B18D90CEBDC5EF26F6CD081DBCDEE5CF64559143C6EB5AC6E9B23D8CBCF7E5F99099C84CF8FD597E985CE24498D8D99C71B3EB041793C12EEC3184726CC3C443D86C8BF12D4377DEB9C48E0793D64F2163CDFEE93854B24D0A6B4443491270631F5F70492BC3E5D04B20D3F88987C5A72E51305FF1C306EDF3DB3D32FC40BE1B0C04851DC26AB844C2307CC994CB36C0ECBA0B59B22F3575B4A593BE92435170844355AAD997DD9BE7D5ECD510FA7CAD27CEDA659A0A549C0BF90DC4CB164AE633877533E498B49C4B69AC1828EFF864204A401D1C415FB49CB32737A9FA1F545FB540679A91043E539E188675A582D6DEE7D1B23F99CCB8FC9B626558ECA0AC0694205A8871EDAFAD1C8227117BAA2EA314EC74F41497788E00A4DD556DEC948075B4BF33A2FF111B7C281298936D5044C7B2E1A19F5FBFDFA75AD1372414E6610A81ACF73948E71A199A5114A0D78A2E2FCB5C04EB089AA3205F61256BF188059F64A26D27CAA2C40A315B49B0E69915357AB15246AB18E21F1B5ED586516083B828A7EBDC0F0C444F0004FFB269055CA2D47AF55D3220B0FDF90056BD4845F1335B0E84C3A5CF08799C6E88D6A59808750176819CB7E51907CD97516837F838AF03CFE13467BA79C6D3DB67B25E2C84CEA3B4875102FBB7C29A57A5C6B2CB3CC5285F9CBD5264268B175CFAA94DEE69200DF934B21BD2E1AD261B51851EDB0D69C0419DC3B36A9817ADD98CD59F1D6E04614D14895D1DDA731DAD46107D84A9D222E4B607C102141A35F73176168427F090E7B3C8F926CCC422E0EB9885BFFD5DD3CFED1040C70D600110E54486C57F620F8EC6C59DF14F9FD8B9C9BB64B21EFE9A7A1A2DD80D99AF1E19B4F4FA5E13CF75D9C586031914FED79C53502CE718217AE8B1C463128B230AB2FEEB65F0DF54A400AE23D8BFAEEF1756A1E4BD753F10D85BF9D3B08CFD23AD15E5003F4C1AA47C2C3503CCCDAE40334F9DAF832BB48AC8F3E23A7DFA8F3B827F4884227508EC7920848B29AECC64848E7AB25B39E9612AFE7B353F7E7B49B3C9ED7B8E0627CC9ED8D649AA4E59F960854D6C5C412D0ECEAC434FEDBC645392F789221B5CFFFB4E129E887B1CE0AAB266BC5A11CCCAC9D723F24335C736122E5BF07B4FFF54B16497298E35A4AB1B911FC4AE44BEA32DDD68A689BDCFD8BA73FB2F3B0B86D5FC07217623B9D610C7E54627162A09EF8F0F2D080CC2D83735DF7F1965660D5227C67FA02E6215C10B26154AFADF58144DF59E5D4EC7BC7B8B7E0C5B592B93A6169BA2E8FC44E7FEAFCF92961E847AC2BF6967ACD17AB8101366AF9D6C5A2A7C9416FCA0E4A3E9AF3E783B529E92C780B22020DDCC0E20E519F4F1F058BE44C5A3EAEF354EF9EF08EF05E53765CAB4DFB7DF14365918E1AE95FCE2F4247E3BAE7A7B0F4D298EE67F8F14764C4F1F54FAB3B6C9254619C9CD9D9839FCD1C6754119F0D7D35D844BE22924D41593C0BFBAD2606A4B2C4CB145642E33F50D2D582CF68FA4E3CE38D42475C77F35A80D99F0D5BCE77403BFCA5C2C1D6AD53E23402A617ED9C6519F20BF8344147EE3AE9D184AB2AE9C9B57F2EC266C9B553B4BB649950E4043F5C4A604F98C6BD04120D5B248746A6C17E1CFA3F22B4F2E840EF1D1C14CAB619170D93E0D5A7B1BF8978E2BD26E07B29E13BE00AA0AA180F56DEFDF320F0C25F4A1E39708792BF14B6B56296661D7D86D8C7E14C272331C4081D3F601BBC24C0B51E1457C4E5FCA68DF10B179F390B3F39E9E678941BB9BE1526E1D60297214E1CBF0133032CBD28217F29EEFDF3758A86679AF32391EE29FEDFE7C4B40F6D154AD90F2041416A987AEC288D20A9025B95FF28B641AC66BEB851347CEA7E803CA27C8BAB95E197FA9ED08473F737265F60578147C3FB0B4436B4E2D21B1E84A3635F03F12B4FB2F3C920DC166A3D4E0E7F62E6B1FA39FD57322257364D55044613E44E7AEC8B856E5EEB92E14BA8DA9FE8C76978D66A3A13D4D800F72D9C3095631C2515C1C9EB2FDD7B76FF5D6FE436AB605D5223CD902CBC538307C028F98E6EBE51CA8143EC61B208479F81B10E35F1CFB5313C0BC5919DDDAC87E425E96178641C8E804E4B6EF8FC87FFC3F736BF421F3FACFD60DA70321ABFF42AC114A42742B6B253250A5D917A165EEB31360BDC1D41B2460C1B013DA0D2BF9B117E4FA18E3D6DED901AABCE0E85B33DBE57E9899C61FC1BF38D2F8AF265547F162E8CE86A7B0CBD92B28AD0637120F62325075225A6E7E2230D815582BBBF93F7988244E803A4236D89061D71D3D396CD925BD5B2B5BED2A47B3AD35DD93BCCBA9367CB6E413F9EE863273CC2E8D6F559FD5082A1388F5917AC3945E2975358ADA60974BADAFB4E7A96C7ABC03964CC9A9AC783CAA5B5F60978793237A14923372F0566BDEB85A47EC9704C4FC60CF9F69C5564AD29E8AA81E65BB61F217F397CB49B44B668EB4D6E49745417E05BCC2CB1299CE00B3BA32ECD2962D9C22E429910281C401F2FE9295380A1BFE2C9C82C35B99F90E1895283F0A4BE038E6D603C14B5FD94E5C3537452CC50C279705989D5729EEB2593E0A415955D924128C174B0D159AEDFE5ABE0A2D59EBB895461CED838D9FA205BA54E11A1A4350128EB18642121A6383530C8D619332434BEC8605EF95CEA56AC92A9A707F2438AFFE564CAF3B1B398E8F525984528AF9E34D8CD10FBC7096EF9DA12A74D86A2BA14C1A57C26E6F93EA3234A18D7B15BBDBAE6557893BF4DAB8A036690C33FE62283687C3BFFDD839BC59CADD5B8C071C90B32605D3831918630BAD8A6788D1778D3A550E0363C0C06A919A542BE1A47772B8DA82C1B511F0D7C130E1EC9DAE199A52075DDAEF4F51844DDDF8B7A359ED534A3209A1E55DD11C9D20695297CAE4B40455A05911EC624381F6E75B2D7211FE51E165AB6D2C704A725474A2E598A219181989A81BEA59395F63FFC02EBDC76F3AF11439D68D4711D53152FC2377579E3A39AADB8A54A1604E0F1917B37DA3CED5D65ADE337C19346A16C2CDB019F63581C4FBF7BBAD6DB52D52ABF06EA5A2F1859B439BBDDAB4E0D70732F8C1515B47026501D7B569D3A034A672BB8CEDFCD96C903D16C5B7DBE8DA136B1BAD29266BFDDF24C7BDC6B7343F669D7F7940B16ED834C83E50411899A94F2CD8190729F7A74557DFEC783E9014C4D2CFD1ED4A934745DB353AFA9226C10D128A96A631DAA4C2DB7EDA8B8EC0B9DFF8CF16CB60FBBC9F922CEB704908B16B3B5288DED681FCF0BC2144E412B73BB6B5742CFC2FAA8C13E015BCEBB0292BB3D014DFDF344570503FC0183D1BF16FE9835F50776491069A1260D03D13EDD2F857BE635D881CE54864D2DEEE860F3C60271D40A7D446BB6FCD77C39980289FD10418C4540A2D6B46A8B7DC79DDDBA7130BE3CB5477B2092A9EC17ACAF55FAD52148F176BD763D8DFDF1B0F6B91701608329D06C1DB5E78C6039B01657F68F94F8441FCFE50B30E02BF15B6DAECE18C083FA4A7FE0DBA55FF09759427268498996E867DF6E6F0FEFD463B3AFB702D4DBC5B312E044D006DF6E616F10A3679F043A2B64EC57819AE6BD3A641694CE576ED7ACA582BBA89A68B8CF6D9295070129EF34AE7464FC306C8A9A42A7D8ED58FE5EEEE464B89E03471329A88893D16302B9CA6B3E1A3636E0D55BBFB7745A3F841B773DB46875949E7F4E31567AEFDC1C4D847893289230A9A9781061523D87D2D2331C752FC7FAD6AA3F433BDE1DA93D350F488BB03B959F68FD5D51B62430CF4706CDEB65AB0674F5AFE197AEAFBE0F3A2AE8195C0FB2BF763EAA3B2EB4A4434CB94A7DA9417B0756A600E0E45846DD22973F41D0A8217F4BE3BF5E4EEE937A2423FDA73DE7BE886118790BC3DA691045CFE4734BC4037B18C8CA3FDBC948836A976777208EE06875CF51DF363761BFE233431922074C2EC6F165A466BEF3D45E5E1AC9D37356C75CE20DDD92FCE496B6498701DC109BFEC8385403F6BE32216BE67DFC78E75446E54D435BCDD41645968AA469855C38F2321AE0540BB70DFF84FE00610CCEF3F5164C6222A943A59C81088B2FF7826E0680B217655127FB35CBA5C9033237524C4A57B305BAC5B4F9F043D192CBAB2E43F8DBB1BD30ED3E66C8A8F3779328B122B885907F3F534EDB6CD902F8B1B861500FED64220FFC891C566DD9B68376AAEC52F1CC23364C12B5AE0D9931BDF9DE95F16AF39CD15D641A9B76E00ACB228970266D37DD2655A9184BA2E38FC406B0C7E22E7CB627645B37E706113C6F09F772FDBDCBB6DCF2919FD4F00AC7107B73E50AC91C099BA1BDD8FF532D2B64BAFFBFF9E23096BD273783704CE400BD887B5D781CDC31250D3DFF9B569B7D4D8C5D6F67CA44D4BCA01A78ECBA80E104DE835339EE6A96FAA5F19EC16633994217A50F4B620D646694315992B7C1D369E43B4FF6F867DBE46F0FEFD166BFE72F80210DEADF8683A5F54B4D9DB375050D2CEC10F89DA7A64E416705D9B360D4A6B2AF7A7AAB3BDBD5AA292C43BD5E73C1C47DD4EF7856AA3487D0E9B2F85F6072E756AAAD49FD64A8877BD9CAA19178ED0AF0BBB15FE6054E97553F67835D4897BF2406A02BA9DEA2C5115B2F9825CC7BA78453CAFFF6E8EC2F7F397D48A09E8687F25BD78F97664EC38A20835F9C42AB4BA54B686771AFB1F63654C30415F024A32BBC8DBFD11600B8D124FD38E8CF9F175515A33CF7EDA9B8F93C8C897B92DF7E8A77313FCDD1525008E73DB6CB7281AA41C43CA2DA8101D8B8FFA78629ADDBD997BECE589D99BC46C5767FF1EB1E7D98493D159834582775654E58B3715B0793A2D3FEC585A95F33D8ADE348D1AA761C0457C8BFCB71BBA34A4DE013562D6EF0417FBD79B718C3A15227C39D78244261DCF1E57ED7E70EBC9E5A112CA3E405BD762D3F4F34C5984179CF34D7FE8BED5200E465EF169A9EA307CEC259224A91B96A4D94F94268EFC7FF6C64838BB48BB4B24B3AD75456D1A5F0A5A27CAD5F4CFC50A93B1083A49918CDB293906AC9FAACFBD67F6B320D462F9D73D917E22D53F4CEC4DA54B3AC3FF6FC9F0AF066511C007DC15C780D38E56EAE79DA9693A3314C6CA03016D844F917F8FE8C5393E30BCBBA013D32EFE4A2427E14C7A2C905D1E3B6361D921CD11184AA363B09D5C827A298F6435E1332624C11942D0371FC04F5ABE6A13AB95103C26F8B29CFDCC44A6D2610875FB0F95F2319B80FFC8C95E4F0F4787C0B78064A944B62E035C91486930AD2194B2E12CEF38C3139B932D3AF386F553134F138A0204CED339C00792D9FF3DB599974F171AE310D31F93E20FD45422DFFDCD7B29C9679935494B9AB8965A4054BB1B3C8408519F1693B12D17EB9847C3367B456EBE34335B7E7DFAC99D08DDCF49DB8696EFB43AA3201FCA494ADA21AB9E8DF5F2BF9BB9A681CD507C83F95028C08FBF414DE6EC9C248C008B6D99F78748D4A3D6E8C92BB0F995D976484E5F760081E0C16EF6B9C70FA58F27C782C2BF0EC23964B777BA7001D43FCEA20C7B608BB2CE9383CF2C000C3C9DD8DCA290AC69FA9E20203DC52410E566B0059BC86B601C8AD6FD7F73B9D5F4C8FAC5F18ECF1294F26790DA05E352A2989A1CCCEA55817681C61C843CCD0DD66FBF80A0686DEC48CF2795F0784C2FC2A3D3137BB52172EA406F19EE565CDFC52D5E6491343A7FCB8C506DA1F3B12FA4422424E3EE7864B525D72990B3BD12C7D66C9DD7B0E95C2234D280E1BABC65DEAE9F744DDE337138AC2D4CF6976AD9361D3F49AAE1A9E141B7A25DBF8E2D7613C0D49A11A1BA693E7B9575CBCC489E153E400A52B19D5978198E93ECD5A148DD897E684DA3A9E5DB1E27B4F0BDB0FEA0FA33A45F8E3CC5E65D9EA1B6C86F7557B223C3135D2143FE309644E3EBB653E06B1E33B9FADFE180793C682266D0D4BBF17F0BA6603FDBEF447F7DC5531BA5683C31D24FC3BED2B9F0603A6DAD9946DF655ACB2008E2DEDEA5C157DAA6DFE0540A374FEEA65A4F3148602CA95802C0C406D27A3853B877CDD1C188A85291EDD3C24164FB40EB26F2C4840435422229623C8CB24E7CB472D6464AFE1CD0C05C026CBB490108B1FF320DFA60D6B559DB54DD32A0413B0FA33FA3A28C601648CF48A2EEDD445E3C8E0AC5A69B0EE42C703231A57041A917260FB4476EB4F8641A9C91BB8F14AF7FB27AFCEB05F471BDEEFB1FA06A05B53EAC418D9E49022B6C6817466C44B43E15A9E0B4773BBFD761B17DDAF7473F9D284040B31410C34614FEE5A48AFCEC2CE271EBEF8C5E92830B98D97DED5BEBD76C2CDD7F422452F50D0130236EACB4DC2E795430F3D145DA5C3203F6AF068CD99FED4D5124433FD5E0FF834DEC737659642A66BBB75F986FAB1BDC3CC3B24CE53669B2CF56A0063643A32A13033E97C9499F7AE812ACD929F0D85083ED6DFEF8548C8C640CD6994FF064D0713D7743084430C19B9292E69AF60A73B6EBC850AF03599ED838A028D75BF1AB3F5A0590171C6C857683CBC671CBB2E954E67DDA430AEAE770F0C38CAFFA14CB96D3FB08F1E9C643E629D62CBF7F82FD7FAA437603381DBDF3D26057EF0EF9ABA86B430806DED2AB55168C85A9C02D50B38CE6D77F51B8D6003E3F71369BEB302851BA3EEA406DC46EF8DA645E34D0E4D87F59006AD7838849EDCB98414E37DF875B3585D532EAB2C6173F700F5D959197AF533E325E0925B32DDF0E5AF83ED4889C05DB3DE1571A160CCA6FF22D795AAB7520C60DF9ACC95BD18654A5B089F605F89A9FE1BFE3F571F14DC63DB4167C4F7B2F337C66B61946B39463007F2193A7D70DA96B79BB3615F64E7C04B8549F46812C15EF19AA32D40FE1452A3081AB6FC229CE46A6A75944D0EF91D4D83865DD19FFC322754B547922EE54A9D8A60FE9AD1C5219BA4461400D269D90864CB01FB7D81109CD98735251FA25AA429576908994BC4871E13034DF7ABE368F6F4630D1FF47B2F59B474AD582EC86F03E37713BFE7B42B689279589CCA6A437EAF0BF9B2E4A08E973FB4FE2B5BA4646AC019271351DE0DE99A267675B79C82A36BB67AA9A7373D9D0FB01D0CFE045E6FE98F67DAE844A32C01C75A5E31C5EB703E9BD50B5D769E9A7EF5BAEDDA95C4C68C0AD5CA7FB6C969455EA828C7CC122D22CAFA365ED4D64F6D78D81C48AD13296F89B3F6139AA1881F41820686270281488B60FB198CE3F4AA694E7B00DCD6E499E57D0226790EFF7902967CDC879CA100278449F03B8F7129B6AED795533E1ED8AA7B57D9C3C4E151E1BD7A4A863B9E1EFB5FE6FFC4DC2DFE350FBD464779FA836522090EC6AC68C4C546A5BFC2453FC76EB11ED7EEBA336655482F94343C8D6852EFE1BE818A2542DA7EBB256FC1F65084C91B78F7FE6A7587F5B22F318C9744EADFFC24DD651EFE7F1139B1A87C94E67601B0B5FBDE766BF7FFF16462CBD2AE650782A1427BC1DB64C999097B415AB1EBE3F6F50493948B013995344F6D1FAB9384FB832C447D4FB4BC4445A427DD592825565D0C34AD8B3D01DD34B54A1145155E36335C991102BC43353DA74244261E5C1779FA15FDAC169F8BAF53E7499995908964B9B7E75B33AE0DC2618F3ADF16D5DAACEC3219375526ECBB627DA65E73C1A1DC56A00552E59A21B9C2CDBCC27991269ACB3DC1B489EF506195D01120EE9DF17EB86866F0175DFAF969C4D39F6D1A3F159801BC880658167CB62474C06970EBF08503C10AB54AD74997E0B674D6F543CB70CA349F99946BD54412067FA74D1215455D7F9AA97D74DDD85F61824DE75034FB38A89785E572CA3DD8FCCCF5509617F16833F335FBEFBD6175BE3DB44B0D9ACBB91EADBEE15A94FD93D02AA93279554103F37A33678DC1A3A224C5A07A0FC2771E7CEEE6FC2B02EE86AB7328643D56DD44FD48A9DA7E4C88CD2F30B1DF46EE4039C90DD7733C231A7E5B372E34055E189DCBE2AAF98987074BB5419EBD352927849F60F8355398F31900F0FD6CE93C12FA4990E40E4B1DBBA1BDAC22816A0319E20789141B01EBE8800619172723363D163C9A1E3EFBCBBA7349ECCA17A3AE77AFC24D1B992CCD94F4D7F4FE23372118E7F2331C485B147ED6F69C064CDF8573B0F70E52CFBAAFCF58F128DB201A748DDE4336BF6B12FBA8C4D00A923766046FEA10F482890FC75B6D433242A53FD8A7ADAE34EC3A501A5B528859687635B64475AB4F2AD588CAAE3CBC719D0841E90617066CBE29BFDA169239C3B0018C9E08544EB3968FD44BFF8EB4589BBB0ABA9D32951222E36D1E3A58E6494CC05A128764CA3C8B53212DCF675246705B22FFD07933B54EF01ADCCDB2BD7D14727BB654F1C94735146D54627266E80926DA7D510593D7DEB5481AA2E2F5C663570E23C65195926BEE68BDE81DCA96CE281EC5D67459C56EBCE8AC3898D746199A613AEF8CDEB0619377EDF268B544A7338C8E13E5EE900F0D291576720A94AE8D5054B92CDAC417EB58EA40E4DD698AA12C03F7A429F93834CE1126C18B4F5C5683D9B14564E5FF0C5BB8EE19F474BCFB464FAC78600229875A024F67F3EFC37E9594F5661991E4925FA426F360DED6E94C17BAAFA295D51D63BAD627891EC685791E1A413F310150DB2CAAD2151807D0A9729326FBC2D742B3725824FAC37A1E106D9F2F4E7629D1FEB97FD6B610A40804C432C6F831C11AE989D5D603F3C02ED66E24EC60F7C394170D36B79FDBFD00D1356F33EE9AC64E2969129D43E8337EAB050CA850F86A618E29899103C1DDC6E11EBC674AC5A338797ACA78889C870D5CDBA7F2EF39C716928442C724521E80207B790BDF9ACFF4F6DA915C347FFC2DDA537BCDF3B26F15AD06E2C966F87E6BCE33F8B88C79788FC8409AAB9640808861ADCCD3A35E84384183664302DDE43EDF9504E7EE58A1FB7457AC9D869D799D9AF45C87E12666F2AFD506548EB5C75ACBAB1F57CAFF449FC3EE7130F18A6DE37F0B7CE3B61412D70390E6BE83DF4BBC12FB8A014DAAE626D98511D6B03B84E5135A3388570B0CCBBCE15AC3FFED36EBE7AF62C10E922D623D9FEB3E7C347B128F083A8FBD721370EB87B679D0053C48B398A08B5D224DB65CAA7752FDE0A17EBC4CE5FBD9F29254B1652C7C120A6D16ADF441F2FA7544F96D1296D2F8CC3E155A5A7EB6EF04AD4DC6B4F4857118D7EB5D386DE1F00FB235DA3D38A40455A5297795E91C6344AE4B04C7C8BFC14BFC41B03091C9650A400947FCA9B050115BEC2A433AE394B0FE069DE51B8269BCCD59ED35203CBFA39FD2EB809424DC6429FC928509BB41D89A26C4734BDF4C7EAF7C0A8FED01D14090D32EB80918EBC792062DAADCEA457A6D9CDC5A8159B0AE461CA6DC5B5FC0B3A9D30DE772FDB25961789D99B9FD841F796EBD86760E207354CEE972C01148025F90BDA8B1D0273279E4755A519D1F50F7F89ACAE2483D066032638B95F2239C61BFB8213D7DEA1C10FB36F9BB382DB5A3179ACF010266F086FCA580920F0F3CFB87ECCF3B9A6471B69E709847F1D002750037192DD30D092889423C050C210721C1DD5A4A8F489A7B4A8D2A7DB6FCA4A5F628E7246D9F5570E28E5FF516FDE4668EBB52A12BD5ED0871776B25A35ADB4010903B897FDD58B0C0419F8DC3F27488C7CEC0C0E10FC298E0BD222D99BBFEBFEA83ED768D7C6BC780F1272E73389E75FCF05B70F20CBE968F8539A35A06669ADC8EE71003811BB1E326DEFAB776F9EE895E1FEE44526F4A3A93B577DC3B38B534FD59C149523F775E45DE68CB50EBF22BA82C998EA57B1D29BF4FD70B49EB40B3C8B6BA0905CCF5560B93AF64D503F84E0FDEB02779381906498C759A599FE582BF99E1A77BE69CC96D195E3CC9AB73E3F6C2D822AD529212964597FBAEAC1A6E99879A30A165058AE5D9FE62F87A0F9A4D6E15A51618E34215EAF461FFBA44643F4EC2643EAA7BC5AAD755117A6BBAFBE6A331C997F18DD8746C1909C65DD2BC46A121E7B844F120F8018A862AB63B6914C8389D63F001CC4B90264ECE5C4BF072563E7B4BF2D7C8C48A95FF4F3BF31D088CDFE7C8C7E40F96B4274C398A9D3DC0D8E393D5447A59D070B023F5782D52D613467D92577B18434486928C8F8746F90F3D426CD319D2055303E3AB949A096191ED82333050B042FCB5310FF96A11D90A432F8D717C0948897EF380E5F8BB035F3DBC141A908F334790B708CA0EF1756DDB8C7FF3C50B320B9C6BCDAD7A950547D7BCC2EC8550C5B05F9610A42D7C0438C968A9730BADCF409CD39233550C1230E8EA0D549EFDF13FA32607147AC9B315B5927CF174CE6653ADCDB378E132CFCBA2E069D83593EEBCF3969CFEB4B51709FBA2FBD6EE84E2FE10ED1D9F64F3E488DF31FB3313A4E7329E901D40A1F8B8C0FC057B7DB7141AB0BEC41AB282A2306D4AAB1EDD9B0F6F1077001D1719F3BFC819D3E84927C6EE2BA710F5DFDDD7EEA20CBBF400B407F5D1EAD4E4DEF601FD0A843487D6F329C854B9178CA410E845D4B7D060C6BE85A0F52B9E4FF0E134C6DFA5657FA6A3ECE68DDDF49112ECBFF849CEBDB76656E284CA6BD40F36DF30C7D5030412BB93939CA5B8517EFA0BA527A30DA3A0C7B621543DCAE209849FC774BDBFCC2927EB5039EF53BA94795E19B5B1E2D5062F796A5EB74FF5E6EC9B5451AF7CD00B83EF432F779054BEF6765A196B0A50C2C230C4A5DFE3767514BEEDF2920EE518627A1479A40A69D05627F65DCD3462290FCC7E9FFBDEC86C845844A215688580975E772368162F73A71EAD6B47E827B70B52624756EC36621FD1EAEA81E9F17712851D3EF0E109534C113B22628FC8FF84649B3322BDD94E9D9DF778050CB71F547ECA48F1AE806E7977F0563E654603CDBD6FAD0D45244D2BB46BD6C368495EEE78BDFBC26EAD93B9883C55F86945036B174926FFC454E3AE238C3E936D1379ED5A8B127C7EBFC308E8D0BEADC08ABBF0FB9479D8CFD82108347F6D26DB18ED34E208047002EDF7BE584A5BF24729B470CDBADF8031352F9AB58287F68DD8E7A89D6A5570D20B98EC63B1D8A97671D806BEBE8A64F799646CCE610EB092F83746D20E2BA187643E87731D53752BCF0E234AF43921DA7F61FC7D4DFC0704EF396FAA32850108D2D4DA283A709CB1F6C9C0B307CCA0754F33AEB93C038C7E626779D9AA3C235298615593410D00402346D4F33CF5E7AA9EA7F154AA19E8B6569E9D704F6DF2C27B971639F344273C8909E4CC1BE92596826C77162B4078D6DC61154F8D96A851FB49159B65131463FBBFF51B4BF5209B174CD82626C8983D5846AA4616348A478C6425E0D252A88EBED20191A27C7134EE5E5BA4F879D96C121B3316E3A54621744F3D596F6C5B103792E84CBF0D0AA3D1538AF8C1A4759620B7F788369DE883DD8D30DFA331477FF0070120FFCDDFBB107BB9F902A77B01DD88F25AD719A888A7BC95C15EBCD6F52E0D34404CDDD0B0C58E1915DD121EB2D07DDEF518D16F7BF1C1068D7C6FA5D7550AC07096AEBD88494A7743E31FC97182826018632F494786E45D17319672DA3445884FEDAEA095C8032C271F41E54EE1A8F3468BD9C4F56C258DCFCD97591F92F2CBB993A4348AF5237F6EE657084EDBAE33762548AA80A5404E35BFEA5331F41DD3A46432B77D1FEE724DE008C8CF5A0C52AADF48D42626A11D2FE65FE37DC92838118B75DE6E47D45CA4F3D2CAAD1FB005E0457156F34DC883F369F38359A24398B8F041A5131717374FDE79C6E1B63DDF9FA08F8BDFBA3C0982808280A72A62C2A518EB3ACE72D48C061A3EB8E13635CF611ACCF61141A6BB4EAA1DCEDA75C78F955A6C5B159D3BCC2037CC0C55AC72C7C5913ADE893DA8600BDEEA0D9B4AC60242DAA06441C6344ED8DF3529A350724A62F048C288756A4909F9585AF0FBC01F09D5FF5F0B875BD6D07C503851262CECDAA9676404B0631CBD19625CACA95FE6AFC0E2ADFF948D17BBDE6E9FF29AB2EF1E45DB5BC785FE5F080CEBB986A97D397777D33728531A118DBFF454FA75ABE69BD87D10CBE9615C7A7ECA20DDF623524636D67CDEF6E163C8A64C881F3EACADD7817A6DDF4EA87ADBCA44F10C2A30C56BF4A4769FA64F58306CCDD8583D46CD405ECC7CCEE70E3BB59A71C7F4A660D4E31F653A05A330EDB553AF7E1F504ADFE178E396998751E9A4DCB37C90CA1D98A3E5F1774F8EBB839FCEAB9FB2047CAC8446DAD3A449FCFC3FA3C853E6F3AF6562953CF57CB9555A1CED2FEC814C74E8EE436EA6B88D1D433BA4925D64206B7409A0B97A9747821759BE2670E8679CD52C39F604553BE7592B9905CA46A756CC620D74FF8C5727997F4931E9595C729713D2FAE1FF71BDEECC974EF35C28A3B442E60BFBA9529D07EF623FC4F50594713366B3A5632F4410057B97C2A4A24983B432B69F352D4D91938823B06DC48D8BFDAB387D89B6937E83A51A0D8218713092342E9839FAA496FD58E96348CE9F512DCFB24B1F569ACDD85559DCF9231696BF681E939B3AC31F4F4B0EAC9EAD0FCE91CFBBD1492B3F3B786FFA3811162100B268F7AC75A5AA4FBF0976E3226ADA168B10E03DAB145E7EF74FFEDBE703EB68DD45E8C19CC498296876EA33CCB99849580FC885ACFB014071E93564A5F26525DF949821B85BC7A65E263FFBD7A6F7FF1DC58FC8BC7D82AFE3D16F4E24E3D4DF3F0B88154014CEBCCBAE144620FFB82E70AC2CF3C5B574A470C3EA1368E0802D9B45A6ACA8ADCE31F167AB9A69CE6ABB1637F213F5A38F6815EE4AF667223F22AC8A712CE9D8FB7085F5783357EA170EDF532758804E3FF9ED0EC040AF6B0CBF2147DF7F90D9C628C75B18B3F46DAEF3956A02174128E23B56A64080C035EC14F12F4146C8E29FC587B9D16F62179BD0C67231ED0E943BF1A7B0A28BB27251ED68AEA34663FD865FBCCBF8B20F35C530C64A57E22654B8BE90744DACA7EC26C55687F5E5E2E1D76338638791CB8DE3D473972C7E0778189B186704630748A0B6CD8F77A16F06D3C12AF4BF26EAF535647D16FB83E9391ACA0638F087525C6FF1DD2E311244EF9A6A3EFAB8799CDBB68C0EBA9A6E551A0338289B6B2D5397E19EF15EF4FF8E34C7596339893D846D59640C0446EE9381B09BD690D72A6AC4F13E30A3D04D90D3DF9A4BA0516C94831E06A411752FE2B2C7D5DC8836C03AA3B6AE838046A2734CDD47BD8DEF9F6ABB147AB4B9CF527EC8DA2D1258D1D3F689BC96947CDF99A479D64ED67C4B2997537D6AE1927D6F3D124EF425F4543A5CB4FD0C567FA4F36111D150EC69BFA600B52A6A4B74D78DD4E3382AB4C188A651AFC96938F029F8FE74E7ED8A49BC29F7F41579EC5D9C8F205A0A84D11A284A9670935BBA8A2D240A0DFC1965CBA6009A24CF9BD5EBC54FC628C4EADFCAC57C8C6BEABFE8549B2C119A6680C945DCF4D7440EEEDACAFE182D00E2DE64FFE04E359BA8CDE54EF592FAE92B20257818D70C5DB7B31FBEE37E8D6F9C1AA1D3D8BDC659C4109710CA26CDF98B6EF613F22A7597F472B0C631F5DF279FA8D2FAAC39851D3A6B6E345CE3D259D0DFDF197413746F655156CC37F7A9DCFD29B1EC7A8B81DCBB89BA817BDE61B3EC9FF62AD7FC9FE6F93E6BCBE2231712777164BFA6DE6CD1B30E6F73D7AB8B63E823EEF9FB590018FFD5BF21E0A7AAA4A84AC075ABD47A964EB0FC12ABB4171257C84DFF7DDD86B40F48F661F0A5D9BDFFE6147AEE5AE59B3221E794BE8DC195D4C1A5C896A7EA260D3CDC2EE165FC42C5821864281FB9B3E61A90AE472F616F2C0F1980BD68A7AB97FC4070109E84931E88AF032FE00956756FF63E0E24101EAB1C998AF931077D759C9FE45A6F07872889B24A76F7E33FFD13C20CA739ECB5E6685C3B0524462919FEE3C4BBA4CB5179C81AC27F71914FCABE03755F332F89CA46768594637E11E9CBA3AC589626CC70BA6A29C50252163B71E7B82E05806EB7238CE76BEC5F37FCA26572B2530E0DF9CBF3257C949E50D18178CCC5C40C9850280C24F3A8645464B2379D874354357C36713D4059A7B21C8E30B1E3171FFE42507157A23A4E7FC2081B3760814AAE053FB1CE43001A85182C5C507EF502870CEE88F2B815F544BE5EE0B1E6CCC349464840B6E4CF9D68ED60F0EF21D544201DC5AA478087AB0CA795EC4002888245E7C0E2283B2A0F02C1170216294ECD3DD6EF05693AF4451331EE7170EF7B13F923DE56209548EE8D5A13763D61861D68ED1811B1D6C0969849714BAFF029D3E8D611DE5E101A1F5F76A12E3077273F402973A7CBB9649CE9C7B39832C8B8E5F1505C9237CD0061CC579F6DDF99B3FFE6D371DCDFF21839635D735EF91CC776F9A81103EC74F291A8C04421460D2670CBDBA5F7CACD84476BB8F75D606E29438410EACCF416D271096A2FBFA2150B8A8D02E096AD72DE68CE0D99B2E2DF95432B880DD9A8842A7A34FF4BF7AA16549EC4E46759D6D227EEFB72F039CF71B7DC21F0818C53ED7D4C00D97565FD129C17BC294FC68476F8078FB357AE50F03C163D2158212B35AE2254A48CAF6590C23FD9EB1A3DA97BA793798A7EE8B31AEE1DD9FEA2BE4253699B7751A7AD12F7EAD7F8C028F9FBD70E7C6FFF230257FC0DC4FB1895D9585157AD887E1422E29F0D3C3A0E59D1B45B1A66FC757890EF4ED03E51DD325F32E31D6003C9B34BC2A2E7E86F1900325A5A3A5F0716E1B204491D1273F7BCB97A7F104EFCFFD69EAE7619AC37BBF977B0B226D0E62BB9CAFAD4B9A4341FF1452165A1190288FB1BD1C1921717855A01021C99083775A3A24A97F625BE482CCC760439FBC4511FDE704F27AC4A2DEC8BB3CBFACCDD51ACA27731A55F51EBA89D675AAE979E8D6C69DEF33C63D0C97F9E7B90AA40AF1B4CADF61F06BADE6B12824A3C6B721A5C7A42071B6E8D17FE3D63DA9CA28958E3A9E06B6507959F3572383912DE06E6D4B879D45430D434E5D1CE9199D545F425344038D43BDBA18FCCF1DE2C0C998E93FF66A0CA57FDA75154BF22381DFD95FE93FC6D25CB7391544753E867DD2B049F7BB9C2AA4E8F72C07F35FF7C99F42348410D43CF37D5BD5D6E6644638ADEB7776C68481366E1AFFBC82052D9DCD1BFDBEB16414110DD6969120BAF6E5120256AC4F84CEC4833A8C6799E70FD3FE49D05AFEAF45361D4C2AF70270FEA4E347511480B6BE910872BF6634045F709258DDBFFB17991713BB4CD4C6D94CBC7D44C02FCF7378E0F2E26070FFEEAF69EC61B3098AE24746E919595CA5BA7AE3CF746595993168C022C2DC05BB53A38EAE482E35D896632D0C37D72BDCB8C8E27C8313FA4226BD150FF6896DEC93088D0917C8CB88A67EE976C86604D7C3C43BD3D1492B9EB23ACCF7DD3850E8E14F790BB6EECA3778285C3B26F0ADAA4C4D0248EC545091D9D7382E98CC331DF2881F30074E070A11D67BA6BE2CEB8603C213AB598AD151D09B447FC6D8F409977D9307075BC537AAE1F85FC6655E7B1D10D9BC24D99776CE2DAFEEC82952C9C745DA565CD3F5237B80A8F877177FEE942C74F043C852CBF4CA8542AAD8CC3F31FAD24A277DB267B7B9AB2180C273957D559C15D2112B303F97D826B99A8C6F3C32F70DDF2D34BE5A1DB5B79CC3DE65222123DB5F60CA3D023813511D2BAC1B045E35E202B5C1E8A128602424F14290F5511E9E926F184F67DE5383F7880D5D632A2E4E882032443075DF55AE7AC459940182F24F515D8FF166EC35D45F6B94CB23047B0DEE31AC2CE9F75FAF28EA07B108D20A318DBD548423CA8E47224CCB7246A01DFECEF05455AE6B069DE960266D96340A3DEDA539CB4D1A5A200D06AA5D65679AC87B0682A224691E455C1A70D0C4F8706A27E4D853ACEE07BD9BDA936F0BF6C1891A52964EE1D2763B5EB5837F64B2640CDBCC2533A88B02243C890358FA04AC245BB8F453F702ECE7AA7F6020531EF29A1BB60207DEC5D42C899D301C427A1A81AC91B9F4795D246BBA016E9C698DCE80F230D2072A06FF35B24593FB113E5B606C57C14ADAB557501809A545BF184C350E504BA2D1CFF856291C99FF07E804D664A277C114DAA9B2CA1B9C5B2FF0A35BBE1409CD742D0BF630330B98A1C9498285CD2875B4E854A80B7459C4FA6C8601BADDE0A520EA258F14B5BA13DDF227D49E524CBC56A483DE9A82530AD90F440D9F167FD95253659230337F9B41E09B5ED4FC8F4DD70F8AFF2FA0DCBA880D5011138983E9ACA7F0DC6C45E6B432B60E25258606FDEE50206A54DFFC4A6BB86D92C7C30FF550FD962F0E4354ABBD6E9BEB111ECC0B296B70CF719453815A650DC8685DA8869F29D83ABDA1BC723B5D93C006DC8367E8E627EC8F75B0AF199976435DE854C71D6A4464BA424BEF368FCB39275D6C10CB6D9568882E51450B2BEC130EDAFAE66ED27A239BEEF090BA8BD06D63C1CCB074BC19E85A297FA8949AE245968929E7C83BBD53DB8F55BC00842FABAD9F2409B6C5B1D6B79CC5B1EC137E41DEEF9B8127EB08A124DB39EE74EA06C705518F395B763C2855484B4915EB39867823F3B7F9A4DCFB914C9C7A4EA23248F1E21D54C9365CF5DF7787CDDF6CA3E9A7D3FC807D6C9A1940E5C3005D3503956FC2AF6B3464D29A59A1D56DC8178436A5729F27A8C99DD2AAB78B773F38722C59A0FB3C30255CA6DF3614AB0CB64360805F0C756D2F3C1FC73AC92DF3A3D10CBDB83AD8377F869B4B7813F7A89D0CD50540C16696C7B8CDF6CDC9C41B75FA9C0886342B257FEE69FF02CFB3FA48967EC0BAA7ED49CCCCFB3315CD29C31FB6252F60B538CF740631FCE1363C9A36769EAB48854A5EF2E5CA7FE3E906096363EB97B5F6A43B4B513A298B58039F6C2EA276350DCD71E0BC68486A56B5AEF8AB2B03F272A696B3BBE79DD25FCC526D8FF8E5D1A4FE782AA705F94A98B456D48095EB36620EC778F1001BC680A063F5AE5251EC2716F0328D4C8D9A8B453C78D3343D93CF76418F0DF65833FB85E13832F01FF78B1F1DC45208923A752DA984BF3A5C84863048EC8741C0FC86B064F9FDC92DD7753D3A85648734A14EC6C5F50C416FC37DFC8C8B57065B129814F018804B4B7CFB1DFD224FD013723D784B02152C371E0B5F76C3BCFCF44B782DAC2C1AE95108F605D9A1ECB7C51B57759C50DF3212DB9A6EB6B739DD0533378491670C2BC61EF3B142BB8669454766AAABE2EF50603AD1DD75A5528F0FC634935DEA037493AD62B242F2378F770BF50B57881F05673A79A7C68E810E2416705FAE4F4E802F5D6D87B6A0EB2B36D4739ED2A1F31E4AB60C777777196FE9FC1FC17F2FF20ABAC11AE735D7ACF76D676FB253F6B78CB8E42D231D771318943FF9D3E00C696A84DC5380224BEA1F70B6B72B527BC74C9D057225C1D19D5AB30DCC5B16B88E2B864BD4162BD523F7DD16CACEFCA411810047CC720D930796174E0CBE6E8B29C99AE89812F29EAB3000C1CD1EB394532D1FF242F4C38DA8322D8DC7AFC4310360D3608AF2CBDC0D987CF3D00E53F1ED8554E419F5F4C4C2CFAE4A4785D4E63B0F52AF4790158467996F2CCC0FC5DBADD79228234B4E69F8A91237ED3E538A2FB40E9F6A6B4B6E6888B5711C01B0E8AB9BFF336FF80785ED7997559479336D1545DBBFEB83F8D75CDD6619F5F1BD045B7D8123B8FC8ED47E809046D3A003CF7669948618DDCE40E11C7898225DE680D24E41841876B6A81DCA36AB723EE1F7709CA5751B47BFE0AA8835902F3B4BA7375C6F051E583BCA61D654686CEAC908BE0199BFE4FF4A548BA2056ABB70DCA1B2A1878C165EC1E03299B92AB105A1C232066DD47EACAF251980E4ADD1B668CD744FEAC1B74716AB87F6BF9C5DD1A3E0B2B296789B4E629F9558374489D052CA1E5A08CC9161592BB911DA4C3447A7842165CC92220D5426462113F78C36492DEEA1846DC7908C8C507BD2A3D75A9BEE8F065CED24D6A953A76C1D8E0DFAA4429F219FAA743420BD0052019521AD63E2CF447172B0A20EFC0E73952B8230786203A2E8295D98BE24A98BE17BED9105A6A711CEB5DE98DFAA17E65DC457B78A212D89D664532CAAA17339518C60E3CE272A3707146258C60C9EA682EA2B17AC6091072C0C502B0C756C7E99099E1574F687C2EE695738968824E0EA0FF4D4816E462E9CCB0E91ED8F66063F6C21887F457E8BEED1D3B37431AE3C009A5D1ACE10F5B03725E9FAE5256D8AE976B400B908ABA9D8A22266C0A73D92AAA80710992E15B984D90DE61C3D870CB6321428CBC4CF8594589E41E558A33CE516F9B6275EADFC6830F153D00DA60D072A108F9B481A065C86B4E4F1DE686073A97A3EC619966FC1B7AA1E9E41078E7119BBEFFD427D5F91E692CFA21CDE6E3F82BFA277FB2721D0A5778CFF4AD2DEDA77F7F68B74E2A35661D61380BAC0B24641EE2209FFB62B3D7A847135432C90D7052A68F3D16CC11F6337FBBC4C4DED10127D7238C5024A866D0627CA20E5F861B78D4DA450C93658CB0C7107686579006FE6389CA47AE63F3DD49F161BE55C2E631818DFB9EA4756F0C64728E85109E7FE56983127A61D4E301AF13F230EC2F294E24FCDC11A94B03CE2EB36670DC3064840ABC45042E69A6F2A36411B7136BD540C39022A1D4C06E289C80A0C749C6C87C3A9213537EBD758142203E00374E9F40EA4FFDFFD7981BB8D1EEEA9B118E6BB96E78A71B81E556CD50CF3018DC4940F0ABD712C7BDEC3342E72C188DEE67A1461D40F77840980639BE4A804188A7FF3CF7304BF840C49AE4B467D05C10F173A057289AAC7AFF47223367F997C792EB86EDC302066F112B366885D2B2E5E0EFFC722682FE73433F86E8EF58B313CDE03463BB463E81D1850904EB519C2458C6C659CEB253C4DD6C8FED45D057456F2F1D3B4A9D25D1F7A7471B92D5BC294511FCD4A1F5D1C7EF6B32B928BEDF1B0B98FA8A5A8F86CF971250EFC40430EFA011C362190BA70F7815CAA452F27D92118AED9983EB6BAFF792CE8D1F8BA5A5D97AC7A27D440BCAEAA60E47B3D85EE09063392F3D3A53873D8194767474FF49F741396C77B56589FCF7B7642AC6EF490E3ED1CE433B0AFF2F9F0603A9D21BBCD0CB1ABD135A6421A456C30A39CF316D7FAD3803A857AB9092AE8151A9EBCA6AD374EAB17AE661C24CD37182543CA0C6BA2B5BF68CE9C4FBCC860BE61F22ED580EA9ED32B341394798C12C505B29573FE37C32F09187F6EF71A79B8FFDBD76AE287CADF08C0A5DD935809CAB62CE6261EBA66F61B5EEBF7117BD0AD6E15C8A9B9F2F2AB0FDAA1C830FE4AE28669391438AF74A3DCFB2194DD1AB0900B15E05BF8A1240DCBD4A2EA4A6FC6E43C3BB6AA0674E975D739ECEB4145BDBAD442BCBAF30DA5E0C4EC91722B0DCEFA933522E8B70047166CAB55963A58F1B317AE164534FF462E9AA34389E31CE4ED92D516767E76039698073D7ABBC58A4A0A1EC8EEB1C8ADC785FBE0E4A8DE3C0EA6484EFAF492AE80D4E73AB372D6F49B137756EDF1F076953BECEEF6E39917376F57BFFA6690D507E0DA4113B6175FFC70FF830C83E9E5E9C43334C9B3A0A4B8770A1A7E984806327A28A504324AF07F85F126ED4670037F119CC1C2E1DFEBBBC1F1B5A22420912FEE99186C8E1A68CEC7C0C4D10417560D426892F8CF08067882FFFB2952A366BD78BE5313C8D625C9D69AB025C312FFBCF36C30074F144526DAAF3EA3D420F355F8E6097F3291FAD3B3BB11DBF2E56706C6B4D320F52917A8EB20758AF04948E0CBDF99FB974860F35EBD9EE0703CDF61A4C9FE8327A92693A5F2C662B8189FF6515FF591A2F52A6BCCCC0ED15F0850794F68252D2BEAA3E790AFA59C7AB68028764828B09C5B0C7D0123C928C046490BE34C729FE27D79DB16AB62F808F9B87A1107DA164B9F8D233FFBC9F85EF936C634B4FE72FC93F6229760F953D5D582D2F6DAB625D04F6BD02E1B996A2F6D3841128E6FA152120D8E05961E159E96AD6E58296EC626420251DB551467AFF3EE220342FAF84ADCB36E46D851DA41352876787C50D70E40E1EC30F16AC2F9036C938DE175262D68314E6763CB1DD14309F71DC2FAC3EFBC3D3C27B513C873A603E27B11134FE25BB86A9F37333AA4BF49F20FD034CAFE68424E20C028147E4F7CECEED0368482D22D72BEF187982E4197B7BF4A17504C4306F569F6937E400CEEB44D46DD022CFE1F207ADF01DE22B7CF533A8C8568BC9C0AB0D0861407780B5B7589025E92FA5E9AE2491FCEB9B34B60FF72071A49EB1EBC2972F7FB5F4BB622AA04CDA767CAC02F3EEB298BB87365BC51DF72B9679CDED05E580B14E90FA0A1122C58160206E712321DF44F0A41753CE0762466897F26A9229D72E1003837BB6FF75C33AB4F63CFEFC71D2AF6D5667BD5AFE402795064331C2C61C28021B1B608DA390F4911E997380B2D25078579519BC717269BB4CF10A37604E43E8504CA6C58C67F52843F7B68D159ADC68B7DC486C60D348F711EDEFA917852B967FE1A1426B3D922D7F8E2D3F8A6729459A209C5193DCF21DA2188F9EC817BBCBE32F01624FD7FADABBD5D36943158B441DEA2277C56DD1C922228A05CF60E57FDEF2DABC45B0693FBCFE3E8AAE40B3CEAD1A6BAB4AE2EEFFCA57A9C3526517CE6B2B78221761186FB75195254AAEF76FF11CAE09E3FE52CADBEA1356539A8AAA1960ABB2269A605AF39BB6764F65EF4EBF468AC0FA145BD486020DD1849179DA22CDCA7A1B3417914F567269D75638A7F59BAF3F43A2ADE572C9E4352CB80025506E5DB9DAE350F8CC69C847C10008C121636C3FB7D3E6222FE9EE3374E447DD2B373A961909836FDC459637FECA3998D34BC1811B6C5A1DCA5374EE426DD75AFB7F3E54AB8D27E2D71145E5CB3810AFAFE504D44CAAFB36B2214447F3B0C13E2FCD7E1A3F85FE44376C652A60B8CDFF587BEE051C73B24EAF027F964F84D6C2259A78264FE1AA467EEDB7D42DCC527F8675D6121370C2AD2D13657F756EE7FC4D78500C96A83428800145B622287E8BE36A565FAE720BBD8EEF4EB0B588A4AB3B505DF6EB5B6BF5CBB1055096D4A23B3E421C2ED614AAFD766B1E56D5641B8172136936E3226B3F31FA3376C8DBD558353D3132C1C195DF6CE0DB26417EDE1FF98447D0B995E7A84A3B2A5D683FFD9C163A3471588854D3309508FB5B1C258C1FFA48AD7BE0A42F2F2E7BBD457A2684908A35D83A1E698E4DFAA752868DBA6171B823F47FA7494EEB36C0DF57862B760425499B53C84ECFCC04A4FB712C67DBF59C757E88492C3C603E97DF3F859AFA28B472915B29FEC215D94A497C346F04123A7CAD8F1D92A476D47CB76DF0566F509B987AD1FBB7E05BC3450BD29233A6CADDD8478CFAA440907CEC6C58410859A0D37C297CDE019730501A5ED7FF2AEFDDD6C7BE1EB5CE3C52F58FEB1E851695B06B41612BDCE9D68C90549784834EBCF85ECC153710603533D0503BD55616BB1712434E7F1F307FF2E3E1508D6007EFE087A15BB449D98A9234F7B0DAB6AFCEB0392319DDFD4A03663A94A31045CDDD812206AE857F6BA32AD4132028524F98C58A0C83D7774157F497FB0157FA972E29D936F3974356CFF43F764504DDA5DB59192082FB7BA8861848DA05F889212B5000CA020226364EEB977F5DD56A5BD9891BF928B85ED8719AA8D39244A3DF30C35A824BEFB21E44D5969AC85AAE3FFA800A9A7A825A78E9B4994B76A8BE9B6BA4FE443291F9F2B9DBABCB75FD512ACD22D3813DB051DC6CDF255275BD25DF859FE63FF37F7FEE03EED3414F5DB65DBE03425D78F553ECF1651683095D4501AC61CD08458D941F02655A3FCBCC081026B626CC276F426C5A6DA5BE2E7678AD8A1F7700E480DFB8238E1E833785F055C69270968FE4A2D1A4A9F918F0156DE41EC5DF8597DBE6C039BD0AE6A2C4EF5510848E038306950FFDD0A28FC8123D02635E67A689CFEE91E3EC8695EE6B52EE28381A81F0DEADB61037251F43B577BD3AE824CCF6456D5E557F1F3B5FB62FE2AC433879C780A55F4CF3C94BECA507C3CF681C3DF58E1B3EF60F305811EFE16E140118A88AB8CFFCCE39D924D62BFDC5F3DAB837DD0CE6FFFF044EE9CF05A4FD0EED4883EF837E9ED91DC04524CB30079C3A329F417D5844708C29C39B9BBDFAEE0DC9582CB1D9490010C2C8E7808ED35137904A1B7D4F6F2093E8A9A0E975FF8B25C4FA802E29BA55CB6B88FE21927DBE59FC3842F90FB722ABC559E4C9E3B29A142F400556AF87A505B4DD23147DFB6C614782F1389A38DBD8544A3BFCB1C893D459B1B27F9E99D7DAB145E47B4A866E8396B5BFEEF24059D4002004F400B303A85A70E40425ADDB686CD6D9F11FCC90BDDBDCF77AF50ACA5A4FE586152DE021659A384518769E59E866612D3CA7E55DE70F60ADD06CB654604D1CD35D4D4659E9BF32B9B653A54D34FA6F98F546AE46A7265F33F700B1AEA51D90A0284D9EF3492ED32CCF6E03CBA7FA3EFABC157C883D7BD86177481CA8DA7C1B787C3A201501E3AA550FB7D6465D406D5E0055DA995D4B4DC7830822FAD79C4EC272C6E0C475344402AD71462B73332380DF7D82B1A57D931B9169703ED69DC663002386AA1B636588ADC5D2A5CE061972DFF01382B5216A9F7CFB19C29480E0A4DEDD61C554D12C789DAEC300EEBD74BB1F012BF7F4883D0138802E273F5CFB4C40ADB1A58BC54FFFDC68094C5508AFBB3E049405FD55C853BA283035012ECF26FC3964EA2805E75CAD776A24ECD9A3C52E19C23F83CC101438C7E448574D897FF066E65F432558BBC7DF73AF762693D7D5167D5AF2F2E3625DA92F7710F3A615400F1073183A3E28F81BC45349A2BA42D5BA91AC13FA9C1E8864172ECEC042B36471D1DA73C0F85B6E8E4C640725C443C56858D1E91B975DB0AF58560618F710C6353FDD058B06A0896C30803EA2E707D042CB50563237026775F9E1715CDF4A24D053823543488663E2853C92F0D581A80F67439FDE3BA7CC012872689CCC2AE93392D35AA181B67D30292E71680579B18F10D99236C93B57FB50AD267812C1FF72D91CB21C7B0F7220F9D8D6E96DAFE5126FD056350B4DDC0185FB7ADA012E0080B50E467CAE52917325CBFDED87B71C0401A1ED36668B35AACDBF8419732F91EE11B2DB7E8F88816767F35D58DF5D07FA57F830F58975D5F39B60ED7119F4EFB031AA393FBE01573B3D6E4223ED796A3465CDAE7EB0614905E41D79EDF607E47BB0326447CBBE3BEEA7AF1DBA7C61BEF5B4D8E5671043969332423322F6FD3B55B93E446B90E45EE2F389C768646091C4EE74E099A391496DB123C98C27512FDE4006FC7A3C0941D0254D7F7DF26983465530C5C3F76F4C97ED41D23F554CF8DFB6751FC5BC3B3E7A70D71C35EB5543222CCEDC220C71B6B9A2595FB5FCAF7917B4C06987F77D77BB0F8E6DFB92D002EC9518C829D19E823A103B6DCADA1B11E7FDDB3836C2F9B9F308B0C93F6C40FBA12C0E77B284D1A9DC42B00F7F52E6F70B02E44B7453FE17CEE268D781780312581C449069A77B44E2C481F5C28E5824A1BD6D6FBA13CCA535559C1FE88A68261B5CD057B915E5539CD2296CFBDEC8A94C4BAAAC022C763A3897DA975C018FC790DF9457464D466D408D821EC47D0A5A8210FE35C208FF14FEBD1EC36228463AE79B986B175D1B0AE6DFE3FA1B79E575EC8AC53A2DF274FBBB9E70F7643BD3F0156676DD81F6BD2BA50947A255BDE5DD8D8CA2F62722A66ED60B9007B3E4DD52A597F8802EF35C784F0DEE23818BD7F698EDF5266016A776028CA95DF37489B00727F5D31D5B2B9439F7A9B5A984F42AE35DD137565C86D1E1EEF0698C8E9620AFA105025B7403B7590A0DF56A51228FE2148259B1C63AC24D4B5F3C28878E0C76540ECD707A9D004E0FC1167645B30085C66884256204231C15004A722B03FD37034E77F3D4BE91C551DB59F2507E44404D5099C81024634FA60C2C6618D3C20566A2D61ABA22B8549FFFA68794492BBC6012623874D28CBA2714A6B2B266613EE1B925C8D87ECB57DB2BE5839188CEF93C0FC044B44FED8E54B7512FBD9727FBF7022ED9E04013378932B9FFAB33093B63DAEE288132E6AC7CEEC0D2D3B550B6B0A29C7156CEC70583003D213D0505CF8017F86622BAEF125240320FB0708194DFD8C24F707B758BC46A934CB1E44875E2A2EC5ADF86B89805898C79E003DD5FF15D3B094DFF11DB5BA084AE0C9989471A9B5D8A554B026B720ABAB768EC0EF90D4B73E1EFAC9A5F6FB98B02C048339B2B9848F884B81B9D5723FBE8CD3A16717FE6519C07569A3EFD2BC0C77B799BB1B59EABA3971F60A6306A9A243EEEF4582E804F21152673170D30C47F0271F7A141FCE9FF08B1E9C8481246FAB2EF66D70AFEDEF6B2C41819DABE623E272073B07428A121F8C6D4A5AF303A18C92C298D8FF80CF9B9F93033246F75F79F2D03E28EA3979E20FBACAABC423ABB7E6DD68897EDAC857D8899366A71DFDE3A476DFBA9D7EBB27C51B9C8C51F72D289918E6818B13B76E9D72490CDDF10F9FAE4C0BBC579A447DF1FF0416F9ED80F0F747C16404C7C2FBB8E6BF5DDAE3F67B4B9A2BE0325D4DEFD03BDDED489AD0369DCF002551BBB4BC5C6F868635A4CC9B40322E8FFE249F8C39E659A1CB2B9AE56547F1F363560D9594ED6A2109C956F1C37BA7AFF72831B0DDB7C7F65A37CEAC01CDAF29443E0172471CC8A5FCF52875FD19560D855783EE46B949AED2F5B21A75D008D2C3BE200154C3339208EEFFD708E24C0E73F7AF00F5C84B7115835C3CC472800FF383C0DAD989E604229323955B6F2368CD4E589F57061EB0A25162AC448F8FEAFA433F7C28BCFBCDAC623494194374B05DD5DA9726040EB62938F2552F2A2568FA524F125132CE8089AE5D9551E7C51C350D166B78E372D7E97085837A0DD0BC31B8F8728F1391AD3E28CB02525660BBEFE63A9AF47A54669D563470DA45C610126A51DB077C22C995B64512FB06D7DD4EFE81393EE58991AB5F879C224BE1A335A193F9C216161D4A08D39B967D53B4AA010E2CF14AA0CF0FFE04A899DC2F0B1BD64658235AD47F20F5BECC8BDE0AE0D4FFA56621F7ED5B830D389C8AD62333A2407A0E545CD1BD421CD6908D6D55209C2E0CE6BB1E0218FAF7E6D4A7474F309C2F858D50BC74F70393324D6D6D05D5D751D8362E23F1F04C3C69C2618537563C52C81743C73B2852D2952BCB93171492863B145AEC1C3D4A789A2C1D76534E147A1CF09B9529B0E7E7BB79FEE8B8A5F257AD2C17C0C4BDFA2755D0773EA869DF6F3671A425475F1432846E9738997A24AAF61A2FFB5A9B8D9411570A2320F8D7AE1D08B897324D109DF29EE060C477E6FE233785A59446CC2FB2F4F213F16364BBDED73F659BB82BDB28FC040CD57873A580773E8E0907BD2A35AC8FF9EFA147B008D2BD39CF3CCE4667B3ED4515938475C8CB5876F207E6001EA4F60869DF17AC98B0F5A4C74B0143149CC2CA3DBEAC9415F1631CA047798D1030311222E2F433EF4777ED7DF932EFA53CFB27C90073717182A4156F41BA5D9A674D13DBF3EC8ECD664B21297FFB55B0DED7BFA280A8E4F0D95A98748022ADD81786770F6782333ED3B9EF5E65D2F4356CC58188579591C26404FBB9B3ECE4A02D54314AB633A9BFBCBA0F907710F7B5341D12CC116C6B51FE89B771FE4F5A578126CEA3137BB5F4DFAF40439F0AB5ECEC502ACFADC926D683F788FF45B4227178C4104C2554D0B7CC7D3E8251A91FD9FD7B2801AE4E053AACDE906BCB4F376A75BF0005F7D838D4D457A2238EA8E80AC1E314AAF5B4DDE685D6FEA9B93DD7EC1CD2D56E70A38D5B7A415CDBBD1DF8A1E9B9D794FA301450E714712FD6303B635369530AB93C1CC5C9D046FC2359DB907D6DE75E455C7205203D547CC29D5B7465E908EFBD14D9D15CEA836D56EEC15A65B80642D192CE2955338C077DC48844854F0FFD70D132C6058F373A37B958373D2A958BD449FB957BD67DC14FDB2561376F3DD1B44154811C819508372FEE1740E755C85DE6C2E020795ABA3CC8903D782F90AA661E0D192D0E4F3015D07D038CD9A2B54A93296FAA2FC661613557C74CE8AAC962EE85DE87EFF9BC54F70415A1A290DEF859A69A3B93C1F4E69F1125C71841CB976C735D4DC062DA56DE13E899DE46E59327B38E297D935B4BD7DE8F4DB046FF058FF7F50FC0781B4FC08A6EF36A71EAA6A6B22FD518CD6223978FAB7334432FDF7228D6C8DD0D79C4B815EC4507CD5809AE8602D678205EDE7322A4FD98F2AD8457698CE7A92DC86325E9D44F3CE16880F04CAACCB563895255312C64C11A9389E9B19B16C69D0B17BF205671642B9402D09E88F09F21B66B356377EADDA84E5D57F8FD3B13759617166EE452311613138AEE8AEC04BD19F65FE73016928A9EB8DF3E67FEC5FCD2C129DBDC3FE5E65840E8EE06E1732E75871427B0C434037AAC09A9C14A520CDFB9CDC5B8D5E3488BFA5CEA88B97910F33213E5CE8BB91016364CE0265B7B6110ECA9058D787F99D2FB729643C3AC7E21AE3645DC57268741CB43D59BADCB29D89583D85C211EDD55A37724D29AC562A31A742AF35B627A2CB26F23C87B029CB9EC236BCD117F42F090B5CE1246DA87B74AF38E2AAFE0F1A15033BAE05C5B8D8352F47A4EF871F5030904C10402950496B1917951619A88270C06AEB969E8A7CBCC93EE0F4A9B32363B6804C60E29765CDF34B8B086437FA26C6700E6615336BF32E366178243672B1B84823012CF709851FFBEC153622C921425E836CB911EF4BB8F41F05AE2E4303F541D7698665C16AF78F2AFB8D48C5BDE43D60E01B65AECE3ED535B4766DD31BDF9E989A4560499A5468063BC55B509B38F910C5BB04170D467BD18D49EA467FF508F38A0EFB643F79CA64ED461D2678166C8F0BADA2D2AE2C295906CEFC29872C8B35F51B17D5C26F922E8D9EF715CFE5F4538E4A790C02312CCA4E317210BF0A5F869401D65D58C300C23F4EA73F91F7DDB62E457B0182F01223875FC75B48693DFEEDA99FD55C97C3612BE51C22F026F2B1A4B3FE17A021F8AA39CCA91C4C4788E8FBE76B66C0EDEC49FCBD72DC9ADFA516375D0B27CBD386104ECFA07A416B9ED85F4D748C61C34317E4305D34EB1AFB5F1D125A1A7D90C1C619DA0AB7F32669632234781267DEC2BA7FE8B7E1C4941867AE92548B854A2C0554CBD0668392EB8B6B0CF7B5CA24719F26EE97414BC914A83C5FB5F9E601A5F542F07B1B934BDB082FFD2001E54796A274FDBD1227A75829B1B18E1757F930986A7EA5D7594B537C4BB7B4FF836C26AE44422386426CB557166F9684F340A2A2D1D49F35791599D8E9413F0D0AF02F77CA34BFB2A5F33EFED61571A0AE73FA1FC518685E67144AFA8997F346896E3D9D6C4FA475012E51E56659C08F6562E1E053D39FC7217C7B5437912EAD5A0413901C2F2E65052C60D5475EB3A41BB3DDD195AFA69B2AB5624154F54AEF577B83D7F33AB008F3CB80D3A511C2D829D1AC3AABA4B037DB2A9C6F30CA452F8FD44BC629800634E81D9060DC5F65B6DF600FCFA17DCDD3039660BB9E64FA2BEB5F741EA877B42454ACF5DE3C6B2B57D253F17E45FD37EDC845839A54FF541B083D800183E6E812FE0C14C91D12BF208FB507F501DA37D7A15006E5429D805056B94E807D847F528664356F72E34D1DD6DAE858C8429589B0EDA00B59C3EF872E1A8BAAF862105E189EF5F9C2CC1A61B4B05E22DB9AE66458CE662AE608E80289B2B6534F691790647AE4C76549B939BDD8D315676D478F2A401037985DA9C6037AF010458F7B3CBD0C4F2352870C5627DF0FFB17F7E5BD388511DD6D2B6A85D0D3BEF80CFFD063C9B82F5E7D9B8F81D53653517D57C079D27624F6B669ACD0B36120B52787F7E337768E3EF17FC3D1DB54F09F586838AC8AFD49FA2723770C46B7F3DE16F355E9DF139BF25FA9A31D3531C236108B375A1F3BF818ECB6777B3520BFC56A113C784BCAEE0B96E95E8557A32CF1041B81CDCC7A4EB31B2F47191AAFB764470D17B6671326F52A7FE577DC8D7E02A6857C3F46755469570AD3301500164E2E97A7812843514BE7EFAEA7F79F8ECEE4D77C1281CFB3C6552963BC79468B10F4649EDA06FE422F94A4CD190C35CC25092F1C4D6557AB8391260C9FF8A6E392858FCDD9A54F6CBFEEFE1C17C75A94A5B8D6EAA27FF992D3737066D3000DD9EC0A5A8698FF3B14B92BF27E3075EC5AC8E7E3E9BD88CD0EB8B5E65F45926B3442723053C05E229EB67680084A93F823A9F8F14F089F919B5800EE6599CD8F5CE589CD4C2E7E2A2BEFD89A9D3FFD1277A949BD4935AA7BC0D5C00C220F30C73F6D5FDBBE7DBD44C9D2D945C7B350C9B208CF479E524FB3E191B838A138161BEA0EBFE73C2969679CE27431B6853DC9E5F18DC786E767B05697BFC78D0124E4627D7E3290181DAA6D855E9C45BD871E7E9E2331459FB3FCE3A3B661D5A31F4C2AA8C0AB0D8599C18EC1FDBB2C959F0FCE4C3EEC691BE31E0FBDEC6C684E267AF76B502D31D2845CFEEF075E6D0AF27278F64F25677634A61F2417D0806A6DBE9C9F40738F4C41D88ED5DE26B8BCE7F504819BB32575B8D067708DF5A0A008EA450D11546B47E0AE9DA03DE154D313F096C949445B0BFA80D455FA5E344A62A88E23B5DB9DC08D03D329E6E2C0C6977BF1979F6E4E42080CC3A402D82686208888CD7775043D5F154FCA3E32C95238AA47CA5424E606651E9F1EE7F4B5F3DD8D3DDCAEFEB03F5F3E30680A9DA946186F9977683FD2E7152B1516A2CE2BC3F4BE90F2C6533BB0E27F206EA0CE72EB5C36A7CAA38F17F75C177D9A6F632AEA29339FB47E9C5CDD25BECC83904062CE6744BE8463131EF996BE5FEFE8FEA5A72362AF26BB41544D688231B434B960064949730993AD42C2C66FAC5FAA7A87E774C3CBFBB38CBC1A7579A41DB18F0BBD5E47884A11B5046F9E4AA456C3B6D7C5CB91EAE5F38359D82ABE45C386C6608BA53104C95449F730EF75B748AD776A44A5E7000C97AE6D81FCAF381B5C8835554C274E136F6DADCC31C5DB2985886A9EC6B76F66A027B65CFC24886119EA4D57AB746D8D914593B8CEE6265A2812CD836F30ED4D8C1AE702027D01842A02FC1CD4269BEF6BE76D456AFCD6EDA5199C8EA05838351993554069B0E11F70E80C325D0F813F36F5D2936EB37ED15C112C1B7B18FD3C16EE4354A942C1A94654C031E99236E93753CF08786214056C0F59D35F852DD2A707E64591B5984A059A6CB1CDC88FC43AD37779AD785B21C242802CC65FF0734CBC3348F370FA4572EE817127905655FC93A29BDFE7B3E4E6A6B71A86A22F38A365D4754CEE97FD0DEF210D6D3433964A2876BA0B8DDD265745171E56903C959DBF5CE54D4E15DD58CF3FE007F20B7EAFF3B24C8AAC3234661D31C58C5F1A4539925CCD05E51E3D9ED33FBD66E780210ADC8275F0BBC177639683E33258DCA82F2BD0343F0E21C6BD1CEB1EFD25F7D418D5294B0B5E10E5C00DBA9E47FDEB2789CABE622B0C844DA1AF53CFAC73E3CF6545496F1CB41BFA58ACA633F10389CB776F43EC34A701F81D86435EFC9EBD2560701D1D18D151AE2DFDF27B1D03287C3C4A368A6D19FA300F2C4346856439A39A3ADB0894C4FD0132378CD4C924E94BE57149E96D5CB0428A370186C0E473A8E7494F94599CA40503354AC149E790FFB0BC7866D04C72137B70CCDDB4341B19FBAFB634ED88EAA3B601CB6B9C9F0AB2129B2FABA97F77D29389D955F285A4E03509E853DDF7CC9DE0FFEDDE4A627ED0FCFA01D92CD82ADD4155724261E90320C16899D3070116830171DE45248363B1B25C6D0DF2D74041E4E6AF22F2F8EAECB65C14DE8C773B960C4E97AA9ACA4143CAC4723D1CD4FFA3E4F690C23D0FFA6A628C91A944F3FE9692D2FDB6473C6BF70302D40B2C92619C75D8C1986777715E02D27C4F2705798B95F30E52D47A619C894CAEFF324D5AB01C13DBE5BEC3C2717256924CBCB874936D804EBB1BA50DD563DE30F653C4D08E221424080AB49868746DC6F414B66E375479F2C3714ABB3C7464E61ABAF3112F2796D9122A055883A1277B28F298238D71466DF7F11DBA18FB13DD845E4D2B952F919ED6970F2576ED4A06E15BA791E330C2C1C7DB559B5B196526A65783962C2ADDFD77D973257E8F0B2106440B8E2BB21FB74D65102B650BC7A9A8B72DEFE3C4EC5AF5E836EB43EE9211EEE99FF5AC9AD1869EA0C1E7A97FEB443C762B3399CBAE58EB9345D5E6F94B2724B4D9B4555E04C18B19656D681E1B72255DD8A4C97D9ECA76CCA010AE122528A89414DDF43A42CFA5C114B7E067F8F00194CACB471F8B22F157FF629A5C6BF6A10051349212611219A9BE51EBB6093B71DD3E91675F71E30D7E5BE2E24A8434EBBC5978B28B69A95656519939C027A6A937EE1C2EB7A66E1FA9126F177F5BD8314AB5E71A896F1A5216A0804F52F57669794401831372FB666FBB9FA31F1A22B6CCD4EA598C6ABDFB9B127136428DB8D100FE9385C34EDECAF5B63AB95BDBBE1C38CB5E98C8CD542772B52689FC216A86C031F3E259F6424C9502F28AFA8A0DED1342FEA7307508043105C9315CBED6A70A48809B1453617BDE871C5019D5B59BC1816B4FC1B7D15BBE375404ACE1E3516D1C56F412A0F0BC13645D12B978B99558B01422E21AD20106805750395FB027BB353A24366CAC6AA585CCA309C5BBE3BEA8188D3018414789D2B3E5964A5E259403F90B4F0409D844A72259AF32B6D8F093AC0D7DE75E997346504AE5E7E177E426B1BFFC3070F4F08BEB4A233734A733F3729A690BA974898245F68E528C80C213FBBDC7EA03BD13ADE78BF443BBF5365CE0F437C8EC3D98895E22C3132A92364A4BEDB78BF55C32A9DCA88866F680EE39606897841D568F1937DA1681C4503B9EAE4897BEC1C2777FE0BA80E0B01CD958EACE96B9D3F70C3B3E80642D0671601165E4B23EA3B83171FD69584D49815EC72C21B92B7D0FA9A4E54BA165E223BF4AE42CDE4D909BAFFC0D87982C471754F4A8EBCF6F8B5F9B6E09450F647DB2C0C5C55FB24687940D5554674AAEEC1485541D719D9CB24FF68615FC3C50508B74B592BED0A097E19B2726764A45892834E06C9271C0964B65766A7B7F997DA0524B0789CA17D170C8355677661E336B28DE2CCA24F9EDE62D01F22FEB230FE0F33F2B8BCC4CA03A645B2D3249C13E5DCA6DE8027BF673820955095B0D97672E955C6C5CADEE16960EE7545019BAE8994EE59DE0DD9B0DE6F68C66E0E55105EE5DA7EDC804826C0B85D46F57DC6275A6DD3B130A33094D9E14D817105DD3D8970C2BD1434B7A24B5BDD3D762C99E1596D019E7B7F07DF7676EFE776B0FC932BF759C48786F8FC0B093E4D8841353186FD1A499B28DFF23521B07D25CA81AA185B65B396CBBAA27C85C6DA169477A3E3A900BF97507169AEF32D5D6759E034A65B9695A20E82DDA57A7FDFB6594233FAB04A94464641084D0BD3CBAD7E0CCD181DBAFFA05B0DCAD3E4691B665A79EB1947976651C1BA37E9252FA762A107348F6F3D018DA66296E1BC87F8F36570ECE4B7E4639EE16FDCBDE5008D45649FA54AA7C4D0207C8393987B5229F8E32982E8B2DEDAF95D0C94D0181AF0F9DBE9A48D648AC724781486E4D800E33F7B1EB26BDDC5B66951E8325D94D4AE9DEE7967918A3F89B8B6EC857D85DFEE0FC8D781C14B7A04E12725D7C355D31A2FBADE1AD7D1C4B115696E56CE361FD49DCD6B9338889F80402AB8992EEA247BB76F14D7C7306A0534E1259F83D9B80FAE37B60FBC27A7E2AE47108DE61BE936B029EC23179298C0CC59348957CEB1F100B7BC45A2638C503948C77062BD2E5F23D92707ECD6869385AE13021C881DBC9FC90B67C88530B82AFD3C185ED9608B39E99952FA6C99A245BF458E490BDBE1FBAE5F6E61444A42A9A50B75EF10CA61CC764F0BE50E2C5044AE09456B1089794F81057184FAEC57EEE0966AA2E4036A285D26FF0388920F78AAE500F7BDEF1411A9B7DE16AC15A9F00637D09DFBDFBCF159C6C1D4665F89DD24DC57DD9001390AE197D6F4A308A945FDEE5631FB8F87C19F06CAA7088604725B2AEFA3992B1D44AFCBD08DE6DCE8DDA1D9FCCE5606483F30CA74F8E41A7E4DACC1DF06C281471128F6E66362694B7B1A2C05CEB0BDE69C5725B3F74878738C917012030A5434EFAB5926433F0917D15B6A06F6B5A4780DE2FB0F02F889D95EE27442366F126CD8C92F1E2DFAE2E77BFDAA17B118E48238658DDD990E4B965E0C056941ED1078A02538FCC3056781CC8DD51D2D5411A85EC3025D9A30F36DD4DE26CBA4D30C2E49E07CA8A2B7FD3964D9A745B9F8A6A83EE7625C21E93F8B9D26BC90A252F13BA6C8D33294B9CAA433ED1CE0EC432233D6F019F3516E111F92272AA16364B63DBEA0A7D2E5771485CDF7091A320725584AFC6EB40156BCE170487CC30F772F82D03AA8816B16231481FACEC72531FC670857F216B03D1EF0D9C5A05AC9DBDD96399CBE610442CD89C8774974BE8583FA702DE31B8A76EF9EBAFA4CB9FA2A91A2B689E05ECD1A03729CCE53DAB8BC6C07200882C5913F2FF6DBA0D3C2B6C821FB217E33A15C98942442420C1474AF38DE0023CBF52B3DBB8404480D863F6AA5174866CB5D769410E18F4612077250D5BB88DA09A5F738E4FECBAB57248279A166E496A1C0B6DFB7E046EE8A11BBCC5DA3195B5D220023F047372E037ADD8BEC21F9F3BD6B74408D08A60FB546423855E09B2F0263D67AB406DF19FBF3F70387B8E24FC38D35339F1D006642D6763784F1EF0ECB4591747634F9B5E85698ADBB1A26848D546BE3DC3C7237D2CFEB3F5F9CE0F66BDC4EC5DBCB16F7137FCF3FB7F715E54D495C6C02E3CE1B23C91398784C23015151AB71CED3A02057A5403F644F4A32B08F4940568EE557BBDC2B21D3F50D96665EC2825B369FA36E4E038CD1906FA52C8F0A7F3661EC78328FF2C7F9F9A86FEAB337C771B01D3E33B98C6CE348F9E82C03E000BEECA3A4544B17C0A9257DB9CE9C96BCE40545738C29DD8F4D226D2F78D9B2925ED4857C11D5C3C1B44EA29B844EECB3674096B0F9E31A5CEE3D897E9F351B2C5F2BDEAB948175231CDB5B3B244869CA82E4087326054DA7C50B0721EDFB7DEB75E4EBC1BFEA911242470C73B5BB090BF377976BFA250361B46146DE88ABDFAFBC6AAE6C78539CF528D5937E5D7FA706BF940EFFB7DFD3694DB961258A0D13381A908F3EE4828DB14C6090E7B3BC736B503D0DAE7FB74CF9D96C3BEDF2BE6653173551D6D64D38B30BF58FE83F34A43E0FD87FE1F8FA8E0BD1B1BB3027DFBA05239F45ECDC8B77D804897483289C0F490ACA5701FFD87DC6D5880D52132E6B42F976E76E48F3503AA6D49D54E50D636FBBAF388EDBB8F1B8C1DB74D1F8CA8A3D8B3670E5F3F9F87F0B179DDC0886E4E3395DBADE2B92C2F10354BE3D7917B5468696EA717A1E5FA674F6E87EDCA02A03B46C72ADB6759B3539D6C5AF799DB87274E94CB0CFEB3D0F1E687621A79460F03DA214EFEDF4D9BA54FC50C71D53ABE097F2CC16B91DB5E58D8246DFC4ADBFE85586FEF0ADFCF3813B2343B3635AF6FF532A3A7FA9634868FA601447D387DC6B078630CF5F3A12BABE72CDB7ADE4100B586F4FE4340BCE820A7EF8541CA2EBE428F5943180B4BF9C202BE393FCA733FF5C63ABB3142B38BE4941839526901E2B17CC099290381F6223284675536FCD0EE6DBEF3599DBA2CCE67E08E10832C7C838AC0D097624FCEFB90FA7C548BADB9B80EA4D49D9DCB6919AF4A86FC9937929D75C74C25F81E02D12E06DC72A8D3CA694AE7B9BF874BDD4F27DC05AB545975B4EAAC4A0D82C29D6B0BAB2A3548B776D11FFCC8E14227CF247B3B2E864771CE9823C3808EF30C63E01F2178BB254FB16CC6C6EFB780F6062650CD5FEDEEFAF36A6BB2F8345B5635C6547E0A5F6A2A95FD24C71B7242D665E8C66EE125876F5E0BEECF6CA140D525A4934030AE496C48BCD396410A71B77A91BD3D0D3F3C13E015E1541FE65FB1781FCD382FE78E64F616FC302E71E7FB8CE2285569E8BCFC507E064929045A021C7475A2AF72044EF5B1D6FE7B9EB1D4062FBF3F191CD0B1AC2158493B9D8DF5EEBEC057FFFE022C829D958249007D9EBA4E765D028E005F722A832B736312E821B5AB9254F7C8381391BDD8E4ED586561AC2C41D21BDD17B1CB6B1AA43E5446931B36E2364291BEBA48D1DC8AA6E27725211D9FB30D3E8A244EAD02CD6049D058177EA6EE0A9C20901966281A65D8A6B6A2DF98F1312281C8708235573BE991CA66369DD051B50D8F43ABFEEE2BA2B1BF775E4CD2C38B6BB1388971FE9F51FDC2E0EB7B80B31C9F26EF604C55AAA9CB8EC8E97F3ACDD5F9359FD04FCF03B501FAC41D75D54A682CAE9C5CD907E8604BA0D059B0EC1CD0F80680919AA000A10201438B0824167B5BE90120D1DF9AD3243EE5BA434FAB0C591A1608F74CBE69B284BF154F4DB4CC624B7E0BBD4471AA426C34E1E246B6F0AFB2F9A658A153F3E1C7E3AA70900846016EA22D08379B4FB8BFBFBFBCB512185915D9B7DBA4AD83318A2DA963007DB7F427F76A21CFFE3A10AE6FE8D66EA2AD07DD51450D6EF81B1878A19F6C78735F31995DF45DA6714E906460112EF7C73C549EE4FD5CD5EBACFD5D5101FF6F5B1876420BAD6CAEF3892B4191D535B3F3E34A4F154F7210ED036B99BFAF1A17CB4D1295DCD6FFAEB08B33D5306D200E9D6556FDB0FB56F658466854FF88B0E881ECC85BC15D73525EDBDB522691567AF118F64D7E20829496C389F7E9BC9E1A763A1EFDEF487C9CF135862783D171950A13B596B86C6C8717EC2CF98E2318AD3A5C3A6D6231EB0F762D74622CFA1AE5C056314E122B1BAEB3F44CBA28F11EAC525CC9E1404E78E9E1C276F79A6B3B7CD4E29BC9EAB8F03DD286C5B6BEF2553584EFB1DE1F8A7BF8313212CE8C664EFB0620D8FC60B026DBF85414699CDA3C02AA26ABBD4759B3E0FFF63DA911D3675CDCE6AC2EC6A176125AC8FF20B3EFEFF7828B95E53C0AD6C24CD4B4964314C8971BEF2690885564C2A24A2C6738CB8E0AA014601A052E3CC9650D967F9E107CBF7C9B3B4F96CE24622E13C674EEABCFD4BF19706FD78C2EF5F3211373543F5ED5589335D12D3E03CB9072502244211EDBD03FF5D08B64AD726DD6856849F54036B4A9241515937B332EB177D126A2A0C3426494AB793CA95B165FC47A956A44559385948D182839555EB084C3A8889273DC9CBE5CCCD77609CF7D7EC31108642CBCE630006FAC3482F19D3E9C8F0C35AEFC7AC5F50BDC807BF447ADB72E8178642BF051BDA92A541724AB3694F4A40F8ECA1CFD6F0EA57847E0FAC41B3C71A135C0409A59E1C02AB3FF3D42564A59452BDB870486A4343C03C85E6D81FDF173AB9F7AC99387499283E85FDC04CDF72E20522527C236E074EA395AB988F3073AFCF8A693E3ED7732893BE9A713731772811760A9097BF39187361A8A1D36A8E4E8CEC7964A15BDC8B21ADE2DECEF20BD763FBB1D15812F7BE2C1AE97FE8FB45494C9812061CD32A4282C6E11128EB75D71F6BAE195261966F8FE698703E621DF5A04A427FFA3DF492FCB9B81BF6FBA0AB0920A1AC018A30EB3B8F1B03551542091F85828E2D5A5F8BABA43BB8C1B3777EA8E5BCA61F6AB994EB359633A2C877F35DF023193A68D1E3919664F78638E2C619A67E36A65BD98C9E08935DBD9F38F4338DCB06FE3234EA10B4C25D4B03A11A361F08078DEAB0D39D8C0CDFBD5ECA1FF163E4B4CA571872557B5753B056D15220D340766F5679F8AB0AAB53D8D6CC8EDB4341F351B367A50A3120392CD41ED9E20E3C15B3E5CC6A6D7A58AB3493C1E7D7E142A5D16366764A7DC8777D6808CAAC4D3CCF3184AE072BEE411D9D43BCB3E856BC9C01BF2E9269C5A763A9AEFC19CA7D8D1A9EF77A7DCEEF74AE58EA77E17B82EDECE80ADAF2A191CA889587D1C696E539FC0EC230B15A9DF91BC9ECDF3E4B4363B88BCD493662F4D79EDA95AD4904C21CE9402535F8334A8506B5A95B76D6959DFC56E9D341C35D8D9CCBF1A651232B8D9F836F33B803CBD110D4E6009E8C7C53436206C15F0C8F952B7E5FF52BE7DAE9C38BDCCDE9779DAE4923288D065A384B082BF518302BA00E5634ADE5692FA814811724877987451B818ADA1B4039EE1776D91006F5F87172D3423D6AB41B665BC4CEDFF2D53A83EA0D1D4F30FADDBD829DBB8FF0ED1A2A411AB5ACE04543FF90FDD7A8E54F2597B95646A17061D6F7FF63C0243CDF4A69E6984678AA6E81C3CDE56A25E5953E05C4F70B4F316A965470AE868BF83DB492F0DEF23A17512C4330B46D7EADE583CBCA9B136A1EF28842D798C0E5930F10F56E7F62C1FDDA6DABC479784FD0F4A8962B60AAC8A4EA3A3C17FABB9E7AC435B46EAB012C8B00B793FDAE992AD8C5E9DA90BA53B6FED339843FC3DEA8E9BED6236198E22A5F76B32F292A85466877EFAE31E471863E3988BB84FD5ADF927DFF88D657D8DC7F9CF7B7C222BE745E1E443B980F7F246F6BDA42F9430BB050BB0ECAA9B543CB02BE2C4340EEDF21FD9AC298B75151AF26D3DA70F360CF47E361350822E1DEFAD7CAC50E6F76381F4AD4473C4ACAC28597664D649D57ECFF2F977D454FB4AD82F643C7E840BE573242B290357D41B0A1AB1163A034C59898446F8139734301E42F6C70DD1C144AC01A1C711A3E6DFB21459FC1E54D5AB5A28EBFD567B61B0A82AB0EE79FCFA0A5CEA3A05EC302B136F6BD4825B0B155CCA94D901D219C32244BA1D2FC597FC93D4F65A436CCF33D332146448698851F73339AE27DBF8E271502EDD33B012D1597866C02B64FCE88BE86BC120C7386E69CE7A7A18FCBAD9B95B8DD1C36D6F381361D6415C88CE0B07AAB122FD43F9C838A4E318C748BE71E42E76356891D3081980C86CD39F1D4543181E4883ED621BEED92B4EA1E7A8C69D48A663BCC3424CFC35707FEEFB944657D02CDB0D74AE3CC4A7182AC03C0FE57B216A752C2A5F3A3C13801B23D4824100D116F085D5D2578CBD377CF22AC8259E09E2B3C11150B3223F1A9A6AB412B7D74123D248CA9288BC0A6672C7B9D268211AA3D9246DBB8F1774CC5B381333C0B07F9D26E6A9162847E16E15264C08E60A030CF4939F128180A9CEEB9770177572C5EBB450CFA919D6C44CCE2B5164E1891E0451191EE1CB51050439808A13487487A65AD08A1BF8C46B87F2DCBEB8A15210A2020C48AFB41EEE46EB10D4EFEB1967378CAA2E47CF9F5A3689B918BC71B511716A02FCFDC9FE09DD8DCFE61951C915DFBAEFDC6A5C30F35EF2A01561399C997D05441702436A8AEC91188F9214231F58C2B43AB4E780BE7CA5FEF15771F52C986E2F4D3958BA2E2F770CC7982E44DEB485531E9EA28A815880E8E049F41A7BF8906E2C43F43A140C328FE026CEA13A99C880C2A16D52F2C1FC936DB073E2C06718B2C2AECBA062B20D890707DB0DF6A70D3555767B721FA9D87C999B46983512864F83C9EDB3FAFC630B2DF9115FD8F6C15773C9A186D774A6941D0ED8DDB09354721DD94C9F048ECCEF3310A2A4543CB3E0F670D26379C227AE02F7605F9B97C77E4162C1CE8907E3FE7D8DB8BA63A720FBD530DA6966FFD84F4F9438ECA31FDD2BA478C2C68F5CBDF16E9279267D21BE1E9EB29491FF65FE78EAC79670F4DC0AD69209CB81AEB78F657FA11C4AF6663AA84C0B3CD6DFDE96D38D6094C8B84B26E3007A837E176773F1571EC93C318CF6278F3EA3BF5C342098F4591A778B5EAFF9452FF704F7D04E334B18D4383C37B637F32F0D4462820184D5865B6F1AD7410D6CCA3FE8356CD63A879D4CFEF66CC2CF1B6ED0A9947A71B9607646FBF00E22D43E5271268E1D03B4895C240284A2263B97A626D2CF7B33FDD0A98332BAF65ACE3B5083EEF50DA43E033C57A8DE4E1A49DBE535975CC62500EBBB8E17745DABF7FC4285E43E182157F7335A38009F8CCFF52FE754A5F4FC52F5B7B7F6C30ED91DFA9DC13F9E0E26782D188C5E7DBA86517BFD2AA03FE5B88713B653A6DBA0622925C69E71970F656391D1AA5B2273E4646DB09EF2785B7F53F628ED627F38FFB33786665C651074EA391DDE3FE391C9117DE24902ACE203F04E1B1B7DFFCF355997AACB25E14F27E8AE4BA750CB9EEDE2049F46B3362C3F60D1EF44BE3184AA1CD4B73FDD5DD427C099E7E1E896BB85B8E4A506395C32036536D606052E46E96FE89E34C01AACA4B9A119D77DC0DA79DC0AA4791F28AADD4A3E66FE204B917DF7AD847EBFA463F2C97B66F40296D1DC27F2960AEFBAE425BD4D5BE8D7B631F65443881FD73AC986123F577B8BCB82F4BFAD74A159C653D8F77FE9BB55BFB47AD9A119361BD7BC868FEA06F63E7452AD4EE3DB0202741B2C4E0232CDFC1B7FCBDC67D7041CC84F480A760CAFF8FF8911CCBD0AC98516BB6E9CD4AEE0A8A773D927224F3EF47CEF2B1D8900865DAC01BACA61278B211551E71CA22F7D767282B74825DA17D183179D48B3681E6EB0FDF8B98E0409E36FA7797195C1CA144CEC441E890F32DB96F76B34249165D195C2EA6923EC75712E7AD15398D00B95DEB5B1BACDB73E66B867824E150BF66FE1263CC1E4CB78A372B32E3B6A69B1FB7118032BED913D42AE0AAD1745C73D549E87B5D9D6AD0F23BC1C4F72BA196F70C9D3092A95B19D4B431AA43BB5049B2CE974A017E7DF4501B8BE1F1376D08F8BF37086824AAE7837CE36EA721B6A8BA59528C80AF25EB463BA18710470A376BFC79A01FE31D80B18F2C949C6CD5EECC6D45BCEDBBA159277E25B4564BBD567A218BAD7E846D63DFC308D3D97B759327B073A59DE8C7FF3F7B26DBA69FD0791243B725AEA699565E81CB44F49FB796479860840BBADD1AAC74735214CF3266A43A7E5483D73C0EE43E429285D0F518FDB11F18B390E178F28243F19E9D848AE547C70FB1404DF7E12BD493A329BCAC5FB84520B6F665CC310E32CEF9D8A33D759C9B67C3ABDE5BCDE7ABD52263C218DF407E54A3B325C7D3E08A99BAD5EEFE69EC3627A75CECFAB87F36EF535DEF51C0ED5578E308DF838DFF60F11B207CF35C2A39B4E754F8C7122E2BADBAF8BADB85A6023A28CCA7D89B14B1401217E7D8B0CCF22F63B819DE426B295546D7B45489A87A7E35743BA25F41E11BB06F6B98062D0251F854786BE0B81D1BDE5F09518F6BF355DCC8D59B6B55D17F22429C3F5A3CBBEE4159C16BD8E5CB70A241EA5620FC80305000C87E9C2167DF7D2912CA9B332435BD40D854520A4D2F8108A90E56EAE4A1B53A6856271F389869CB55B72DF2A9C853259BCBA94AC2097D5CA2BE0FAA16C65DB167A1947F96CE447EEB783CFDE41C7AD8A970BBC9DB8558354A0A49D171E34A2FE97F8B735CC42EE78743575C23683CE84A24CCF62743257B2FB9F036BD36510E12781D7B475B7987ACD113930D61C6C5A5F65641BFF1FCB0D9F11100D711000C1F20193694250204622D1D4A963763A36FABF54F6C8F35F4BB928E7A4A15650E4D23A98733156ADDEA22329682E44A16687C9D01CFAECF1B4CB46735D3566BA7A349D76FEE6AA20944D103C69CF8F8EA2677494DA4EC67E0A6DDEDA2D379D942472261668C1E5726A9724D5BF14FAF068C1CC7A2DF90FB9DE51014A9B8321389F1CEF2C3C94C244E5BECA784A9606ED7927FB9F11DC2918CFF283C2104E6FE07C47DE1A7488B20E0F9FF1ED1CC4C7C6DFAC9AF7DC76B2197827E0153A70F041708D3E2FC1455D09583AFC8FC7E7238BC58047F121C42A7ADEC95D76A8A0099B4A053853AAF14442FADDB024B8B623AAB1DE9AEEEAD69793D7749CCBA4AA1C54312E01C8888048F647B5F23566A800DB81D7D8E8C4C823D8206F2C01723F75723D63B70DD472907332F56EA1D7F1BA73A423E6E30B8F0B0971C60363A3F9233240368F641CDD97C16C59B07BDF58FDBD93D2D45724DE05988AAE7876F942B1027BDBAA1686FF06552C65E26858369398613A9632618663E0A2CB403A3E24638085C0FAE042EE496CF486CAF926CA9B99EF3CBE493348E6837B12C4247BAE0F7C56015E0404867270624AAC6A05729DE657DD6596171FF0C1CA9DD603A13643A1293968209A042D6E918C928BC626809744299E6B700617BB0360E9750863C94BE40CEED55F6DDFD01BBD89E505FAD13159526D54C1A8A32BDF978E328B3D7A05E50DA95CF45B450D9C7B400BD5EBD12ABA6F06E1FC9E1C1185FF46AE8F94B9FB7B675BA29DBE892C268A66A46ECEFF0EC9F54CD60ECABB29B88254D1CB7BE43EC1DC49D622E139DDE204A9AD8F186B596320C5F02D632BFDE23076579BE6BD2F0D3CDE0AF5761E94F0A888B6A858DDDF937EA7A865DFCF50433FBBB1E85636AB484FA1B3E9B392FCBCB80D178E51C2B3D4E04E87045B57B5A920394BF4FA7831C69ADDD441CF1BF20C69B8D92F8BA2FDE8A9644E90361893BFF73B3A77FD347E690A9B103779BFE9923A72B70F32634312C11BE707911592A12E77F51C8A7F2F6BAFD8EBF6770969402DEA2FE0DF90D534096E7361F483E69BA4DCA5ACCC76D9BA411A6EBC7703F092D5441CD52C24199E0BE8AD6955EA9AC7CD267E3969B5CFE0213E574224343C26D72D58B8B876F2B5F52808936BAE9517CAAC28726EF5BBEC75C95F94ED094574932B7F4D2686FA325D174A7A413230C7A2C6779257F6456C68BA1ADFE278C45216D1647DDFBD06E46DA0BE44B36C3B0A65D545EE585D86785EBFE8E09510D5A91476C8013035023763346B731637F1007148B578D6E81F597F29BD91AC9B288CF3D26740C684744526FBCEDD803532A7ECCB645A34003E9CFD8FDB7121042F645E1DEB05A0067954421B0F3890442B409EA6F5E290F5807156034E4692FB3B76056B2AD80A48FA519A42242EAB1CC8599E190AC9E8D6EB068A7ACC7DB24397AD2C250525F6BF38CC665FD14D16A1D4E5E586DE3A3A9C6E9BC13362652022E02F0FE2A378AAA2225FDD262E0D3F0868D682EAA81B39C9A5C25D3A4EBB6EAF2D2C62F35E654538A9F5A3FEA769174C063DB13039B25E250487F22538E9F1D9CFEBBB5CE7B7DE1E317B0303290967A4AF0F0AD25CEBD48620A756D371905EFFDEE3D844D611DD38C4D3C4ACC201880FAD1E94E35195FBCA5DE3524BD18F1A716198CC213DA0524E7EE8020F292DD1020E924115DB2271575957EF1606F96FFEBA24E4EE194AC942EBAD1EA5BF0B009C2AD60BE84D8FA588DD83E9482758CE621234ED7586524C606C534B1D8379E6B57E63C7DA526AA61A144C8E63BFAAF8C225FF34A0848725E94AB0EBC61F9F31ECFB2C4550D52DB5154546193F10B849D4727F7CE831E09CB5C8C8B7E76CFDBDB5498BF7E0ACCBECD2E397291C1F211B566EEC700CCAD87A9E2392F250E607B8310DFBB0841537A7CB3EBB77F063A62E7B4B07E369646F4C603DAEEC8B5DE27D5937BF57F8DA4811BC9E1A9CCAD8F2D2E4D79C4789507622767CC38DED9B1EA52E2C005B154175E127B77C21DF4860009E2C3642CCEEA23F401AABF59E1A8E786DB87631B1A5565C7E4AE1A4D97296CD462663223D22791D3F2D86A37D683AFEBD753707BED3AA53D7418386D03216CFA8BDDFFFE95EFB479D8E130B683896E4B8CA1A222341CD79BA288BD14D98607DA3C9B9667DD14B1BE15E45A352B05A75FFE74E8FD60A3208FFA55F528B1F75873D76607814DD7014D7655156E20F78A9F0F0AD97426A907608E1FE9741270F86191DF53D4CFD1E507A6D513F939CD883499E0A107BE5AF24737CCE204EC08FADE32D1C5095B896B7FB4D1F22EE671ABCF26CAA7C32B8E6B26FA55960E4B9F1306BF4F63765C28CC0B132A1E00062D01726DA4C00122AF48665DF3241C23F989BE7FA0E17061188413515E103908223E41C43549E753E48AE7C175D04403414E1EFA7C87465D07C7A07F62920F47A351974E33BAC66FD47F122419E51B64E067A68E23791BFD0C13DCDFBEE0FC095E96B00091B1929CE665D2E5A52299ABC9F23726175B71B1348FA13D2198DD9A37571B715CFBC59564BF2DB18F1D9758A9AF027880A1DD6C433D33D543C2F686DF8603258B2B56D2938B8D6105D3F44D8BC7243C5F13BFC7E8A58F10FC29B7F23E04062C69CD5B7EA48AE22DC1663D2CFC5E8D47FDA91D47F662417C2DC6C65CD3DAD008C05B47CF3CB188F5733A5AB6FDF5721CC4A2C1B75D938EF4C00247B6FF8996AA1834EE275D38F826B74AD559FA097CC5C3569396AC7F925EE07EBCD97904DA7AC6F3532441B6FC1198FD83A353D34F690DC104FD5A5198CBCF21C2AD5D7C80A2A267AC2EC19F18DC7989B81AD34C4378DED1FC0CE4A44C4AC9C8990BD6C0866EA28B286D8D40C5286C3ADC4E3C932E8B889B7E6D3B34722F44DAAD9970A9D049DD6EC913DE9B7FDD6BB1BC053AD314DD9E64798F831397B20C4E9C9BD32D9CE5C5BAFFFC736944A44185DF28502E252A2B30ADCC48C991F6E93FFD0DA6A1B45E60F117E0FD38FB54CAC83D8B62C0D4DEF4892BBC738166853F7FB40BBEE329962537DE537375128C9F81166FB92523ADF6F27F4E3E5251D5C0568697092D98474D47411484798A6E08EC47D6F7DD23B9FF5DB1C84D5BFB8BC9D51E8D320279519674E5FFF0A2E10E013D25E0B830C8D7C7B279B798004C818E0C1ACC4F79A1C882B27F2BE51A1E12EB688D37CE5BC58823D91A948523C840E9108D6CBFEECBBEDBA304DBEDFAA1670144942EB07C9E867146856AC911BDC61565410EE29FC2E10086E8451EE270136B24EB0154B40075E1F959E9EA92DF8A411BD68567F936F8B2EFA470FC5DE53AAC30FB9F79109CB51C06B7D6DE5CCCF5FBA6B907EC47C4F0BCCABCC6BE72F9F7672FB2AC31D08BDB519B64AC33023D9180AF23FC7114C026CA8103CF21AD28C278BF7F45F0E36FE3645FFB33B1E7CE3753DAE3D02FA5D8EF4FAABB212400FA358CFD70A1DD7B126236041D70328D4FCA36CD08857BC6471082D4F168E3F7003B95E289BC4B7458672C4FF97E00DD2BB5D42656FADF4F5E2DB70C04F162589DDEA1481A70CFFECC476356BEA8C91A438B673D7246F9B00CE4C46B0CCFFAD3A58A63CD7C3401404C639036E3CFC845177FD3817FEA974A656B087BB9B4AFF7D705161A788534DD65C8FB44E491888CA58A889D160EF595242BC2D0C5838DCF72CFF0E7BE504B8D6E2A75C3BD5D24AB7B7E6F175FA6FBE28898EDBD65231A8CD03EE021B90644D1685D6F4344FF1AE768531B6BAFCCFE86473FB658A34BE8F69AEADF2330BFA159A641555326FCFC43BBF62F7634952415B501A2627C0132DC374460D32FFF640E7C2421B330F23BD68F0FE41E972ED285873982412F1E3D5801668AFED0D51507D97EEF6A3B4B32248CB68383466C2F96B50B56D66359FAC2C286545A760E286586689711EB3E3A1B0B6DA073B7B90F5F41AB92F2CFE33AB873E1FD634C30367C18199E7301A1A18CC537A2B1A5AC2A200E26BFB792A6B2B8D38FFAE5AD3AB822E13DACDD53F906F55E5719C25D8BD8D3C76CCB4E00A50AB171D26335C4004329B3D731DC1388062219C7BEC9F353140CA568E707544FB2F25693DE9815A5414B6BB1DB7A23BC42013C2B1EADDD138794BC068E3FF0CEAFFEE8A29FE85F08A8CC60CAA531FC4745AB8C499326029BC13D39C37B0D0A5910632F47B0E73A77626A526A809EFD51A66A7F8A2BEFC3CDD326A01D604966DBCC87FC78232FCDEB52ED03FD02B63160E8E4CF18D709198E69BE3AC97380719B737BEE314A604BC889CBB85EA2BC9872F0A0C610C4449CD44BCC4A1F984A7EAB5D0344850A291E9409CD4C41090D69954413F84343FDA38347DA1079D80ED2CD2482FEE86F9D58F11350A0941EC23EA82D4F31095C0F349345630081CACFD2902C705B5E953B1FFFD8F560899D033699B1EAF8A781F7DF5EE692CE0380EBDDD66F22815616015AED172BF682D471B41D80E29C9ACC1B91BC6414788B381862F5AD5330AD5B5AA5947EC942B4F59EBFE7C3CF217BC0FEF414CB4984E4CD35D4D4D7CAAE6DEBDB3E8BFF17E6F70D64B3FF34A23F6E0E5D01EF0C2CAF5F6D2899E5766242D6F559D99792D138720B6BE57DDBEE7C8D5ABD5B37F470A91B0E111E635C0B0E74C347585249B214072F5ECC3E67037E9463A1AA0A45F6EBB6317CCBBEBBEE0ECFE01F7B29E89C0EFBEB2AE70AF07546C222A99C54B00D1983834E635B383E42460223310245D2FFED01B42D9192887256C10538925DBF8A8EC6B6476DA918DE76CB7E79C6C1A4C08EA9A1F5EAD14D5A4549C5E7E2F028243332F6932C4FCE378A2110C7ADEFE9A6B82B5446DBBBF2E17864BFA2C48BEAC1264FA8EDF84BA00DEFE0105615A4377BBDCB7C8850A3F39C8CC2FD45EC71D8B422592F8599FCDF4DF8E7092745F40510A45B2F5A996051265055AD7E21181BAEBBC67E6BA4BB15282E3D04F99CD79B9EF88B94A9311F921EB0FC419FD88F44962E0D13876869878643B4F33734B278951056607B0FF9F7B59EC6FEF0745909DF3F2669072BA92D374C28CA55E582DE375BF41988163FFFC55126D64FFB4FD865204CE5BA9E26077C1CE13A36C9CF53FE64C9FFDF01775AD5D4575A0B28B76D67B6DADC3EE681E07B191B6C2593F187073FBF9FCEF90147802F89CE869CC0F5A71B77F943E4F39B8658F7A69184045AB61B56651455C2F6056F76924212CD7DFEC1AAA204A534A59B44DB7AAFA38828AFBEE874DBF5411E3F6A41C3279589FFFE29C6214CFE27EB3A32FFFDC6CF55F7674317A5BFD13680F583451B2B334161A32EF3ACB91E434CC38DBD9DEAD12B1CAAF3ECE02F6B77972A7D9923A95057B8F8D07B777FD56A93D8872527E1092310B75626BA16154D2513F96A7B5B25EB6B083D77DCFB0936B1B4F12F1E26E6CE35106C3950E9EE03B9A2529E42E9787F7B600B6672EF4F6A37F2176672FAFCAA005B07706F408EC275AE2C0ED1C32F423817CEA5545914703E29083807B3F6671288018900EEED51F5B5BD89A1D83A91FE0BDED861A9DAB3B689B757ECCFB057E2C0F0C468340290AC130C3713219056062513F2396A3813D89D649F3EAE642A9F1AFF1A32FAEE0FC4B690D014740D653251E0AF8C846CBCCF728EFF0D5BB6616EECBBFCD2BD8153221581DE3E5EE9598A22A72397E52EFAFA7F48ABB9B9BE61FE2C5189F0834B55DB32A9211E772D366AF01E7FB28657218D1E0F33D7C22A0096FE6226665FFEB02BBF5870635894A2DCD37C6CC2E1F75AC6F0BF1FAD27F6913D28C8BC729BAC4B2C29EC4502B212ECD73284E84D033A930E957EA28C3D2A76DF76443E705B1A5C75ED525A75D1B18E00C845932D689FA3ABC99843398F10B4FADDC809B8FE54D4E2758EACA3F146F8CA0FDC839C3ACF7037A7FA78D783456D2ACEC238FBBFA5CC9BB54C4329F41F46D631E6E6BE319E2072E9CC650B39C0A2FD2CEC8AF15E0ED3F6A8ACF5694DAB3F8CBAD2EE9FE950F4BB344EE26F7B8D651032AF6AB37532E0661186AE608D012D8074B80EB984E28A3830F0B58CA545ACA32A081CF67EB4F83BFD93C8297B4D6A2EA06AF05FD7A9CF929354B15A69CA06A74D80CB51AE5E5C2AF20DA19A680DD18C826283ADD41108A0BC42BA4B186D73640BC0BBAC3C0140EEF9250F6DC36C7DD51D096762543333FEC2138FB80453EF3E5B64175C1AC296110AA0EB8FFB8F3F48379FEA7D2DCB15716AB896FFF948FE8B974D47E311DEE20DC9384007D2A6808D24C77E164AD9645D0A94A4FA313FDD50B88D6D4978BB73D0DCBD83DDBC9E7DF3B900CD87E8DA9267ADE037215C6E4D35183F3ED2357F17E941F965F8CED6001214D84D6401A2DD08C99EF53D7DB4F6B341EDA58CFD60078E1E3D293161553CE54757CA1298046A3066F36E9BB022747DFEF7BF5F3C00051BE61892CCBC13C511CDAC191456496A8327E2373EA6E125C8AA87866F6B5736DE08A0E54B79EE741ED3887DEB44E07625BD9567193B25A9397C824E03687951F83CB95EC39DB0D8A2DA84D1002248D7410BD38B52B682F5F0E5807EC3B6EA44BC02950FD3FF5812FDCF42A8EC15345C0F9D49A935A73CF7822C50F73FA5D24FFB5C2993A1EE327607AFC573A69DF304A2018CF66B8DBB422DC497E063D7E33BB14565FA1D0AD122CC01831E79473E011B6C80411CEFF774B38EBC6C9BD9E2DDBC34E7E65F63979807E19E5BF9908520EDBC0415D3A4DBC16670CFBFA21305BFF103DB10FE485D26F37A1DD0D98A4E5BB241AC716265334ED9D049404B04815AD9F62F741FF5E43449295A963734EA210F0C05D7F83BC62B3DB7272AADDAA4EB015D4F6D7C064198087D0C35ED3C3565A5BB849EC425058705F5E12C7224B0BB441B07F84979CA5F2E3A78A0CDEA9F3CFD34F1F87E6127A3F0C31C85C78DC3E5158ADDEF69C70F0433BB5B7B1E1F981B5C4FED9A3AF3122CBBDEE896F7F32E98F281E113DF9A3776F8DCD0CB8D1C7ABA7B0E807CC6C4E5001361364DCA6568520A294884F18E84C511792677C455463CF312329E3DFB4B3178FEA0B1E887031049F97C152F11AE507CC111B696E734C5FBF5BDBA8748938406181A8056AD5E61B2796E7D7D31922DCCE958B086A21758D096816545528BFC881AF932D977E456DE37261693B89AED894514F7280E34005A7639211C57A5378240903D209C103E71F0FB172A551E4051DD6F824A1A0E1844CC15B2ABB1383C2A7139E6D11670262666A9653F85639E8E1A9B1A875A1104DF5B06AC115E6F433B7EA27C79FE09A6E871C7B9FC29DE795D1E50B9988265BB74CBB4C444F0D2E092BF5F7A8228A4B93CDFC53B041580F0BEF9E6377E600C385470E498F5F1B62378BFE33D9C8A29888A38E71365302C087AD454DE778954FE1C7DA4A5BF890A7D5B1EBB1F0F63BB7764146AFDF2939DE4AD2D724B0DCF218E38BC5725276A04A9D318D434A58F89C9F4765C312E707C14B71A285A6B965C6164B27B929EC8F534AE1C6B8BFBA67EC036B79E7A60AB2CDE9774AF04EB71DAD2B693EAAD2C56A68B121050952F32358ECCB1DB59B3FB46D36FF67F178C19861C64BFB69C849FD5AEF5D19DA1633DD2F95FA616CE9E645DC9C7B54AF7409B0AA5F5613FBD985512EDBC3D585B649E0E723EE8A1095FB01043F13526DFA66FBBB73AEC2F0228154EC1AD107ABBF81656749E738D17F3B7E80BA22BE1CF32EABE580CDDC2F32086F1074D29E7A7ABC974B3BE42D6AC8801DC738798E1F72716AF96FA538DD0085070DB95FDF37BB98F5A0A1B44CABF5CFE9B3AF85A5ED59414A30CEA46DDE93A0E321ABADE036084095189D81F649DAFEE9E228581D326177C3E32C2160E03A84003B95F3FAE69E70B8D4818416E8A20142EF43E94D1333C2FF74905477D675FF6D6B80757879AC9B723523C724BD70E818565B7FC1069BBF771F8484BF8D129D192F8E66BA54DB04273D562210B85C2827D4F413935F1A84BB9F5BF6CD221D8BDB218D04A92015C3447A92F9D635B51260870EF17006A42CE7243803C3A73EC77A0E7611799F380B4DBBD3089E03DA9D87DCFE7688E5705F4BD5B1D946126EC2B66403110A361EB07B478D6CD659EB1D0EFA482480BC6B18471CF41D5A09967E1D809FBEAE209B34A2E5737A99E9E6A198BD6B2460AE522BCAEB5AF87571B307DDE12C89ECD400AFF4307F500A5539BDD47268D76BF09893471FDC19E5CEECAB42234E683F5B3B3DEA065E40CC627A2EC1F323D7BF3FA08B54D5658AEE8E7B4B491D1139C2BBF3780F4EAF0F5FD3CA633FD63DBE607E5E0DF73A2E22D5C9CBA76B4706AD743E8EE12BB5148AB8318B81EC9BE1503AE779983244EE89D818503046D74CEF442066BEC9D9583FD88231D26806D6D70F1653612E9791845492E57EE178EFA4917C71EBC38F0E2486C31B3A9671FAC52F4EA4EE25C76B47BCA7CEB4023374A0712A69E548550C0C359957C1BEE772E918DEC6C991AF9139ED3202FD6BA1447293B0A496C710115601BC91D1D7FE4A7D29E61F8791B6838C46FD7F7BCE1111F12869D6BA484F39679FC12DEDD5CC3F1830AAD5B9C153A2E1DBE7F6A334A0629DF851FB4E7E3EA11B677A87533FF60F6BA15256A8F515F2764CCC78E50D0ACA37D9BC85DE1B2F57F72B4D585641BBF1DB72F93191C9CF05E11CA39BEF46C09678C5AF2062218610206E401947183125B7892AF46179BBE0652A94D85FC47F8842847254080890380C33D214F53388BEE0768200A9BC06480DC0995744A9EBC1CB1D1BDC501B105BCD79FBBB3708F17057F08D587D0127FB34C8206BC800B4DC4F590EA7F3357528DC377FEC8B71DAAA66C74F887924FA5886145B748C94FD35E210678886F7C7054C62CE88C494DFE31BF6B23747AABE54DA3CEB20CF4A3F9B6CB9A36749591A368F29CE00FD97F141038074BDED3B565A7409B3676665AFE898DF0A00DDECBC2053AD367529F98921ADEF66586216638DAFE29A1A92EBC1D50471C13E17F154A3A59000B5DC27BFF1355D19C28A138898427542F723FD24E0C21F57964EA164EEA1F89B31E7133310A006E0E4BBA161CF6FBAE08D73D6D0F4C273ED426C3407EFC8C7467A12A56FF2E90491CA888B5CB63D72E6B4F1C97E92664517C040EFBD2A119C7C57A4952011A6FBA8A681337ED5322A48D60DCD10341367F417E4EE855B8A95C7DE1718D392EE1950183F0E622B3CA6F52FDF012C1BD31D038DBCAC715C3E6E9E70E6A5A3DDCED34EEF8C2D2BEBE688D343FCCBE002280C49E8F3370C68D2F76EC28CE896DD0C2B5F0DE3936E521788ECC5C449E3A034EF5447F02E3E87C4588B54DA711042EBA6AA86F7D4F94376B4F000C986FC9F9FDC6320C7667619CA8B0CC357F7BF599B0E55ACFC04FD01DB953E4A407D4BC96C9E51FE7299A72A729755C23464AD202A619A40659130CDA9DBBF3D9171D299302259F2D934C633769E96C9D5C73F72FC8FD9FB66384B5072E48B0D6867CF626FAE3A6E75814244465C8F0F8B022797256DE01B1FA17D4221AEDC875B753F7CE8CC767390F4FD2099D814C9A6C490DBD30BD1C1D2252896A2795CBCE06DC1C04A4586F21E53982130A0643C2EAE28FFD1692E909D92B810ADD7B5FC66AD418C6AE3F5E92CD646D56BF5D4D078CDF3677009BCF4A7B84FB519692C25A33F6386BE5B5C243CE8D2A40F4687E6EB60A281A5E236758F5DF91488326BA72C19B2D7DF29D5BAB3E4CB7DE6DB7AEECDD381465992ABDB0C1CCC6F6403F6D94025AA17A951A1AC1BAA231523F15513A1A051B73A5E4003DF90BF89CB42CF18B3F8ACB48040EB63D384ABDF4C75D99764E5844BD0668D91C10CBBFFE441D4523A77EB132F5B451284F2B69A775F68191870487564964EFF5C37E001035A71BBB7FED329064C66688FDBB507EED54D7D64DBD51648013FE6301AEFE4355C031E0A679FB723855440B40F007EBA82EDF03343F3988135137DB9CDFC85D25851B5096B151FC3B1C5A2E7638A2C72DD4C90B3FCD23B9072C367C0F63DCFBDCE67A8A4A70C1F0FF22FEA6829475EC8F548E242DA5AE94F1B50485D910050FA054C4351656BF63F4687D06751ED8823BF0133B7D01E09833FA69CF50E89091F4E4AEF71261C0F3461878DB57633C51684443B93F070F8C8CE001E1B32C6667C97C7E2FDA0F9DA611EF32CF5C479E5C50F89E3F1180A9F94FBE720A273891392CA65067A57E318E408BFDAE4160F7C56A93ECFCEAB40546EFFBC77E01878D7EED61295455741B0A068224843FF7E37AE086F368E070FE28A9FBFFC4EE535D481F27C0A436CBB3FEE52D4569EBCA04084ED121535B6E625478D48055D0D6715E36D7995C821E23AF72234CDE2BFF12AD5B578AEAA3932CE0CDA8D9A5CAFA2EA7B9A2F56B42283672F5C0702487C4FF8A4170882517E0D2AF06C6FD505EBF01ACB8E44B3D89F2E4DCA8C8AE1842D245D4735EE39CF53751AD48AB19C4F79FE928930DEC656D3864CF599B85B64B70C5083658889D819428BD091DA82B3E0464C4C96E03CF786C44187EE8FDA41F5F44E0E23BB7B03E062FA8A30A22D3F426F6222C53FC4524AD2A548AC0D1ABF5B03E118BD51F423D806A1A9467EB35C09DF5BD07DFAF79323F4965051D97FE393095D0F49668E0AB37CA7C0E7BA90E87909E799B7452C82EDA69698BA7F8B91077F2A3153F5F229A93EF406EBCD93AFA0E83108E134750FA15CA8748E33C9D3C664694680BC0CB88AB7E6CD19DE5C4E5EA9B9A9BC8CA35DBC200CD562BF37CA929397B6D7E77FA24204D4857A440C5570BCCEA465BEA805EF8B6EF1BCBBEADA275FFECB85C843FBA47EC5951DFE004E5359509E96577B8C12BBC0FE1BAC472597503A0AABD3FC28EA30747F09A1FA10CD1F79B9D8366AAB9E4F33EE22EF5AC1B2A797AC715A3A05124B60EC9C323B5A059B0B03831C98F14596517AB590B17640DCA035D802F97FF6660843ED3B4A29E0F903FC7420868079C64C43B78F741F907AF6107BD0897019C6E10891707406815618611AD77B40F9AB69CB9328E1EB506E49B710AF559779F1E0B6EAA2A49A53C7146140490F9420CC3A03B08F8EAB920BB12E63EB006425E3B180A54CFDA291B197CA6AAB374ADC780E4AEC72E1128AC5B708F4FC7AB8B7648093D009570469AFF7FAF5C628336E571241DBCC4BDC055559A77B467D0622A5ACBC08F7DB5AF4A661F91488E9D8711049816B0382C8E6BA64D026438D5A694FF30CDA340960D7C41C3A69DF8C1FD43CE49CA8E36BEF4A2FC6B4961ABDFECD14DBAEC2E8D212CF2C86117A3F8D6E8E1968B5E63B8F46D9F11CEA4B62941D916E09D08AB5D2884BAB16AF760D74BA4F23A04DDB8FEE8A529B46CC13AEA7554CE4E6659F87DD5B9A48C182D10B1484C5E43A2CD618943CCFC4FFE06D8BACE5DC91E97B4990F2CC22B2BC68D9DA6785A3E3BC009525440FC51E3B58B3F9355A9C52252600B221A81EDE30EB3AFD86597D2D120FDD84D81464727CCE0EE5F07BE0A3F3D6C2EFBFDF4758DC9EC3214AAB1C7A96654F3497014E413AC2035945BCBF0745A79F6DE4239459DE796FB39CF5E81ABE23C0AF48935248204BD1D819387FB9D859DE588C5A3433EC7385912038750B9CCEBC8B3ACB4CDD05071FB34B0E63E03CEDC4044EB102CDF2F05DBE1C2EB69F574A10C5FAF3E983913424D494CB5EABD463FBD19A19956361DB17671BF0C4F981A4329C9B6B78E5589E584C3BD1B8696AAB09C625B07C40C93CBA7E4D6FE0782D864729497FAC37F434104B21FF74F7DCD49D4CACB68716562365BD778167B353CF00E4DA215F1BFC2544F5C11C0CAFA65157A42126F2DA8E04519928C7102F3033E7AFA7608CA31060C27C61F66BC90C24446C2D34B65C865C56F79E1408FAEEE55FABA0D1CF1B38C0B8A79546E8BB908035C51FF519A54DECC533BFAEE73937AB71338FD948B9062A47FB3D564EC1E572C725EC06AE9E2CD46A318E159A3404D35A522953870EAD516689C11EF99BED0F77068B4229F2B4BFE8724ABE07F72FFA2337345C87445428BD6C9F3EF774E74BE031D17A69BA5B4F3B5F77FD5D2DA534048FF03BECBC059147F6F71D254A2E78A6BED8C66A95F9A14CE77E23CBBA6EF5C13FBC94AE76258C7F59D93DDEB9A4798A230828233C9B9DF9CA66B1A4288FBA4792B6107FAC3F12C6BD1B4B04BD08EB0185E9D0F87089D0B507BC470640B5D0E0E7E71F9613879EDABB0BD30E74EAD31718978DB91D040EFEDABC7649C30BB2BD4F2EDB487EDEE9F151B59206948621E328EAB0D2E20F3B48AED40B8832156BD810AFFFF872EFF9274A299911EB2944200804D9250B3B3261CDBA8B58F6B017CA4CBB28F3994064D5B68F07825C861E63BAE2E5A04B501F5D264AFFADF2F4AE78EB76BBAE749E115C6F8C39AFCE4E3C8D8DFF2D1CA86771D8948589EE06EF95AD4B68FF140C34D7B1E7E1CD11211350BE51117FBBB2A4FBE1042ED3394E9FCDC3A6E93705B8384B2E3673FB801B3C7A399351F49B9ED29DEC5276C97941897D4C2AE48A5F0B70DC1634263FC9E14B6B30B5AED3D68A31AA57349445FD73B3A9D41158F981FF81506D965E8B242C87EE37713F108A281DD150EFC14C3245D401BDD1C8F8C34607ADF94F2CFA15A89D92FC518C8970CEF48F140459F6D0D552463C7D462388F28301B177FA783C1736E30D6A57D7135137E869D86EB0018B7DF4145F8A67B9CD075553F54CBE07EBF0589F166BE8A2264F9216FC7BC5FB3FEE27494AD5669928B4AF36C0EBBE05DB6B7564207076FF612FD46C74E583D3515030822985F64FF30CFB04913672D5FFF616B2ED727C89F56146642715B1BFD7F4F9FB52DF6A8FC5FFD627B94C639B7E001F9BB9D19144714BDDB7C5890D92355D633755DCAE74A2667DB4E6A0959F396C8178D34E90FEA24CABCB44DD7D9FDB52EC8D69081FD263D2856FFE71C1FD43ED639E9782DBD9428D79726CC583EB723EA796DD57CF611A0ABFDF6AC7FFF484109CDBDF9F36D6678F09E2EBB5AFDBF9B681AE5695FEBCFC22ADAA8597811A43C218C37444070F8042502E2B01F2E315526EC135BF5587F407FDF3234400B2FA22313E3D05924C3CCBB6825C887F264EB33FCD5E7B26222D930197D240423ED19345AC8AA0E6A2EAB2F0B177236834D4EC9922E0842C99382A94D7CAC0EA5E557A3B054ADCCE53EF28730D4A51EEE69207FD37C1A34E62A54E3FFA5514E139C8AD2DED0F16B6D799B2F613F32805B9BD01D2C9C47A9759593ADC2A6B014E1EAA40DA1D5C3631BADA80FA3A92AFEFBC6401149B1AC60B2A2BF746673C4A3B82BB5C7958F7EA052BE26F4C896738DA6C42D0BC00B099F852556990EE2961C3432CE452B68EF3ABEECFB02328C8C960C2083F463E0D87BABC65762B30508404242FE50583F5C98BB52C9CBA97DDC565BD363D675E8F9BF7278E13B3067888DFCFAFA06B953FBDF5551DC22D028F111C8B89092F07A49580E1B48B456EFADA2C25882AE49520AB19C399C49F6E6EC9F78CB72B86ECFF276B6C6A8993C2CF183EE088F8BDAAC48B325BF623AFBA64A1DDC9D9C0CDEEA5F5AFE40EE5873C1FBB289F76D3CF428EA92D86DA020F3A5DAC4EA9AABB11F987C635E42384634EF9C066AA45B08E64FB9EA7F35EDB8F09872B89836B584AF9418FFE2B1B240D9DAA27582AD06EA3944AAB0AD791483E86591C52AD0C9B9F1EA334B0CE3D8F3D8A316D99622F11ADE9C571FDC9E57D178C018D85928E5E4E8A5A96F61E1BAAD2C4CFBFAD98EECFBD9C1F19918F502066FDEE00345B67FC2E5C8C059A40D59CE74DE7E76E71FE9BED9F03953B9459CAA4A44F22F86C14A71068546EF171FC641B595D793A1D9022497EC8709E906F98FFDF332B1C6CFDAC75D19A1F45C6C47A19A7047F23C72D6B43BE54315CD77DF9A77F94AB3B21C7B8FF06050B794E8F5DA9EE0DF5DEA9025CCF3D9578C82EB9D62FBDD74A6194C0F3E93EE25870C4CA46E7885B160C79A71D7BF2024A88B411AD9D25019E9EECBE7CD3A1FF6B33D2D6B1D7E8A0E8D447364C7B34AD8A6A44899CDC9359A8E66B1C1FD7802D6D262464F6E75DB765C70BC5AB70DE0D410678F7F9A13C26E0F4945C34667EAD8D52D1178F8178F955E445DAFB97B276A1299431D27AF8515F17FC3BAEEE9D6FA03F552331345698C7F47D3F8166DB31BFD7267E929DB10DE1D62F4335160D240DE7F92607F9056C13190BD5F736295FD9DD6DC4BCD18D35975FD7FC6AB49565A354FFBC73FA72B0D975D70A19917E4B17E08822CDF7CCC082DFF4FA8547768A7A960C5B9F1BA6C83ADBC9706CD1620A944B1BDA45EF60345A52554FFE06FA94F83CF415A885FF27A15E663E5052B4A3AFECAFE9BB8F57DB01B95F60891B9DBBDF5E8BDF47E2552E64F5438FCD443F888E4A1AD49B9C99B4E0FAE97645675EBF792950E59788677132B7B19057AB26B2D787EB7C19188B3C6AE67F1FD559F486770D11BA57F733A892D35D683B7E1543C92F9B863A4F963826BAB5221631ECF85FF56DCCC32FCA296D1C67F7A9DC20AE599725DDD039C92B5D156972E0E6D27E23F7C628EBC4C5A7D2E9858CDFDCC7D7A234C01C1FE795EBD89BB9F97EC6A36FF3066A607F6FB4B225A0C91669D050489B9D6D6281FD2527E10B08DE20EA5FC3937A2EAA4A92FC35520567CD18F75FF61A546E1857A9C8414BFEF7DC031E459DD8C246AE8760FB6482677978289D854068F783014903D71277A2F5276AFE63C4E2C176CB5AADBB7F3A5769CD429D690493AAC0FB8058C3EA992C10B6B0888E5826CA3752DED62A426F65766C3C5EF9515678C7E3A8AA5657B83AC512BCEC5BCFA57366A7245F1BDA5C32EB908C9A8952A6CC183BEA9B712F57752255868A4209F55970FD00AE5D7F0C0F5BC670992BDFDB944D32A06C1789B2A7C04E2D24BAC885369F157948BD599526CE6B436D8301C4A5719990287FFDC988CFC37FA205B2696B693B2495151EAD3730C1CC15E1B8D35D7270085D91414AA3137E5B91C90A9ABD70BB557F9B3EA0CBDE49885653FD7899EB61ADF8CB2FB957ACCB03AE1571CD76FEFF1EB11B58D84C10659F2049828F3488EA7C53EA32A799E3BF3D83DF3DC282EF9A4740F07B9BD10C7BD0638C797CD3EF172E8B5AD162A7EF877CCBE47DD15A66C3ED63507EDBEAEEEC19A1017BA66027841ABBADFD2785FA1A419BF86B0B2CFE6F15FBE57C1DA1F970B29CB329B9DCBAEA311A9198B101408435452B68F0F9C9305D5CFFE180EA328B6D439DFB1EFFE1B7D74BF71727266718935FC802416D667AF079039B9DB59E528CA8EB4F57FDBE69C8D4196F5E5C4E7FEC852F81D75F94E92E3CB27AE5D6F2045E196E6337A1C00A9926BF5EB069E64E4C48735A53C1936BB92D55882DC67E0CB770563D5F5CD7862ACFDE84E3322CD558D65520F26AF7B6458AC3DB45204705F293B228BF7FF213347732CCB8C95D9B16108C5ED74411F9979132C689693F5DBDDC6DF34FC3EDFC6F65A8BCD29211136ABCF276DF4CDD25FAF6AD73ADE186FAE21A2BB7BB0529E5CFCE61448EBC246EFE7FD8F761061CE6DD70D2AE82A9D4E102FC70D885CCAEB36C1B9FBB0CF58F4A1E763765CC0FD82C39D52A871646F11A34757E98F9FD1F03A3D71B1F1B3BFC41424FC9DE4CB72595A995F1A5BA7A070791B641E8C45955BEF1690F8C205016A1AD0325DEA5B0D8922570CCE60DAFC94333A11627A92A462E3B26A917C1D20951C950A4F381AB051D6223F9BE00B4927CDF6DDFBFDE9BCAB891D9F24D3B1F73409AD54F6F7CD0030ACEA5373C95F58D367FC7568B4D2F6BAAA09836F885C6C9DA2BB24BD622A49D03CA437C02DE1D21F5E2C52DA2C11D933CC188D55865C01177330F57C22CF6C8804703F76A1DC77A8865633B93B338D69428C502647D039E54C4CF8DF586F0E75BB2D230073F060FDC2717FAFF57B3906B9FC2DFEF667A2E9D744CD818D53695122D9BAA3B60752741AEDC4D5E1E4075F340894595F235711E3A2B93DFDF27BBC6B1C5D087F7C0EA1689E25239704FCBCFC5ACD8615401634AFC079FF5E324EE94FFE94C661DE7795387DD78F398995C167779DCA572EA53C64E0A6BB81DF4C6230027753A11A3B420691C34385A86A5FF1D5637968BEC7FEF80F5446E2D87C65BE5ED96CE4CA2EEBAADF655A1A1E28D8E7D80E0868309064B6E69A8750CFE51DF73F1D9BA0FFA9CB1D6F9023F8D6D499100B7F3F55671310026D3C12DF36252D48AAE955707CB23714A8FFF38944A55047FF6DAA35FB7CA91BC370A02AC12ABDA9B6C5CB2F142120F30A463FFE4B677E086373A5CE9C80CA0F08D4AD9365912813132686A5C554BE8EBD143DDBBC60E2961C149A270D56177EC7DFC9D0377215ACAAE8BE66D32A82EC9BC3E648A40A8577A0763DDA199AAC2C71F069E9D7D2C7AF3DC495AF12EEBEEF0328E6465D14E3F8BD7E615235412711CAD5F4D1A55E77AAE41AE765595FF134185C3B7BE04AF6B2ACACECB9A84C4A6CFE703EAC9048AF3E478118019AFC520E6C4BD03C01E20D082819368C280A045055D2ADA1089B17CD3AAF46A118C37F5321B71E35F1AD3246F681915AE6267FC1358DB829E816EC28019A95FAC0209C4AF73BA873809E6DD36910BBB4E8BD2F0987178ACB9178FE7D593F47D856F34858D71042B91C3B977EFDA7FB01973D2A0E453B551BE1C7212305F490E8DB0985EC666113B24311385344CAC934E43127FD4E0FCC6FA4FD2AEC06F3E2DECD2E3E741B8B3F833E89CA2F023C875CECB031F61A2A3785E5D754AFA6CBE8005D11A2800D70392C775ED96C013C2199839A4F2AE807590A1A0BF7EB9F8A92DB210E1EF200B9C8BA8B3D632A5F965E0E2870D4A7DDBBBE56AC564B0095CC29AFE65C99E4D2A91990EB2C75A1A619AE416F151E843B8798756C3818950D6114E02B899A109684675B0C4517A4B6B63BA630025FAE0059A305B71E781F398E440770834A327516696DFEA257FD184153FDF1113CD96689F6BF7096C7786B5E063B4975DEAA54CB1389A80C0FAB233A7283D5E3706A3E1B8F6BDA020F5AA0C82F1E1BC3580CCBC80F75FED6A5CAEFB377FD2D0C6DDE48DAB6E6BC6B8ABE3367F98B0B53CE1FBCCC0182F2C7601E092C2D8BBF0F92027506C5B9AD7B8966792BDCFAD39E0BEDF85A81C4EE0E44FC3421F467210E30D01AA05DBD00C1FD52A7C553D223485266C36D282CF1B41678639AE711B6FA13EE1499CCF6084BF2003FCAB64C29672F46E837BD3D439421939AA96D2D2889D10388E173BF4BDC3326D5EC64FD890EF67B86C049FE17F24120FAC44BDF158087C772A5631C7835F8FDE9DF79EE7E565721F0C9C2BE5B6D684E8C45C22B6A2BE713E1B726F3546EE0DE74866E6153FA02826A0FEFAB1849243BEB2FFA08D25A4188C60F8F56DA1396A713223BE0A2B4276B786C73985842942089F245F1577F6259698D5F5D3175B002D88D87F794736D8C7658E0DAD88CDC8DCD3B240BA83B81C6471943B7B55DCC6208E9E2318D74656584484989DE685157A0A35A931AD0CC68BB6BEAFBE69F87A311C7B154F4141FD7CC4E4BC14422D4513B20632586722A6BBA16CF21801DD0CC9FF2F3721E63AB3619F50D1728152D575DD974BD6C7ECA50BC0D73CFE25A5E983DC8E2CBA742C18C466EFA7F379698B17370DB54570C770887F27C9BB5F20A370A468C1871063D62F3AD104CFBF38902414D506DC041FC4920CBC667314922FB23E3E7D2C04972882F0B387604EAAF00C0ED6440F9C0381EA664DC1FB602A2CFFD82EBFD27FBFD750BC03DCD63B657019B5CC15E5F608482BB5C606D097893777FD8027C790D4A8C0134BD1BDC7F8A07667240DE047962095A3B837F64C0ADDCFB906BC05D0300AE83AE28609F3FD0F9841CB05FFAA9169053D8A80DC20AFCE5E14AD29968F9DF243009A4847FA5FECD44E1FF6B1230C87E31FEBBDD4A91346A1900D57FA45B5F43DCC3CB124EB1D785FFBAD5FE91DE83EEFF937D9994BDC159417B011B201B6F171E8452B1C8321BD19177BD88DAD9808BF213FDB4733C8213DD55AF9CF85888D856A2B3D6281CD6831D2A0E8BE47DAEDBA1890757DF403DCC6CFE503CFE58017F00F8B3AAEFE1AAF26286E3DC7DF4F1055F897754013C64820381093C27211551C2C8A66388E3F2564651D943AC9C8EFDED31AB26C3B8D2AA2A0C47515680901815A5037F66A991E8F522AF2D229B29A0CC2E338CAF2C9115E8B78E83C0F70FEFF4A248F3D98584E3A5EC89053C1F59C6B5C5F4FA424F04B4AC2059DE3190F6D8A5F5DA1AB1607BAEF6BE0D74FB21349D9490AD3EE4EA3BC2FFFD315F3E87619731E1A57C714FEAA4D1E0E0B22E4856B57AF054650ED77FF9082EA2C7B9A830F3E204742821FA182ED460A567849808E23052BCC01A8F7BA086713B5327FA3A27B79367A336048A8C7C6EFDB41CB98817CB121662F7D3C58F753D31C364E3FAE1EDEA230A8D87AF6D23F7F8E88675EBC87E277315BD330E6576A036F241D9B60C5C899811D2EC31E107A9E2A9FE7C3A5C048C2CFAAEBD46E6FC0BEC8828C0DAD5AC35E06D9A1FD83ED2EBF9B302EC2B50B28AA55BF1C6F6BA2B8D1DCCFF575A00D595B559CE32DEE5E2F6F3594A2C00C82F9D976D87BB37B0A325B7A2B2B6BEA7D5B1216A9EE1AB40B7870D8D2C9FB506EC2A3B217D2CB4E91CAC7DF5B727FFE7FF24A12FDB40707A7CB528C190C349D9566B81363DA58B2D0BCE77B9E36389F0196F24DA4EA1F49C8A86003E229E493F3ECDF86F2966AB9AFC150B6194C53F4628C0537EF8A97AEF2CA57ADE8DF8835ABA9449D1FC1EB7DE5004D869A1A85F25B910FB3B38D1AD07D60D638B5E23DAE894BE98E857A0EA63CB0294CAAC3A6BCB3D63EAF4C3050335C336E454AC4E56F006EA318FB72A87E5CEBF18C5D6089C2AFD59342FFA7AC7F0A979DA8824EA4731288E56813E20493C1D03D808D20B27832B424CE1ADD4A36D3664DD740943EBBFB4183E019B72E9EC328081C8D3646FA0DA953F325DAE06A7F7AF8EDFB9276A90D96A264C3AEBD8A007579D51A408AB2542CB945B67B62FB0C8CAE26FB5DB7D86FEDC99A12C751EEF59DEE993D66B537A264E7943541EC4F25D8E197AAF4250F1CF88037EFE43E6345C1FA5A2FA2C4523EF043D0974FB61BD7A35E6198221F5C2F55C2B315C67DA66DAE28E0C90B65AFAF12FD2BA12D7A401E140E0313CEF9FEB3304065811EB50599D464BF9173B9762C7E5B512CA8D89635452A45977484FB04DC79E02D2D2A97D91DE5F7B3BF9DE539E178C3C2E0CA7D571B50E0C26423078DBAEFF88B329E1B0B676481CB40F40C19A92430AB484FF1B2BBFA5725E87978287FE00C19FB19596C11EB0FF47B5A2F25EB32B6A2B700611BF5B708844791110C6055557E9D53D9A59A5F74D4CD5B7D8E33D1E05C5B756273BAFAA00F47A81B9091CF77114D6EF38E7CF5CB003F4EBDC26678BA8F1EE2E3DFADE1BBAD96AE5207F5F2A0816951A3EA1A83F2259A80FB1DDFAB7467A193FDB3212E05D103614EFBEEF2D8CB7252F7E5289D2682F910EC46F59910BACC2BFA79AFD43EB1DD7A8D72C54F1952329623E93B57E82FC407099B1BCD0B2552FB1386CF70F21DBB5C24AEF91A05B5F7287AB15BA407B64A0E716096789BDC877DC64A355812EB91856C369DDFE5C9C5D60AA190ABFA7B53C7BA7C7D03044D25860A6DFBA537631BDB53CCCD0482EC52CBD7788E8CB9EF59BFF2F291325ECFBD302CC349E613433F3E6802362240FE7390EB617489D75143F790F76BD546CAC00B506628A7C87B604D6B971D47DD696FD212761B5114A15822942EC986B24940369329E2043EF86BCDF5AE90C1300ADC041855973CEDA790AF1085DFE7F0E2E33567A8E8CAEF5781462CC21916B479586A3A09538DD057C73534CCA6604C08E0E91670F36AE295E0AED612113F1BBD56886E682D908C87CA73F687E6880C01A76BA53B9571421B43A9E87B82414F1834BF529CDF3D90413B5EF2B6DF4CA2B55C0FFB46A713430E546B7063E40B1EB4F8ED40EA5896DF532C9958321234AD66CDEBFE5C3D5BE825A4FC55D73F46EF8011035B09016612B82A31111F407C6EBBE56F465E01F71E4CC7990D0475C9AA5E23B65CC49482CE9B74FB00E968E67AE62D5B91AD8C40E058541ED16B1FCC95E2C09FB16CCDE378AE147447CEA8EF55C2B679B31DDB3F2ABF6D378C0A70310CA7C665E40C8AA53C679DD0D5F1017761E215B874F82A433F5EDAF49D82F1DE11C784AD8171E2B3C984E2FC23DCA607CCD2E55B832C3954411234FB632A42E562229621459670DB571DF1BAAA8F4402593841041CC5856E53C62034E90B75F54E24D7EEC02F989C45BB44A0A0E6B557F7F141204516AE1575E384C7C69BBCCB83B4E55EFC835879379502EC5730741733D3D1211A6FECCA4919AAA5956065396B134B9772664D229AB87F41012AFFE04A7D249F2E82BF4226E5CDE3DBD906F8B3754C0DAC377F1E7600D4E14C6712C7B9CA8D8B867405319C9EFBA85388F6727C515D6695E9604420F209CA0D16482014AC9163C4777E9A9C08122E191DB1ADF9641BEDFFC872A851CB9A43499F928B0ABCEBDE7B56CE3FC4BB03031B3A0DCE7EA35579FD04020E5891FDD80456DD5E0E9C62EFFCB263BC48C4DC24AFF13FA9E25A5CE86815B25D5AE608561B513901706262A2213F2DA517FD9EB68E2A21928433F29167DFEC4DA2859AC315B27D69EFBAB1B98C84ECBDCC0CB0524F1D93434D2D71D7F61266CB00FBB7BA8EE6C3DAE4A209A27E531A0BCF4968E1279A9A31D49B4C1D6521E6A857B46C8122E4994854A0F90196541F3C9D49AE591A8A946412118B1EFC275009E80CF6EFB1DD5F4DA7209909C3299819B2614609C5D225B04381A88904A6303C6E20E64E7CBA1F880CC0C4CFDBE29FAC6BFC5E7F1373489DB93718F0B049DFB563DC1FB4B07C10063BA6EE4A777ECFA48D454218737E17BC9A6CE16FA2FC89AC583D2693248C55880D04738E8D2B1DF68D12E8F386F9C452227DAEB186FA7C53D56C3815D75B31751DDC84876F3F3484357F875E493B516FDD1DEDF9C7BBC6614E1EA1BC19A55814DCCD8DABB02109D74AA38D47828AB732A05C7FAB7F2809438D5099CE1A6860EBFC1796CAF1AF50F011A6583DF1A2D5746824B94E4CC7056169127068386677D7D64252DD8CE9E5415F1B835B3751440FAFA42D804A9703D62A525DDC7E40730C43A04A48C4E29F15A33F24390242897C471A7905475479CD12CE4E3D2CA19EC99D9A339492462C4628749FA849012775895FAC136CCCA8B86D13EC4EABDEA22BD749C504187B18CE13AF9AC628FCCD1EFA2BDC32EB1FAF8BB393FFA30E487B06CDD1C052240DEF58C692CB51CC122DECB43115EFA6FE9D80CC378AB6EFC31CEBFF1722E8B4F96F40F6071401A8245CFFD7FFBF9470A65E54A73ECC7B88213C11DA78B9BD44F84E7AFDCB6A58895B64E8B3A2875F10ED6B4AD8F5C80FCFF49D402EEEBF3AFFD93D0CA91B1FBF58952CBF20E10E1C26560F8DC531C519420593A569C01305738EF0EEEB8FFBEFC8A71A0D960242373796BA21EA4C8F614AE93684E0D35339DA6459F896871747AE887B1366FE1D7B61767F226D0F714E7D2A12EF55EC942B9F73EFCFD7E4B5AB678C171991A907010E2A84B26B861160410A03A217D8F7B219481D4F016D61B8DA5A117D3E77B9243DC3EFEBD697CE1587447B45726A9B456FD483965A5C616678428AF400B3FF4AA2ECDA905208EC3D57752828384B85C4FF15F9AB9C495FFFBE3E5EA6779B8FD53A77D1F1AB2E813440F9426B1912D1DC300B9D0916225425A8FC28E80672EA308CB053DFD7273B3DFB364F023A7FC8C0E622A146B6EA5E984B38042A14F1E1C6DB3CFF1EAEF0B52420072DF5F05634B0978AC8FF6F0A919895C007375C76DE4D2171BEC26A654EABDB8FE0170EA2120E80CC46877DD7F147C8ADBF082F1EE4321AA7AD5C197E9A0F2220E33B2A8AC452744B448CD45567DACB71EFD88FC7C666960F9D1F5701FCCC4DF51F609CE420A3F5F7507AE87D4EBC60922C4015FCF7794BD77406F9714CF2D9FB93C67F0FD248DCA105BB5067DEBDB4DEB22E6702FB2BE68E92A1E1953615F31190A471C58B8F2EE15678C7B7CCDFED27C2C7701BD36EF46FFAF266A9149325B53993AC1F49E39144AC3E5D835A26935DFFE5F11497EB41898D707CF8BC03ADA10AB1CE143457C471F06A744F48930CFB8710C63A47649B7CE75FF4A46D4771C7E9F5974117AD0B1A7ABE2025F52A3688679BE169D3B5539F9B491E1ABA8DCA27CF52A3A396F73E546E1F27023825B10A0E2189B1B3541AE596C2EFBD6B57BDFDD4F696F64BEE8E6C22154F9990F895DB21B4E7BE0E5528CEE4E2468C2E57A4AE4A519519894680ACEF8CA3D14D257F94A65B561AE4D6758158FD9EFFA4225F08985960332476DC42186BEE480F19F7FF13845268E6164ED8C2D7F6D9633FC4023D3E10AB9D4BAC755DEE8EE58BBA2BE25240C6FABFB4AE0CD02C4250EDE9DBFF8279BE92ECA3D5A596ECBFC3F3DC5E69C49217C21FF904120CC97669DE6F8FE44E47F175838E500B834F1BA9AA2DCFF09E04BFC5D9E914538861A15E26AA050ABD6BCF133CE39A4DD05DDDB808FC07453FC21918DD9C518962BCC5A83FF1C5339E4D343804B750953730327090CEA45A03FAA5BA8B06145BCD093325AF0B7148CAA48FCA884ED3E60893AFDCDE760F60DD3A7CE78B7C1735260D6F2747F86828BD46BD0ADF762EE694159FFBF9BEC1577A24F6F59CDF7000A7632099CEA3873CE172A7E1328D69500D4BD38186B3D76B30FDCCC3AE6581C7F4CA6C2EF07903177257D5A25C2694091EB6995FC395F8DC8F9BC6642A1E987C4C7BF4EDB21AAB9F7811BB099EC7FF96F203E8413EA503F8701173938E8DF15A8D15EF96D6F5AFC826AC56BB9D300A0E52960BD945F9F15D3F2658EA1FEDDC2C7F4534B62D95A435B434A77F4ACB23311C3AAAF45A2D31E93C815F3B5E2174B85C29C8C33C8076883B2997E77EEBE4D7C1AC005A3A394187B2126E9DC44F04EDC072CFAFA20A8D04EBFD56B252DC6F13D4BFC17AD48620E09459F3F58802240C1A8F30B230D0F3E89E9A2F43A7B9E56AF4137F781B9E7C29DEAD6AD469A480A15D2D14692EA6E06E3CCFDB0DAB8D10CD6717AD0293B02503E5F081CC5F1E95DB632ED419A5AE5B1A1FA720DFF89ED8AF8599239C3F2BDB01B5A2950F3C9889CCF4D6D0DF3768C2EA50984BA469E38C6461372CFF5646143D4AF3DE16274B442B968416F7FCC66BFB33A3E499EF76F6C85EF8D14C05E7E57150FE3FFCACA59DCFFC67CC5EF961F8196A69D83D979AC28C6806D9BD2112672B146CE17540456AFE1226117FBEB753E53769B974869E076653845308B4F92BDD84E234D52BA568972FF555559141F42ED7C1DAFD3EA13C8302CD6519C1AA1E01342B0A2BC0C89E4DD0320D830AA710B395F41DBDE3898939A50AF20161F5999F8E561BD6B051ECBC02B457B81F4C21F323483E6AFA743BB48716F95E093E996E88A3C924D804C27F8E81DB4697B7F19A8E4792F10FF4ACFBE6F011880F2F091DB0679384EA1418FB051A54BE3D8685F742F301AEA400D7C2E5CF9D55F7E7F8229F7EE0E4B76D34FF6646118BA83ABA117199CF1B55E646C36E0CDBF410CC5751B76D5EA899C10E2B810DDD8D6C1E15277E8D5843DCA0660A7950CC0D0D6555E9B27E9ACA0FA60452D8838BFC348954BF3DBDD22D08386B680FF58B018A92F53A0D104C684E5D1064F2C0897C4B9E78B1E37497B0B895599A082284682A27968E17A98D420D03D3AD939C6589511B386B26AD2B27F8EE2FD71956DDAAB3ECD75B277010C1462457FC0E81B99A1B38DE60C73786234B2F4F03D6157557366216B2EBD74D8AD23C5E0EE84CE2215B6C7D82591F0AD52E417146613560630509A55D5CFF1B42A6E5C93D0821ABD276C14E352FE6061AA9E7F2A1A85F2CB7113C0D0A1837C69FCBD63B5F536BD645F7DFB54A68AB46E9B9BFB2701F9BFDD9B0C1CB468921FD6E826685AC2A048A2AB93D03F00A5A51B8207325A3DF78D050DD9FE79D48D16A9AB44EEFA8A9607B41EB3C48643914247F80AD57C27F353B6D97118B50649AE5652AA36747BFC4B90A1CA58BD19C96CB8CAC86FD08E0F05A453A1CBFA1D7EDF321C3549D39333D2B473436DA4E27B7D335E294BCB359B9094AAEF8A84478CD58C72D646801C8AEE17F24003B725B07B033FBEB34C715CF801D0F84D6CD3C4805157B99C8740E5978C058D86C00085CFE6B2864399586D52665E947773FB9223E24F5DEDB0233DD2EC7E6C8FDC3DC0D991FB653D945D17DCFE79C4E792A1980D2C3E009BC28E93BAF95D8431648CCC59D2C98415758DC09C6EB42477AE173E2B24B56BC24493FDF144F53710D814AB85D8360DF9BF93CC4F5E1CD9FE3FA8A349EE7EB0EE1873B300E48512DF24BA3E3F4694E28DD670F2C09FAF8443C5EA5CF6380ADE2256B6483A632882EDD0456F59F8C638EF5BCC8BE229E38EE8BF7918208FD18DA97477F52274A49E7AAA520C59DEFD36E76FB341DCB4AFFFACC916FE49BB79F4C9BB716FB463CF4402531FC9643840612E498293AAF6A8CEA8B3D4F3101E51246AA0FF5BBE2E0DDE7BCB82B719410E5ACE70DEAF115A379CC27A432390C9FE8786FFAB47CE285C737ED8C49BEE8B895CD686CB2DB386E43A3E0CED863D35D3D1A2AB7F846DC01CEA3C3DCE129E075BB9385B2D99CA4FD7E692B6B29AEDB618FA7BC3B902DF514576A211E73D96ABA08D77F4E3C3AE4DC9DE14C62FCEDDBB7DA8BB96DD5DAA499A157083B25BCEDF25F07820391B487F1553FCF1894EA752C6A9F3DE9F2FFEE442B0EA1179F692DBAD91CE9A182D992D259762BA87D2AC7583DE0711D5A81D58550D53BA2A3A9A626981A09D1FC893B2951811A11E2466D9A96CFA8CB3FAB7FC61AF61192B679449A46E91934467D57946D8EB32735B3353BFA4867199110C70C35974A36EDDF99D8076BC78A28279D868B36F642E1FB764773C92FE77ACC40440FB533255369340A1BA62384D195A99F42A366994415990AD611A36884DDEBF5D31CA230B1DFBA2229F4AB8685A7B9B01D7E3B9A145206E2CDFB92EDB789D1202ABE68EFE6B8C068FF7C97158637B6C938700405E1C871A668E277294F72DCFF94EC5774ED025088FE7C0AAE5AC11C178135FF02C402CAF9526E142A15B8D4C6DB94733674CB01732EA432D10D817E698C75D5BCA8B15E2DAABC22CA6B5582690A87C5ACC5F58C4CD86ED2003D03694F76215D8BBFD8D7B28E345475AFD28E0E2F9E0609C2D8F53DD94D8E14598DF03893889637C14C015C8FC873CC32702EA47D75B0CE0E6DDA2BB71ADACCFE3858C9B5C72E7A1D5AD4F5D979FDA70852D0BEB62A48F9A3FCF9FE06A5C8FDB05141AC3B57D9166B7CE40F1ED00CE70D882FD65FD4DE4BDE0FAC0E9284213D593DB54D39F4B96D8DBAA6DB63B4E3F4AB2C5C061BA00B2E9A557C1084A4292478A9CE3C143E59B9B591FB31FA74E05165CA1952EF9C44CBABE9CCF04DA3963BE984D325F5C91C6F6D22B60D44B3112D7C71335394E56F1FD7F11F18F3D26C35B776E9323B856E9CA21308032822CAD14C7397477593BC2BC3BFB421E6CA88E6AC9754A79AB5D2DFBF50F24C0D910B8EB80065E609FF54E906BC8D58F8B2E0B812D4DDE9EAC3F26C822F01EDED50E0A408640EA2D125D8266CE3C75C1AD36B86AD1CBB58BF2D68C343F8FAF6EED5F6BEA90DA6441625581F3472FCAF67E2A63841FE054B3D9D76CB7E36CC401F61A2E5F77F23797673958766010C370F37C40D977BD2B10F430312576D770042E7B6A0D69060C76697FD9D3E3E2CFDA23E91878501C1754294F0CA6AF7895ADC655A8F34366EFEB76A115B0661A6FF5F12C3203D3B30BB6A2448F67E8B0E374A615E546A80404BC5BC5EB5B8B483DB224E9F798396FF49B37A5B424B53FD12BD3DB86177340CFDFD9DC8AF08F90208F6D2441F58444A30A0C9CFA93D6F8676CD4B7DF4C67D1D41B08D6101DA70AF5C9B20FBB21F6F3127A051AABCC89ADA9F9131C051B2B408792032FDEC2CD3781C7D60D2C6C118FF02579462E636B8EBA30A73DBF4D305E22597AC3BBDA3C90FA2086CAEE193B1574C50C19A2925FFB32E363F41B077CE96E15143F0F3AF249AF67D8696F67A2BBB46B1957C6CB81E550BA88DEC4C7A387E0DB3361F8A8EB868D2CC8CC866286A1E349D18B5300E1B3CDB103A6C7A4A72A46D5AA2DD7834FAF3764AD74206FB1E8BA5A1CE79DC93EFD61E1195CC5EF22BC0F46AC81F02C909A4C77E90FDF3BB226D5CB7A291D4A67ABEBEAFFB74F53BB8A8C307F997F167D828A8F1B96553EAE1FDE36B1DAE74FFF00EA93B2F2E5A85606E23F7FFEF5FDFFECF3438A7EA95A86ECC5AF515CFC1FFF9D263DABD706549764F0E5A3A006E167C74D83AA721720C2C19328A35EC4A6AF2ADDB81D756A3E61C90421E3413EEB476837F2317CAF0E783B11BD648A7C3426CE4EE90792D5927E622A1212EBB27492D8EAAEED3D3DA3B67A2D3B2B8140E7DB5E62DF2B68089EEFE96CA525CFF1D07DC84ECEDFC0B44FFAD2C6DBFB3385B118E3BBD8396832BB9C5ECC0A1A25D229DDDFB6E840404050DDCE53400CBBC4EB4C848FB108ACE85EFDE7EB54F1559822A5BB815392DD73C25753D11C077D9C8FDDC86BFA8B31C1E313973D30B3291A2D45E75D227262CFDF8B01CE901DCF4A5D2F3D46866A71994FC5C1F8149CBC03E2C1AD5851AE156D3A717F2E7BA78F2E917061C7E0FD39889BA942B94E9FD1D696BCC44DAF67C26509B033ABE9BCF85A42B93637D1101F12EC90FEDC7BBEBA5DBBCD8A60DDE000F4D4D689439A36157F90FB9158F06B3B33D3AD73726FC4419A2C9CBA1B3679E95C56163716AF4047D4415877CFA13E106CAE1FA73FEB94D4BA60300EC153D05B57F6ECED31DF116680FF83824A4C93DB4B7C3DC03E1106C99085AEA05C77CE4CE6C7A09872AF9DDE286CB2D71AD490814C1E2E674FAE0C7BD79BD831616F29DC23F1A5A1FCA73A3BC716A0A729B6754F66906C50C17FCD38176E1BE245135F1F7D541853343D792FD2D8A36FC9FAF34014DF86E243E5E89BBCBB02E50725355089A3CCEAB086CEEACFE26FA03F22572A1171183F869826CB38A40F294151AFF605E880747BCAB05242E8BC7340BABDA15C88E0B724BC09B9A5763E45F54F8AEFB616A3FE3C0788AA8C6E8F4CDF9B4C2A7D415E99B2CEE8D089EC602CEE5E453F372F78FD070D85FF1A4EC529259DABE4EAB7C29206C0A237074DDF47363381D81CF3FD74590D5D20DEDB7252A1E435D933956F52B26824B105A2E516100BCC8061B079496D2E8BD52E4C23D9CE606894AA6C7E425166DE25FBD64AF29D91BCB64BC79C46237F3EC78391783D2D50EE6657FC6F870B38E48727CF2E62853828FEFAB62788BB07C5E4E33A8C586D92B25154FFA793916490E72061DE100CECBCCDBCED2C40F2DD111317E0E605B9BF494AB7A01D235619F99DAF85EC237308FCDB5838D19EA16E4A9B1A94BDC77DC6235D6178890C419BECC464922D790C91C2A3C8FFBED1369543C5D6160D18D23E8FBBEEC3FE9A937B4AB512E5113797FB5053C29F93DCD672741E49485301318AEC45C2A3BF01A267EF8C47C36C0C649992229B9B0E42C8F9652C8BF750BDE77A736FCD0569DC79A0708404C5228D9303422261DE5C348540A8C349E1DC5FEEF3F8D9C2B93A788364B02E4A325738A7166B48CF32BF7C602C65DEB4DDBEB740F9BD1F6553C9FDDB914D8F6188284797CF5BED98A52D403BF41453DD926303139C11B91F2130079A3CF30F51FBD1451D821922E51F6B630F8F098F43170AC0E29A313A671C32E325EB48D91215D452AB91B3D98B1E7E3030C4C048FE53B46BF54AD8434E89FED7E8CC977F87F838B8E622EBE27402B929BD02EFDCFEB9D1AA38F3E3E716E02AE5EAF06C82BFDEAD149F0D6F1F749A25837CAD5A2125A0EE4020408F440FEF86088268DB03D9A635A872F7EA211010A3A150C0CC0BA37D51D9FF2B764AF7F14700F532521C288C35342C045C3406541744980552A3880FB645D60B03A69E921D5B30347E2F9F389FE34A1ACB517F79DEE37FFCF32751FDEC29C4F09C032E576F99D99C770FB8D40FDFFCDF46AAFEA084EF7BFA9345EACF6EDD3E899D2889AF973C7D783ABCA605640BBF1733BABE7C834202D41884719EC24B689EE8C077EC72E78D570D306B4A5C8FFAEEB218069F447638C1B8FF2237A02BE58862BB62FEF7AD34AB7773F0128A842034BCA0793732E3857BA99E2463D5674A6351D6FC78FF4AFBA980B68C3B68180C6AC0992EE4E4D310E4131315B796DB5B2626AD757A78E0D1D1FE7DDF570AE8295A2BC6D613C5C3F09B17A9D6CDFABC259D580EEA3D910DC49A86FB8E03465ADB50788C5F916E327C3DC127A6713BA660893D2790BEA622B5DF4439EAF46A48C3DCCFF68F012291AAB4A6325DED2B27075795B04542A11A9421C60647424B49DE9FEA0225F4B0A70564DF0CD165BD28D9BB2F637364279015307B79A5132E215FA3C21EC2FAE1EC27B4A93C6AABB4C96C2765A76DC74B545FC778C5B3327282BA77DFF8BB5CA2DC72DF745E05258FEA5AC72EC7113D92540AB28F66A0FBFC69494252745CBCF5BD94BA935D6E831C21055A9857A6059E043ACC2C26EF9DA77644A1D5A811C7CDB45B7BDB446E7D88D534C4F2341F3A77C7A432DB73250EE7CFCAD518110FF4ACB1EDCEAFE04FB3463A1537A711B10077CC6053B095DAF88683C3D02B82E597B6A231C525ECD19A293F39570D6F2C7808D9E927B22B288184D1D9CE6B1982B0C71311107E6C932F1ACCC32A98D2EF900134A5123692FB91B5F2599B1F8F98A6BF6C634CDCAE3C38B9320E469243C3748AFA82A7ED561A3BFC236C56E7E9BD532D04F1428ADED80E5D40135DF7DDA128DB8FAAF7661831B0D62A24307811A20408F1001C41EAB5FEEF7E09E0E09AA47917FCB159D566175593E38CF9924C702C9679AC076B36A7868C40842728FE0E41D093C43A987C4EF388825F02D3F1AB56A16FAE04571511932A1470529EA1D94A842A2F5BDA0CE79971F5B229DB967F299ABB0CD6BDA264BEFE1FFC1286260E6DADF35EE7D815AAC33ACF6905BA1B75E48AE8EDFEF40058E27F919B6ECD61ED990196E63C7EA5D911A496E67922B66F8844862172AAEDA87993B6BC9D205DD5188AD0FA120C5826959F3B66AE3A7392B33192796E3887F0F3C496D56AA3D9D8EDD584BC576101029C47EB75DF396D42771C7BF1B91D4829BD9604F7E1F20D2351FC2A75F58906BBBA41F41A325432DF63B2DDF049468591A4DE750355EEDC262E4FAD6EB1EFCD1B535E853AEC6D36D88BE8ACF8E462C7A6D28CA3615B713BD86FD9E7E11839382CEF3D5F0CF20E4344AF323CC000CBBF401E6F7B905D3D5D59519FB5163E32D51CBFE68C7CFA12567E01BB0E725F78A4020D84987E4C23A6AC249D3F1668CA43E0F3EB1DB8BDE6FA41E5E79E190D7E66BA910A0A5D1D7BE7BB5ED2735AC22498A128C5690BBFA553D7988DF7120353273D5CB9B4755551DD77251D0BB8D3DA5FFDA99B2FBA0561F948E61F5439035E4B179F455F82ED536CF908DE422FFE40F7AE44EB50F3BB14FA01B050BDB81AB307AEDD26E9C3BC64D92B3FF7EE6BF0744A47FFBF7AF51E768753E484A401F6953441B90E3BC8FB7FA00830BD49588614849CEFDA04C7C63763AF3F18F1FCF08C3D78CBA1DD10C946BC84ECA119CAFCC0ABC6FDD8927144A22A6F8FFB3DDC1E443513EAB20E4C96FC71E449AC0BB71EE2CC69D3D237012A5CB0FE560E8C8E655FAB040505E59FE51DF419BFFD51E1D9A682249E6D829D54230275E8B4BFF2B1441E1AA4F5E066C27855F506917AE013111E5B364F18560FE449A3FE0A6E1CD880F2F777F29FD2C63A853F172F4DC01FF045BAEFC46287CD33DFB1F557B4D36FC49B57A8200B1FFF07287CB36F74E8A56989F380A4F63F3B02533EB65EBC59F295D9F320173BFD7792A090465FA301C11936A5AE8FB3BAD1A57030ADF188B9A8E40C68FA8236BCF5610E8C8376FCB79CAD6E99EB7FEDF7AF9C791775FEE654A7383496CBE3967BBE331A58209271B49B7A4EE0AA8957FDAA67BC38405B23DD6D335F73742DE84151585BABE48A1CC9684477C0408A597BB821F04061D5E313715F74F8091DF5D053B989F62242CBD1A9EF9738D5AF1AE2915C80A821254DC1B4A42A9A3A48AFFB486845DD9F1A5587DA42BC62216B296B9E8BE76D9C55A6F885833D4B66A27750947D77BE3472F62DC912B420522160B14FED4A61D9C1C91341F07D17E7D025BF3E69E2A4E730DFBCA9803C1AB4A63AC883558988B4B5CF16465FF4612756789632B4101B08FB1193019360AFD844E32E4A531F8097C52AAEC0B0769DBD89C84E56520DB727BA2BB5C6A6228E4A737F061E6ECD489737687AA002431751E03C43489F35FD6E7B369C19B250A2F2C77544B0C7B0730CE22684C4741BD5021B96D60767F585427B9ECBFCD01DE5F5C8B88DD646F7B3F39F8533E2DC3D3B72C0671937F5660A181F3525C1D08020340A764AFFADF491B051BC36D0F3EF8539BE2B07F4B860AFB88F18E165955CF701757EC43C157EC6219E40FC1BC64D139DCDC8C03B41CD36EA8580626D149107D039B3F1E49946C736EB1CDB94DF0BD7A5A6F46135B7068ED8F400C3E23F98F95FA7461756324EC4CCF4A9307F9DF921EE46DC11A617A1405DA0BEE90A024DB5D89E3D2F4ACE786EE8FCE5A14C7DA995FDA1B7EC73B2ED1FB218CC528674D739983FA49FAA719C4BC8A0E71EFE43890EE37C625C5FA52B79395B1A95FAE3AB31D31D801BCCF96A64F971391DF40C3707D1CC03E068DDE786FCAFB175A06FEE441211407B0B0A6A43082C55817E8DCC1901A8896BE64E42FF5EA911532D4E67B9705632D5E841A6AD93C7A0596D5EEE1764A0AE41FEB35050C92116BF5FCC2A99BD3C8396EF59DE7628F21B05FEAA0B769CEAE8A07E067B007FF4F7AE6AAE89859BD3833FEAAF8FE0463CFFACAA65D8285E41D5275109CED1BAB240B30E9208592162B03DCA02AD42659F3B332D2B0A17C53ACC9B9F667C9AF91D73D0740E1BC19F7ABABCA6A0F794123ECBDB40BF820B0F1341839597D5F7DC870E126C1F4D476C9F6EB0DFC5A5C4EC4610EF22F990698AFB591C9AAAB058CE210F87CD56672CF01F79B88023436F8C0A1A7E2379B0DC068C97743607F5C3F23279D7FC91F09FD31399A75797CED572888FDECDF62B61AD3F0F21EA7E2FDEF0A3E4665CB193D5128AA5BB4B41860E9C2F4B48C1D868B97DD6224ABB276027BDD2C26F76B3FCC42CD9309336A01BAF40B028E287919F54B9252B5E13A31D0EA4F4841CF68560949D8E150B9A4C1E659B71649C23FE713993A58FE0291AF1BF3C2939C884DE4065325D03F6760923CE802FD2A65039DD1A7882A9FF24CBAAAE8305A7A62B55231C7CE6DF2A0BCE1F83C1E3F73175B0EE3C45E5A567E8DEAFD3CE827D4520EBB5AE285E3245D5A14B4A5D1AC3B5AA7D7584798D46FF0F0058812EE705911F44D7C4C6BDB36518492E6A26B59474CB8B5569C3BE6BCD683F1F2D78D5309DB3F7DDDB9C6B0022759F89EAA058CF4936F1AEC8113F4FF1E6447E5B037AC6F4FE73628B201D786F46059D39E3A9DA86910B6748228E3330C1BEDD06518132F31F77ED4EED9B9194E28C08117DD9286F453D5C170723DC7DEEF685E27AC80CE0028261DD91798E9DBFC2E30E26FA16C463F4DDAE8C9F30A160B3D4A6FA7A9BDC616F2609E9BB00459D8E5DA6FDEB16DF63A2A9BC269FE25BB9FBD2AB4AD0E13731F4DBB483C7ADFCA87B386763F55DE9329E0E399834FA302803D8A89376F0A9246466E9D25C8C74D31A00F7A60CE92DF819C1843D70D507CB8F4FA14C75C59059EB1EF51F0A86F538A15AAAEA1F000DFBD1F7796D3298118F4E3FF5FC9BAC73AF45092B4C34719F42E2E423B4FCEF54840F57EEF76FD098DF198B274021F368E49FC395BA23E383518EC8327ED493B99DF8D69880D4EAB035003EBB9694189305AC530AA88E4EDD59462F9FAF81833A17233B2C90D83C7AA7ED9A712E8786C3EFD49CEC971B3DBF2383D4F869B13BDF1A4D96C0F0047C20717EB7D264368626688B4CD9347C38981E411A676DD4D1E410436055662766AC09DB0446F5150F55A4EF78CC1D6E1AB66C38600B2D3E2295DCA75A53D1B59BD3615A4FE672C44CCE1E87E1D7F80436FDF2D7B11B567D9EE5A83FA30E2405DF061C899732BA940BC4435A917F59E3BF8D1C0424CA10348DDE84467C3CCD5C0C85023FFE9BA6C3FDA15D2A3939FEA980E349BDC4D02341C1F671C9CFB5E32F113F57072853EC442826524EB9A058B6F13F2609986EB034F9103FDB7EB7CA81712916ACA0909FBA29939F85E6D446200C968786EBCD5F6610B65E877B83A5F5E66E3BBEC38D65DD9304DDB38476C35BEE2C6B8D8CDB295AAD468C058BA7904344AE625F05F2DB73A718547CA682F4ED30A451C147AC4382EE512C7ACB04460C987376DCEE1F2C432056E815C8CA874F20EA850984B85AC85CA154072D6025BA1EF705F0CB33DB42488873EE611227C88F28A3CBF8B6B348FF4E4D1731764DA1CE2B0F6E8C5DF28EE6AC42FBE6876A29D73C176526E0966A81D20382B3F9F5AD28C44C1526D30FA29C1EB0BE03524C5037848F8871E5E55413DB4C2280C0D251130A88A78236111A4C731C2C9A03EE931FE3430038600C1211801B52297205848F055A8F04939034C62E815B635B1B01003BF158640D70A20F36C700FEBB72AD29408D6461CE1A10C9113AC30FC09B0BC98806FE26091D7F80CCDCF8028E866C77DE7990807CAA4F1697FC013E0BBBCF9647C05A22D6331070909646AD68F061DDBA4A02F8A761B16900F01068FD21007C06C5DD7B81E455AD6480848CFC1A175101390A4C2171003CA37E8609004F64DC2F1B20122A9F13018CD8D74E63023149BF8D9AD81DFDA76DB1BC762D875996F480EC91048B2DC05C57FA0A0C2898CC9CDE04C8DB102B390E429F14C9A3806C4030440109A9B2595BBA042995C7A78400DC82330B10C0F29A9C910AD06FDFC3F701D40656454A00476D19F53A008E624F3B00981FCECF87019A6B2802D5822D0E699F258063016B923B7FA00F4A57395AD020B2DEDFCA07C810D274266888351B32B4192404F016AC00E81BA7B0310E5A9E7B86A70081A7B0FE1E8DE682E42312C0336E66B8046067C1811B80A5BDBE98D4013B1D43826924D6B26B377A0E0C932479B34F6F1739C5BF4FD120BF71687E160864B23E6F91E0788295670DB0DAB7303104E4DFAFA9390C684DE1A11C0F648E8B3BFF1110A4E79BDE39E0F9C6D95903C884D7D7F0013E0F56F1408280E6C527EC4858FFA4C16A33D83E02A74A0EC8415EFB9016A4A7E3330B098852F1BD2542E30845A5DA6682D73881EA36ACEC6FEF9F49E8CF8EDD5FF89DE25D7DDFBD913AD92340F1AF2DAD7E808C5DE3B480D4AE53105C05A9A92FCC69806A5BB13B0809E111D7E1DB01992EAF397201202FFE350FA0F0B9ACD70334F132611F406E6B7B6F3F70F5E14F7373B6EE875A240776FF5F647F7E22DB179316857B8CE119B5A8F2537CA17E22569F4D175470E6C60EDBC9994718DCB1E8C59E8E71A9C65620300CFEF65BC2DDDFF80A21724D15EC4C5583FAB00CD277785667DC2FCAA623B34732743DB5937A0A164A263FC2FE242631E7F9CCF2E5ADB47ED11B3EB348C9A85B902DFF03201089C264FC2936AD32944674E4D83FCC6CDB2ADE2DF9F67766F79348F6E69C76B4A5C5168C12A92AA64D617F712077F77D458AA3DD18918EB0701B36DAC8224BF6B6100A74254FA3B8D1FCCF2567B6E47E93897F9A403A0E6C6D84158AA7D1027D5DB09400C8847F6F8AD1CD82F2237205CED28FA96F1D0781FDD2BC2A16A3FF7ABDDDB174B93C4874C8F2045D2B500352AC322B03C49FB7D8E304692B5DBE048682867D5DBB8E49A22A60EA0C163C27D31FC73CF881E9241ECA7A35369AB683F84A72E6006EF37A0C067A8AC8E78BE25010D32A1E4471DD2541C5B987746743F49F72D3C9F08BF81F5EB0A504B23CBD1039784A539B6EEFE5AAFCD06B2C4AF1ACCB0F6C94C8C0AD49BDF755C8EA0A87FC67CAEA81E2652FBCA9D6A07BD8891915E19A01DC460C1E3977A1A30BFE44DF22B0629BF955DB7C5A9E714B1C1CFB9A106A5F6041D433C55E43F46F62638B9D2DAD1BCBF14CEFD1D62420D3A7B72A1BDBED928F2BF3CD650AB542EE3AF260E597F1A42A6EFF93C6407778C2EC86C2CEF8CBFE82B47F474B86C021AE142C3C44A188C2E2F2422BF84FD17680F4B95676F44EC4E12AABA8F0043CDD9B33838017CFCC62907F878291282767D5E5A6C1FE5DAD705533369E00206C17F19F5ED7E0BF0E9E56812794CE97E15B12AA4C8D74553A27BC5D3B6D283E071C36885D71DD1908F41551E97AF27358E4C91AB5CB921524458C422AB4B9E84376248208CB8E8A619E8BF287E300E02AA87413A655C8C2689298BE0E0BE4A18322E724E639D4ACFA6E1B5A6D5EB61ACE2F7BFBD9CCE4EF75BBCF3A302DA597776E3C33A7CCAD72FCEA806CFC7F886900EF4DE9DC4A281AFB7465FA968CCBB846611521919851BEE4B605FEA020BC706799BD513F8527898FEB0E743859A13EB3B6C6008EDCF747657A05A0F2D383019584742FAA589AB78AF231C8D0D6EC260643A9C646A73AE3B51A8EAB2BF4D1087F5C96C144A3DD73BBB0CA64879F6A5D3D013020F799E521F2DCB2B0EDB0F2139E16259CFFBCBCDD6E805D1E610A8A44C97AA7370046F91DE2ADAB3223450501BB6EA771F4B8FF85306FB95A569570A921749BDF68EE8C8AC9BEAEAAB907993A5B0186428177EC1038B8AFE34FA920713043448F20473E711805BE176ECF19B715E7264ED401A8551CD99BA8A69C1D0544D47A01DE495FD808616A1A2EE1AAF76C4D706EE8DD5DBE5F94665877D2A4025263B823E8E1BB94AE1175C7090D57211F084315FAFFF1A657C9C33EC32B2E3435B24C9F295228DC7DBF02D872D412D2AB533F8BAE370CDE57A722C874F69A56C1B8ABA9ABC3E227BA5C59BB61377C1FC5A70493B321E8CF157BCDCCD21DF5F73290B13B92E0B1E9CDF63A32E8C966D586075AD08C32DDEE026174199AA0284ED59391D6EB698ED7FDC121A0DFCA2B59099C7F7822555E8B05F57665113C513FB4D31AEC26FDEFA83B81368A48488E85123C64E51D2CD6C1D09E9AC679068D2439FAFB5BEF4CD65DC084103EFB9C4A69165D0BDA1AD9BBD5DED12242BDED2508F6B140DFCC220DFF936621C4814A345E56D87B5C69AD1F1F736982F229C7A7EB720D083668EF2932CACD140EADB50FFBD30D6ACCD4213FA642786A63E6BF0434248FB85E3F026533BFEB708AA9D88C251DBF6E6B1218B17FC427C85C67CED3E6210282D55D1969BB91CDCCC6ED6F3BCC84A96920C6EE5FF555BD7D0051F1F7E597EE74C1F7EBC20F6EFA50A4A052E6FDE0E40DA327347E75709D488B6B3E40D6167BC2FF863D33B6E71285222EA6995CC935A1F2EE3DD3B1313F30BF6B012F180C89E4E94F30250D012B82FC60CE4C3CF1BDD41FAA6FEF29194899271DF9036921168DD985D75F2999C3D1E39FE7F4806613B664317C7EDA2AF12F90DB968CCC87BD13C78BE373F53FE7E60CE9C27CDE65F696943D29BDAC1124A2766F4F2A8A5C344DCE536FD645FC31E3CB0B359384BA1AA1FE502810AA48545AEDC6358310ACC8B2022794E11B021A38E9D874760C5D247A74159003F8374F1D06689C800745CB9092624E6C8FCB6282692FBDDF5BF01DFFB36BC043EF06F782022521605680F857F43680B5E6EFC6B43136EE26C043D0023AEF553184F81DDC1BC3F3524219D3A933FD991C71BE819BAE263275F3644ACCC0A71AB4C58EF4FFCBF4901B695C4C9BCB35CC7BE43F8564926A149CCF02A5B34ABAC19AB3E129046DCF6897C9B50C9F1EE1F187FAEFA4BAD3C4D11AE4EC6CC197EE7B9461C70F524ACFF97925C2AC5DC53FB89ECF794BBBB53DFFC8C94C3C046E87E86EAE9FD18A42F9682B96A97029B9B60A70DC018E6D1A5EB4685729FA22DB479616BF34ABB5C6E0792CD805B7FF99C4E4F4FC23C1CF0C84CBC2B5EF24F660D2AFD4A56A46B6C392CF0080A08ECE35FC8042E5D5B60E64C8B0CCE838B9C8B23EBDBBDB513E0BEF4E8005F1AD5972AA300BC511AA305D6FC8D3ABD40509CB4B24C1120BFA0F0EE208BE4EC51B44174E6D3BF9FEE232B643CBD3C3D10F06CBFDEB265E7911F85F9F4873435790D14D4EF2E4C97DA8F0B68C3DDB5E809BB51EDC008CF519A53076955566A9151609D4A2762A6E0CC08269BEE38F01E530968A9E8B267D7034CB653A8BD7195EFF53CE68A87D0E627A3F0820B9C29ED91827D7A27BF87A28D548AA35970F8307FB0E4B03A2871EE478C78053D9D333469902FB3879F6BA099769C0F7D63A8C5A1560DCABFDB8321230BC1E443853E7C08D410473DDD0F84B8C3E903E8470D164ACB6A80B42A42337C37EF6EE686B57589C986C4F0267FBD8869F80BDB5CCADC464FFEBA62708D976C356DC82D906D233404521B1FA03D4F9A005DFD1367B36967CCBEA843084D78E242494FBA33F3B0235F7CC3132C00C69DE288DBE2E5A43BFB6718CF41EFA27D4F62BB81C8339B4B1ADE7F27E926540A369DBE683C05C3C8594F41D7378FC516C587178629850B85D2BF785D279554780A22CFA25BA0C655CA8D7561194E81210D2EEC354B0BAECAB147D09DA5E38FDA475B17D489852ACABBC55B909D7E20B451D8D6E6B174DFBA9511F3A03021EEC1181363535774D8A80937140B80BF1EA287AE0B67BA08792644ECC802B60BAFA63AE2D0EE97C70E7A2C7F0DFAF9F3A6A5FC5D1D75C4D6C1F4751288A7F7517ED4B6B818BEE3FF3071A11187C880F1733B9200ADF9B1087D6E5B08179DE2325AFE6D1EEC21C48299B8E470B50963D74EC2929F051C5CC8E5BFFF035F635D28038B5AE7288AD1FB0B50AD225EA86E900B12BDA1C0E6695B4F165DF484604EACE930164106248A772D2B2B9600A80E4698583BCC9C7701850C4BF415052AE0792B59FBC9C7CF7B317011962B3F8F92E581B4CC2854AE3D9EE5611EA3E43C8E97A99648F0D2E48F7984DD886178A68C8232033B3E7BC014C7C6951399EBFE810814D40B268336F15EF897F25C3CD0D993C388465D5C1C4682E27D071163A23AEAAD2B09284169CE1573AECC82F7C2F8BD51B769A1300435B56556E0E8CBFF38C751C6713791D96C47FD0EA4B3AB037D854236FD095AB1B393F379B56BA609046E9A6482449B64386DC2CA18C0A28C95E224542C34E8A239C771F19558CF54B13B00718B5025E538F519C6F2537E3637B7A2BF1ADAC4BFA96DE901D840086220AEED7FCC157140221142221161221153221170AA1141991153991170551142551161551153551170DD1142DD1161DD1153DD1178333195E4926B77F8D8A63E2C10C0E52757B26E49B0507CB624D14FE458506A63A8DCCC5C0A6D11309BEDAA949B2C0467AC4A30223CD36FDEE7C0CE2A67BED05DADF3E72A10E84E578F6F288143A66A2B192A008780C04AABEE50155F58DA83592658884D2D5237399EC3AB6E68F4F06C1A8114D5EF36A71318818062248FCE213B421E4CEC1F959A1240C091E52643511613BED4491DF0DFF67A8BCB6FA135B46388F7ABDB749CFE8C3CA949A3CAC087A4DCDCEEB72665E413583E721067344D7A33C96BDD8DF342024799CCABF0906915C970E754811D55C4D09A9BD609EE309231FCACBFF797DDABF70A62E8FC915FCF48F7536070D4F74819B78A757BDE714EAE64446546EBA2DD793B651B3F264049C59219859E6D57E284F590D8C0C8A5D722F11E04E1B880D892D6A84B60CF1977722B820326684897B52D39C97B5D79E276D3554C67DC22970214764AA5ED61E1278C7D32B754B54C54B2D57B48FFDD6988749732CDE79169FA5A1809F9A3ABD7F61AE0A48554DDFB1311B28DE516A7E4F7F604A363FEFA18490C63A9CC814996E8D2ACA2D6D8E970AC68B76D247977181A68253AA372153DD1A91BFB119B9D89DD4979C81C3C5E394FC8F08DF08B5963C44B98D569C14775E6C26320DF59665E1EC03EB7D1F3F9911D53CD4BFD6908CA205573758B1F1EDE8CA12DA4AEE0E62E7D1EFB7E60CE14E83D90D709006B8021E2494C664AB65866C77256536B6F2A594A36E303DF2670F8F172737FF65A896270B4E91F0BFA12ACC65E032D7785343254085AA2301115F3795E77FD0B6D574023EE9B892B6BB09F9113D097010436B7DE2B3C1BF0B611CFAA8BC33ADDBE1D54504F9DB4A2FD783D67D131CBDEC0BCA7AEC291B167F5F1977B97A5F52BFA423523EF8A896AFAF5C4E829597817480E5D1CAC2F8D40C3FDF13535994338FAED83BA3208C1B1E10A321F4CD2C738D420F60E1DDAA394928D26902A210BB5B88B2B283E8404951157FF9183FC84CD3D9F3EB3433C9E811053BC31FFDCFABBD4CD7F963D72B1F3A302F5C93DBA98B0FC6712B0D0FFC5386CFEF55F86664B00F84F54913C384E083A1C0E25FBBD49ECD9555FB9CF0931F716EF2913A46E11C3FE617DB7A3D422EA00C8E0047C7E881CA0D1BC601B27F6B6E4C3F7C5E7AC0AE104A354231C53AC927C96E1481FA5FF1FC31A064EF2A20804E1C4306095530108821CE669E010CF893B8C7BDBC1AD4DF50A2FF0EF57521184303F72E4C770D641243EA0DAA050E01D25354859818FEDBB5C4D57B43B382E83C7E331B861FAC9C0CB208EB9F426EB56BEEDD2A00515BB37EC0C389B1BE0CF274FE63B070BC4805241C300C5FBB3E0C0DFF9BBB90187EA80E85DEEFA960465471738B2430FE4C431EBAF9248BF5509F52C919477EBDACDAED9336FB2C14B1DDA8AC1C9345FD3BB4DDC7FE5DBB080884C59737A494D796D59ABC465C92EDADF3A9083438EEFBCB7E0920B35EFECFD4FC5E2E644AAFA96DFE330EE652799FB323EBF899E7C8CF3CFC493E7E77ECA9D63559257EDAC69C559B21972620F795E847F7B8FD585D845A79A50C1FA3B4052CE42817869B1D552A5EDEE17ACDD9776399362AEB6363D6205CD159986056EEC73BFCA41861F1FD10AF1974568D25BA350C67AE05A8C3B8BC61F7406A1EB739BABA4A5C9ECD9808136D182C29413F5C72B1D4895573F89FCD926F93ABF8B056252CC4C9E6BF0EB6236AEAE9B0140B4B67B7CB3D84FF17826AC2452C94F21EAE78356C3F0913FE08D3984748EFE7C18EB80DC1F0E1FB80AEC3BFE49671E35FBBAC6306D363FFD98820BB1EA2BE02E0D8F08E7E21230EB1EC292D317D8E13F031357AFD092A3E713ADAD0CA0A466899D8ADE58B94C817A528C9343ED3C2F57C8E73EC3FED562F73A15CC37261D377D7AE81181FAFB610B6144E918B92FBC81E5E4E7751A2F01E1E36F2C249D410BFB236C84962A177BB8FEF3DE9A7A6DC000134EC14F8FA7E70091F7A2C6964E52DA740616CEF94B191D13D8C979120B476349D26C15888B38E86F831833ABBA15F9027A6C47C17A9C85D354CD63B5DFC08CCE204BE96D034977D96A45FECD595189C2093EB05FD21C7650B55994B5549DCF0B9D4190E53F515404B7C1F12F418C7527204D7C7895F7B6ADC80E1C9D16BEF3B4B803B23A57C9843411CBCDEE8673CAAE15FAB2082D3D994A9916EC8F293E69190D3F1FC213B426A996C97ED8F5D69CFCEC96D7C4EF6CA97452C7546882757E094457FE607C2C375A86B75BFC66029C9E232B5FC3FA579AE08445A585445EC4265260E965BA6D083C6EAA75DB24A84B5BF5F814D44038EBCADD9B4E4A54E77313235BE76DD7B6F635878DC1D1338E0D2D4C4E5DE568A45176821D92A91EA7810E8F4DCD82B5560F90065D31111EAEF1F3F333B0923B2BAFE156BF37F660DEC1EDDDEF7195046416B6AE782FD27543748BCADE5A4B1DBDDB1985FE24A88EE144B373F8FD6435B89E8517BABF50073C13FE9295DAAEA1F8DB6C9CEC7422A3A68D7CDF7FC77552A6FE1C1A664FE714BAF2C5C2BD34EB5F9891B2FA08D75D357F5CE566A4A27A9E625D37303E3FB332EBB3F5BB6414F66EF22C157488C2B66AA20D6BD0E09A20F88801CE351EA003A17B225292AFE45A65BF1EFA880E2DD2FBA11D723211FA1A394D648F47A5D7FF299EEECCF7889877998EA306196D16B0A4D4C7B2344379588187CEF64EDE2D7D566E90D75FF4683F7B4B1CEBBB58D94AAACC5142AF3A532F39786CBC0CFFDE0115A6D8AB71CD0A7F1652FDC857C3108F169E6F6041181910B89FC38FA41C0F40561A26C40933C9C0023A923A436988F58643E6A877654B76F9B02459ABF04567AB25DC2FE9020D82D08C381A93EAA384D6399759D3FB410F2C3A0CDB5EBB76E0C01BE90732126ECBEB98F3FB49B0DC7FE24BD9F6B40B3E4617A729BF499E7BDF64A8AB6292ACED696F5DCB87153B2B0143BE22FFF15FFFFAB76F9C814F9F2FF660DD51ECA6C9C1519109373AD7053071F3F7EB0A8AF6A495BF4AE2BD207BA526721597F27A24ED9795817819FB51A14757F03FEAB137BBDA944846B920CFE7E62F33E39E0A85440BD329E61837C7E173820DD6848263A468AD5D0660D4E19D839F144658B63D1E24554C800D36632625AF368B536BC514B9C1E739A60B535907BBA4A8CD207DC02298A56DE384A69F96BBC60F982D3525FC8F56138D5862A2C3E17DEB53ED789F74F0DAE97641FCEFB016077630A5812679E93C93972DC4BA56D2CEE69FE4E0C242EAC5B0D838CAD585C47A07304845F05C1661BC848C88D153B80E509A80B3F52DB7DFACBA963E8FC32043C8745933EA89C90B845458777216D44CD337AC2C7C9FDD399F05CFE5D4195D7B9058128C805F1C8F88F1B592EB94AEF0918793D53917FF86F33FFFF01FCA68CF1A4E37A9E468DA10D8615E4B726A1B995BA23B868CD422CCEBB8887D2FD3BC903033BCD4C16DEA0C950C8FD7ABF2D9F88A520FAFEBD2CE215AE43174655A43CCC396E46318C95DBC321A5D9D908D3E09B28EAA7E90B5C480299C4D996FAB97470B6FC07BD7EF3D24F3F6335FF3222CDB76E663EFA8ABBBC871D23C2F6D0B4D0E263E6C3F8E5E45906042C1317D610265B18C0A03C556F2546DB7AA3182C2D9561CE588B5FF8D56B6BE401B5CBA019432828D84C713AB11054C26F135611CCECCEB70FA936391C838892179DFAB8EE30C20D07DE9E444689A3F2437780236CF1227E8F9F96EBE2ACB879D21FE286871BF67BF57CD7C3F2CC95AC1149B2AE3490C505A3E0C435335746CB653A6694CF79D196E955D38BC211AB0E8857E5ECB129D537B320B8BE701AC553165F427338E0F28FE77FC679B039A446FEE19B6DFDFB6A6E494170E49EBD719DED7FDDC016D8843080D4139B2F02B3E71076A59A1A403EF397E0B08E71C60ED675AC9AD4965BCE35B0415A0733965648EB8CBBB519A1F108EA4CC23F507059C1F213E53C3358F9712B23468EC168E09B392CFCA9186D37D6EF7952167DB820D4F753823543D25465BC937E92B1C0A0C47A77F63D6808200FB4003DA9C2451614CB770431A1DCAEDB7F4F7B85E5FE06848823C028B1DD3E7653811938AED199B50E65ABCC50CFB91B0117B458233C7A6E0B0CFC71C18763C9083B78840CE76F1573C0AA61E63459B87FF4D4E0BD5CAC1B940C5B386A4B89FECDA13D1E17EC6FF95EFA2B9E20CF39854293BD3032C3FD976FFECF9BC427F8F6BF74AC6564DB1B8BB3C8BF72F07366230308510390AEBA957F8763EED0C96871DABD4C07247D5E86A592A71B395B2B08FCF1BFBE02585B5B82410FEF6A4AFE7450CF7C08D2850AF96E9445C3A30E00F815F9B28773BBEA870C8739E7DF70AEDCE55AF1BE4043E80AD949A59DD4D1A2C0B9ACCD715C85FCB71F8E52CEBF9D119B66C73C4745479DA7C080C86118FC36AB1ACD206BD0E21229749DFD24E58A97F70390EEA6206D7856F3B6BDB016DB764786B3E76A2C458927A379EF31B2FB9BB1D97BAB8B4F13C2E9A8960B157CA6C36AE980594E0A0A4F77ED936D6E05F702F2DFE8D949C2D7D4237029997D23C342C00C0DEC6A11E7B38A49859A15D7991ACF882B087752F30C70035C36A541E6EDD62243C7D0E10158819F5A8F48307F359D26BF986CDB832F143FBA616A77615F902D2E93720EA9991B63F52CF21C6CD34D811D782B6770260AA353E4A8CB31D2B903EEEFFC816DE644F4ADBB24F9817A5190C3E2171EE937B0C4DDB5AE02CF5ED8D88608B8C4FF4F1A72C96A6C8AAC48E1C7541D1DB6E05BF035176FB3A9B5A9DB364F719E717EAF0741CA3A899469A2FB79E00AE927FD22CAD68B6F67F395A986E7C25D51ABF2FB86E68B31ED14EAEEE1248D620F410F67C76BD4F451883463456B91CA3DDC3DDB8EB6FD113451A3F68A4F00F6F76C6918C83AC21158DF40E14AF6307FF6559BB429F96A6054705FF45CA763A00306F70BD06295AC787C149803F644BDA05EEFFD4CD67E267354FE5A92ADF22D7E4BB5E1DC244D62FA112F0219914F7ED0784D2D40AC14E217CA452F4FE82C7B8200B29FC42006D466D10E09365BDA1627FB0CC6D16575751F7B559E554C6AACBCBEDB0E104FC8F2903E3548F34270BF5D99623A3844E823C134887BF84733E3FF80B42EBE99E19CDCD6AAB2A10BAA560130913F1491971D99595FDD9A058B7F6513F88002D798AE05F4B0C87F93399D1832537B822A1D7075C8E293CAA0F33B835440EB1D2CEA72A7FDFED2B3F9AC9C38BFCF476BCEB413BEE3A61DC9865938487FBACB0314169B0E744FF2A4E27F42A8A9652F75BD10A0786B9B0D1DFBCC56B5E2A91DA458FAF2246B1E8EC046647B34CBCB16CE2200787E13060FECF73A210B51FD1CCBB8C5E17DF4FF863898543427D2FDD3A88C3BBC1B8CE1F774B025E4F6921DB9D407C8BE31E62F852D41AD6CFD9955F10E386A3FB4AC3C7628D17075E3EB3B19913B9A1800778F1B9BC89AB8F32D18DF18F1D1EC7D568AFE88EA841D7AB7FA781C93A48D524BA02936700FCA0245A99A92477C311DF64AAEB028EE78945E3C2FDB395EF4E2CE49039A5D0CE3CE986F6DBA5FE5E5BA75D3F82C4E1E15A67CFD1E0035CFFAA512F223E13F202C254DFB4DA3503040B775B447343F99D9821605FFB038F7228F4A6CE822420B64FCF2700A8130E56CBDFEFFE90D8CB436BAF1BFBED8226CFA4D775D8ED7490E733B7D4DD14525ED5A9CE1B6574E026B848C28A75E7D9937BCEE8DF5157170C67201C56436E5A7D7A7147FB5254FDE7E0140D677FAE6D696AA48D58A474DA8909DE74396F6D228B84F2BFE697B5490E81DA31BDE63DF8EFD0E83983E9F633BC0A2E50AFBED749615D6A26DDD571E4F8ACC57631841062AC51F12C4FAD52DC7FD215510908F300EC47ECF27CC29148B2F40B9EFBE0A71DB1A79DEF44642F124EC3A38BCEE18FA07C3523036BB256795D44813220087AAA217CD7F1A966BC0E089AA1D00AD5CB5FE3490B9E7BF4430B279F0B07EE8CFC88961B4214798A54A6843180A9CB0EC9A98CF2F3A73CEE3439930D9246CCAE5AB3BD10D62E56495B7DB35C67603D4EDF1984D0259476EEE148360D58A0B71AD2DAD7F8DA0801806433EC9037191653C14A27BB319F623DFC00706CC7F66A4573A0A6D2E74F3249F06185118A52970B6D9F5432CDA62E024E1DFC4E97619FACF3915C94B069F93E51785FF39102BF78E6D5EB67F5A174AECC5D36A8FCA65885209CDD94B8133C63BFB3C7B59BAE33EC6011A5FB50D5B22270E417A29F1C115C409082BFCA48F9170D4250AFDFA0BEFD04C6196876DB8828FF7A7CA09584531FE5F7FC015E23F8B3C68B7CE6483907CA7D82BEA30A64A5DCEE857B9FFAE1DB0C0BCEEEB0673B6C826D893D86BEBFB889F80052CBC90D5482EE520B9884C3DCDAB186EEFFC02D65D32A182C0A9E463E507D6E1E6C14007653B990962B5A1E0521A7C1285F58DB1B2BFF41D3C6B49FF837DCA7117CBD5348CD96CD5CE160FFF1F9B23E500D4BDEA9CF0E081E78A1AC3F21656B400622F1B87F7EA7F3C409D8F91A309870B9A11C068E66D1B86B834EB3D20E7AA870A6181FDCE1FF34B8E3398E3B4557B7FA4FB6449D94CA2E58B4547E3A7CC60AB3FE8DC2E28ABFA3BED9984FD7365FF39580C8CB47436B61ECE46DEE336155A25B21EE6456778282780F16CF211D0DDAC7FE1BA7BB5DC5398024DFBEE4194D18F035697655477D463705F9DBC127E6EA5BFCDAFCD0270586CB164662A65EFF4F95A8861A4251538002E0827F05971C01A9D37C9B37C17D4797CA2E76C83C54D5836C9A17FACC7229AF58C2D9A83F12281B37E9DA9E867FEC384B94D2B0B67DA24823F594DA281151F08D3A55671180348C4ECC2F64C34D119F7F066FD3B3E1DBBA207A5DEB03C40EA1187F4C8879521E597794A4858B2A4C550A3E778D6DC40F5E13C6F9654FF7137A40D0921CE1678E44CCEBE5B1F40FFD046007ECD1037DC93F96D175F818F47635311B3F4B3E604D5AB0C434273B450A95295FC623E927D0C8037BBA92BB2120A6B4DFA31A65871684675D435DD8E30B374461DC1597EF1A83CEF1EDB9D2BD416381D90DC32457589942AAAB1F94245533E438858F76506F09F69CB21B8EF692BDB1B14574B59EA671DCF880418520A382CBA9C3400EE73B51999D261E340700D9743EED395C9118445145352645427ECF31F69344F07BBB8AF7124854899064D93C8A6BA4D99EF06EC2BCDAF12CEC111606292473DFB47BE2551FD15C62135788D2AF2560D37C5F6811F5066DCAB9CD567B06674886B434B43B31986CD578148E64D3A44533488D9F4B1EB10D4EFC811D20023DCE76B8FC3D74FEC5B476E6F72D84474695BBFD19DFD57C1B9C89854FF6FEB66D3D4A238429A1640FEE7FE89C72EEA0A4CCA1BF55F916EDB3D22C7A454AAA624C503A1DAFC4D84F70D6D11BB11D7AF7B302D359F3D9BE5A2CFF00E34522FAEF6536F3ECB454F537E3BF2B9EBCEB1FAA6036EA338E705DF8CE239F7FB7EF79E938294BE4CA7709FF6EF35DF9753F2DDBA72AFB4CD4506578450C0D6EFC74AD105BA305D2082CAE3A6FCECE0E01818DF288EF46F3B34EFE31B234D001165C91B3D214B296E095B28B7448DA9A8A540BB5B8DD724F7CB42EA4762D11F0F30408C7B2DD34EC1F6A0321C69EC23889E45B9C4FE5A148CD371F3D8EC5D9C1125CD97F73120F930123E3C4A3C2B4E055F826C1454EEAE06E3CB8AB778EEEA448A9694F03F5888426961AA790C0D059B58954F7D14CEB7D935DF3B8D82D199620BA8017BE0F667E565892691BA8C540BBB8FF93F9B40C2ED42D987DBB5DD5681D1396A5446F1A4E42FCF4AB8EF383CCAFCC3F7075C9691152D9D0A38DC9E8C101DEF641A0710F574B6B66D63B65F0756EED6ECE030F10802313874D82E871FEA3619FDEB4CBD450123490B4A3B757ABAA7296395732EF5F1BA6AFB922DA0BA8066181012BF23F7D6613A8D3BC6F1B51E6B001D2FFB6A698AB23160462CAA0B596CD1285AC4D7D8DF7BD513C6068DC2CDB397D36534C737F660C1C44BD4835823D2A4CBD13082CD88F2EC0F7FD00567BA5B6F6ED659FC7EA9C536E24D76538817051410F447E896FAA8618A19EF1F9AD4CE3BABCAE1C95598C97ECE9C390AC451287583877FCCECC019F396ECF2CF14DC9B28EAFC9CEA9CBBF4D87275A9C1CBEC293FFF3F403C448D899BA85B1DA221CE0D300A515DF037EE8D31FBBF544D2042176F936AB8A6F46F0F55915C3D2EEDF76B56A84405410B4B968F9041523744AA81AE21E135B51C4A4AB312EE66E5F81D9507776950A8EB7AE90C45AF8A2202ECCF15318DED83F193C7EFC6D1EF09547E9CB568CC21B37B9FACBF68271E31D09B9BE59820E730DDDB4807FE2A9B7E8FA33CF08D9739813B58550024EBA367A79E80E0F22D3396BD91201A45C2F8078F88A7249E69BA5E703EBB308790EFB312CF14FEA74D1C3165E195E72A204087616BA57A743EC4507FBBCAAC0AAE512BA92B8F709C79DBAD83633698B5AC1BFC3D823A027A874347B0CEB07FDCCCB946689183C28210482DE50CEA906D7C8096D6AF15EE86E7C8FC863A7BCA145DC93E771BA02F8E3D2CDEB8DAC5A5E87A0C83296437399560CBA2550A94AA6700A709C77D95856340EEA8BAAA4BB1DA11105D4A8E6334A0A3B7EE57FB6D90E938F4B7DB00C701BB5A004B4E767743462D64EA69C596164547AD2FC160DE4C7DEA58CE48B96D153E01C1483706BE2AF0462374F4735D8FC7DD6EC07EE8FCF18CB1A3FE8D42B1769DE8C9DBC9FFCAFEA370C1164BCEF428808A7AD5773FBCD5FA1886C85C1B561A9F48B47D7588F9C2DB601AD9B8A12883A1CAB9015EE72B292DD7B79C92567B8F69BE759B26F550AF711D824DD5C183C87A546875AF3341600EA0F38331232650F9C5296DFE19CC36E1D54B43027EB048FD2FD3CA1F80A5701E675A6AE9E881F3FA4E6F5224F98AD9464AFA4ED4E3F356AF71EE3BDC915E371F69547C1DB0542B3CC4E037F71EC5983AC75756E010AC08652052234380CE5DAF96B707D8D685CF1EBBC6602C7106DEAFA8081C9706915B26DA89B25618F760225D924A6252C7AE5193303BD377342EAF8CB790D8D0A69B537952733FC2D1A6683CF7BBE7DB6398911E7F19DADB1C18BB2BB683250AE716BDA56931FD9681C43DABA29D0BA8C7F4B1C4C477328CD2FB9E597F658DC2B68AEAB5033BA5D653975201AF18C7942EC2956FEF968C2BF54F352E9C26D027C3D8B1EA94A937FB7C0068FD2437B7BBFF2989E3322B765BB90E62BFF9986CDE43D141D76AD0D5C8AE5662CEA5784E188CDC306FC14E2B7BF8D64D1EA07021681C272CDE0DD425825FB3031E7EB20EBE36CC7DCFA7A4BF947832281A452F2D704C92F3D4D0B11A70AF09DA6687E9F93243B0E31C2ABB9E9FFEA81540F7B5A13B2954364ECE57AFDF56691B03C838D8918D16840506E5197A7058806FD6367DF6D2FA8B031D667FCF29CA491D33D1714258CC13F4B4B203B8FDD2E3D3C967B45F92F93AD18EF7585863A9C66478673BB8BAE6C622930592ED2181402419C54721462A5535E34AB297D253C9D8216A62A6623090C5AC5F122EC893CEC739F75761362ABB6B179B5EC35DF5983D867BFFB5580C5114D66E931CE10D7ABD006B466A02AC25764E3764A4B7EB8179240A116B0A9F5F798952BDCE111ED5858B7E7C2365D64DD60D3482FBC8734A8C601F2FE2CD2F45878AE014284981BFBC9209756CA35AE8E22B63F74F05F4AE06245064260A31E47C610FD0121BE69986E9121A84396DCA106FE3E1F29E3347CD471A963F8398090D26EC2DD5F65F2F744353B8DEE87CCD79E26748DA2FF469ADE2A15E05205C727BE3930283ACB0DCB927F445B5E62BA43BA0FDBEAF0CA00BD123FAF22710C27F1A93EE8CD1A9866081FBBAAA1294149C916F02FC56411CB09CCFB7E37FAA0CBAE7E5EB1B0AED8A50E4A74D883491AA369552EE66DDA684194DAF888502425104C987FBE4E62B7E7FAC19FFEF37FA679CD4F02B1C4EBAD8AD12706C260ED42A991C526703BC070C6DF3D237EEC2EDB246A71C73273EF38E062C7923298A2714C612B45E3D4A79041C26632D506754A3C1475028F134FED2C20DE7E9555AB5682C5430207B36724164D4D7F5C16A4EE636DED2CA8A52BA7EDA1C3C76DAF61A1C7EBE9ECA32663C16F2FE62BA96F2925C62D2967C8A7EDCDE4A664EA78E4DC00AB882B53B7173E0A861A3D2A8490EF6E33F41E466351E4A9F32FF2E56D494026C2E0BF33769E9C6070176C5907E185B2479D78D98EBDAAB678B8D8224D3FD9B6E44EF993817E28E169A1EF805BBC93CE5D06E44D824ADA86C7F3F05BD6E61F1B9788CC94B1232E36753AE068D10D54DA48C32F4677D0844482028304C56380CC9D890489CAED4AADE225242E3B43005CD67E71815B34630490D9FEC57D409E273B1D47FEDE4ED67ED6120BC8229A58489A91EAE5156C36C7604BA05CC3EE833F2CC03925FF6C89B8F3B4C31C12F1B92E578F54A4C69385B451A52155383EACD4EC4E493F703C1BF1D4EC5E78CB21DBB098DA2C843E10EBED506C9E63B6CFDB75B2063EEDF89B3B2063FD1AFD470F104150B2246B846463EB93DE4F4D2B91258EB5F4AE55CF8D9C9C953802F75B843FC7E5DC3C7AB48E66B1A7BEF768B3B4A8FF0C84AA23C634CF4A9BFF9734CE0BC09B15B9FBD7A682D572C2B4F47119988B7238A454C6E3FD7AD581432E9D1B35C44DEDD2A79F737758FF663935339A92F35EE752DD82423F844A60AE4DA01D9178E7BA6990BA37A9C782A119584D11E702724DC5439C5B5198C2148FBA4AA6A86E29DB2A6C3121A2E60A2F5D2F18ECE2EF4E11675A669EEE555666DDFD4253C2D83CE3694F20949812CFA4C690F376A5164E438FC48BF79A4B292A7C039E9468440419A71905ABB3EA705CE1E5E675AC40D4006220F465A8015EF3C6E5E7778BC39914C92E5EF5B47A743480BB79FE223D67976EDE25D8F125D227639E3FB81D366477817F5C12FF43AD88F075826301C96FD3CF0E0D63C23F7E8DA0FECDFD6CA6E27093B3F4FE743983BB472E40A650ED9EB81C9A7128B4AF2DB9FF197A1EC0EE397B28BF4F9E859BC35F74885D46915B97A9A6F5F58BA4FCBBBFD2775B8D780D2176CE5EF0E8D31EAC638C431A1CCE8DF7954CAF1AAF0C38DF905C48D2FF0CFBA0E682E40A250E9B42634B15EC481441930C22018050997110E7901C587B1F224EB8A8A075F372B1ECD2DA978A19487E215CA2D11D7B08450BC91EE5544B5DC91007ABD6E3F1E1EE3DC9D20A86ED354A37859131F27D4FCDB03A1CED4D5051A6EDCAD63638A9F3559DE3890E115C5465ED6FE55129D68BA0F3FC2B5FB6A249B98F5EA98F3687D3A4C75254DB1C38EF446C0E6CFF091EB5277FCCFE5AC0F09011FC2B99D561765881F5C80E1A9B5645AD1327BA18C59EA79EA2296B872894B8231FC9C7C48ACF42A725A2FC6F6DC821B430BFEBA7F948B1123D63D717AA92B349BDE91EEE470AB2C1A9D566B6F9093D0AAD92AC7BB5A37B844152AB74CCF58FC6B933CE19E23385F197376F0D48F9D398583B3C3CDE7000AF2799E863C42ED32DAB762608A7BD3C9A743FC2753D1D290513B9C4C1EBAA62D25821AE6D2204899A416A7644F5A5E1077A8FBE89380A5D70C21D510A3156CBB3E1953CB37B5CE518237CABB1D7F4FAA2EC92AC0F8B2E3189B0C4E8257B11A3B59A71D5F2CDC37C884EBDA7EEDA2B01B452C22AD4D4438CB9E7259B852553F1CF2228B0C7829AF7EB712113EFE5302D5DB33AA48348049C8FB171B7C225CA5DD7041ECD4AAC36192EAA0EBB0A24F07226EBA0E6EE605B05226384FAACDBB99A09CD2A08AB435A57AFD9D7C89F1504D7982C18E9A79F3AB1B011F0957B0707F537688C8ED59DF4148B7E7D7FD0C7A6D7D0C9C9B1B262B0590B0F3CFCAA4261F70C4272127676527A1A0EA0FBD206C7D844420128F4C040AC7CCF3636F418CC07111570A7E4BF207F747E084C6541FB4D0CD525E08BD5E1F6966A466C70BD81ABE858BB5A76A0964FD759239444A4FE0A7C8EE58062D68A016B90AAAE8212C3A310D106DF9033D3FFD93B9E9C5BFECFB02C321ADD18B675DB3F8393795A143E5D1D15877B703859B3881D9FF33B4CE7AB291723CF1FFEFCA6EAEB42E624B0D32CC35984045966EBD331283D7689C334477B0B686AE80E02EACF452E775E43223AAB9B98A3143F273F348C4D3B4C5D62DBA3E3A4E7A9B3AD779CD9A1C4E8BEBFCA72DF551C28F4F474F061477C8D4A952C69C7BDA4FCAA4935CBB38193549F265A8E7A08A4E1DFCA1E5FA358FD696E96A4AA9AAA14BAD1AEDA460F6D369F6CD7388300789E42AA7C4EDAB5E95E58DAD8F7C2B1BD344500AA0CD5BE0BE13F9E09476E6EB78F9C1B5D1B12CBD4228FFC6AA31F0C53E2CB20AFDA0AAB8290055A7FFED58B724A86FF4EB8D795510E136143D81007AB42AB9B5C5CA3459873EDA021B7F33F0F766D43E35D77F6A2AA552F9E735319BE80C707E2B126FB8700D3CF91CAE52C5D17E9546A3C110B275A1F3BF81960EDE98E606201D6F9D5DAEB3F2A1A1C817AEBC98D5555FA7D4ABC095E732B3BB292A4AB639B3A34750488C25B92943670E55A3ED6DAFFB7F00FE462A9C8F738433DD44BF9639A1042F5148E7750E9FB9F3EF8720448D2334DB4E18D6B493D20A84798AB514DA322D9384E761CCD9BAECEF83E2462BBF3A9EC1FEFF2A22B7B8B443884A51613972E0C33631A963F6292F846A9B4A625D5589FAF615756E5253F813773802A0D97EC5BF3914E76472A568E7CCA443401A27C9A08752C1280029CA43C0A8F8D415060AF5A58A27231146714CD382816AFB9DC938CE6E85CEC9D17C7580E657520ACBFBDF6DEBEBEB0F871E1298C63010C2D534659F669FFB4A1EFDD182330C28CF547A123D3F7CCDC17091472AF7387CB9EB7ADB5C584F7DEC903D657E585CF82F3DF5722414FCA838FBEBC912DB35235BE4D15CD2C7FA2C24D69070B91A1E390F624C363606B364BB97349F3112B5A64D713B2AFED79F77184248D809494139C1511894727A43F16388BC58A22F31FD8C12AB5C1180F360B89D635109635807A0DA8286BDD1B008ED30287DC1F006D7091042639C86B19BF85CE54E232B43E95411177A95535779FC9DE1F2EC7F3770541CCB1541104D0A4FD34617AE241BDA8D1CC9DB0D6B2622158211B3B6CB99F9F97A02965AC91822E54FE28E0244052E55FAB0CBE1F9B5E6078E097EEA715D1B2A868FCD65514A8DB0CB7CA3D7793D65DBCF2D5DEB199901850DF7FBE76DD82547347E9D0A0BAA27EA5B6DD368F548A3FFF86A22EC522BA8E5F756651B9B20CD1886992CC896FDC3A4A05D9EA7C31957F6C24A12A8E19FB39CD573EEB9B10FC32EA73B0C21B29AC74E0657EEF020FB322BEB52913328DAC59B20CE9F99EBFE309068B5CBD21DD7CCE7A047047651B1CC5B28CDA719AB8FB734CB1FA77376A2DA3DC32E8E8256E264738F159FB837CB6D5F9C4B9F4E05116197B686CA6453B5355850895519E89AD3C8FDA93F4261979902CF0A810E4DC391F193E41D2251447FC9190BEC52D1B06A4994B610D4FBB068E2617EE55D57435706BB781D076BB524F27ED95BFDFB58F487295E5E9318815D4660B4FB650E14F6BCAC62CAEA7425AC673D19F1609769E3CA36AAE18272DF97D7AE6D52B6F45E2BD37360979EF3943D005B3471C0AD897C58EED6ABDF980823ECD2A177951C7CCBB9E1DAA018864A8EFDF30B21510C76B9D05B515CFF738D7C43162EE1A377F1CBDFC6B00D8C36D8F529F095229E36A05C036CF2E8CDF16BEC9FF4EE2EA9620C338D2167BAAF3EA6216BADAA21F54C894429B0658593221993298951E145C6644A62540491F008105FEE4A45AA8A5EB0AEFB885CE2B7A7A64860C83BFF822526C7987F2F368C210A3B7248269C24BC2D35B2284748FF7678F68198696449DDF3D590917A49CB6783A5491844E9B8077CF3AC2F59B88557340C0B8F11A09781C620B4AEE701CA6C154307C7E71071F68FF3C3C650D91B40F338C8D093E1612A102FD84CFE7A4652B83B3A1BE4FA796EE34E795DB631AC4BFDDED424FEAFE20CC980BF6B0B2A5E2E15CD13D21FBEB98749A1990DDAB4EF64948D3AC1F0B94F4540E52B5252958317E57A06E8E07C4F3E608DFD76CCDF1F3DEBA7F2F74A2CB63E10BAFC8317A2EF6242D911DAD5BB7448F5C27D3551D0AB34EACE4E74E8E71E6121375CFEAD684FC7276AF8F3856DEFDCAB0BD6A4B0FD801E3B517D55CB66F5648045464222A7763870D3049DC08ACF82BE45B9BA2614AF310091E88CFB80DCBAA11B96581F7BB8E8DB1D2209D2B04F17D6DFC3B364A3049763349082ABCCE0E117803FEBB2BB509D3FFEF8B720B20E4F66AE001609628484E319201611054E42F1316AD6AF47B15F569F5425D68FBA681248CE88136F06519184A3F4EB00895EAF198B26028B706C116726E69113C3CA9B6FDBC387D2EA6DD2650746182B7C36FA87430B199AAB81804D158D8744A81344C39BF69DD2D6D71D41F4CC79B48BFC8BD4D0685B06B276106E85059E38184F86261DD598DA78714886F821F834A5A88E5DA7F4DA522C4A8B080F735DA0E838EF43C8C0709CF00B6FE440BA00606AFF132BBD96F37F12654F65D1AC1B01A9C61381A4A9CEA7F70498C7BA0B0F70C7DCA692023D78726E2C6767B8192EB1B268A1DE641CB5D5827BB5695E668DE0D949741A069A473C1C94BB03AA41E4FEE2748ADBAC0864790D828E8E7F8113916518027800DC24EAEAF06640C16880C2828FF55070F4D2DB167FE9C05C33B3DA65F4FE690CEBC3639584DE104AEBE68F7E1759A3C70FA5A5231FFFBB5471CA3BAC0C3713083403249DD20F9AF0F0FA1B57C61BFE76A020153A4E5D65A7BC5F592EC0D745621FFC32E51694534BA7B1EED76142568EEA1A99D1240E56E8B2CCE0CED89B9B7EC14C96C3C4241B70CBCE6E026AD3215B2B107763F6C621FE0A55D4CEF26C04A5A7313387D8FDB2D69EA12A25D379D8018E27D79C84DF6F8C0A92C8B0C623269D3A9A962006E7601749CF4559FA7DF656EDF75AF2704FAFD1E4CC66B5D2BF04C3F07E2507238C50290803763E6387A04ACCFA6CE9284900D3AA91E514CCEFFF0837EF1381A7A1C7B8AB72D079C5394720B1FEF755D93C7EC9848B15B4D63E332FF3E41B5BDF86DF29E4257F7687F9B50032828589FB61160BF69CDBF36CE543426443D143B574E4AD417E90C911EF2A11C0FC258074F6BC2B1976E0C00A21282588EEAB5812F16E10FA7E9C7582BFDFF2405368C5B426A7F1B7403A674A2A78372656D718C8DA478636225B3784728E0CFACD603092CEEEF0FE16EB1668620C9B3825982BEDA234A51F5684CE8C4ADC905323816ECD04C090D675DEF4B08E7F742D3CB600FEF146C711A4926CA35CB130D75E3EDAA16C6F11B9F334A93EA92E7A3683200C1880A5484B4CD0A11ECEBA12B5AF5CC4F34A1B526D0DFD8FF5223D6931C1CD57EC4ABC006A2A1DBC22AFC1CFB6552828A45DC5011988CFB719CD2004125FFC2018E0654C4D9936CBEFECFFA1EAD9E976ADE38A7B0557AE00F61B42CE23845C937500306279BFB0805DAE288EE3DBF2B4D4C2B853D912F56C6D236C0C519544DADB6814F00643728248DA43C22133D32B46FB89DC66E86C44ABC56A5576B81C33FC60AFC16086EFB7C6A72208A57D3FB33FFE17CFA45F7C6FA65F71C641D3EF56FE8BC13694CFB5781C2AC74E3A6415DD0B3ECA4D96E859BB72BF3BA1648439C347BD92A5D1B91F6E4560CB5FAB34B7B39775B755D88A814F36E8EE755D37991A9FEBD16214A6ACF2F7178FC26F8433B2CD6B31994B68FC210358A4EBF837F1CF6AFAB59A58D04ACC877C15B339B815D64BA1AB26BF5BDB84847C281A1952A933C493836B28A86C2E05303B84C2065E265DFFBDDBFEBF006F6FBE46A54701B4E26DE3307A46298B1D7007F85DE76BCF1E8D8C0AC6779D8AB218C87B8E3DBBD26B72FE711E3BA7877EEF857C0F562F70198F947BACD133E378D12EF3B4752E37939CD0953315A450CADD58AE7578B8019A180EE42534AAA75D2270A9AD1B410C4275493DDD8460138B1A19A3096B5F135DEEA05135B0BBB0339F215B8A4BC323B77605FAEF624660725AE8D0D9927EBE8E360A76EA5C92E13ADA77E4038DBCE80A429A36F99B7D77FC7BD135A562DAB5310DB6810042A4BD1A7546806E7111A1E814FD965FCCF5678C4A129813BB72F102CF424837A4EF38EEF937BE8D51EDA829CDA5B9BD19B17B0BA465FF280B79149C0A60DCEA03BEBB48F9177B4BEC7E19B4A8EC24303131A5A417EAD0E18117DB73FED97E268B49DFA7004095168CA047BEED3CF544E0BE0C6156F573B3E1AEA8AF3D9CE3359F070DDCF54942DAC71C95478F6C43FD1653005EF4024BBF9A0497D8094049D47D3970768AA1B7399EE76E99A1445C438A21DB4A010167BEA0D377E69D69F9E6CD3D76D3E9FBEEAC6E3DCAF41B2AF27F3FC613F060690EC77E1674735EDCAF8BAE7454BFB6BECFD0F6F66212D7D02A3DED61DDD4DB4374EDCD8F9CE500B3F909CCDB90E2615F0871EB8AF87A6385F72D2BEAD6B162AB9418CBA62137C51F4320E67068D3E8199CE1BF28B4932B24C90D296DAC84BAD1D3346A00405576EB42CFD223EC2BE12F03128BA92130E09CF59FDC2FB47F4B11FDDA62F388713FB4AC6F2FCB79D8B8AAE8BCEB0C05474480807F27195541FD548A29EDFC3FE110359CEAC68F76F544BF4DA7A864BF07518AA6666C18CB8878DC7988968F00D160F8ABF0A567412B1B7525501F8A9CB371F1D159EC83267BB344D79EEAF11C70FEB3F2E2176B646D647D856ADCE32C4039823FD9AA297B1E8F6CDCD0DE6131A44A838149B48C8F70E6042FCDB5971169D58A18716F8536F943ADD43CB31849B961C5DF09E669635FFB0DED9AAE668FE7EE7FD19FC4B47C45A63CDC7E8200BF452E5E548E1C4619900BC357DA99C882C4E3459C5BE120C5F56AA776EC3983D18327213B04593501D082A6528A18117F924FCA7A11000D31F838DF92AFF4DBAA5D039A16D45F8F2595EE69BE30FBD0D6F7CE8859A2FBAFAFA7C609A2176D816ECE78A8B9CB9015E36BD7D2135B03C5D06E3282B817957F458C46742AB44864657EED6A49E80E03471EFB7E89C6B802EC9046225A08E0397EEF6EB3F75640E79D83C1A951B2DE2C17D73C656F9FBE2267641C2A176D52EB702484ED86E360CE197799F2AFD79435B64D82FC5A4CB8F847BCEF5DEBA095E9BB7DE55DC66FD4B4722DFF08CFEB6069880E63A3C731039C924A1243D400F79BF3A211CBFDB920C52673D657F8B5F097F714F9731989913D1B735107FD44351200AE13C682ABCE790D3A42725DAC7586DD7D9A25F2AE9ACEF2EB9F0964508B0D5149711830C347FCD2105D54F8A79B96BC4FDB473057BCBABB371D2FD45112D5318315FBC8B3EC8FA1C9E539EA6C8ECF14C0B7467A0E7C3CBF31B9541C1EE650CFA6865E18A58EC6F1BA3A613EF8D7D6CE930081443E4BA804AFDF70B8EFFF330E8BE9AD07E0BDFE9F622AAAB3C6B34D23BFD8AE44ED9954B301A0DA93C7F1D069317571A6371EA8E9C97D0C8176F1C2CE283CA2A93B620C9A98BBCD7D3C6CB254A84226E497F5FF419A6D95DC5A045807A6535C00A6850F4B15F7770A35A4E9725EC4F551B9872E4683E6F7E6D6811C25BA3640D60D9BBB446644B81667B534AA500B7F1B93FD334F56BBE730154EBB522B06C6DCCE5F19D3ED03F6FB8F8BB397DFB851250F0EFE939E58B48D6B692D249F6AF1CD112A8457EB3A9602E4178BFECC8C649E7D26291C9D5A9371DD7A6C07955CA82079F304C212D5F21D3ECBE80B622EBF43E2AACF353107BEC9F60DA94491334363C0F4E40F37FC0450FECE7A9C44BCC0D37BDB8FA82D861E152D105581017312811E655B17E3391B81C82B19285250C6A1604B4BE1272F85A1440A0BB21476A1289CF166E91F2CBD5EA1AEBBF8C46BE96F01B60788D93AFCAFC02B5C20EB067F8345C1ECAAF3679579C871CDBC470A7549B83D737CF906B77C95718F53F85BE89206740839B867B3F5759F72D373BF4ADC179AA7ED5E0242051158C37296B6DAD2B07C74AFFCE8FF263251561ACC8E55706DA45EAEE16F5DBF9353A1C7AF873E3B20E279D8B7501B81955EACD1AC2F50E6DFB9DAA16B04EC4636A7014A53B29C831B93166901E4B0FDD6803A196F369C06C76C6695AAE50082AB16E6D14127F6DA6005CC30BDD21AB33DCB05CBBF0F578A792519DDEC04F59CC8C838E632E51B7DCC5D66B6479EF765B383AA40EBEA79369C1766B54A91201BF9028F0782CE5F9268AD9F0A14E7380553CB58FACFB6DA78637964121C1383051D393CC52CEBDCA98612EE93BB1D979B00726C091014945FF87F1859FA9F1F5229FFC3E67F8E5A59515D99DE1403F91D792C1F545D8F3998918D4029D45EDACCE651F56C1A25C502822431F6B7DC237343254C6A18F44F032C506A265C579840BAB368CA2479C2C30A18938C0BE409E0E21149C62C3A80EFC2D3094C08B4E5ADE45DF32F02D6375202D01046019A60FDCA898652818C0A4588F2B14EF5BA4E21AE1EE86721123BE0443A59B239C0E76FF94A6F726E1C29288C8A9A9E4EE3AE65A4CCD1C88807F4AE925A9D5F216D4FCEEE6469A875FA794329C4AD1D6DEB03A9AA516BC33FC126F0287CB376FFE88886B88862FFC4E12854E0DF74A385DB120243FC2563B667720358D53A623FC75E0FED81DADBC769FC328934CDCBEA8A1BA43B07F80DF3572835BBC1301184E8C32CB3F5C666FA64047C84966CE0D2909283DB1C7CC1433E7F37F595353BCB6F477206DA655C8ADBA0C8FA37309044B66527A24171EF52EF0B06707DE740635954CB6FCCC26620E0D2C562723369A3853255A8CC18B476DAF37B9391592C7D0473F97ED7709C90F75C7D0892D41F25F4EDB225E75F808085069F4FD1081ACCA70DDBF0394D15208E9EF913AECB10C1FA63C15DD997B26B15C42E6F85836975AE5DDC1F051966600B117699225B6243BBE1890DB56B08D097EE960A4729A92DB29342E01E32558C921795F1768D5BA6A96079E8F5D3A3E68AAEB4752A1B306C8122580DFB679EDA5A88A7B57A2651BDF7E79AE09BB1B3A0018007F6C77A0861B747163656A02839601B57A9E3BAE535B8FC8DBC5459B5DCD5B31D89D851DCCDA748C4B83B12CC19CD22139F71366524B9F08E9EEE1680F60CD32FFA97B76DF9ED315079127B0FD245DA3DB911157927621F97694387F694CDCD79B0ED2EF05BED6897AD6C2882824FCFB108B73AACB49FFB89BFB39A00508D53712D6B3FF6F1DB063494381D41D1CAF319CC71F6D93F2B465866FE5423C6D89C82A978008A8BE55C3F04651A68E39B8EA74CBEA8AA02649C3130B64B7C057D8DFBD20C9648E4FB5E0AE04722216AF32E776EEB49C6DDE89DD2EFFECE1D61E73E81F18F8935A73FE46A964D17EA97943C9765CFF8A2662EBF4ABE286D83A080DBAF18123A9A78BA332FE6533BCDF8C9E8BB3F4E6B0BBE9D6274973071E3799F8555EEE155D935D0A054BEA3FF5E74CC7D8B7F433C2B679AEBF752036439197A9103664272255AFF2B202386132763E36B1A0C3D647D0B55A473F4501ED262A913B3286DC3C74F83DB83B36D40B63140A770699DFF0F0DCCC1DFE9DF0EFCAD14AEB91A95884C47628F02B372220A9B6657061398FE2AA8B727E27F2CE7883D033D2940C7071925A134B8256398D60792137044A569255938D1AF1AB476CBC09069AE03A3ED43CD5FFB35FE03FD450DF4003EFC0846AFD4846AB6502306F1492DF795CA66B9E971DACD30DB76176ECD31B91EBCE7529D418BC2378E9ED6843FFE5403C2797A94E2BC76A807231D380699B909B16238E0DF133FD16D45AFCAD3E0A2EF2010375B685F67762E2D7D3B92D27DF92CC71C1CF325FD74EE9274D13B63620FFC8223568A6D1FA8468C539593CEF02929320C456BAEB07AF72813D50E2FD5275577DBB065F4DC2A8D0252E6366793F0D4961DA218086BDE1CFDD97DCB8D2247054409FB7F6377867476BAE183BD294834ADBF42E81D0B25EE48A7E3FFA0DCEBC6A11993F945E3D2B5B24CB3EB591227708DD2F2114F5C43562BE25FD08A893ADA7D3FB249E8A720239DE8278A457BE57229B215F8BC92E9B727AC3DDAB62E9CA5DA32459F556C34F0E340CE602870CB0D1B9F32433973D3D6E3632B1FFB3518F5F9FE3DEB566CF028C6F59021FA1290CE0F561FA0925E9429F1B136D1A116217A8342B9092836CBB9FB91935C3494B80B2CD6D35AADF96B74CA39EDCF7BB83AD0F4208D860081C8473383D1E01227AFF393CDAC83ED2F86947DBF7ECEB8C84F895FE9835E19F880D2A53FC11C51F44422DE6E51508947F39D031DAF7475A160E2BEA3D87654A4FB2864846B9A366ADCBD4E037E2E22B0074891EDF40E13D928BC2D3301C83A1893EFDB0EFF6E89FDB1170D2378C8F2DEB6D2A66178F1B7750773004512319AA7228CAC89BCB18D1EA0D12EFE9B5CDDA35B35E94F6004B9173552A53A51C37745DDC93C4F61742F0C06872D464098F3010546BCA765F45DA8168FD3D951F665A2728A8D4D725E7E2F402AEA81FCE5EBA7AD7A0DA7EA3D31B4CB33174E1B9D257532E9E8BEBE28D40C7EFE77F93C6CD7BCB45E84C4DA4C4AFD8573E18A1B3F091BE85ADB888BB4BD8215DDCE9EBF8E13EEA9B95F1CFBFD43C245A08A9A7A66949DB3BBD23A95E89F128A44002CD95D962C0BA0245EDB3F61F72F47AB5BB4F8D22F0B217FEBF4CE2FBA0C836F3FB6AD5081A2A49E774BD0708E500A9F8561B4F5E1F9433B7470F4E41E92E63BDD312ABC8D9FC491F53E48D12F7F8FACCEE83B261FF803119BB8BFCECC002F92B03FD77EBC1D92B04F412EF82BEC4DF3E78E22F6162CB6673ADF4FFFE69E0FC424F50B30A4B5A6665D9EE59C13FA1EEF28B2EF270BEEA5AB6CFA7237AD59589738237988F20B4EDE43EAC2DB99BC0F52A54712243A93047C7559847017B3B69D5CBB911F85E4083FCA87D79FCAC345BEA9120CE1109EE47DDF0B44DF72563CE5392C02232DDDE378B9F2B22A94DE65D93AB0275186D84B8ED1D18337824AF4CC272FC826560A6A9C9149C4BCB7457E84ADFEAA93A1B514E1C8EC21C6400944744D02F53F064CE4563F0FE374161D6CD23C1C9CB1D4B742C784E0F307C21A4E45A9307EA0087783EF072631E202FCEB0283707F6774B9A67ECD84A2908D1811325D10F17E546D632F17FDA141D1CA5201C38E860C3FFADCFFA42FA73C33EDFFC4A54E6DF06B4BBFD60DA023C93BD8B9EF4BCE68DB70904F88C748098830A18CD0D70E229B3277ED41F1F97EC5DEA98D8D3D70C417ED5727A8C11A12AA7B17867AD26782B3F3B7E3B3119EB17E042FA0BFB1593DD1507365D62B44A9362F007C4CEF4772FDF70A645A5482E6631AF0F4FFFFE262CCE5083ED9B484EB09131AC7F854A09B3FE812559383C6A467BEC132F29C6555B4EEF71B3E5972FC579AC6B2CEA8EED3A259CACFA635DB5799612374F071BB06EB5BA84E28665C67119019EEBF17A501424998A2E4AA2C20EF44DDC55B02CD3E13DD1945892AAFFBF997CE3024AA5DFC770EECB0B4514D2361896EB400CEAEA1C35CA866AF871914BD5C306BAA38DDA3796840CE463FB2F9FFE06637509871EA4DF5C400043221FE42DEA5C91C8C8B6A12B9CF6B93C3AA80E86A5C187FF3D8E3149F8C709630EF0A9BC29FE1CF0DCB325AFF7A0B6F2F641AE9F63262ECFF4F0A54606212D0702227AD6DDE91CCB88B9994B64E9BB31D47AB8CED47AEC46F61EC90BE5B9E55ACD48B423CEED2A34758C7768BB1C7F3622779F46105F7284280161C9FC476DE1B8D224428C3C78B6BAC1534964C3CD2766C50A7CFC00901FC21EB00A1E21F91274830D6695F15D821342B7E8B48A6A4CDD3C7979A0DA24CEBB3954693271005982671CE4CC667B3FD69A67E4BB161BDF83CA5F8872F344881EAC60C8B9D4B3C1BA0E0BF9BB6AB34FAFBCDB965E44D4FB8FB3B12539FFB0D7CCB968027D1B57B296E64604875246C06F7464BAF0941A2866FCC52DE019A6957BA0FA9B08FBD7F8CE72DA0188883C7A675021672E04C2342A1B3AFA9D901123966F6661D239B8745CE2A2F6A804D9293789BD18870685D24E23144D8B2A442136F5B835A86184613F049BF05A029560723023310906FDCBE93DCD1BFA2E8D3E575824955ACCCDB4B437F3AAFDF20744C540E000AD442BF57BD96415BBE9B32B7FEFB3DCB48D5657D8967382DFCB761E5019E9BC441E2C01161DF562E2E4978C6706DFD5EB186E5EB919E9DC4442E0C8D4233877ADDE4F2D4A632373E478268E222EE7992D48340686F285F12042531227DFF539EF149791FBCD5CC9F271E31C1BE7EE4905E9850A4E43F1EAE0BE9887D27B638E3741C5416CF88B685350DBE49F1DB06340B37089C7DA135F41BB10E09529866A1C67C0DEE1CDADFCD4DA9E92F4361615DEF20FA50F978E160CA0A35D816472C3B2DA1BBF964C47D1BC10579D8A33D69A9E92606DCE211DF698EE53F84536A6B9A5A2CD4C1686FA131B265D6121865BAA0267267BB70C0B022379B09F0C898DF451968A9F69D94BE60E831EDB056372BD66568A9CC32FDA6D7618C5D58CCAB2F0ECF23C26165A72211C2336AC351E9EC748805C549754EAE444202DBD228881849260FA01DBCACAEEA4A06338CB9BFD0213A9B5CCD9BC87BC12B3D85BB2E02DC37596723642F4ACEF0FACB3B0772764B578975162175EA95EC3BB723DB3268DD108BA62DFE473145B102529E45088E38A51D72B76FA0F1A8A3A21DA68A8F300D770E7D2759F4E0FD643885B878BC627BE90382FFDCD0A79E07CD8DB15C1E3F3F9A79471EE7A1C6A82E4A03733F3F3E8522708F440C55410BA8531D2B232E51F91F7C1A34547DFA4FE2463F8090CE33ACF7A8CF5679D5774202D870AC6D1EC1E2BD6470CD20FD4E212C136A0E9382D4502F869EFA2C8C6F424642A26CE8C4C80291650F4A466D68F420DC068654B241287736180A18F3F35B43BEE472705059E190EBB587781A46EF50A27D3F48BD69DE7DC7F00D05105DFFDD7D8AD7998CBE28F55E3531A49AEEC6D35190C3A6A8B61B6D6AD4252D9B8430024C97A3355ADECC9521EAB25C4FE6EE796D1A93F8AAC5D86007A9BECE52EE2E0A06F47B8EAB6C8697D7C6AA3CE4B9BF89D803E7D797DD016638574962308478454CB42711CC8D2729FFD09922CA963920F8CE9E04A47903E4167DA2A9699D5B27CE46C8461259A0AA9167681471C26E9EBB8F3CF2D0B99127F934E03BBE274242F70FB13BAD51EC567CDF565DEDB437FFA9F9A8FF6FFB28A4F16F70A00799661F61F7E68C7489F911088058FE40B97A222D63046DD421F12F564246857E5785CEAD0CE6F842EE69A184D060164D69000A71860C82A1F7564D95B311102514D79C06D0365E07033ED0F81F20553C2211A5A84F53CE2D7DD86C4099BD21583D151BEB2B3900D799ABE6C91D9D8A8CABE96265FF3FC969DA8C25BA21ECDFE0507C7E6FD724936E30775087F24395BD7C2A378D2F5E86BD18561CFF725370CE0133B8658E85CB644DB53467A6147F5A9E3147790A56966DA6E8844E6FF84E5D4C6479B1D89E117ED7E1AA641620DF3FADAD104C42ECA5CC9956BB13D9A6FC54EEC3489FAA7F9830B021D3C5347829D25408D0DB80ED5C4940540DBB32E00261A9F44590D6C9B45ACB71C05E160273AC45AD863C9DE21937D3640C309CC6ABAC5556CB1C82B69D2A6531A0FD5DCAFE87EB455A7FC2D6FECE22FDAAB11BE63768D9DFB4000640EA541449B1298896FE07128883250F7C997C544FC8764615CDD06EE84C07546E3D88E85D0ACEDE08FD08CD9753CDE30981403855ECFF6928410FAC626397045D1EA8573DB2A1E282E0214701777A6DC1E8DD0F2B375A7755E9710AB6D6B92A12C6E667F13BA7BA7DFFD0AE330071A8F7D80526B5E7FDFA0E93AB2E79368BAE98D9ADAE5301ADFF14F0436AF7FFBA61375A3405C2640BE444EFA4B4DCD421E4B97BC9E975655F7A599DF8C3E9BE56470EA1E01A7948DC1708FBFD877611EFA54F8899FD26EB2A2397B601DDD4EC93985BBEF3FB1827342F40C62A17AF3C476830E8060320AC13A4D7680DA3FEB9D9625CC6583D5CA914F3B6EF53E4D10E89EFA4BFA7BC8A92A9A6E3A46D3AACFE0B9906C74661D300C49F75E57FE7292F40E1CE4C95234173C9CBFC01A21B6068E0209409BC4824CC02C088A254452AA50632DCE893557A3234A6507D91A59A167ABD52C93644028E5F379FDAE8FA5E17B411B1ECCD0650D6AF9388E6E8A730282785F2FA6E2B6313991E382B09438BACEC21EFD54C4C028913B5B23888326294548A4757FB95342C3FBF69FBDDB5C88C98E328CD4A992D2553453D7CD386E75008F9D37225D71541984B100FD5843F56EE380C6B2570BB9C1BEDDAD335DEAA46905CB1D23B2A761574EB29381AD45ED6CAEAF0AFF9C01AFECA389078A6FE1E4652CDD1F3F0D384D3C38555AEB8FB3E233686971206FF258040C7B381352AA651EDE594DBA8F093C6D1029CE5FCAFB544CA339FF59AB58295067072C2B6134F3CBC08DABB5C3F52465E7B86CB89F1DA60FD6FB4AA8B7D26F9BFAE9D7E48140DA656AA0FEC2A1A823C64791B91E88058C61BF56E4C8B8572CCB1516FDCC8B41CA0C8CCD2CB917419C00A45FB74A5365934E2DB6EBA2E43015D951952E15881F35CD8BA329208B2474361DED6C06137C30337369A352364F7EC24059EE331E7B4697D3AE854F4C36810AB079BF1E0F00D6AA061546EDA3A9C4FCFF0E04AE3B05C963635941AAF368A414D8483AFF7CD2307EB0508AA0C83E3ECD005C28D8510E99229A4913171EADB7EFD2254912CD5E9B14AEFECC6B005D1A177B77E3E159032F4D93B11385709410557E6B92D766B1E2279E147388FD0AAB1EB9D714EE519652EFBC8258EC5A04DE14C7B92D6E942AC2D5E5B2A0EA28AE414A4AA3C9E5B9CC83043C0108C1E03B1B0EAF743C7DF237EAC14CC88837119CD2B3ECC961D5CB189A23D04DF5D27CC77D5F01088886ED6E086B65733567EEE37FF7CB3B8A5F8C99EC911F6C5A058A37F26F1BE743FC4CFC24D4F156B1528A5BEE9E13CE3D7E48222B7BF8D262BA25C3C6D02640A48715D1D06C10021AEE1BEE174943F4605E6EB5447174CFA2E0F7A598A1B39BB411439FB59D66FC0AC81F17E26F1CA88A0261A34C363F0CFF0E6EFDFBDA41796D2CE85BCD5D8C46FC516FF93262B8CBC6212E526156DCE281CBE636EF9236A2057D4DED5E85FFE24DF55A6FFF37F129333ABD65490A7427F1B9D438E71AF148B3BCF3299A5EE1DD3F91C77EC4CAFD1ED21CC542A01BD766D98887FA623B6D44CC44F89F566FE019351565171D89AD3BC90D457B1F6B965A7D1A3378464B42357B1B309A48BDAF8B32A7016709EFF2BC87F6CC52BC01E1B64AE49E979BD8A7A059271D839C3E78E6F1F40E7AA496E7FC3EEA853AAA3625295C7CE5E5B49A0B9090518DBB92A8C4A2B1E6F0C0D58926532F5BAD2E26B21CE3E3A852B571D9641E0B8DC42B18AC3FCC720976B59DD5044A531B76C44B895E9C4014EC8F2FF48E192D6F6365497D91C06BBFD3B1EE7C404C83322920938EDD564FC4506C759F12F1E4B92137019160F64BD532C77DF83757564599293F575D2E55A992DC95B76A3CE7A6A34F9D70F2ED99B7FE455B09CD4C502D62648A49B86E4F7FD6213E6FEE8B9BCE96F258D299A6A34C45ABA347C1BC224259BC2CA3F24653E3759AC9E0FF407C18F78E131263DD8EEFC360815DC2DFF810EFF7487F673E843B80AD928A105A91FCD1C436AB50020619085E0504141F62B2BB9BCE2AAE78B46B86A930C8E9A41078C4A8C94E7E095AAD7022A3CC282759416868A225544FF9448CAC0EB6543EB87922A7D7993DDD1A64FF761D2A3DF2AA38E652CF68DE42CB8BB7B9C540921724ADFFAF2C7112B558CF76E6B020F6DD1D2FFD9A6E3D1B622FBDD87035FC139CC73826FDE92264B8072D7A262A5E3DBBC8B65A2ED5E9E8ECB48CE912DF97EE4C6E2A05824EB6DA7D068F05358DDFF1FD2D583141A67699BAE7E9AA29805B9F816EFE17858F4BFAC228ECF20B8D4EB6A160F76A3B2F0CB05AB51EC3D13D59C67D75F6E23E2DFFB8B78924E022C8170C70E09D0458B4CC5690DBAFADE7A3FF7B9916C6046527337E5830BB234943F35BBD0DB3659B9592185C58D18E1B2DB88B23D69C106F82DF72F8BFFCFF131CB63ED9B6190BA7FD17C29C2097A580B77178B9BFC5D2BC472EB003256FEEFABC332E0F480296A4165D3C6AEA14111CA2EC97B825F58F51650C67B8481BD165370D0E1E581785B7E09590BCACA892CC080B7A96EEABB7D7AE9067397BB69383B0412301448D08C9C616FCA21156F986D5EABE91B80A54D83686CAB08EDE48EBC688A2D225717BE703175A48276AC6EA08D0F6585697F74D77BC160284078A320BCE97F74EE3A80190072D2D2F9649F1939094DB2330F312428E13D6700DCEA56E20778AC0F7D8355469C323D6AF011EC4AF86ACDD15DA91928E4D1EDA2BBF1B14074AED40E831CC7F5D6B6A48455B85A9E9788E0DC05864B0CA5DD907CECDF8ABB71D9EEE08F91980AD8E7F41929FD4C19C666ABC399A59FBF03D0BC575015B4407B4F9A3D7466B008E5C0A0CFD02A4B0937605D65F441F75B3CDDFDEC20040156EFEA889926D245F8CBC30BB2329D1C53B9E197CFEEA04A2D85AE69B4BA579DFD7E46822F427024697C8C40055E344CA9341A58513182B08A5810F9AC3129CC690BE929DE338E4045B504EECDBD9F3B9569E7F27FC8564E4F934CF3E77AAD669CFE4226CE10BF7B2A849F8F2756FB4DB2A0295DD9597B3060C7CD297F52DBD0ABCBABCBB0196F0348DC2B65F61F5BDE3E7B137FC208B35B2CCB6026646D9757A7439298D3C7758077BE01F0FE8CAF1187A04C7CBC9A0B78A49FC0B215B4AB5188ED385665854C0F0E282B0AC097C0657325AF1AF5F1C6265D8307B797F6DE76775E766F2747B25BB16870AE4F408F9BE67E9C52262C15126CA5ED5965CD48440519F6ADC8A40F36D34B62B9AB300E1B95AC3E25F8CF5C4EBC388D0D35B84F33DDDB4A67EA6DFE2B890F1E7EB9C2FD64A5AE2DC3C1D73CE7C3A919B4AE723380F5824F6C725C0049D2B69677C955B15CFCCC68E87923BFAD4C518FC6553A3E353C99E4ABB096BDF924E76A6930EAA1B18BDD07679D09CE8ECCD0F2E29E798760BAB8B92EB8986DE67F353FB2DCDC3ED1BD522370CBEBC4FF348B5302580BE1BBFA454B313E2581DAC6830904323658BD329715F8CC56011CACFE1A3F909E64C3BE922C2822797BA05CB4FCA9DA45D8DD029BF8A80B82AE88DF143BE34ACB870CBF883C3426A2B854F6BAE87A441EEC57E0D9A1F49828848CB76947EF4F581329FED18F56F373A3FE24062BFA895B161A9A13F6928BB6DBF74D2E095A605CC92192457B361F0F30AD6FA3DD5EEF4A3E6EC1C80BDC458B128DC2348285DDFD9663E1CD35807AD7A129CB91A8AB7DB6127AC91AE1F0301F1622029E3BE22D637A27015B8D05DC2F461A313F99D5C02570D5DBB9EBE7C7CD1B566520640EDCA8BD7430F2F9FA3BC30D19F673528E24B31391E3FAD272B6774250097F1BB87335045F64C1EC4F07CFB78492BC580ABB8C50694A4B31ABFBFE44BCE1578800C3BBBACAB3E11404571817F12EFBF22626A327F7B9FC6883D4E2B1FC37549A8DF34206B541E2BF7FF15FAFAB95015FC24453ED574A2481B91134F77C2EB12471302F63F835B66C2F08C16983EC09FCE12A37D7E4588CA5F731B3A2B868AA761EFE6F5FED558DAEF53FBF5F1D4FA06C374C825059EC660BBC450FC68442B3241BCF59A7CD691A1E2F2274300CEFF35174508E1B9453FD1B6FD59E39307A17F3BB1AD907361CC966AA1D985EE630552A9272FAA46E9F096C27808F3882E51A58A809A41FA1275534AABFFCC69102214B71E47344E4A6CF2F70A4E01B7208F857AA5BCE66BDC1B93EFA4A77F4977C19ED86C1808ABCB22A8920683271A9FD75DE1F5C259BF9E727C75C022BA443CE4E1CA79FE292ED16B2CE113E4F40CFC7AF04EE37169A11C4E81BD98F199AEFFF7299B6D9AD9FDCBF9592E3393F9C8B267B9868D5F8BBEA6AB2A7D5BE3CE7FF7D474DDE290CBD3DD4D26164FA0E7ACD67157A8F9128E82FED1AB809DB46CF65DB68905A70F959FE5D8CEE7995FF1A30E5DD68D0EE43E88F5BB25915DF25F046284CDA8959A17F53FD7482BBB46A45FA30F5C2A6863BAF2ED0E76EEA11C8DAF40779F20E3907F46A11AFE48DBBA44F63757593E490B78650574FE36F6E092FE6BFF71C378580730BFDCC087AFBD189D674FC4C317707BC079E0426CB545224E695517D48A5E93C36681E9078DFD4D4ED772DD3882F2A431450F95F3F790FEDD30906DF5704E988B972447B475426D416109341632D3AA13B04203DDFA21FBB134B665E38B051734093A758545458E7CC099CF37C2CC44ED07FE1E91161D817C20185A84CF8A549C7ECE75EF50642F4A5FA57A26EFAE5D6703DA3C8061A6B3B198CA1E71E3FB6AA9E40CB4FE48BFBE727FC261713A43BF5F996F3F0E78E5591C27F760AFF6AA6BA2F113B07CDDB7D920E1FF5B7EDB0755DF3039A94A9ABF0DA0C245641A43B406898396AE004E1EE48DA9C912E01A59A5DCE7E330C52A5CB717B7CCC65D632BECD0B09ED434C0CF5292623B7514C9D2E9F261FCF0FBF84067CB2998B9892C17F454FFD86FEBB12CF2BA144ADB85776C6D0B43F069C2B3C09CE8004A910F4FE9A4EF67D21218AC8907A48FCC237AAA432F1FD8B35DC26A6A75B7F4DA467F23F6B3C213B00AFF75C9476BBBC7BC03BFBD36731491AF44F5B7B8D7E809B55116DC7EBF698335A9149234AC2CAA8F0229A01F56D44E57C6C8C1D0DBD1975F293FBAB5D5645E56EE9170BFE1C73F3BC2EEB57ABD6BB56800C2AEDAEE88DCD8BA49016ADF65F898DA3AD9CD93B010CFB9DADE9B53881E01E9B850FB847B004C9B3D7B2D480EBCF0267117DD201C5D9D5FB64DDAF47F973B215EE16DE7CC05BE1B1B597D97FE2234CBA8FD4E2CA43BB3618A4AF9271F72254FBD54339E03C2710A4E1AAFAEE6E3C41AF9998206CB49C9FB5A89D9454C8F3017D6E1E548F16ECF71B8D5221BED2A03CFFD246B5B37F1ED04309211C2FCD59C20E3B316A9D1A90635A521DE59D09D95F7E0958CD7F57489C5507522C7E7ECD147B2DDE73E6C0105F53B937B799A031100AB0E2C3BD68F24E6B3AA58A4B7BA344BC655CEF53E63B9B4CA069A4DD8BBA269300E14601D13FD025F3C56D6F0A15ACD80B619DE45209308E615A7372142DFDF6598B15A139D8C113D002254A3AB722C21693557B7C8A0AA79A8C613B709525AF63146B334BA3192C992B80FC59117399806C89723FFE44E6CACC7B75D1C2C4010A63685D115DE19F47C8B160E31B207A3620A8E921DCF3E4BE44131EBBE636E4E74D231F7C5BF2641398D0508A90D9144CEBB4683A050C8664FDD1FC52A6BCEFB824BE67D633556C2A06785BD9AA99A2317C1C4FF50FBA11AA4174262EB40084E82274A94E78C05DF0B01D6A9087B8A7C5A3169EEFEBCA437D9AE2D82F5A845374E7912A6D08E3FB34AE351C570C3D7840FC75FFCBAA40D483A8BB4ED3481EC71974BD68C5079D4CE0352BCB474E25496E2CB74909802008FB245595C00467CC5D891B3B11266BE317DBB6288901B6DCD3D5FC370756A2C3F4FE27F1BA2DCAB85121E565813883F59AFFFF8BC300F78878C06CD64E3D6CB42B9F715D1C9FC74D725BFB73BCA4A7AA6C4A5D06EAA33BF343660ADF499581BDE4935455E13FF3597794BEB24DFB757C979D8239F0C286301A98A1D08842CCCF2CD7D134B291A67A54F391F9AE1126E17641EA5CFCA19EDBD30904FB0612A77497D44BC4F158C7E46426E7EA04CCEFA6AD516290463D82070AB90D9E36B052B2C34E3D6067D703A13C1645FA94F4D4FFA37809452A6CD5AB0A54990E45373AA2B13497BD252B0330AE390DFE8F1C31831793420B4652AFA61FA371761618356C577627A92B1B211F8D65B1E1D6F74B6D42CC4BDE0F93AC93D5D2367BB745BB20164305C29D0320F77848090C2814837B50F4A628FF3C0DF28A55F05C24BA9B5D7A79BDE8EE0BB438050C6ABF354646FCB092FF6358BB6781AADB1A4E8AFDEDC233E8095AC24AB8BFB9D374258DCE86201AB090E4F3F3DA32D0935F6C5BCC0AC2E8512C0C5B3A4EF5F03BE54A02F5D596D802D4BCAE70FF454D771973289B833BD398FEF11F4D435285867756D2B7D06AE910D5E01216DF3B92E94D0922D7BA96F03FA8B3030772F5DD00845EA5C5B161DF171F4FF4FAFBE77F16A9ADBD6CD882C76F0ADFB5738F46C127AB87EF74D8D81A8090BBD8DF28A556D7AFD9370E4845F749319473A0DAB35EC8078F663B0AE0ACFE29204436C164CB8CAD0C85F37DDCF6E4C507543769347075033E35F08A2EC941A7629C9B51F789B77BC9C75E673EEC1454123918BA026E73C43E8BD32426647DA4E0AF3DECE5007970E95C5E66C9DCDEA65162CAA8A9B2B33B175B0DDDD57D6A899AB1D81A9EB3D1C12D5438382F49849C13548CB99C26037F263B8873AF76614B9C4AF68C544B12B08896187242B652836C1E13A19462C69C2EBD5EC79809A98E76C5E5115A770F884F411E7A25E907A39E80BAF5D0740D4B6B2B9D0FC165352F4130E2917E16C659390360301A92C144EE21B158CC355C3B67B2AC72005F90ABFD682758A0636BC4B8BBE7CB2FB2C8E94C07587791781FA4925D596593845BDB61E1223052AB463ECDEBE9F95A0B0A8C563D6B5B6DEE659704D587D538F7D4596F6DDD131EE4DDA80FB4C069A8FF28F9656455D9144F538FBF4B11A4AA31DCEF4DF9E0F10D60A78144E913303EBB7D2A6F0DA99266EF5B3DC9D0E9EA21E8179066FD57CC9A2F87B2158141A8B93290375BE8385C6B812E7C7E5D785C676816D856097E5CD05AFE32DBFFC79C1CC00B9DB8BBFC890988481FD7AE8826C33509D2A9FE0D42B0B29300D4A9F0117839384394BBD59128C98247CD8244EEA6BCCEF4FABA0F4C3532180D2E2FB4E3BCC8D6E7F41938F59AD72A04C105C3B61B006AEBFDEE86F19B29B006D513D0266EFCE1F2B5B2D14A83626A5B39DBB3DE8BDDDFEE98C71D43C047FD70E77D733600D3A661ABDE1CD1D00AA301DF8E4B553BF19DE1A404E749FE5B59F44BB48389E86E2CE2243FDC02B72AB680F66F6B9AA91A6450E4508CAAD9DDEC1FF6E721174DC1E0FD875BFF17632A7876328E46D68D59267A241217EF1F2DC7FF409CC7ED4B5385ABD32BA76776D61E3EF65E0642409E54B52146B3145C693CF7C9BB187552F8EC5B30B5ADE2AE51A5882036C9488052D5E5C7694F804A378E077279E7B2BA0B3042C18C839998F030D577C717EB0D82D33B2B16AC9D98434ABBBFD451B499508CE5277F0B813199D107B06AB55BBE6B4B488E33BDB2FACACC5B0F2CBEA2F4CA297C9F633AC6A9BBB2C41F40365A1EC24CA6EAF5574149442651C98FDC2D3D687D87160342D92EADFD38D2E00430716BFFF072B0F6B1D7A8DEE5FB54376B6F17BE57E8D867873308BFA42229624D684CA911FF5BB7A2D9F4BE62E18A4D51D2C71E82CC0A22B23791F83F09903589005E284F990ED81413EDF24B0FAEE0F3E59032A764FC5DE9BE9CC11AAE7448102B957A24746C2875ABFB43CB2DECC290481F0C80B9526248CFA1718539A5A30F220B5DD129C9FF9529E49E05CFFFE7ABA2A39C95C4514F1BA09F44B7CD73B0AE838F0FDB258D608E39D2CE20110BE749B26CD032BD261C463254A6853E6C0E759FA4C8C90609E9541ECA59CCF92E56433F3154D5C987F990ECDDFEC0CCDC72AC8A68A901A7F07304F0A704FC412E6124C3D0C3E8BF5BB6FA2EFCD3B5E81A4832E972E4A4C0C993909CFC18AF28BECF597B389D309365F67DF81DDD7C90D0881121C0B3A3F1E68B39E6D03D81932DBACC1C715CE9299C6BA477978B13BB6DF0F9BECD0FAEE4062AE7E557F779789971F2175959087822BA4CB1CE6858E2A0DE6564DD63B2E2FD4313C0866532767FA3D0E5724A9684E49CD831B0A4DF8D31C745D648A0DCC3F5ABA9208B312C2A8EFF6F5DAF75D31177FCCE25C3611DE48F2FBEFCF9958BA5043C0512F667A68DDE38D697F0B89A5973CE4A8DFC2F1B84A0065D2F09DF390D62AB51F9D521FD33D094CA064F3608E73925CCCFB5F51CEF0C50819207086B625BDEFA3E8F1BC5AE6A5CE655BF6D3073F04AED1B97B4BAF820680B16CDC7F4C410764574C320B43FCB4DF42B22AF0FB611909D853E95E989FA839FF7E5A7F58D446915E6D7AE222AD19BB7BD1645050F13CC7A57D3386CB0E5AA817C9136CC6C420ABA104C08773CD8097B4734B28365B6F8D4EAA4843CCD32A4E265D7FD703ECDA350160DEDEDB06C257A435E69D46D98D3CAB2D37DF78F0A7F19C2A9B3E240A916297AE3399F012F6FB2663679A793323F6B62A23D66509C971FC0534D651D57275B6E7B56AD9162617719EDC64AE0A0845A4098533DE7B840B8B4CF832F6B51EB5C8D7BD964293B83FECB21833C6736EB7EA29EAE69ECF3030B586DBCB51D45DD0777D5C8745348526E07D4EC667677AC18D088DBAEE00B1CDABE067E5A72850EFEFBD692723D7AEDCBD35D2791300AEA2E776A4500CE02DD5D5818F172458802245953266F3A1217CC29399F28568ECB7A24820CA7F051F357AA308776FEEE5B022A28F3365623E9FF588E36F4C65B53D39BD5B77514AF324C43C3165B54C54B220DF5684D41A100228C2646D0C1989B30D39EB799BA3BBEAF65276B9FA6C7FE496E0CF8DF566AF0A9216CD26F03F5EAA152257E4F41CA50927A9AA8C0FCB88F5F0E7E2DC60C32875B42F6B11E929F0FB2D9C759A3BCBA2F87027B5C6DD8AD9FD82EA3DB8F9D5D689F8E29D1B87E62559A9E6FCC72162C319906CD46E18CB744DBC6117FE88B2C53EE810333025BBECC1AB1A1AE750B731AE3F349FAE529D2FB517D70F6FBBE6D7FEE1AE4C0F949F6BA85056011C9FC8C092273195EE89FC06BE942A7D56194E13ED55083580D8DFAE2B114D68DC6A68E97D019AD160E6136A7D101D34A19B9698FA6387E7EC3332109683FE72DCCF494B9C314E9BE322AED4B1D2B35744ABB2F28DC04946B9F1A8CBD175E18799E120CDF56DB9888AE3DDEF2A976A929291B78B488F895D2158A211B9C08603175AB0B9619AB1A277CA2EE14C0D6205F87F3298397F9660D04707BF323259871B3FB70D0875E62DCD947A401A14583A7B57CCD74D83C60118421EC4855BA8D5A231FC38EBCA5325C108AF2324EAA3653686CADC069B63FA16B67789839A57B3AD63BE19813F6707537FCFE9D8EF06BAEEED3CD5286C3EAFE36EAA16C755591359810FD89E6714AE7EB23E38026D93D853E676213C1EDA3B0D4C71FC3F1809315C3A3DEC47F497C9AE786479E995131DA07917FA5DDF63A6660AC36746AB11D57D0877C1134C18FE0DC247C8665214F16FEBCB00A9A1DC0C1B9C7A847132B87961754A5B6D97CBE050C443B930C534B891E0E0C3C2137C44C484A1B34624D091B744293DFAB0A78F361382CD064E373FC52777D4A2851513F8709FFB7CDCB8B09DF998DE13E9C0D3E5C8972936852BA61B88FFCB194A06B895596C2887FBE67C4666183FBE280819733C149D302E5D567590D9C43F23B8497E86DD1E2A5DE8ABF7730E19593FC8B5A5A3607826C40C48F7D83062EF94F559626B216F384A38024F169272DC4CBDC2651042D736FEC0EDC6CF263CD643D38CD9619A67A26A90DC00A5B4A8EA5DAD694E4BBDBC61F71185BF51A1FD9540AD79663CB64A792DFBDB77F5DC1E04F5938FF1143A6A9EE27495499294A2F03D2D7AAF57EC612AF701BF2E5E6F9BAD6B503C9037CD6380805BFA1BCF2D2E0EB475408CB9ABCB95048972D7BD0DD86071CEAE7E614EC581419A458FE1D2483C1B239DC220B888D411DE3CD78C7DDFE3F89159F929143F0ED2F19F6C401DF4898258815ECC278CD9876B1B988B71D93F847B6A6C31FCA8481D2E77602FCF022888866443F50B4BA537F904C322C893F0DDC5AB3A38427E96C6FFB23155579A1768A96AC7E46E5C8A6545283C58ED6621DD742177F77844AC6075591C9B6861A614ECE076018A3CDCD612ABAFF32A2F112B0D7BDE6FD6579BC0D37FB6224CEEAADBB173EFC4E9E03BF278E0CDB884AF8B40DBB5FADABB38B22E7FBF31F54FE31571B6653ACBFFF784621686D35F44C9545A3D711CA7A30232A62DADDC6DC761BB8BB26BBE301205E0864E5CA79766DF43CEF54C12D40560AFBF00E5C0602371C73B1DBED1C7DDFCCA8BE91E2C516A59B1A3D2ED11E9A4AC455E864DDED138AC2147567B412E9C336E80D3CA6684038177737DA0EC62A039DAC347B9D8378EACA592BCD1A8F4570A6EB1C9B9D941060F6A0B6F0836BDF365038982E0264798CBF4ED13E55FE51D0FCF785C573B6A5EE868900D1056E1FC87959FB69333A790716392BA56DA50BBD04391E449E93E095EC63C058C6F0A1B6BE83FB8E1CEF60DBF82317CB3B03C3ACFF75DFAA36C79AFFE06DB281A46569C9C7ECB1043CFD8F329CF4A3AFF9022B641DB7F3DD2B0C45CAFBDB17206C2FB3266C90F1CE6321CA66542862E9C27094DCA8CEAA414442B194BAF2418FB1DDB532E65C5E24721FE53A4D89535333E9635DA8065321CCB5B15D362C614BD9B394BE96B4E0688918E0B94DA778F06F62B5BDBDF549AED2561076ED61E5A3A31E8F70317C59919C7D05A2EC46356C1274A0361BEBDBB25D28A1095A90C0F282BA0B234FC163D2B9F9FDA16080A824DAC8C926F988E8D01CEE81A0DEB5320E6763EBB76F7F8BD339CE9CD5EACA00980E6DAFAE73F585A3043F78152BB7508FDD0C8FE13ABA08A68081FC6DFACB5718C5DEF6CAF7E0C33DF6CE903C0B1D9345B69B26D8EBE3E41CAD1612EAC35000D146A7C1E731D0B9DF5BC42036BFF747181DF3916C5BB317893461F30D9FB72A00367890555D5B43E11FE10F350EC3A4FF8C4CEC3C6816B85BDE5C61CD66EB2FE910F90A03C50C8A84B99FAC1BC1F2673A6313FB3FB3A45D9EF481D43FFBAC78745675ABD29CD00A44A89BAD1E90B55B5DB01CA9013ED860609B7D992D034E417D38AE875FE7465849E41F42A247E62BBF2874432787B158CC6FF085EDF30D4432F7A43CE5FFE43E3788BAF09E26CF8CB403382954664A219821CB53BFD6EBC894B6A0E21B4C02EF6D6A502A3F70AA71893F77915DF266B4CB46AAF9CA1EF0C013AEF6685B23D39920F0CAEF9FFC1F0DF7920C5BBACD1488F6DE0ADCA4A16AAFA015A2DF283A23B47F206F35A0984D36DFCEF8A35BE520F18594B3D9BD2A39C66937D1D560725FFF132BB258F3B0344A60D7E0C74DA0EC14D402A28CC9E481C12E1C95BD4FE8E8FB8B64617EC97CCCB0FC6972E6680F85F63A31E8973AE6A2A09E299D84EE82C9E2E73BC8740053DB87BB589FBE94B98D6D28E6E70EC3A65FBAE52E93C255D1FA5C183CDCA74F, afterDelayedMessagesRead=1184819, gasRefunder=0xe64a54E2533Fd126C2E452c5fAb544d80E2E4eb5, prevMessageCount=128587430, newMessageCount=128587721 )
    • TransparentUpgradeableProxy.STATICCALL( )
      • Bridge.DELEGATECALL( )
      • TransparentUpgradeableProxy.86598a56( )
        • Bridge.enqueueSequencerMessage( dataHash=7830B5474AFFC727EC0AC420BDC5956584C67C19B0729262840976985865C62A, afterDelayedMessagesRead=1184819, prevMessageCount=128587430, newMessageCount=128587721 ) => ( seqMessageIndex=406503, beforeAcc=7296055B5347A20B0DC3E78113FCE040B031C1449A5ADE3911E5107B00295DDC, delayedAcc=C41634B446E620336B0FB3BB241BB2F764C2460A151830C7406FAC2A634BD873, acc=E9C77CD47287146891660331C4A8D23ADF98411BF84FF99C38895AB73341DFFB )
        • TransparentUpgradeableProxy.7a88b107( )
          • Bridge.submitBatchSpendingReport( sender=0xC1b634853Cb333D3aD8663715b08f41A3Aec47cc, messageDataHash=F829BBF7A37183EDE66557ECED930052F69312974B27390D94581D4550ED0508 ) => ( 1184834 )
          • GasRefunder.onGasSpent( refundee=0xC1b634853Cb333D3aD8663715b08f41A3Aec47cc, gasUsed=207006, calldataSize=98276 ) => ( success=True )
            • ETH 0.064031880774757061 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);
              }