diff --git a/lib/FlashPlayer.exe b/lib/FlashPlayer.exe index 5e418d550..157a692bf 100644 Binary files a/lib/FlashPlayer.exe and b/lib/FlashPlayer.exe differ diff --git a/libsrc/FlashPlayer/uMain.dfm b/libsrc/FlashPlayer/uMain.dfm index c6d700215..b49134eb8 100644 --- a/libsrc/FlashPlayer/uMain.dfm +++ b/libsrc/FlashPlayer/uMain.dfm @@ -1,656 +1,656 @@ -object frmMain: TfrmMain - Left = 300 - Top = 617 - Width = 1381 - Height = 811 - Caption = 'FFDec Flash Player' - Color = clWhite - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -14 - Font.Name = 'MS Sans Serif' - Font.Style = [] - Icon.Data = { - 0000010004000000000001000800EC310000460000003030000001000800A80E - 0000323200002020000001000800A8080000DA40000010100000010008006805 - 00008249000089504E470D0A1A0A0000000D4948445200000100000001000806 - 0000005C72A866000031B34944415478DAED9D0B7C14D5F5C70F8F3C8090F008 - 041523521031451E159AF8A041FEB4F28F88429428A08912B51A54A80F94FEED - 940AA258F081CADFA841010D1A10458A1695482B49E15F40298280881435BC02 - 84040328F33FBF95B50177E6DED99DDD99D9BDDFCF673EBBB0B39BBBB373CE3D - E7DC73CE6D448AA8E4FD8913F5FA8307E9686DADEF38C2CF8F1C3A4447F9F03D - E2FFF911C4B76C49F149499480473EF0989092E2FB3F1C89FC7CE0E4C98D9CFE - 4E0AFB513FAA078170EFFDEC33DAC7C7DE2D5BE8787DBD23E3689C9848A95DBB - 52DB6EDD28950FA524BC87FAC15CCC5B85853F0A7ADDAE5D4E0FC7122DD2D27E - 540C571417ABFBCCA5A81FC645BC326488BE7DF9729F791E8DC09DE83460005D - B778B1BAEF5C82FA211CA474D8307D7B7939D557573B3D1447486CD3863A6567 - 53DEC285EA3E740875E123C8EB7979BE19DE6BE67CA480DB000BE1EAD252755F - 460875A1C3CCCB8306E9DB962D737A189EA4F3A04174FDB265EA1E0D23EAE286 - 8137F2F3F58D656551EBCB471AC40EBAE7E6D255B367ABFBD566D405B5092CCD - 7D3C670ED5ECD8E1D8185A356942CD1B35A284C68D299E1F7124F21177E27933 - FEFF383E2F911F134E3C07C7F83872FC38D5F381E7DFF2E3515DA7637CD4F371 - F4C481730EF3E381EFBF77EC3B26A7A753CFD1A3D592A34DA88B1822C59999FA - 57959511FB7BCD5890539B36F51D6D59E053F9687BE27924D9C74A60DF77DFD1 - 5E3CF2B117CFF9F8961544A4382333930A2B2BD53D1C02EAE20501D6E7D7CD9E - 4DC78F1D0BDBDFC0ACDD312E8E4E83B043D04F083D667437038BC1AF0CA01CBE - E1C79D7C9D8E85513134E6EBD42B3F5FE51B0481BA601658306A94BE61FEFCB0 - 083E04BE030BF8D9F1F1D4858F347E1EE77261B7C2177CCDBE3C7A94BEE0A38A - 95423814021441C68811347CEEDCE8B97061465D2809E6E7E6FA827A767326DF - B0387E9690401DA34CE0CD80F0EF6425F0F99123B49D15C2D7FCDC6E10341C51 - 56161B173404D40532615E4E8EBE65C912DB3E0FFEFBCF1313A90B0B7C2716FC - 581178115008DBD942D8CA0AE15FF5F5B6C611BAE6E4D0C8254BD48536405D98 - 00CC1E30C097B0630710F27359E07B356B4667C7C585FE813100DC8575DF7E4B - 9B5821D8E52A20C1287FF97275BF9F82BA200D783E2B4BDF595161CB67C197EF - C1829FC133BE9AE98303C2BF812D82F5AC08103BB0838E595934A6A242FD2027 - 501782595450A0AF2B2909F973DAB31FDF8305BE271F498D1B3BFDB5A28ADAE3 - C7E96328033E76DB1033E8555040579694C4FCFD1FF317606A9B367A28C53898 - DD7BB1C0F766131F517C45F8C12AC25A7611D6B13208C5454031D284EAEA9896 - 8198FDF2CFF5EBA77FBD6A55D0EF87E0F765A1CF6CDE5CCDF60E01ABA0F2F061 - 5ACDCA201445707ABF7E74F3AA5531290B31F7A5971415E9AB67CE0CFAFD88E4 - F765A187E0BB3D29275640F2914F11F011CA0A42DFA222CA993933A67ED498FA - B2D3D2D2F4604B7121F817B568E19BF55550CF9DC00A8035F0515D5DD08AA045 - 870E744F5555CCFCC031F1454BB2B3F52FCBCB837A2F0A6CFAF36CAFA2F9DE01 - 8A00F1810AB608822D5C3A2B3B9B0ACACBA3FE078FFA2F382931510FA669A65F - F0B17EAFF02EC8275811A42240D3D307EBEBA35A46A2F6CB059BBE8B593E8B05 - FF223ED48C1F1DC022F88895002C82608285D19C561C955FEA892E5DF4FD5BB7 - 5A7E1F9277FEBB65CB8897D62A2203CA96FF72E850504945ADBB74A13BB76E8D - 3A7989BA2F34292E4EB75AAD87001F041F7EBE22FA4176211481D54021AA0D1F - 3C762CAA64266ABE0C3AEC6E5AB8D0F2FB10D51F80DD6F94B91F53C01578AFB6 - D6B76A609573870D8B9A4EC651F1251EEFDC593FB06D9BA5F7A00C7730CFFA2A - 7B2FB64156E1DB3535964B925B75EE4C776DDBE679F9F1FC17B06AF223B03798 - 677C15DD573404AB054BD922B012248C0697C0B3830F26CA7F3ACFF6D7A4A450 - B20AF2290250F3FDF7F4DAC18396AD012FAF127872D0C1D4EBC3D787C9AF5088 - 587AE890E5D88057FB0D786EC0B37AF7D6ABD6AE953E1F11FEA1C9C9744E4282 - D343577888CD478ED09B353596560A3AF4EE4DB7AE5DEB2999F2D460ADAEEF2B - 935F110AC1B8045ECB17F0CC40A775E8A0D75555499F7F61F3E6F45F49494E0F - 5B110560B970E5E1C3D2E77BA9A0C813839C9294A4CB6EB3A54C7E4538B0EA12 - 603BB3076A6B5D2F5FAE1FA095621EB4E41AD5AA956AD0A138097F1BF24DFCB8 - 95CDFAADFCFCE77CAF145A5C0A864BF00ABB04B22DC9BC504CE4EAC15959E347 - 1EFFD5ECEFAB8CBED8E4C0F1E3B48D8FCF5948716CE763CB89E7DFF071EA5D74 - 330BFFAC205685A04C4A5909C8D613B83D57C0B503D388A4C3AFDDD9DC87F02B - 6283AF58D03F64015C81F6E13C1B6346AFB698D7FF5B56004F07B92C0C25B088 - DD818DEC16C8A2B954D65C3928CD82F0ABF5FDE807FB047CC8B378F909A1DF6E - C3EEC4C15A000DB19A2FA0B950DE5C37202B667F768B16D49F0F4574B19167F4 - 0F21F438B09720CFF876138A05D09015757554CE870C6E74075C35182B01BF2B - F8C753F9FCD10384FE25FEED4BD9ACDE61C30C2FC20E0BC00FEA08DE626B4006 - B705065D3310D9A53E14F3E4B2BFDF353EDEE9212B42640FCFEC10F812F4F80F - C306A166D86501F8C132E1829A1AA96222372D11BA6210B2493E58E3BFB6552B - EAA8F6D8F32C68E1BD98CDFAB93CDBBF83BDFF1C1A879D16809F9DECB2BC7AE0 - 8054AE805B92851C1F806C7A2F847F74EBD6AA7EDFA354B070C0C47F958F4336 - EEFEDB90389E183A75EAE43BBA76ED4AEBD6ADA3952B57063CD76E0BC00FFA0B - CCD9BF5F4A09B8216DD8D13F2E5BD803B37FB49AF93DC7376CE2CF62F37E0E0B - BD1D91FB86B464E1CDCCCCA45FFDEA57949595455D5898CE3CF34C6AD4200F64 - C28409F4C8238F047C7F382C003FB004E6B02520E30E385D40E4D81FB652D29B - C73EBF4AEDF50E58A79F525747B359F043D9A9A721EDDAB5F3097A7676365D7C - F1C5D4B3674F8A17C481CC1440B82C003F880920614806274B891DF9A3569A79 - A868BF77B053F021F003070EA44B2EB9C427F4DDBB773F697697C1290BC08F95 - D501A79A8A38A20034C9441FB5CEEF0DFC82FF3C36E90CE173E0C30F1932846E - B8E106BAECB2CB8433BC08272D003F56F2043407E431E27F5036D14765F8B91F - 44F435BEB96760C38D103EA75FBF7E3EA1CFCBCBA3366DDAD8363EA72D003FB2 - 19834EE40844F48FC976EF55B9FDEE6711FBB877D5D6069DB4939E9E4E23478E - A4FCFC7C3AE79C73C232463758007E5E3F7850AA7620D2DD8623F68764FBF6A3 - AA0F413FB52D973B415E7E11CFFA4B83D85D0791FB2BAFBCD227F403060CB0EC - D35BC52D16801FAC0CC854114672DF8188499926E1F7A39EFFA6D6AD95F0BB10 - 98FBD3D9D49FCC87D5001F027877DF7DB7CFC46FDEBC79C4C6EC260B00E01ACE - DEBF5FAA9F801621D98CC81F91F1FB91E8730BFB7FAA7F9FFB409EFE556CC26E - B668EE43F0274E9C48D75D775DD867FB40B8CD0200682AF2BFD5D542251AA9C2 - A1B0FF01D94C3FA4F8AAFC7EF7F14A7D3D155ADC47CF69C1F7E3360BC0CF1676 - 0390322C2212998261FD70D9F57ED5C0D37D208B6D6C6D2D3D67A1DEFDB4D34E - A369D3A6392EF87EDC6801F8916D341AEEFC80B0FE4A9A84DF8F3DFA0AD8EF57 - B80704FA86F3AC2F5BA187F5FB5B6FBD951E7AE8214A4E4E767AF83FE2560BC0 - CFF3EC0AC8B41CD7C228A761FB6099DA7EE5F7BB0F2CEFDD5053235DB08335FC - 679F7D96FAF4E9E3F4D07F829B2D00201D0F08637E40583EB4243B5BFFB2BC5C - 789ECAF17717C8E6FBBD64D65A6BB6DA205C63C68C7185B91F08B75B0040B666 - E0ACEC6C2A282FB7FD4287E597D3244C7FE5F7BB8B89EC933E2CB9F945FFFEFD - A9B4B4D4E7F3BB19B75B007E64E3015A18E4D5F60F9C9696A6D7EDDA657A0EB6 - EC1A6363CAA722347EC737E00C49E1BFEFBEFBE8E1871F76EDACDF102F58007E - 64E2012DD2D2E89E5DBB6CBDF0B67ED892A2227DF5CC99A6E720C9E776E5F7BB - 863B0F1DA2A72422FD30F9E7CD9B4783070F767AC8D278C5020088073CCD4A40 - D443A06F5111E5CC9C699BDCDAAA003409D35F95F7BA87DB59F89F95107E04FA - 5E7FFD755FFEBE97F092050064CB87351BE5D6B60F7AAE5F3FFDEB55AB4CCF51 - A6BF7BB8956F349935FEC2C2429AC9565DA8A5B94EE0250BC04FC9FEFDF46F41 - D6ECE9AC906F5EB5CA16D9B54D016812B3FFCD2CFCAAA79FF3C8CEFCE3C68DA3 - E9D3A73B3DDCA0F19A0500D053F0397605446836C9AE2D1F32B54D1BBD5E3068 - 55DFEF0ED09F0FEBFC22EEBFFF7E9A32658AD3C30D092F5A0040A67F40224FA6 - 13AAAB4396DF903F60514181BEAEA4C4F41C24FCDC959AAAAAFC1C660DCF2E97 - 4874AC45461F72F9BD8E172D008040E0E37BF70A7FA75E050574654949484215 - B2446A12A6FFF0E464CA484CB4FB3A292C80DD73FBB0F08BBAF3C2E487E91F0D - 78D502009B8E1CA1D7241284B4106538A4373F9F95A5EFACA8303D070D3ED0D2 - 5BE12C39070E089B783CF1C41374C71D77383D54DBF0AA05E047A68148C7AC2C - 1A535111B41C87A40034C1EC0F931F81BFB66ACDDF51FE5057477F12A4F8DE76 - DB6DF4F4D34F3B3D545BF1B20500F6B3B5364B2237400B418E837EA34C5F7F74 - F4CD565D7D1DE56D3625AF109892175E78212DE7DFD28B4B7D6678DD0200E828 - BC42A0BC43D957206805A00966FF563CEBFF96677F15F8730EF8FDDD7806D963 - B2BD36F2F9FFF9CF7FBA3EAF3F18BC6E0100CCFECFF26F784010BBD18294E5A0 - DE342F2747DFB26489E9392AE3CF794439FEA8E3FFF0C30F7D3BEE4423D16001 - 00990CC1AE39393472C912CBF21C9402D02466FF3BDAB68DE435529C02FAF85D - 2058F283CF0FDF3F1A387AF428FDFDEF7FA7F2F272DAB06103AD5FBF9EB66CD9 - 6278BE572C003F4FEEDB17162BC0F21B64DA7C21E1A7AF9AFD1D4514F52F2828 - A0175F7CD1E96186C461B66EDE7BEF3D5AB46891EFD8CF0A4F162F5900008941 - 4B05564030EDC32C2B004D30FB23E9E79E76ED9CB8468A132C63C1FF8D49D349 - F8FB5BB76E8D688B6EBBD0D9A259BC7831BDF4D24BB46CD9323A24B9F7DEA978 - CD0200D3F6EC112607691665DAD2C90B468DD2D7CF9D6B7A0E9A7C5CE8C11B2B - 9AF87975357D6A525B3E977F43ECCAE32520F8A848449622CCFB50F19A0500D0 - 3404CD43CCE8316A140D9F3B575AAE2D2900517F7F95F2EB3CA8EDBFD36456C4 - 921F7C652F34F40010FC3973E6D0D4A95369E3C68DB67DAE172D00991461ABFB - 09489FF85661A1BEA6B8D8F41CB5EEEF2C58F6EBB26F1F551BDC20717C7CB46A - 15F5EDDBD7E9A14AF1C1071FF8BA0D9B05F382C58B160090C90BE85358485714 - 174BC9B6B40210CDFE98F5C7F1EC9FE89199251A1165FC7925F0575353E3AB46 - 7CE6996742FE2C28BDB39B34A1F39B36A55E7C9CC74737FE77778F96A5637BB1 - 196C051CB3C90A9096564D10FC534D3E9DA713CFFE46BBF562634E04FEDAB76F - EFF4304DF9EB5FFF4AB7DC720B6DDFBE3DA8F7A7B3700F8D8FA70B58083220F0 - FCEF689B94649A886A92B22D75527166A6FE5565A5E1EB98FDC7B66D4B498D1B - 3B7D6D62162CF9E59844FE911073EFBDF73A3D4C43E0EB1715150535EB63561F - 9E904043F9E8E3D199DD0A3256C019999954585929946F2905A009667FD5ECC3 - 79AE397890CA0CF69FC7ECBF73E74E57EDDAD31098FCB9B9B9BE653D5960DA8F - 4A4CA4BBD9F2F4AA391F0A324D433409F9169EF0FEC489FADF264F363D47B5FA - 7216E4FA77C48C60F0BA9B7DFF6DDBB6D1E5975F2E1DE187E08FE109E76E16FE - B3E3E29C1EBE63C8B40EBB64E2441A3879B2A98C0B15C0F4F474BD66C70EC3D7 - DBB3E0DFAA1A7D3ACA34F607EF33591F5EB972A52BF3FD57AF5E4D393939B467 - CF1EA9F30B58E8272525D119CAD5F48152E1DD26F91EC9E9E9347EC78ED01480 - 2630FF07F20F72914AFC719473F7EDA3CD06C1BF1E3D7AD0279F7CE2F4107F02 - 847FE0C08152997C1D58E05F60F7657094952B878A4C6290269071D317DFC8CF - D73F9E3DDBF40F8C4F4D55C13F07A938768C2E32C9817763971F28A4ECEC6CA9 - DC7DCCFA7FE649A695BAC77E422DBB7ED3D9F533A3677E3E5D357BB6A19C9B2A - 80294949FA51130DA3DA7D39CF4D35355462B00B7333F69511FC6BE322170D3E - FFC5175F4CDF7CF38DE979C82A9DCDB3FED56AF35853446DC3E259793E505B1B - 9C02D004E6BFAAF9779E54F69F8D32FFF2F2F2E8D5575F757A883F02A1472AB2 - 688DBF1DCFF66FA7A450DF180EF2C922D32B40339173C3175E1E3448DF66B22C - 83B5FFBB55DEBFA3A0E63FC32412FCFEFBEFD3A5975EEAF4307D609D1F3EFF72 - 411BB99F376D4A4BD9AA54813E39900BF0982027A0F3A04174FDB2650105D550 - 7A35C1ECDF837DB3AB5CBAAE1C2B14B3F6BFC540FBB76BD78E76EFDEEDF4107F - 64C68C19347EFC78D37390D0F321CFFCAA89AC35DE603770BD811BE8473390F5 - A015C0B5ACA5BBAAA8ACA398F9FF575C7105BDF9E69B4E0FD107827E175C7001 - 1D33A925410A6F45EBD6749A9AF92DF3055FD7398280AA664501BC9E97A76F28 - 2D35FC30D5F4C31D982DFFB925F517ADBA20FC6635FCF0F92B79E68FE5C49E50 - 11350BC9C8CBA3AB4B4B7F22EF0115C0B4B434BD6ED72EC30F53A9BFCE83D2DF - 36264B4068F6D9BF7F7FA787E933FB61FE1B81C6A4157C2FC5420E7F38111508 - B5E8D081EEA9AA9253009AC0FC1FCDA69AD2D6CE6256FC03A13AC0AF39DDF20B - F5FC08FC998135FE712A912C64B6F0FDF0AA493118D002C87B500AE07E36FF55 - F4DF59CC6AFFFBF4E9E3EBF5EF24D5D5D5D4BB776FDA6192463E283E9EDE5579 - 24B620B31AA0C92880D261C3F44D0B171A7EC8993CBB14B005A0709681ACED97 - 1B24808C1D3B969E7CF24947C777EDB5D752A9491C097EFFBA366D54D0CF464A - F6EFA77F9B045ACF1D368CF2162E3C49E67FA200A6B669A3D79BAC2DABC61FEE - A08549D0C7E9A69F6BD6ACA15FFCE217A6E7CC4F4951597E36236A1796C80A77 - 4275B5B902D094FFEF7A4409405F7EF925A5A7A73B36BEA14387D25B6FBD65F8 - 3AF2FB5F503924B613CC72A02505A0B2FFDCC12BF5F534AAA626E06BE8F9FFF5 - D75F3B3636ACF9F7ECD9D3F0F54E4D9AD0273C89A80232FB09260E70D23F5E19 - 3244DFBC78B1E19B95FFEF0E26D4D6D2A3064B3EC3D8CF5BB0608163631B3E7C - 382D3489217DC8F7CF25CA820C1BA238C0394386D0758B17FF28F727290051F5 - 9F6AFBED0ECC0280D83863E2C4898E8CEBD34F3FA58C8C0CC3D755D43FFC88E2 - 00A756079EA4003481FF7F236BEF8E4A7B3B8E5905E05FFEF2171A3C78B023E3 - 1245FED5EC1F7EACC601A41580F2FFDD017EE09F99FCC0F0FF1107883498FD7B - F5EA6598EF0FC1FF50B98F11E1619E2064E3003F3E11EDFCA39A7FB88345478E - D0B0830703BEE66405E0F5D75FEFDBC2CB88F7F9DE19A08AC72282A84948C39D - 837E54002FF6EFAFEF58B1C2F04D6AFDDF1D986500C2F4870B1069D0D63B95AD - 43A3D93F8B67FF8FD4EC1F31447180F4FEFDE9C6152B4E5600D33A74D0EBAAAA - 0CDFA4BAFFB803E4FF2F35D0EED84E6BCA9429111F135A8EDF74D34D86AF2FE1 - D95F35F48C1CA22E412DD2D2E89E5DBB4E56009A0A007A82D3F7EEA5AAE3C703 - BE367FFE7CBAE69A6B223E26741D32EAF483FDF8D6B8A827612C20B367807642 - F6A515C0BDEC5F46DB1E6B5E031B80A49994007FFEF9E7D4B973E7888E09C53E - 679D7596E1EB4FB0E53856598E11055B873D2AD86B41B3A20054031077605602 - 8CEDBF0E1E3C488D22ACA41F7DF451BAEFBEFB02BE067B717B6AAA2AF8710051 - 8310ADA102106DFFA53200DDC1D4C38791C411F03534FF4013904873FEF9E71B - 76FB51893FCE21CA08F46F1BE65300F37373F58D65658627F766136E88EA00E4 - 38B93CC32F34D80074DCB871347DFAF4888E4794F9F7627232E5272646744C8A - 1F587CE810AD35D93CB47B6E2E8D282BFB41013CD3A387BEDBA4671B96FF2E54 - 5D5B1CA7F3BE7DB4DDA007E04B2FBDE45B8B8F24D8CAFBF6DB6F0FF81ADCC65D - 6ACB78C7106D1BD6BE470FBA6DFDFA1F14C0A4C444FDB8495B61D501D879443D - 003FFEF8639F391E49468C1841AFBDF65AC0D786252450594A4A44C7A3F80FA2 - 16618DD9327BB0BEFE0705A00956006E674DAE7AB53BCBDFD89FFB95410A30B6 - 00430FC0F8082BE9D34F3FDD708BAF67D865BCD562F41FD1EB437CF8B31C603B - A0552882895881C21DA852D1E5D8C796E2D36C319AA111C9298007DBB777FAFB - C43C33D8A4FB9D8149E7440FC0CD9B3753B76EDD0C5F47F61F76F769CEB7D861 - 16EA3A3E0EF081C834FE5DC3079C995A7EFC8E8F63F27F9AFCD9284DF9B3FD2A - 269E9FE380D2883FF1EFF1ECB6C6720C6292202D5C935100AD78E6BF832D0085 - B3E4D7D4D0CB066E5A6161213DF7DC73111D4F717131DD7CF3CD4E5F1653A624 - 25D184188E5D3DC916C001839811D06414C0E94D9BD21895C9E5384800DA6390 - 01F8F4D34FD36DB7DD16D1F1888A7FDC40AC2B80E7ABABE9EBEFBE337C5D9351 - 00AA0AD0792AD8FFBFC8A40418E63FDC804872F6D9670B77F9759A585700A2AA - 400D0A409404D42D218146A868AEA34C64DFFF618316604EF40044E00F0140B7 - 13EB0A60FEC183F49941DE08403250A3254545FAEA99330D4F524940CE733E9B - 72FF3230E59CF0FFE7CD9B47A3468D72FAB20889750520DA35B86F5111357A23 - 3F5FFF78F66CE393D43E808E22EA00841D80B113702441F20F9280DC4EAC2B80 - A5870ED16A936CC09EF9F9D4489406AC1A813ACB53FC03DE6950DB8D02A0AAAA - AA88EF01880620C83BA8E7D9A596DD131C757575F42D8F15C7617657F088D771 - 24262652120B63C303FF87FC85047631F11CDFA5499326BED7F0FF286AC2CEC2 - DFB1E5E33F8EB0398BA623FE7FE3B3274C98404B972E0D38CE585700A20D4391 - 0EDCE8E54183F46DCB96199E04E1EFAF148063987500C6CC0F0B2096316B441A - EB0AE02316FEF74DD2813B0F1A448D9ECFCAD2775654189E04F3BFAFAAE77684 - 0327EAFF8D92645E78E105BAF1C61B9D1EA6A398A523C7BA0280F9BFD4A433D0 - 199999D4E8E98C0C7DCF860D8627A95660CE61B6031070AA03B09B501680311B - F8FE596072FFB4CBC8A046D3D3D3F51A932D9CAF4949A173D5268E8E702DFF78 - F30DA2B8FDFAF5A37FFCE31F4E0FD17194023066D39123F49A410769909C9E4E - 8D44BB01ABCD409D017DDD53D9FC3F64D0D5C5C91D80DC845200C6883609C16E - C18D26C5C5E9C74D3A87DCCC277568DAD4E9EF127320F037D0A49CD389F25F37 - A21480313B59AE5F3451008D7962172A00D50DD819B0F4F794C11A6EA74E9DE8 - 8B2FBE707A88AE4029006344DD817D0A40B900EEC4ACFBCFD8B163E9C9279F74 - 7A88AE40AD021823E502A820A0FB40DAEFF9264AF9DD77DFA55FFFFAD74E0FD3 - 15280BC018A920A068197078723265C47053052740E38F1906195CC898DBBB77 - 6FC4BBFFB815A5008C11ED10E45B062CCECCD4BFAAAC343C4925024516B4C54A - 3389FE63E71FEC00A4F801A5008C914A0412A5020FE48B78510C5FC44853CC3F - DA2D263F1A36FFC426A08A1F50310063A4528145C5406A57E0C8D2877DFF7506 - A5BF88FE6FDBB62DE2BBFFB81965011823550CA4CA81DD83A8F3CF238F3C42F7 - DE7BAFD3C374154A011823550EAC1A82B887913535F4AA41EA6F5C5C9CAFF4B7 - 8DEACF78124A011823D51044B50473071BD9ECEFC5E6BF514AD6E8D1A3E9E597 - 5F767A98AE43C5008C916A0986279A6A0AEA3866B33F58B97225656565393D4C - D7A12C0063A49A829E78A2DA823B8868F67762E30FAFA0148031B6B405571B83 - 841FD1EC8F757FACFF2B7E8A5200C6D8B23108505B83850FCCFE192669BF3D7A - F4F055FEA9A5BFC0280560CCC37BF6F8CACA8DD0641580DA1C347CE4B09FB6D4 - C44F5BB060010D1B36CCE961BA16A5000263697350D1F6E0792929748E2A08B2 - 9D45478ED03093620DE5FB8B510A20309BF9DE2A35B9B74EDA1EFC991E3DF4DD - EBD71B9E8C4CC00B63F442860BE4FC9FCBA6FF0E131FCD899EFF5E432980C020 - 03F03D9334E0F6EC5ADEB67EFD0F0A40940EAC9281EC6702FF388F9AA469AA9E - 7F7228051098C5870ED15A932C40A4018F282BFB4101889281CE8C8BA382D6AD - 9DFE4E518368D90F38B1E1A717510A203025FBF7D3BF4D3A7D210968E0E4C9FF - 092D6B2681C0667CDA3DEDDA39FD9DA20244652F3970805699FC38D8EA1B5B7E - 2BC4A84CC0C04CDBB387BE15AC00E0514A01807B590124AAA5A890316BF601D0 - E77FD3A64D949C9CECF4503D81B2007E0AE24B8FB2023043B3AA005477E0D079 - FBC811BAC224320BE6CE9D4B23478E74749C2B56ACF0EDBBF7FDF7DFFBF6EB6B - F8084EFDBF501EC1A99FDFF06F3424D0FB27B3EB8AF10622561580A81B30D04E - 5500D3D2D2F4BA5DBB0CDFA076080A8DAF8E1FA79EFBF651B589593660C000FA - E0830F1C1D2736FE4C4D4DF56DC2E975625501885A81B5484BA37B76ED3A5901 - BCD8BFBFBEC3409302B54B70F0608FBF4BD9EF5F6792978D5E7FEBD6ADA3CE9D - 3B3B3A56F8D3F0ABA381585500E57575B4820F23D2FBF7A71B57AC385901BC55 - 58A8AF292E367C93AA0A0C8E5A16FEFE02E1076EC9F7C766A32525254E0FC316 - 62550188AA00FB1416D215C5C5272B00A099C401E21A35A2FBD54A802520FCFF - C53EFF2A81395DC83FC873CF3DE7F4707DB46FDF9EF60802485E211615005699 - 1EC38ED2122B00405A0100B54B903C88C4FE8635F1DF04C28F629FCACA4A6AEE - 821B75F5EAD5BE04A468211615809500203849018876095271003920FC393CF3 - 2F3731C300FC7E08FF79E79DE7F4907D4C9A3489FEF0873F383D0CDB88450520 - F2FFB11BD084EAEAC00AE0952143F4CD8B171BBE5965048A81E975250BFF5281 - F0376BD68CDE79E71DEADFBFBFD343FE915FFEF297B46AD5AA80AFB5611730B5 - 7163A7876889DFB1F017C6D8CA952803F09C2143E8BAC58B032B00A009E20077 - A7A6FA1E153F05C29F5B53438B4DFAB00108FFDB6FBF4D975E7AA9D343FE91DD - BB7753C78E1D0D97FFE6A7A4D0D5AA22D4D558F5FF81250500D466A181C152DF - 0D870E4909FFA2458B5CB7B71F1A8EDE70C30D015FC3AFBD8B157F2B8F5900B1 - 86683350A08914808A035807FDFCAFE599DFACB417A0B5775959992B4B7CCD52 - 6A07C4C7D3FB6A09D8F588360239D5FF073F5100A5C386E99B162E34FC101507 - 3899297575F4473E447973107E08981BBBFB1CE69B06E6FF7E83D9E391A424BA - 27C682695E44E4FF9FCBF75EDEC285E60A0068023700F900B11E07406AEFF53C - EB8B22FD00C28F1C7F3724FA04E2C9279FA43BEFBCD3F0F50D3C7374577520AE - 067EFFC39205400D094A015CCBE660D718DE9E1A453D37B1BFBF87958008083F - 32EB9C2EF031E2282BB06EDDBAD1F6EDDB03BEDEA94913DAA6BA42BB9E60FC7F - 1050014CEBD041AFABAA32FCA058DD3014EBFBF7B19FF59449A7958640F867CD - 9AE54BAF752B66C13FF03F2D5AD01F55CCC7F588F6016C5800D490800AE0F5BC - 3C7D83414008C46283106CDBFD07F6F5AB24667D809D7C5F79E51557EFE6A3B3 - 42CBC8C8A08D1B37067C1DBFF30E36FF554768F723DA0320232F8FAE2E2D9553 - 004053CB813ED0B917FDFB360B22FC0D81AF5F5C5CECFAA61E6FBDF5160D1D3A - D4F0F5716CE9FD39062D3DAF11ACF90F0C15C0A4B838FDB84944B14762225DE5 - F21B3C1490C30FC1AFB050178F35FE993367BADAE46F8859E61F54FBB6D4543A - 43ADFDBB1ED12EC040B3AA005E1E3448DFB66C99E107466B56E0BFBEFBCEE7E7 - 8B52794F05453D58E6734B5EBF08341E193870A0E1EB05ACE05F8862051F2DC8 - 64FF751E3488AE5FB6CC9A02009AC00D88A62E4130A3FEC87E3EF6E8B3DA0B67 - ECD8B1F4D8638F51BC47564610F9EFD5AB97A1EF0FD4D29F371075FF019A899C - 9B2A80294949FA5193CD05A2A14908D6F11FE78B284AE10D44EBD6AD69F6ECD9 - AECCEC33E381071EA0871F7ED8F0F5DC84047A2D25C5E9612A241035FF884F4A - A2076A6B8353006FE4E7EB1FF30D6EC6787603923CE62762396F0ECFF458CEFB - 97A0534F20B0BC57545444BFFFFDEFA98DC7B64E5FB3660D6566669AF6FCFB3F - FE4E7DD4ECEF7AD070663A9BFF66F42A28A02B4B4A8253004013B8015EDA360C - D97B4F1D3E4C252CFC32493CA702C1CFCBCB234DD31CEFDD170C30FD2FB8E002 - 5A6FB20DDC109EFDDF54B3BF27106DFF0534818C0B15C0F4F474BD66C70EC3D7 - DBF34C71ABCB674144F2D18BFF4D36F383ED753B78F0609A3A752A9D7FFEF94E - 7F9DA079F0C107E94F7FFA93E1EB2D1B35A24D6DDBD2691EB3E8629559D5D5B4 - DBC4824D4E4FA7F13B7684A60044DB8601B7EE198035FC497575C2869C66A045 - 16FC6537D5EE07838CE9FF627232E527263A3D548504557C4F3F6752B50BFCDB - 7F999D23B586A709DC80BECD9AD160176E1E3AF4E0C1A0827BA06BD7AEBE19DF - 8DD57B5641B51F84DFCCF41F141F4FEF7A3CA01B4B88527F812621DF520AA038 - 3353FFAAB2D2F075E4028C4B4D75DDD661B9AC00165A540068D185CAB8ABAEBA - 8A1AB9ECFB0403D27D73727268E9D2A586E7C0F4FF944D7F95F4E30D10C49E21 - 58FB3F83157E6165A53D0A0068022BC08D0542B2160032F810DCBBEBAEBB3CED - E307E28E3BEEA0A79E7ACAF49C67D87ABB354AF239620151E30FA049CAB6B402 - 989498A81F37493774A315205200D888F3F6DB6FF7F5E5473FFC6863C68C1934 - 7EFC78D37354B71F6F2133FB378E8BA3078F1DB3570188760E026815D6DF45A5 - A3660A005B704340BC92BD671551A10F80E9BF8E853F168ABAA205B4FC2E3769 - FB0D1AEEFC23C2D2742D2A1042F9E85D2EAA0F3053004F3CF184CF3C8E4610F1 - CFCECEA6432629A210F97758F80744A9028C4630EB3FCEB3FFB736CDFEC092A4 - 2E18354A5F3F77AEE9396E4A0C325300D3A74FA771E3C6393D44DBD9BC79B34F - F8BFF9E61BD3F3D4929FF79049FCE9316A140D9F3B373C0A00C858016E691662 - B60A108D0A0033FF65975D26DCDB4F75F9F126D3F877359BFD816651A62D2B80 - F9B9B9FAC6B232D373DC5225184B2EC08A152BE8F2CB2F3735FBC1F53CEBCF56 - 65BE9E036BFE4B05BF6DF7DC5C1A5156165E050034C19260AB264DE80E173492 - 8C150580801F9631BF1524865CC2FEE17BECF7BB2546A39047D4F20B6841C873 - 5077C2BC9C1C7DCB9225A6E7B8C10A888518C0BC79F3A8A0A0C034C5179CC34A - B9B2756BB5BB8F0791A9F93F75CF3F59829E0A34092BE0B76DDA383ADB44BB02 - 78F4D147E9BEFBEE139E87D6DEEFB3D9AF96FBBC0722FFCF56578765F607414B - E7EC0103F4EDCB979B9EE3F43662D1EA02D4D4D4F866FD85263B38F939AF6953 - 5F8EBF4AF3F526A2EDBE41A70103287FF9F2C82A00A009AC00CCFEBF6DDBD631 - B3D36C15C0AB0AE0934F3EA1DCDC5CDAB2658BF0DC7E3CE3BF9392A2CC7E8FB2 - 8F677D54FC1DB339F2DF909014C0F35959FACE8A0AD3739C6C1B166D2EC08B2F - BEE8EB44240AF60124F8BCC966BFD7BA3529FE83A8DD17E8989545632A2A9C51 - 00401358016038DF88190E249D448B0B80725E083EB61893015D7DCAF89AAB68 - BF77D9505F4F0BD8D513A18528C321DF218B0A0AF475821B130141340D8974A1 - 503458009F7EFAA96F89CFAC96BF21AA9DB7F79149F905A27E7F32D8229153DB - B4D1EB05DD499C2817F6B20580FE7D0F3DF490AF298968890F20BEFF47BEBE13 - 5C9286AD081E9972DF449E50275457872CBFB64DC99A842B10E9D6615EB5002A - 2A2AE8A69B6E32EDDBDF900EECE7CF4F49F125FA28BC8D4CAB2FA0D924BBB629 - 0051D7207026DFA005AD5BDBF5278578AD1600CB7B68352E6AE0D11004FB4AD9 - E46FA7827D5141C9FEFDF46F81C527DBED47065B9D7251A110886486A0975C00 - A4F36287A11D261D984F4515F5441732197F40B3516E6D55004B8A8AF4D53367 - 9A9E83C8F4EDEC0A244760CB692FB800AB57AFF665F32D1724553504B33D0A7A - 06AB5AFEA8A1E6FBEFE9698935FFBE4545943373A63B1500989696A6D7EDDA65 - 7A4EA45C01375B00DBB66DA3FBEFBF9F5E7BED354BEF43F75ED4F2ABCCBEE8E2 - 7916FEAF05EDEB5BA4A5D13DBB76D92AB3615997D3240282915815709B024087 - DEFDECE36167A159B3664945F7FD60D67F8CAFD768D5C423EA9089FA032D0CF2 - 1A160550929DAD7F595E2E3CEFDA56ADA86B18CD5837B900E8D083E0DE4C7691 - 4435FB3FB94E2CF48FB3F0AB405FF4B199EFCF52BE4F458492EF6F46D8327344 - 5D8441B313B502E14A5775C32A0072F7B175786969A9A5191FA4376942CFB66C - A97CFD28057EFFFFB2E92F4AF869CC13C083F5F56191D5B0A6E66912AEC0E94D - 9BD29830ED2DE8940B0053FF9D77DEA169D3A6590AEEF9C16AFE9866CDE8CF3C - EBBBA9CDBAC25E64FC7EA085514EC37A77C9B40F03E18A07445A0120671F0D3A - D06E5C3689E75490C73FB5450BEAEEC2BD1615F621EBF767E4E5D1D5A5A5DE54 - 00E0892E5DF4FD5BB70ACF0B473C20523180DDBB77FB7C7B04F6440D398DE8C5 - 02FF049BFB2A9B2FFAD972F428BD7AE080F0BCD65DBAD09D5BB786554623625F - CAC6036EB1393F20DC0A00FEFDE38F3FEEF3EF654A7403816E3D0FF18C7F9D8A - EEC704D27EBFC5FEFEC112310753938807B4E759F0A6D6AD6D2B630D870B80F5 - FB575F7D95E6CF9F2F5DA11708E4EF8F63D7E72EF6F555D96E6C80249F17F6EF - A7DD0EFBFD0D89D89D573A6C98BE49A285959D0D44ECEA088425BC3973E6D082 - 050B68D5AA55218DE9E7ACE4C6B3E08F645F5F097EEC00E1C7729FA8C1073877 - D830CA5BB830BA140078BC7367FD00CFA022BAB3705C9D9212F2DF0BC50580D0 - BFF1C61BBEA0DECA952B431E0B32F8EE66C11FA496F46292D7F95EDC28B15375 - ABCE9DE9AE6DDB222697119F8264E201A02F9BC6835BB60CE96F59550028C479 - F7DD777D267E30CB77A782705E017F8F3BF95051FDD8051B7AAC9688118573BD - DF08476C504D221E0042DD6D58140340A79DF2F2727AEFBDF768D9B265B47DFB - 765BBE1F32F66E65A12FE24365EFC53632BBF9FAD11C90474714C0EB7979FA86 - D252A97343291F365300AD5BB7F6E5E5DB095A7063B647BEBE4AE051C896F782 - 70AFF71BE1D85D2AB3AF809FBC94143A2721C1F2DF3053007681E5CB1CF6EB61 - EAAB945D851FD91C7F10AE3C7F191C9DA666F5EEAD57AD5D2B3C0FD172AC0C74 - B49824132E0580515CC60A69041F57B0D0ABD6DB8A86EC3C76CCD7D25B54DB0F - 3AF4EE4DB7AE5DEB981C3A6EA7CA660A62A61DCD66BB959E82762A0008FDC52C - EC7958A1E0436DB6A108047AFACD61D75294E8032291E927C2710500A675E8A0 - D7555509CF8312B8D68225609607200B76D719C93E3D045F05F4146660E6478A - AF8CF0B7E8D081EEA9AA725CFE1C1F809F294949FAD1DA5AE1797007B0D1884C - 4C20180BA0257F7E36CFF4D92CF8D7B0E0ABCE3B0A1990DF5FC6F79B8CD96F57 - 4B6F3B70C520FCC8E6080099D5011905005B229385FD372CF4E8B09BA58A7114 - 16B112ED7762ADDF0CD70CC48F4C67613FA23C01230580CABB5FB3B00FE403D5 - 776AC94E112C56D6F92355E06305570DC68F26992804CC3206FD3100E4DF0FE0 - 8B3FE08469AF02780A3B90CDF0F3A3B950DE5C37203F9A052560543BB0E6BBEF - E84C167615BC53D88D6C6EBF1FCDA5B2E6CA41F9B1E20EA08A100943AAC24E11 - 4EEA75DD27FC32557DC08D667F435C3B303F560283E827701D2B81486C3AA288 - 3D6A8F1FA7B9070E48D5F303B705FC02E1EAC1F991D97DD80F7205AE642510CE - 76E38AD803A9BD6FD6D448ADF103372DF599E1FA01FA914D16F2E3C476E48AE8 - 44B681A71FB724F9C8E08941FA914D1BF6832DC89034A45C024530A07FDF029E - F545BBF536C40DE9BD56F0CC40FDC81610F9814B3054327350A1F083CCBE4507 - 0F4A9BFCC0E9C29E60F0D460FD582925F663478721456C60D5E4074E96F48682 - E706ECC74A53113F7009AE4A495189408A80C0E47F8D677D99DD7A1AE254330F - 3BF0E4A01B62255700204F60705252D05D8614D109F2F997F2CC2F53CCE3C7ED - 6BFC32787AF07E64BB0D3704D6005C022BFD0514D107EAF791D26B25D00722DD - BD375C78FE0BF891DD77E054101BC072A1CA208C2D30D3C3D7B792CBEF27927D - FBC34D547C898658750900560AFE9BAD810CB53D574CB0A1BE9EFEC2B3BE9508 - 3FF042669F55A2EACBF8B19A2FE007F5044392935590304AD9F7FDF7BE59FFB3 - 20BA44796D7D5F96A8FB427E64B7263F15B80259CD9BD3457C28B7203A80B9FF - D1E1C354C18795209F9FEEB9B934A2AC2C2A6F86A8FC520DB1524CD490564D9A - D0C0162D945BE07110DD5FC1827F80677FAB44A3C97F2A51FDE5FC946467EB5F - 969707F55E280258047DD5B2A1A74070AF2248C1075E4DECB14AD47FC1864C4B - 4BD3EB76ED0AEABD500417B012E8ABB6F3762D30EF21F8FFC747B082EFA5421E - 3B88992FEA67495191BE7AE6CCA0DF8F1583BE6C1164F2A17A09BA0334E958C5 - B3FD3FF8B01AD96F48DFA222CA993933A67ED498FAB20D29CECCD4BFAAAC0CFA - FDB002600D5CDCA28552040E01C1FF7B5D9D6FD60F26B8E7E7F47EFDE8E655AB - 62F2478CC92FDD102BCD46020145D02B31917AB3325059859101D97B6B59E8D7 - D5D78724F85E69DA114E62FACBFB595450A0AF2B2909F973D092EC7C560638D4 - 7E81F682765C9FB0C0E3906DC96546AF8202BAB2A424E6EFFF98BF000D793E2B - 4BDF595161CB6721A9A84742826F1951050D8303B33B5A71AD61A1976DC229A2 - 6356168DA9A8503FC809D485084030FD068C80F09FCB8A00D58767AB5D87A440 - 338E7FB1D06F62E10FC5C46F48AC2CEB59455D10135E193244DFBC78B16D9F87 - 1504C40ACE62EBA0132B036519FC00847CFBB163B495051EC21FEC125E20BAE6 - E4D0C8254BD48536405D18099056FCD99B6F92D52223112849C6F133B6103A36 - 6D1A330A0102BF93FDF8CF59E0B7B3C0EF6181B76BA607A8D3EF367468D4A6EF - DA89BA401658306A94BE61FE7CDB150180F0631501B1832E7CA4459942F882AF - D9972CECF0E511C5B753E0FD40F033468CA0E173E746CF850B33EA4205C15B85 - 85FABA397328981A035920FC1DF9863E8D15018E56AC14DAF2FFB93DE7006BF3 - 30E1AB58E0F7F2E3372CEC3BF9793804DE0F04BF577E3E5D515CECEE8BE342D4 - 050B9150138AAC8238422A2B041C6D9B34A176FC8823D225CC28ADDDC7C20D21 - C7F3BD78CE4728997856392333930A2B2BD53D1C02EAE2D9C4FB1327EA1FB355 - 50B36387237F1F16430B5602CDF931811FE3F9B1393F363DF15AB313FF877588 - 447E8E73A04CBE6381854373E4F871AAE703CF8FF2FF7D8BE7FC8815F7C3FC1C - FF87730E9F98E19D22393D9D7A8E1E4D03274F56F7AE0DA88B1806DEC8CFF7F5 - 22385A5BEBF450A282F8A4243AEFEAAB55E24E18501734CCBC3C6890BEBDBC3C - 2C81C368067E7DA7EC6CBA7ED932758F861175712308F6328032B0B2C7612C81 - 525C08BD577BEC7B1175A11D04F9055F7CF00185528CE465508C03818F960EBB - 5E445D781781CCC31D1F7D14B50A01029F7ED14574DDE2C5EABE7309EA877031 - C837D8B7650BEDDDB4C9736E438BB4344AEDDE9DDA76EDAAD6E75D8CFA613C08 - 961CF77EF619EDE3632F2B887026249981A699A92CE06DBB75A3543ED4D29CF7 - 503F58940225517FF0201DABABA323870ED1117E8E65C9233535BE7FE3F9517E - 04F12D5BFA96DA12F8312139F987E72929BE7FC7A1E3113F57C21D9DFC3FB05B - 459D4B95757A0000000049454E44AE4260822800000030000000600000000100 - 0800000000000000000000000000000000000000000000000000000000000202 - 04000505070004040B0003030E0004040D0008080B000A0A0E000C0C0E000404 - 1200050514000C0C100006061A0006061D001111160015151A00060621000707 - 280007072C001B1B20001D1D22000808350008083B0022222800242429002828 - 2E002E2E2F0036363A0039393D003C3C3C000808470008084B0008084D000707 - 50000808530008085A0008085F003E3E42000909660009096A000A0A71000A0A - 76000B0B79000B0B7D004343470044444700464649004A4A4C00535354005757 - 57005B5B5D00666667007171710077777700787878007D7D7D00000080000606 - 83000B0B8100090984000C0C85000404890005058F000C0C890016168B001717 - 8C00070790000D0D91000D0D96000606990006069D000D0D9900222291003434 - 9A003E3E9E000707A3000E0EA0000E0EA6000707A9000909B1000F0FB2000909 - B5001010B4001010BA005050A7005757AB007272B8000E0ECE001111C2001111 - C9001212D1001212D6001010DA001010DE001313E1001414E3001212E6001414 - E7001414E9001515EE001414F3001515F5001616FA001515FE00808080008A8A - 8A008D8D8D00929292009A9A9A009E9E9E00A1A1A100A7A7A700AAAAAA00B0B0 - B000BDBDBD00C9C9C900D0D0D000D7D7D700D9D9D900DDDDDD00E2E2E200E5E5 - E500EBEBEB00EDEDED00F1F1F100F5F5F500F9F9F900FEFEFE00000000002F26 - 000050410000705B000090740000B08E0000CFA90000F0C30000FFD21100FFD8 - 3100FFDD5100FFE47100FFEA9100FFF0B100FFF6D100FFFFFF00000000002F14 - 00005022000070300000903E0000B04D0000CF5B0000F0690000FF791100FF8A - 3100FF9D5100FFAF7100FFC19100FFD2B100FFE5D100FFFFFF00000000002F03 - 0000500400007006000090090000B00A0000CF0C0000F00E0000FF201200FF3E - 3100FF5C5100FF7A7100FF979100FFB6B100FFD4D100FFFFFF00000000002F00 - 0E00500017007000210090002B00B0003600CF004000F0004900FF115A00FF31 - 7000FF518600FF719C00FF91B200FFB1C800FFD1DF00FFFFFF00000000002F00 - 20005000360070004C0090006200B0007800CF008E00F000A400FF11B300FF31 - BE00FF51C700FF71D100FF91DC00FFB1E500FFD1F000FFFFFF00000000002C00 - 2F004B0050006900700087009000A500B000C400CF00E100F000F011FF00F231 - FF00F451FF00F671FF00F791FF00F9B1FF00FBD1FF00FFFFFF00000000001B00 - 2F002D0050003F007000520090006300B0007600CF008800F0009911FF00A631 - FF00B451FF00C271FF00CF91FF00DCB1FF00EBD1FF00FFFFFF00000000000800 - 2F000E005000150070001B0090002100B0002600CF002C00F0003E11FF005831 - FF007151FF008C71FF00A691FF00BFB1FF00DAD1FF00FFFFFF00000000000000 - 0000000000000000000000000056554A483B3B484A5556000000000000000000 - 0000000000000000000000000000000000000000000000000000543B383D4246 - 4F52534E4B4339383B5400000000000000000000000000000000000000000000 - 00000000000000003B393D505E676666666666666667665E513D383C00000000 - 0000000000000000000000000000000000000000000040384B5E676766666666 - 666666666666666666665F4D3841000000000000000000000000000000000000 - 000000004938475F66666666666666666666666666666666666667675E453849 - 0000000000000000000000000000000000000041395767676767666666666666 - 66666666666666666666666666665A3941000000000000000000000000000000 - 0000394261676767676767676666666666666666666666666666666666676761 - 423B0000000000000000000000000000003846652923475F6767676767676766 - 6666666666666666666666666666666666463800000000000000000000000000 - 394C6667240807011F5266676767676666666666666666666666666666666667 - 6766463900000000000000000000004142656767242E7E6F25000C2B63676767 - 6766666666666666666666666666666666666642410000000000000000004939 - 62666767242E8F8F8F77360E0A47666766666666666666666666666666666666 - 6667676139490000000000000000385767676666262E8F8F8F8F8F7C34011662 - 67676766666666666666666666666666666666665A3800000000000000414766 - 66666767242E8F8F8F8F8F8F8F7414105B676666666666666666666666666666 - 66666667674541000000000000385D6767666666262E8F8F8F8F8F8F8F8F7A1C - 055B676767666666666666666666666666666666665F3800000000003B4D6666 - 66666667241A7B8F8F8F8F8F8F8F8F7E1B126567676767666666666666666666 - 6666666767674B3C00000000385E6767666666664D0C08347A7F8F8F8F8F8F8F - 790B26676767676767676766666666666666666666665F380000005442666666 - 666666666666430C026D8F8F8F8F8F8F8F70005E676767676767676766666666 - 666666666767673D5400003B4F67676666666666666666663C02688F8F8F8F8F - 8F7F0F2A67676767676767676767676666666666666666503B0000385E666666 - 6666666666666666674C01327F8F8F8F8F8F360C44444444444444475B666666 - 666666666667675C38005638676767666666666666666666666658026D8F8F8F - 8F8F75080B0707080B0808004467676666666666666666673956554366666666 - 6666666666666666666767270F7D8F8F8F8F8F8F8F8F8F8F8F8F8F0B47666666 - 666666666666676742554A466767666666666666666666666666666306688F8F - 8F8F8F8F8F8F8F8F8F8F8F0B446767666666666666666667464A484E67666666 - 6666666666666666666667673C06798F8F8F8F8F8F8F8F8F8F8F8F0B47666666 - 66666666666767674E483B5167676766666666666666666666666666660B698F - 8F8F8F8F8F8F8F8F8F8F8F08446767666666666666666666533B3B5366666666 - 66666666666666666666666767222F8F8F8F8F8F8F8F8F8F8F8F8F0847666666 - 6666666666666767513B484E6767676666666666666666666666666666440B8F - 8F8F8F8F712D2C2D2D2E2E024467666666666666666666674E484A4667676666 - 666666666666666666666667675A00748F8F8F8F730022262627272759666666 - 6666666666676767464A5542676767666666666666666666666666666667076B - 8F8F8F8F7F0E2A67676766666666666666666666666666674355563966676666 - 666666666666666666666667676720308F8F8F8F8F370A656766666666666666 - 6666666666676767385600385C6767676766666666666666666666666666400E - 8F8F8F8F8F79023F6767676766666666666666666666675B3800003B4F676767 - 66666666666666666666666666675A00738F8F8F8F8F69015267676666666666 - 666666666767674F3B0000543D67676767666666666666666666666666666610 - 687F8F8F8F8F8F330359676767676666666666666667663D54000000385E6767 - 66666666666666666666666666676727198F8F8F8F8F8F7F2E01285F67666666 - 6666666767675D38000000003C4B67676767666666666666666666666666665A - 026E8F8F8F8F8F8F7F6C0E000C3C66666666666667674B3C0000000000385E67 - 67666666666666666666666666666767280B798F8F8F8F8F8F8F7E721D1F6666 - 66676767675D3800000000000040456767676767666666666666666666666666 - 66111D7C8F8F8F8F8F8F8F8F331E67666667676767454100000000000000385A - 67676766666666666666666666666666675B0D18778F8F8F8F8F8F8F331E6767 - 6767676757380000000000000000493861676767676766666666666666666666 - 666663150E6A7E8F8F8F8F8F331E676767676761384900000000000000000041 - 3E656767676666666666666666666666666667662A021469768F8F8F331E6767 - 6767643E41000000000000000000000039466767676767676666666666666666 - 666666666661260C02183672311E676767674639000000000000000000000000 - 00384665676767676766666666666666666666666666666658281100001E6767 - 644638000000000000000000000000000000393E606767676767676767666666 - 6666666666666666666667635958676142390000000000000000000000000000 - 0000004138576767676767676767676767676767676767676767676767675738 - 41000000000000000000000000000000000000004938455D6767676767676767 - 6767676767676767676767675D45384900000000000000000000000000000000 - 00000000000040384B5D676767676767676767676767676767675D4B38400000 - 0000000000000000000000000000000000000000000000003B383D4F5C676767 - 676767676767675C4F3D383B0000000000000000000000000000000000000000 - 00000000000000000000543B38383E464E51514E464238383B54000000000000 - 000000000000000000000000000000000000000000000000000000000056554A - 483B3B484A555600000000000000000000000000000000000000FFFFE007FFFF - 0000FFFF0000FFFF0000FFFC00003FFF0000FFF000000FFF0000FFC0000003FF - 0000FF80000001FF0000FF00000000FF0000FE000000007F0000FC000000003F - 0000F8000000001F0000F0000000000F0000F0000000000F0000E00000000007 - 0000E000000000070000C000000000030000C000000000030000800000000001 - 0000800000000001000080000000000100000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000000000000000000000000000000000000000000000000000000000000000 - 0000800000000001000080000000000100008000000000010000C00000000003 - 0000C000000000030000E000000000070000E000000000070000F0000000000F - 0000F0000000000F0000F8000000001F0000FC000000003F0000FE000000007F - 0000FF00000000FF0000FF80000001FF0000FFC0000003FF0000FFF000000FFF - 0000FFFC00003FFF0000FFFF0000FFFF0000FFFFE007FFFF0000280000002000 - 0000400000000100080000000000000000000000000000000000000000000000 - 000000000000030305000B0B14000C0C16000E0E1D0012121F000F0F22001313 - 220017172300101024001919270012122D0014142F00191928001D1D29001E1E - 2F001313340014143A0012123C0015153F00222231002A2A3A002C2C39003131 - 3D001212450010104B001616480012124E0013135200323243003A3A46001717 - 660012126A001414690012126E000F0F7D001111700013137E00454554004B4B - 570050505E005E5E6A0063636F00676772006D6D77007373780078787F000606 - 8400090987000A0A88000E0E8E0012128E0015158E000D0D95000E0E9D001010 - 92001919910010109A0010109C002E2E9B0031319F000E0EA8001010A3001010 - A6000F0FB7001010BA001010BF006262B4007A7ABE000D0DC2001212CE000F0F - D0001212D1001010DA001212E7001414E7001414E9001313EE001414EC001414 - F1001414F5001616FB001616FE00808085008C8C8F00969699009E9E9F00A0A0 - A100AEAEAE00B7B7B700BEBEBE00D6D6D600DADADA00E2E2E200E4E4E400E9E9 - E900EEEEEE00F0F0F000F6F6F600F8F8F800FEFEFE004CB0000059CF000067F0 - 000078FF11008AFF31009CFF5100AEFF7100C0FF9100D2FFB100E4FFD100FFFF - FF0000000000262F0000405000005A700000749000008EB00000A9CF0000C2F0 - 0000D1FF1100D8FF3100DEFF5100E3FF7100E9FF9100EFFFB100F6FFD100FFFF - FF00000000002F26000050410000705B000090740000B08E0000CFA90000F0C3 - 0000FFD21100FFD83100FFDD5100FFE47100FFEA9100FFF0B100FFF6D100FFFF - FF00000000002F1400005022000070300000903E0000B04D0000CF5B0000F069 - 0000FF791100FF8A3100FF9D5100FFAF7100FFC19100FFD2B100FFE5D100FFFF - FF00000000002F030000500400007006000090090000B00A0000CF0C0000F00E - 0000FF201200FF3E3100FF5C5100FF7A7100FF979100FFB6B100FFD4D100FFFF - FF00000000002F000E00500017007000210090002B00B0003600CF004000F000 - 4900FF115A00FF317000FF518600FF719C00FF91B200FFB1C800FFD1DF00FFFF - FF00000000002F0020005000360070004C0090006200B0007800CF008E00F000 - A400FF11B300FF31BE00FF51C700FF71D100FF91DC00FFB1E500FFD1F000FFFF - FF00000000002C002F004B0050006900700087009000A500B000C400CF00E100 - F000F011FF00F231FF00F451FF00F671FF00F791FF00F9B1FF00FBD1FF00FFFF - FF00000000001B002F002D0050003F007000520090006300B0007600CF008800 - F0009911FF00A631FF00B451FF00C271FF00CF91FF00DCB1FF00EBD1FF00FFFF - FF000000000008002F000E005000150070001B0090002100B0002600CF002C00 - F0003E11FF005831FF007151FF008C71FF00A691FF00BFB1FF00DAD1FF00FFFF - FF00000000000000000000000000433C382F2F383C4300000000000000000000 - 000000000000000000000043313945494A50504A494539314300000000000000 - 0000000000000000004431404F525252525252525252524F4031440000000000 - 00000000000000003B3F4F52525252525252525252525252524D3F3B00000000 - 0000000000000034414952525252525252525252525252525252524234000000 - 00000000000034474B0110324B52525252525252525252525252525247340000 - 00000000003B42524B0F5C2E0A1A485252525252525252525252525252423B00 - 00000000443F52524B0F6F6F6F5A0A3352525252525252525252525252523F44 - 00000000314D52524B0F6F6F6F6F6127184B5252525252525252525252524D31 - 00000043405252524B08626F6F6F6F6F55125252525252525252525252525240 - 430000314F52525250220553636F6F6F6F2B255252525252525252525252524F - 300000395252525252524E2017606F6F6F610451525252525252525252525252 - 390043455252525252525252370E616F6F6F281B1F1F1F1F2452525252525252 - 45433C49525252525252525252232C6F6F6F5E59595959590352525252525252 - 493C384A52525252525252525250065D6F6F6F6F6F6F6F6F0352525252525252 - 4A382F505252525252525252525236296F6F6F6F6F6F6F6F0352525252525252 - 502F2F50525252525252525252524E0D6F6F6F615B5C5B5B0352525252525252 - 502F384A52525252525252525252520B5F6F6F5B011313131952525252525252 - 4A383C49525252525252525252525221586F6F6F144952525252525252525252 - 493C434552525252525252525252523D2A6F6F6F542452525252525252525252 - 4543003952525252525252525252524E0D6F6F6F63163E525252525252525252 - 390000304F5252525252525252525252115C6F6F6F5F0E21465252525252524F - 300000434052525252525252525252523E266F6F6F6F6257151C525252525240 - 43000000314D52525252525252525252521B53646F6F6F6F610C525252524D31 - 00000000443F52525252525252525252524E1C1E5F6F6F6F610C525252523F44 - 00000000003B425252525252525252525252523A0756616F610C525252423B00 - 00000000000034475252525252525252525252524922091D2D0C525247340000 - 0000000000000034425252525252525252525252525252483532524234000000 - 00000000000000003B3F4D52525252525252525252525252524D3F3B00000000 - 0000000000000000004431404F525252525252525252524F4031440000000000 - 000000000000000000000043303945494A50504A494539304300000000000000 - 0000000000000000000000000000433C382F2F383C4300000000000000000000 - 0000FFF00FFFFF8001FFFE00007FFC00003FF800001FF000000FE0000007C000 - 0003C00000038000000180000001800000010000000000000000000000000000 - 000000000000000000000000000000000000800000018000000180000001C000 - 0003C0000003E0000007F000000FF800001FFC00003FFE00007FFF8001FFFFF0 - 0FFF280000001000000020000000010008000000000000000000000000000000 - 00000000000000000000000000003F3F69002A2A720044447700272784002323 - 8F002C2C8F003535870033338C0035358E002A2A91002D2D910023239A001F1F - A1001F1FB1001C1CBF002323A0002525A4003333BE0040408700515181005555 - 86005F5F80006363870062628E0066668E00696989004747B4004A4ABC001515 - C3001515D4001919D6002828C5001717E5001515F3001515FA001616FE006969 - C1007E7EC8009797AA00AFAFBB00BABAC700C2C2C800CDCDD400D1D1D300D5D5 - D800DDDDE000E4E4E500F1F1F100F9F9F900FFFFFF0000704C000090630000B0 - 790000CF8F0000F0A60011FFB40031FFBE0051FFC80071FFD30091FFDC00B1FF - E500D1FFF000FFFFFF0000000000002F0E00005018000070220000902C0000B0 - 360000CF400000F04A0011FF5B0031FF710051FF870071FF9D0091FFB200B1FF - C900D1FFDF00FFFFFF0000000000022F00000450000006700000089000000AB0 - 00000BCF00000EF0000020FF12003DFF31005BFF510079FF710098FF9100B5FF - B100D4FFD100FFFFFF0000000000142F000022500000307000003D9000004CB0 - 000059CF000067F0000078FF11008AFF31009CFF5100AEFF7100C0FF9100D2FF - B100E4FFD100FFFFFF0000000000262F0000405000005A700000749000008EB0 - 0000A9CF0000C2F00000D1FF1100D8FF3100DEFF5100E3FF7100E9FF9100EFFF - B100F6FFD100FFFFFF00000000002F26000050410000705B000090740000B08E - 0000CFA90000F0C30000FFD21100FFD83100FFDD5100FFE47100FFEA9100FFF0 - B100FFF6D100FFFFFF00000000002F1400005022000070300000903E0000B04D - 0000CF5B0000F0690000FF791100FF8A3100FF9D5100FFAF7100FFC19100FFD2 - B100FFE5D100FFFFFF00000000002F030000500400007006000090090000B00A - 0000CF0C0000F00E0000FF201200FF3E3100FF5C5100FF7A7100FF979100FFB6 - B100FFD4D100FFFFFF00000000002F000E00500017007000210090002B00B000 - 3600CF004000F0004900FF115A00FF317000FF518600FF719C00FF91B200FFB1 - C800FFD1DF00FFFFFF00000000002F0020005000360070004C0090006200B000 - 7800CF008E00F000A400FF11B300FF31BE00FF51C700FF71D100FF91DC00FFB1 - E500FFD1F000FFFFFF00000000002C002F004B0050006900700087009000A500 - B000C400CF00E100F000F011FF00F231FF00F451FF00F671FF00F791FF00F9B1 - FF00FBD1FF00FFFFFF00000000001B002F002D0050003F007000520090006300 - B0007600CF008800F0009911FF00A631FF00B451FF00C271FF00CF91FF00DCB1 - FF00EBD1FF00FFFFFF000000000008002F000E005000150070001B0090002100 - B0002600CF002C00F0003E11FF005831FF007151FF008C71FF00A691FF00BFB1 - FF00DAD1FF00FFFFFF000000000000251C12121C250000000000000000262023 - 2424242423202600000000001B0D0E23242424242424211B0000002621092C17 - 112424242424242126000020240832322B0724242424242420002523241F032E - 32280F242424242423251C24242424042D321A1515102424241C122424242424 - 143232323206242424121224242424240B313016180C242424121C2424242424 - 1D2A321324242424241C25232424242424153229052224242325002024242424 - 240C2E322F012424200000262124242424240A2731192421260000001B212424 - 2424241E0A02211B000000000026202324242424232026000000000000000025 - 1C12121C250000000000F81F0000E0070000C003000080010000800100000000 - 000000000000000000000000000000000000000000008001000080010000C003 - 0000E0070000F81F0000} - OldCreateOrder = False - OnActivate = FormActivate - OnCreate = FormCreate - PixelsPerInch = 120 - TextHeight = 16 - object tmrWatchDog: TTimer - OnTimer = tmrWatchDogTimer - Left = 16 - Top = 8 - end -end +object frmMain: TfrmMain + Left = 585 + Top = 543 + Width = 805 + Height = 266 + Caption = 'FFDec Flash Player' + Color = clWhite + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'MS Sans Serif' + Font.Style = [] + Icon.Data = { + 0000010004000000000001000800EC310000460000003030000001000800A80E + 0000323200002020000001000800A8080000DA40000010100000010008006805 + 00008249000089504E470D0A1A0A0000000D4948445200000100000001000806 + 0000005C72A866000031B34944415478DAED9D0B7C14D5F5C70F8F3C8090F008 + 041523521031451E159AF8A041FEB4F28F88429428A08912B51A54A80F94FEED + 940AA258F081CADFA841010D1A10458A1695482B49E15F40298280881435BC02 + 84040328F33FBF95B50177E6DED99DDD99D9BDDFCF673EBBB0B39BBBB373CE3D + E7DC73CE6D448AA8E4FD8913F5FA8307E9686DADEF38C2CF8F1C3A4447F9F03D + E2FFF911C4B76C49F149499480473EF0989092E2FB3F1C89FC7CE0E4C98D9CFE + 4E0AFB513FAA078170EFFDEC33DAC7C7DE2D5BE8787DBD23E3689C9848A95DBB + 52DB6EDD28950FA524BC87FAC15CCC5B85853F0A7ADDAE5D4E0FC7122DD2D27E + 540C571417ABFBCCA5A81FC645BC326488BE7DF9729F791E8DC09DE83460005D + B778B1BAEF5C82FA211CA474D8307D7B7939D557573B3D1447486CD3863A6567 + 53DEC285EA3E740875E123C8EB7979BE19DE6BE67CA480DB000BE1EAD252755F + 460875A1C3CCCB8306E9DB962D737A189EA4F3A04174FDB265EA1E0D23EAE286 + 8137F2F3F58D656551EBCB471AC40EBAE7E6D255B367ABFBD566D405B5092CCD + 7D3C670ED5ECD8E1D8185A356942CD1B35A284C68D299E1F7124F21177E27933 + FEFF383E2F911F134E3C07C7F83872FC38D5F381E7DFF2E3515DA7637CD4F371 + F4C481730EF3E381EFBF77EC3B26A7A753CFD1A3D592A34DA88B1822C59999FA + 57959511FB7BCD5890539B36F51D6D59E053F9687BE27924D9C74A60DF77DFD1 + 5E3CF2B117CFF9F8961544A4382333930A2B2BD53D1C02EAE20501D6E7D7CD9E + 4DC78F1D0BDBDFC0ACDD312E8E4E83B043D04F083D667437038BC1AF0CA01CBE + E1C79D7C9D8E85513134E6EBD42B3F5FE51B0481BA601658306A94BE61FEFCB0 + 083E04BE030BF8D9F1F1D4858F347E1EE77261B7C2177CCDBE3C7A94BEE0A38A + 95423814021441C68811347CEEDCE8B97061465D2809E6E7E6FA827A767326DF + B0387E9690401DA34CE0CD80F0EF6425F0F99123B49D15C2D7FCDC6E10341C51 + 56161B173404D40532615E4E8EBE65C912DB3E0FFEFBCF1313A90B0B7C2716FC + 581178115008DBD942D8CA0AE15FF5F5B6C611BAE6E4D0C8254BD48536405D98 + 00CC1E30C097B0630710F27359E07B356B4667C7C585FE813100DC8575DF7E4B + 9B5821D8E52A20C1287FF97275BF9F82BA200D783E2B4BDF595161CB67C197EF + C1829FC133BE9AE98303C2BF812D82F5AC08103BB0838E595934A6A242FD2027 + 501782595450A0AF2B2909F973DAB31FDF8305BE271F498D1B3BFDB5A28ADAE3 + C7E96328033E76DB1033E8555040579694C4FCFD1FF317606A9B367A28C53898 + DD7BB1C0F766131F517C45F8C12AC25A7611D6B13208C5454031D284EAEA9896 + 8198FDF2CFF5EBA77FBD6A55D0EF87E0F765A1CF6CDE5CCDF60E01ABA0F2F061 + 5ACDCA201445707ABF7E74F3AA5531290B31F7A5971415E9AB67CE0CFAFD88E4 + F765A187E0BB3D29275640F2914F11F011CA0A42DFA222CA993933A67ED498FA + B2D3D2D2F4604B7121F817B568E19BF55550CF9DC00A8035F0515D5DD08AA045 + 870E744F5555CCFCC031F1454BB2B3F52FCBCB837A2F0A6CFAF36CAFA2F9DE01 + 8A00F1810AB608822D5C3A2B3B9B0ACACBA3FE078FFA2F382931510FA669A65F + F0B17EAFF02EC8275811A42240D3D307EBEBA35A46A2F6CB059BBE8B593E8B05 + FF223ED48C1F1DC022F88895002C82608285D19C561C955FEA892E5DF4FD5BB7 + 5A7E1F9277FEBB65CB8897D62A2203CA96FF72E850504945ADBB74A13BB76E8D + 3A7989BA2F34292E4EB75AAD87001F041F7EBE22FA4176211481D54021AA0D1F + 3C762CAA64266ABE0C3AEC6E5AB8D0F2FB10D51F80DD6F94B91F53C01578AFB6 + D6B76A609573870D8B9A4EC651F1251EEFDC593FB06D9BA5F7A00C7730CFFA2A + 7B2FB64156E1DB3535964B925B75EE4C776DDBE679F9F1FC17B06AF223B03798 + 677C15DD573404AB054BD922B012248C0697C0B3830F26CA7F3ACFF6D7A4A450 + B20AF2290250F3FDF7F4DAC18396AD012FAF127872D0C1D4EBC3D787C9AF5088 + 587AE890E5D88057FB0D786EC0B37AF7D6ABD6AE953E1F11FEA1C9C9744E4282 + D343577888CD478ED09B353596560A3AF4EE4DB7AE5DEB2999F2D460ADAEEF2B + 935F110AC1B8045ECB17F0CC40A775E8A0D75555499F7F61F3E6F45F49494E0F + 5B110560B970E5E1C3D2E77BA9A0C813839C9294A4CB6EB3A54C7E4538B0EA12 + 603BB3076A6B5D2F5FAE1FA095621EB4E41AD5AA956AD0A138097F1BF24DFCB8 + 95CDFAADFCFCE77CAF145A5C0A864BF00ABB04B22DC9BC504CE4EAC15959E347 + 1EFFD5ECEFAB8CBED8E4C0F1E3B48D8FCF5948716CE763CB89E7DFF071EA5D74 + 330BFFAC205685A04C4A5909C8D613B83D57C0B503D388A4C3AFDDD9DC87F02B + 6283AF58D03F64015C81F6E13C1B6346AFB698D7FF5B56004F07B92C0C25B088 + DD818DEC16C8A2B954D65C3928CD82F0ABF5FDE807FB047CC8B378F909A1DF6E + C3EEC4C15A000DB19A2FA0B950DE5C37202B667F768B16D49F0F4574B19167F4 + 0F21F438B09720CFF876138A05D09015757554CE870C6E74075C35182B01BF2B + F8C753F9FCD10384FE25FEED4BD9ACDE61C30C2FC20E0BC00FEA08DE626B4006 + B705065D3310D9A53E14F3E4B2BFDF353EDEE9212B42640FCFEC10F812F4F80F + C306A166D86501F8C132E1829A1AA96222372D11BA6210B2493E58E3BFB6552B + EAA8F6D8F32C68E1BD98CDFAB93CDBBF83BDFF1C1A879D16809F9DECB2BC7AE0 + 8054AE805B92851C1F806C7A2F847F74EBD6AA7EDFA354B070C0C47F958F4336 + EEFEDB90389E183A75EAE43BBA76ED4AEBD6ADA3952B57063CD76E0BC00FFA0B + CCD9BF5F4A09B8216DD8D13F2E5BD803B37FB49AF93DC7376CE2CF62F37E0E0B + BD1D91FB86B464E1CDCCCCA45FFDEA57949595455D5898CE3CF34C6AD4200F64 + C28409F4C8238F047C7F382C003FB004E6B02520E30E385D40E4D81FB652D29B + C73EBF4AEDF50E58A79F525747B359F043D9A9A721EDDAB5F3097A7676365D7C + F1C5D4B3674F8A17C481CC1440B82C003F880920614806274B891DF9A3569A79 + A868BF77B053F021F003070EA44B2EB9C427F4DDBB773F697697C1290BC08F95 + D501A79A8A38A20034C9441FB5CEEF0DFC82FF3C36E90CE173E0C30F1932846E + B8E106BAECB2CB8433BC08272D003F56F2043407E431E27F5036D14765F8B91F + 44F435BEB96760C38D103EA75FBF7E3EA1CFCBCBA3366DDAD8363EA72D003FB2 + 19834EE40844F48FC976EF55B9FDEE6711FBB877D5D6069DB4939E9E4E23478E + A4FCFC7C3AE79C73C232463758007E5E3F7850AA7620D2DD8623F68764FBF6A3 + AA0F413FB52D973B415E7E11CFFA4B83D85D0791FB2BAFBCD227F403060CB0EC + D35BC52D16801FAC0CC854114672DF8188499926E1F7A39EFFA6D6AD95F0BB10 + 98FBD3D9D49FCC87D5001F027877DF7DB7CFC46FDEBC79C4C6EC260B00E01ACE + DEBF5FAA9F801621D98CC81F91F1FB91E8730BFB7FAA7F9FFB409EFE556CC26E + B668EE43F0274E9C48D75D775DD867FB40B8CD0200682AF2BFD5D542251AA9C2 + A1B0FF01D94C3FA4F8AAFC7EF7F14A7D3D155ADC47CF69C1F7E3360BC0CF1676 + 0390322C2212998261FD70D9F57ED5C0D37D208B6D6C6D2D3D67A1DEFDB4D34E + A369D3A6392EF87EDC6801F8916D341AEEFC80B0FE4A9A84DF8F3DFA0AD8EF57 + B80704FA86F3AC2F5BA187F5FB5B6FBD951E7AE8214A4E4E767AF83FE2560BC0 + CFF3EC0AC8B41CD7C228A761FB6099DA7EE5F7BB0F2CEFDD5053235DB08335FC + 679F7D96FAF4E9E3F4D07F829B2D00201D0F08637E40583EB4243B5BFFB2BC5C + 789ECAF17717C8E6FBBD64D65A6BB6DA205C63C68C7185B91F08B75B0040B666 + E0ACEC6C2A282FB7FD4287E597D3244C7FE5F7BB8B89EC933E2CB9F945FFFEFD + A9B4B4D4E7F3BB19B75B007E64E3015A18E4D5F60F9C9696A6D7EDDA657A0EB6 + EC1A6363CAA722347EC737E00C49E1BFEFBEFBE8E1871F76EDACDF102F58007E + 64E2012DD2D2E89E5DBB6CBDF0B67ED892A2227DF5CC99A6E720C9E776E5F7BB + 863B0F1DA2A72422FD30F9E7CD9B4783070F767AC8D278C5020088073CCD4A40 + D443A06F5111E5CC9C699BDCDAAA003409D35F95F7BA87DB59F89F95107E04FA + 5E7FFD755FFEBE97F092050064CB87351BE5D6B60F7AAE5F3FFDEB55AB4CCF51 + A6BF7BB8956F349935FEC2C2429AC9565DA8A5B94EE0250BC04FC9FEFDF46F41 + D6ECE9AC906F5EB5CA16D9B54D016812B3FFCD2CFCAAA79FF3C8CEFCE3C68DA3 + E9D3A73B3DDCA0F19A0500D053F0397605446836C9AE2D1F32B54D1BBD5E3068 + 55DFEF0ED09F0FEBFC22EEBFFF7E9A32658AD3C30D092F5A0040A67F40224FA6 + 13AAAB4396DF903F60514181BEAEA4C4F41C24FCDC959AAAAAFC1C660DCF2E97 + 4874AC45461F72F9BD8E172D008040E0E37BF70A7FA75E050574654949484215 + B2446A12A6FFF0E464CA484CB4FB3A292C80DD73FBB0F08BBAF3C2E487E91F0D + 78D502009B8E1CA1D7241284B4106538A4373F9F95A5EFACA8303D070D3ED0D2 + 5BE12C39070E089B783CF1C41374C71D77383D54DBF0AA05E047A68148C7AC2C + 1A535111B41C87A40034C1EC0F931F81BFB66ACDDF51FE5057477F12A4F8DE76 + DB6DF4F4D34F3B3D545BF1B20500F6B3B5364B2237400B418E837EA34C5F7F74 + F4CD565D7D1DE56D3625AF109892175E78212DE7DFD28B4B7D6678DD0200E828 + BC42A0BC43D957206805A00966FF563CEBFF96677F15F8730EF8FDDD7806D963 + B2BD36F2F9FFF9CF7FBA3EAF3F18BC6E0100CCFECFF26F784010BBD18294E5A0 + DE342F2747DFB26489E9392AE3CF794439FEA8E3FFF0C30F7D3BEE4423D16001 + 00990CC1AE39393472C912CBF21C9402D02466FF3BDAB68DE435529C02FAF85D + 2058F283CF0FDF3F1A387AF428FDFDEF7FA7F2F272DAB06103AD5FBF9EB66CD9 + 6278BE572C003F4FEEDB17162BC0F21B64DA7C21E1A7AF9AFD1D4514F52F2828 + A0175F7CD1E96186C461B66EDE7BEF3D5AB46891EFD8CF0A4F162F5900008941 + 4B05564030EDC32C2B004D30FB23E9E79E76ED9CB8468A132C63C1FF8D49D349 + F8FB5BB76E8D688B6EBBD0D9A259BC7831BDF4D24BB46CD9323A24B9F7DEA978 + CD0200D3F6EC112607691665DAD2C90B468DD2D7CF9D6B7A0E9A7C5CE8C11B2B + 9AF87975357D6A525B3E977F43ECCAE32520F8A848449622CCFB50F19A0500D0 + 3404CD43CCE8316A140D9F3B575AAE2D2900517F7F95F2EB3CA8EDBFD36456C4 + 921F7C652F34F40010FC3973E6D0D4A95369E3C68DB67DAE172D00991461ABFB + 09489FF85661A1BEA6B8D8F41CB5EEEF2C58F6EBB26F1F551BDC20717C7CB46A + 15F5EDDBD7E9A14AF1C1071FF8BA0D9B05F382C58B160090C90BE85358485714 + 174BC9B6B40210CDFE98F5C7F1EC9FE89199251A1165FC7925F0575353E3AB46 + 7CE6996742FE2C28BDB39B34A1F39B36A55E7C9CC74737FE77778F96A5637BB1 + 196C051CB3C90A9096564D10FC534D3E9DA713CFFE46BBF562634E04FEDAB76F + EFF4304DF9EB5FFF4AB7DC720B6DDFBE3DA8F7A7B3700F8D8FA70B58083220F0 + FCEF689B94649A886A92B22D75527166A6FE5565A5E1EB98FDC7B66D4B498D1B + 3B7D6D62162CF9E59844FE911073EFBDF73A3D4C43E0EB1715150535EB63561F + 9E904043F9E8E3D199DD0A3256C019999954585929946F2905A009667FD5ECC3 + 79AE397890CA0CF69FC7ECBF73E74E57EDDAD31098FCB9B9B9BE653D5960DA8F + 4A4CA4BBD9F2F4AA391F0A324D433409F9169EF0FEC489FADF264F363D47B5FA + 7216E4FA77C48C60F0BA9B7DFF6DDBB6D1E5975F2E1DE187E08FE109E76E16FE + B3E3E29C1EBE63C8B40EBB64E2441A3879B2A98C0B15C0F4F474BD66C70EC3D7 + DBB3E0DFAA1A7D3ACA34F607EF33591F5EB972A52BF3FD57AF5E4D393939B467 + CF1EA9F30B58E8272525D119CAD5F48152E1DD26F91EC9E9E9347EC78ED01480 + 2630FF07F20F72914AFC719473F7EDA3CD06C1BF1E3D7AD0279F7CE2F4107F02 + 847FE0C08152997C1D58E05F60F7657094952B878A4C6290269071D317DFC8CF + D73F9E3DDBF40F8C4F4D55C13F07A938768C2E32C9817763971F28A4ECEC6CA9 + DC7DCCFA7FE649A695BAC77E422DBB7ED3D9F533A3677E3E5D357BB6A19C9B2A + 80294949FA51130DA3DA7D39CF4D35355462B00B7333F69511FC6BE322170D3E + FFC5175F4CDF7CF38DE979C82A9DCDB3FED56AF35853446DC3E259793E505B1B + 9C02D004E6BFAAF9779E54F69F8D32FFF2F2F2E8D5575F757A883F02A1472AB2 + 688DBF1DCFF66FA7A450DF180EF2C922D32B40339173C3175E1E3448DF66B22C + 83B5FFBB55DEBFA3A0E63FC32412FCFEFBEFD3A5975EEAF4307D609D1F3EFF72 + 411BB99F376D4A4BD9AA54813E39900BF0982027A0F3A04174FDB2650105D550 + 7A35C1ECDF837DB3AB5CBAAE1C2B14B3F6BFC540FBB76BD78E76EFDEEDF4107F + 64C68C19347EFC78D37390D0F321CFFCAA89AC35DE603770BD811BE8473390F5 + A015C0B5ACA5BBAAA8ACA398F9FF575C7105BDF9E69B4E0FD107827E175C7001 + 1D33A925410A6F45EBD6749A9AF92DF3055FD7398280AA664501BC9E97A76F28 + 2D35FC30D5F4C31D982DFFB925F517ADBA20FC6635FCF0F92B79E68FE5C49E50 + 11350BC9C8CBA3AB4B4B7F22EF0115C0B4B434BD6ED72EC30F53A9BFCE83D2DF + 36264B4068F6D9BF7F7FA787E933FB61FE1B81C6A4157C2FC5420E7F38111508 + B5E8D081EEA9AA9253009AC0FC1FCDA69AD2D6CE6256FC03A13AC0AF39DDF20B + F5FC08FC998135FE712A912C64B6F0FDF0AA493118D002C87B500AE07E36FF55 + F4DF59CC6AFFFBF4E9E3EBF5EF24D5D5D5D4BB776FDA6192463E283E9EDE5579 + 24B620B31AA0C92880D261C3F44D0B171A7EC8993CBB14B005A0709681ACED97 + 1B24808C1D3B969E7CF24947C777EDB5D752A9491C097EFFBA366D54D0CF464A + F6EFA77F9B045ACF1D368CF2162E3C49E67FA200A6B669A3D79BAC2DABC61FEE + A08549D0C7E9A69F6BD6ACA15FFCE217A6E7CC4F4951597E36236A1796C80A77 + 4275B5B902D094FFEF7A4409405F7EF925A5A7A73B36BEA14387D25B6FBD65F8 + 3AF2FB5F503924B613CC72A02505A0B2FFDCC12BF5F534AAA626E06BE8F9FFF5 + D75F3B3636ACF9F7ECD9D3F0F54E4D9AD0273C89A80232FB09260E70D23F5E19 + 3244DFBC78B1E19B95FFEF0E26D4D6D2A3064B3EC3D8CF5BB0608163631B3E7C + 382D3489217DC8F7CF25CA820C1BA238C0394386D0758B17FF28F727290051F5 + 9F6AFBED0ECC0280D83863E2C4898E8CEBD34F3FA58C8C0CC3D755D43FFC88E2 + 00A756079EA4003481FF7F236BEF8E4A7B3B8E5905E05FFEF2171A3C78B023E3 + 1245FED5EC1F7EACC601A41580F2FFDD017EE09F99FCC0F0FF1107883498FD7B + F5EA6598EF0FC1FF50B98F11E1619E2064E3003F3E11EDFCA39A7FB88345478E + D0B0830703BEE66405E0F5D75FEFDBC2CB88F7F9DE19A08AC72282A84948C39D + 837E54002FF6EFAFEF58B1C2F04D6AFDDF1D986500C2F4870B1069D0D63B95AD + 43A3D93F8B67FF8FD4EC1F31447180F4FEFDE9C6152B4E5600D33A74D0EBAAAA + 0CDFA4BAFFB803E4FF2F35D0EED84E6BCA9429111F135A8EDF74D34D86AF2FE1 + D95F35F48C1CA22E412DD2D2E89E5DBB4E56009A0A007A82D3F7EEA5AAE3C703 + BE367FFE7CBAE69A6B223E26741D32EAF483FDF8D6B8A827612C20B367807642 + F6A515C0BDEC5F46DB1E6B5E031B80A49994007FFEF9E7D4B973E7888E09C53E + 679D7596E1EB4FB0E53856598E11055B873D2AD86B41B3A20054031077605602 + 8CEDBF0E1E3C488D22ACA41F7DF451BAEFBEFB02BE067B717B6AAA2AF8710051 + 8310ADA102106DFFA53200DDC1D4C38791C411F03534FF4013904873FEF9E71B + 76FB51893FCE21CA08F46F1BE65300F37373F58D65658627F766136E88EA00E4 + 38B93CC32F34D80074DCB871347DFAF4888E4794F9F7627232E5272646744C8A + 1F587CE810AD35D93CB47B6E2E8D282BFB41013CD3A387BEDBA4671B96FF2E54 + 5D5B1CA7F3BE7DB4DDA007E04B2FBDE45B8B8F24D8CAFBF6DB6F0FF81ADCC65D + 6ACB78C7106D1BD6BE470FBA6DFDFA1F14C0A4C444FDB8495B61D501D879443D + 003FFEF8639F391E49468C1841AFBDF65AC0D786252450594A4A44C7A3F80FA2 + 16618DD9327BB0BEFE0705A00956006E674DAE7AB53BCBDFD89FFB95410A30B6 + 00430FC0F8082BE9D34F3FDD708BAF67D865BCD562F41FD1EB437CF8B31C603B + A0552882895881C21DA852D1E5D8C796E2D36C319AA111C9298007DBB777FAFB + C43C33D8A4FB9D8149E7440FC0CD9B3753B76EDD0C5F47F61F76F769CEB7D861 + 16EA3A3E0EF081C834FE5DC3079C995A7EFC8E8F63F27F9AFCD9284DF9B3FD2A + 269E9FE380D2883FF1EFF1ECB6C6720C6292202D5C935100AD78E6BF832D0085 + B3E4D7D4D0CB066E5A6161213DF7DC73111D4F717131DD7CF3CD4E5F1653A624 + 25D184188E5D3DC916C001839811D06414C0E94D9BD21895C9E5384800DA6390 + 01F8F4D34FD36DB7DD16D1F1888A7FDC40AC2B80E7ABABE9EBEFBE337C5D9351 + 00AA0AD0792AD8FFBFC8A40418E63FDC804872F6D9670B77F9759A585700A2AA + 400D0A409404D42D218146A868AEA34C64DFFF618316604EF40044E00F0140B7 + 13EB0A60FEC183F49941DE08403250A3254545FAEA99330D4F524940CE733E9B + 72FF3230E59CF0FFE7CD9B47A3468D72FAB20889750520DA35B86F5111357A23 + 3F5FFF78F66CE393D43E808E22EA00841D80B113702441F20F9280DC4EAC2B80 + A5870ED16A936CC09EF9F9D4489406AC1A813ACB53FC03DE6950DB8D02A0AAAA + AA88EF01880620C83BA8E7D9A596DD131C757575F42D8F15C7617657F088D771 + 24262652120B63C303FF87FC85047631F11CDFA5499326BED7F0FF286AC2CEC2 + DFB1E5E33F8EB0398BA623FE7FE3B3274C98404B972E0D38CE585700A20D4391 + 0EDCE8E54183F46DCB96199E04E1EFAF148063987500C6CC0F0B2096316B441A + EB0AE02316FEF74DD2813B0F1A448D9ECFCAD2775654189E04F3BFAFAAE77684 + 0327EAFF8D92645E78E105BAF1C61B9D1EA6A398A523C7BA0280F9BFD4A433D0 + 199999D4E8E98C0C7DCF860D8627A95660CE61B6031070AA03B09B501680311B + F8FE596072FFB4CBC8A046D3D3D3F51A932D9CAF4949A173D5268E8E702DFF78 + F30DA2B8FDFAF5A37FFCE31F4E0FD17194023066D39123F49A410769909C9E4E + 8D44BB01ABCD409D017DDD53D9FC3F64D0D5C5C91D80DC845200C6883609C16E + C18D26C5C5E9C74D3A87DCCC277568DAD4E9EF127320F037D0A49CD389F25F37 + A21480313B59AE5F3451008D7962172A00D50DD819B0F4F794C11A6EA74E9DE8 + 8B2FBE707A88AE4029006344DD817D0A40B900EEC4ACFBCFD8B163E9C9279F74 + 7A88AE40AD021823E502A820A0FB40DAEFF9264AF9DD77DFA55FFFFAD74E0FD3 + 15280BC018A920A068197078723265C47053052740E38F1906195CC898DBBB77 + 6FC4BBFFB815A5008C11ED10E45B062CCECCD4BFAAAC343C4925024516B4C54A + 3389FE63E71FEC00A4F801A5008C914A0412A5020FE48B78510C5FC44853CC3F + DA2D263F1A36FFC426A08A1F50310063A4528145C5406A57E0C8D2877DFF7506 + A5BF88FE6FDBB62DE2BBFFB81965011823550CA4CA81DD83A8F3CF238F3C42F7 + DE7BAFD3C374154A011823550EAC1A82B887913535F4AA41EA6F5C5C9CAFF4B7 + 8DEACF78124A011823D51044B50473071BD9ECEFC5E6BF514AD6E8D1A3E9E597 + 5F767A98AE43C5008C916A0986279A6A0AEA3866B33F58B97225656565393D4C + D7A12C0063A49A829E78A2DA823B8868F67762E30FAFA0148031B6B405571B83 + 841FD1EC8F757FACFF2B7E8A5200C6D8B23108505B83850FCCFE192669BF3D7A + F4F055FEA9A5BFC0280560CCC37BF6F8CACA8DD0641580DA1C347CE4B09FB6D4 + C44F5BB060010D1B36CCE961BA16A5000263697350D1F6E0792929748E2A08B2 + 9D45478ED03093620DE5FB8B510A20309BF9DE2A35B9B74EDA1EFC991E3DF4DD + EBD71B9E8C4CC00B63F442860BE4FC9FCBA6FF0E131FCD899EFF5E432980C020 + 03F03D9334E0F6EC5ADEB67EFD0F0A40940EAC9281EC6702FF388F9AA469AA9E + 7F7228051098C5870ED15A932C40A4018F282BFB4101889281CE8C8BA382D6AD + 9DFE4E518368D90F38B1E1A717510A203025FBF7D3BF4D3A7D210968E0E4C9FF + 092D6B2681C0667CDA3DEDDA39FD9DA20244652F3970805699FC38D8EA1B5B7E + 2BC4A84CC0C04CDBB387BE15AC00E0514A01807B590124AAA5A890316BF601D0 + E77FD3A64D949C9CECF4503D81B2007E0AE24B8FB2023043B3AA005477E0D079 + FBC811BAC224320BE6CE9D4B23478E74749C2B56ACF0EDBBF7FDF7DFFBF6EB6B + F8084EFDBF501EC1A99FDFF06F3424D0FB27B3EB8AF10622561580A81B30D04E + 5500D3D2D2F4BA5DBB0CDFA076080A8DAF8E1FA79EFBF651B589593660C000FA + E0830F1C1D2736FE4C4D4DF56DC2E975625501885A81B5484BA37B76ED3A5901 + BCD8BFBFBEC3409302B54B70F0608FBF4BD9EF5F6792978D5E7FEBD6ADA3CE9D + 3B3B3A56F8D3F0ABA381585500E57575B4820F23D2FBF7A71B57AC385901BC55 + 58A8AF292E367C93AA0A0C8E5A16FEFE02E1076EC9F7C766A32525254E0FC316 + 62550188AA00FB1416D215C5C5272B00A099C401E21A35A2FBD54A802520FCFF + C53EFF2A81395DC83FC873CF3DE7F4707DB46FDF9EF60802485E211615005699 + 1EC38ED2122B00405A0100B54B903C88C4FE8635F1DF04C28F629FCACA4A6AEE + 821B75F5EAD5BE04A468211615809500203849018876095271003920FC393CF3 + 2F3731C300FC7E08FF79E79DE7F4907D4C9A3489FEF0873F383D0CDB88450520 + F2FFB11BD084EAEAC00AE0952143F4CD8B171BBE5965048A81E975250BFF5281 + F0376BD68CDE79E71DEADFBFBFD343FE915FFEF297B46AD5AA80AFB5611730B5 + 7163A7876889DFB1F017C6D8CA952803F09C2143E8BAC58B032B00A009E20077 + A7A6FA1E153F05C29F5B53438B4DFAB00108FFDB6FBF4D975E7AA9D343FE91DD + BB7753C78E1D0D97FFE6A7A4D0D5AA22D4D558F5FF81250500D466A181C152DF + 0D870E4909FFA2458B5CB7B71F1A8EDE70C30D015FC3AFBD8B157F2B8F5900B1 + 86683350A08914808A035807FDFCAFE599DFACB417A0B5775959992B4B7CCD52 + 6A07C4C7D3FB6A09D8F588360239D5FF073F5100A5C386E99B162E34FC101507 + 3899297575F4473E447973107E08981BBBFB1CE69B06E6FF7E83D9E391A424BA + 27C682695E44E4FF9FCBF75EDEC285E60A0068023700F900B11E07406AEFF53C + EB8B22FD00C28F1C7F3724FA04E2C9279FA43BEFBCD3F0F50D3C7374577520AE + 067EFFC39205400D094A015CCBE660D718DE9E1A453D37B1BFBF87958008083F + 32EB9C2EF031E2282BB06EDDBAD1F6EDDB03BEDEA94913DAA6BA42BB9E60FC7F + 1050014CEBD041AFABAA32FCA058DD3014EBFBF7B19FF59449A7958640F867CD + 9AE54BAF752B66C13FF03F2D5AD01F55CCC7F588F6016C5800D490800AE0F5BC + 3C7D83414008C46283106CDBFD07F6F5AB24667D809D7C5F79E51557EFE6A3B3 + 42CBC8C8A08D1B37067C1DBFF30E36FF554768F723DA0320232F8FAE2E2D9553 + 004053CB813ED0B917FDFB360B22FC0D81AF5F5C5CECFAA61E6FBDF5160D1D3A + D4F0F5716CE9FD39062D3DAF11ACF90F0C15C0A4B838FDB84944B14762225DE5 + F21B3C1490C30FC1AFB050178F35FE993367BADAE46F8859E61F54FBB6D4543A + 43ADFDBB1ED12EC040B3AA005E1E3448DFB66C99E107466B56E0BFBEFBCEE7E7 + 8B52794F05453D58E6734B5EBF08341E193870A0E1EB05ACE05F8862051F2DC8 + 64FF751E3488AE5FB6CC9A02009AC00D88A62E4130A3FEC87E3EF6E8B3DA0B67 + ECD8B1F4D8638F51BC47564610F9EFD5AB97A1EF0FD4D29F371075FF019A899C + 9B2A80294949FA5193CD05A2A14908D6F11FE78B284AE10D44EBD6AD69F6ECD9 + AECCEC33E381071EA0871F7ED8F0F5DC84047A2D25C5E9612A241035FF884F4A + A2076A6B8353006FE4E7EB1FF30D6EC6787603923CE62762396F0ECFF458CEFB + 97A0534F20B0BC57545444BFFFFDEFA98DC7B64E5FB3660D6566669AF6FCFB3F + FE4E7DD4ECEF7AD070663A9BFF66F42A28A02B4B4A8253004013B8015EDA360C + D97B4F1D3E4C252CFC32493CA702C1CFCBCB234DD31CEFDD170C30FD2FB8E002 + 5A6FB20DDC109EFDDF54B3BF27106DFF0534818C0B15C0F4F474BD66C70EC3D7 + DBF34C71ABCB674144F2D18BFF4D36F383ED753B78F0609A3A752A9D7FFEF94E + 7F9DA079F0C107E94F7FFA93E1EB2D1B35A24D6DDBD2691EB3E8629559D5D5B4 + DBC4824D4E4FA7F13B7684A60044DB8601B7EE198035FC497575C2869C66A045 + 16FC6537D5EE07838CE9FF627232E527263A3D548504557C4F3F6752B50BFCDB + 7F999D23B586A709DC80BECD9AD160176E1E3AF4E0C1A0827BA06BD7AEBE19DF + 8DD57B5641B51F84DFCCF41F141F4FEF7A3CA01B4B88527F812621DF520AA038 + 3353FFAAB2D2F075E4028C4B4D75DDD661B9AC00165A540068D185CAB8ABAEBA + 8A1AB9ECFB0403D27D73727268E9D2A586E7C0F4FF944D7F95F4E30D10C49E21 + 58FB3F83157E6165A53D0A0068022BC08D0542B2160032F810DCBBEBAEBB3CED + E307E28E3BEEA0A79E7ACAF49C67D87ABB354AF239620151E30FA049CAB6B402 + 989498A81F37493774A315205200D888F3F6DB6FF7F5E5473FFC6863C68C1934 + 7EFC78D37354B71F6F2133FB378E8BA3078F1DB3570188760E026815D6DF45A5 + A3660A005B704340BC92BD671551A10F80E9BF8E853F168ABAA205B4FC2E3769 + FB0D1AEEFC23C2D2742D2A1042F9E85D2EAA0F3053004F3CF184CF3C8E4610F1 + CFCECEA6432629A210F97758F80744A9028C4630EB3FCEB3FFB736CDFEC092A4 + 2E18354A5F3F77AEE9396E4A0C325300D3A74FA771E3C6393D44DBD9BC79B34F + F8BFF9E61BD3F3D4929FF79049FCE9316A140D9F3B373C0A00C858016E691662 + B60A108D0A0033FF65975D26DCDB4F75F9F126D3F877359BFD816651A62D2B80 + F9B9B9FAC6B232D373DC5225184B2EC08A152BE8F2CB2F3735FBC1F53CEBCF56 + 65BE9E036BFE4B05BF6DF7DC5C1A5156165E050034C19260AB264DE80E173492 + 8C150580801F9631BF1524865CC2FEE17BECF7BB2546A39047D4F20B6841C873 + 5077C2BC9C1C7DCB9225A6E7B8C10A888518C0BC79F3A8A0A0C034C5179CC34A + B9B2756BB5BB8F0791A9F93F75CF3F59829E0A34092BE0B76DDA383ADB44BB02 + 78F4D147E9BEFBEE139E87D6DEEFB3D9AF96FBBC0722FFCF56578765F607414B + E7EC0103F4EDCB979B9EE3F43662D1EA02D4D4D4F866FD85263B38F939AF6953 + 5F8EBF4AF3F526A2EDBE41A70103287FF9F2C82A00A009AC00CCFEBF6DDBD631 + B3D36C15C0AB0AE0934F3EA1DCDC5CDAB2658BF0DC7E3CE3BF9392A2CC7E8FB2 + 8F677D54FC1DB339F2DF909014C0F35959FACE8A0AD3739C6C1B166D2EC08B2F + BEE8EB44240AF60124F8BCC966BFD7BA3529FE83A8DD17E8989545632A2A9C51 + 00401358016038DF88190E249D448B0B80725E083EB61893015D7DCAF89AAB68 + BF77D9505F4F0BD8D513A18528C321DF218B0A0AF475821B130141340D8974A1 + 503458009F7EFAA96F89CFAC96BF21AA9DB7F79149F905A27E7F32D8229153DB + B4D1EB05DD499C2817F6B20580FE7D0F3DF490AF298968890F20BEFF47BEBE13 + 5C9286AD081E9972DF449E50275457872CBFB64DC99A842B10E9D6615EB5002A + 2A2AE8A69B6E32EDDBDF900EECE7CF4F49F125FA28BC8D4CAB2FA0D924BBB629 + 0051D7207026DFA005AD5BDBF5278578AD1600CB7B68352E6AE0D11004FB4AD9 + E46FA7827D5141C9FEFDF46F81C527DBED47065B9D7251A110886486A0975C00 + A4F36287A11D261D984F4515F5441732197F40B3516E6D55004B8A8AF4D53367 + 9A9E83C8F4EDEC0A244760CB692FB800AB57AFF665F32D1724553504B33D0A7A + 06AB5AFEA8A1E6FBEFE9698935FFBE4545943373A63B1500989696A6D7EDDA65 + 7A4EA45C01375B00DBB66DA3FBEFBF9F5E7BED354BEF43F75ED4F2ABCCBEE8E2 + 7916FEAF05EDEB5BA4A5D13DBB76D92AB3615997D3240282915815709B024087 + DEFDECE36167A159B3664945F7FD60D67F8CAFD768D5C423EA9089FA032D0CF2 + 1A160550929DAD7F595E2E3CEFDA56ADA86B18CD5837B900E8D083E0DE4C7691 + 4435FB3FB94E2CF48FB3F0AB405FF4B199EFCF52BE4F458492EF6F46D8327344 + 5D8441B313B502E14A5775C32A0072F7B175786969A9A5191FA4376942CFB66C + A97CFD28057EFFFFB2E92F4AF869CC13C083F5F56191D5B0A6E66912AEC0E94D + 9BD29830ED2DE8940B0053FF9D77DEA169D3A6590AEEF9C16AFE9866CDE8CF3C + EBBBA9CDBAC25E64FC7EA085514EC37A77C9B40F03E18A07445A0120671F0D3A + D06E5C3689E75490C73FB5450BEAEEC2BD1615F621EBF767E4E5D1D5A5A5DE54 + 00E0892E5DF4FD5BB70ACF0B473C20523180DDBB77FB7C7B04F6440D398DE8C5 + 02FF049BFB2A9B2FFAD972F428BD7AE080F0BCD65DBAD09D5BB786554623625F + CAC6036EB1393F20DC0A00FEFDE38F3FEEF3EF654A7403816E3D0FF18C7F9D8A + EEC704D27EBFC5FEFEC112310753938807B4E759F0A6D6AD6D2B630D870B80F5 + FB575F7D95E6CF9F2F5DA11708E4EF8F63D7E72EF6F555D96E6C80249F17F6EF + A7DD0EFBFD0D89D89D573A6C98BE49A285959D0D44ECEA088425BC3973E6D082 + 050B68D5AA55218DE9E7ACE4C6B3E08F645F5F097EEC00E1C7729FA8C1073877 + D830CA5BB830BA140078BC7367FD00CFA022BAB3705C9D9212F2DF0BC50580D0 + BFF1C61BBEA0DECA952B431E0B32F8EE66C11FA496F46292D7F95EDC28B15375 + ABCE9DE9AE6DDB222697119F8264E201A02F9BC6835BB60CE96F59550028C479 + F7DD777D267E30CB77A782705E017F8F3BF95051FDD8051B7AAC9688118573BD + DF08476C504D221E0042DD6D58140340A79DF2F2727AEFBDF768D9B265B47DFB + 765BBE1F32F66E65A12FE24365EFC53632BBF9FAD11C90474714C0EB7979FA86 + D252A97343291F365300AD5BB7F6E5E5DB095A7063B647BEBE4AE051C896F782 + 70AFF71BE1D85D2AB3AF809FBC94143A2721C1F2DF3053007681E5CB1CF6EB61 + EAAB945D851FD91C7F10AE3C7F191C9DA666F5EEAD57AD5D2B3C0FD172AC0C74 + B49824132E0580515CC60A69041F57B0D0ABD6DB8A86EC3C76CCD7D25B54DB0F + 3AF4EE4DB7AE5DEB981C3A6EA7CA660A62A61DCD66BB959E82762A0008FDC52C + EC7958A1E0436DB6A108047AFACD61D75294E8032291E927C2710500A675E8A0 + D7555509CF8312B8D68225609607200B76D719C93E3D045F05F4146660E6478A + AF8CF0B7E8D081EEA9AA725CFE1C1F809F294949FAD1DA5AE1797007B0D1884C + 4C20180BA0257F7E36CFF4D92CF8D7B0E0ABCE3B0A1990DF5FC6F79B8CD96F57 + 4B6F3B70C520FCC8E6080099D5011905005B229385FD372CF4E8B09BA58A7114 + 16B112ED7762ADDF0CD70CC48F4C67613FA23C01230580CABB5FB3B00FE403D5 + 776AC94E112C56D6F92355E06305570DC68F26992804CC3206FD3100E4DF0FE0 + 8B3FE08469AF02780A3B90CDF0F3A3B950DE5C37203F9A052560543BB0E6BBEF + E84C167615BC53D88D6C6EBF1FCDA5B2E6CA41F9B1E20EA08A100943AAC24E11 + 4EEA75DD27FC32557DC08D667F435C3B303F560283E827701D2B81486C3AA288 + 3D6A8F1FA7B9070E48D5F303B705FC02E1EAC1F991D97DD80F7205AE642510CE + 76E38AD803A9BD6FD6D448ADF103372DF599E1FA01FA914D16F2E3C476E48AE8 + 44B681A71FB724F9C8E08941FA914D1BF6832DC89034A45C024530A07FDF029E + F545BBF536C40DE9BD56F0CC40FDC81610F9814B3054327350A1F083CCBE4507 + 0F4A9BFCC0E9C29E60F0D460FD582925F663478721456C60D5E4074E96F48682 + E706ECC74A53113F7009AE4A495189408A80C0E47F8D677D99DD7A1AE254330F + 3BF0E4A01B62255700204F60705252D05D8614D109F2F997F2CC2F53CCE3C7ED + 6BFC32787AF07E64BB0D3704D6005C022BFD0514D107EAF791D26B25D00722DD + BD375C78FE0BF891DD77E054101BC072A1CA208C2D30D3C3D7B792CBEF27927D + FBC34D547C898658750900560AFE9BAD810CB53D574CB0A1BE9EFEC2B3BE9508 + 3FF042669F55A2EACBF8B19A2FE007F5044392935590304AD9F7FDF7BE59FFB3 + 20BA44796D7D5F96A8FB427E64B7263F15B80259CD9BD3457C28B7203A80B9FF + D1E1C354C18795209F9FEEB9B934A2AC2C2A6F86A8FC520DB1524CD490564D9A + D0C0162D945BE07110DD5FC1827F80677FAB44A3C97F2A51FDE5FC946467EB5F + 969707F55E280258047DD5B2A1A74070AF2248C1075E4DECB14AD47FC1864C4B + 4BD3EB76ED0AEABD500417B012E8ABB6F3762D30EF21F8FFC747B082EFA5421E + 3B88992FEA67495191BE7AE6CCA0DF8F1583BE6C1164F2A17A09BA0334E958C5 + B3FD3FF8B01AD96F48DFA222CA993933A67ED498FAB20D29CECCD4BFAAAC0CFA + FDB002600D5CDCA28552040E01C1FF7B5D9D6FD60F26B8E7E7F47EFDE8E655AB + 62F2478CC92FDD102BCD46020145D02B31917AB3325059859101D97B6B59E8D7 + D5D78724F85E69DA114E62FACBFB595450A0AF2B2909F973D092EC7C560638D4 + 7E81F682765C9FB0C0E3906DC96546AF8202BAB2A424E6EFFF98BF000D793E2B + 4BDF595161CB6721A9A84742826F1951050D8303B33B5A71AD61A1976DC229A2 + 6356168DA9A8503FC809D485084030FD068C80F09FCB8A00D58767AB5D87A440 + 338E7FB1D06F62E10FC5C46F48AC2CEB59455D10135E193244DFBC78B16D9F87 + 1504C40ACE62EBA0132B036519FC00847CFBB163B495051EC21FEC125E20BAE6 + E4D0C8254BD48536405D18099056FCD99B6F92D52223112849C6F133B6103A36 + 6D1A330A0102BF93FDF8CF59E0B7B3C0EF6181B76BA607A8D3EF367468D4A6EF + DA89BA401658306A94BE61FE7CDB150180F0631501B1832E7CA4459942F882AF + D9972CECF0E511C5B753E0FD40F033468CA0E173E746CF850B33EA4205C15B85 + 85FABA397328981A035920FC1DF9863E8D15018E56AC14DAF2FFB93DE7006BF3 + 30E1AB58E0F7F2E3372CEC3BF9793804DE0F04BF577E3E5D515CECEE8BE342D4 + 050B9150138AAC8238422A2B041C6D9B34A176FC8823D225CC28ADDDC7C20D21 + C7F3BD78CE4728997856392333930A2B2BD53D1C02EAE2D9C4FB1327EA1FB355 + 50B36387237F1F16430B5602CDF931811FE3F9B1393F363DF15AB313FF877588 + 447E8E73A04CBE6381854373E4F871AAE703CF8FF2FF7D8BE7FC8815F7C3FC1C + FF87730E9F98E19D22393D9D7A8E1E4D03274F56F7AE0DA88B1806DEC8CFF7F5 + 22385A5BEBF450A282F8A4243AEFEAAB55E24E18501734CCBC3C6890BEBDBC3C + 2C81C368067E7DA7EC6CBA7ED932758F861175712308F6328032B0B2C7612C81 + 525C08BD577BEC7B1175A11D04F9055F7CF00185528CE465508C03818F960EBB + 5E445D781781CCC31D1F7D14B50A01029F7ED14574DDE2C5EABE7309EA877031 + C837D8B7650BEDDDB4C9736E438BB4344AEDDE9DDA76EDAAD6E75D8CFA613C08 + 961CF77EF619EDE3632F2B887026249981A699A92CE06DBB75A3543ED4D29CF7 + 503F58940225517FF0201DABABA323870ED1117E8E65C9233535BE7FE3F9517E + 04F12D5BFA96DA12F8312139F987E72929BE7FC7A1E3113F57C21D9DFC3FB05B + 459D4B95757A0000000049454E44AE4260822800000030000000600000000100 + 0800000000000000000000000000000000000000000000000000000000000202 + 04000505070004040B0003030E0004040D0008080B000A0A0E000C0C0E000404 + 1200050514000C0C100006061A0006061D001111160015151A00060621000707 + 280007072C001B1B20001D1D22000808350008083B0022222800242429002828 + 2E002E2E2F0036363A0039393D003C3C3C000808470008084B0008084D000707 + 50000808530008085A0008085F003E3E42000909660009096A000A0A71000A0A + 76000B0B79000B0B7D004343470044444700464649004A4A4C00535354005757 + 57005B5B5D00666667007171710077777700787878007D7D7D00000080000606 + 83000B0B8100090984000C0C85000404890005058F000C0C890016168B001717 + 8C00070790000D0D91000D0D96000606990006069D000D0D9900222291003434 + 9A003E3E9E000707A3000E0EA0000E0EA6000707A9000909B1000F0FB2000909 + B5001010B4001010BA005050A7005757AB007272B8000E0ECE001111C2001111 + C9001212D1001212D6001010DA001010DE001313E1001414E3001212E6001414 + E7001414E9001515EE001414F3001515F5001616FA001515FE00808080008A8A + 8A008D8D8D00929292009A9A9A009E9E9E00A1A1A100A7A7A700AAAAAA00B0B0 + B000BDBDBD00C9C9C900D0D0D000D7D7D700D9D9D900DDDDDD00E2E2E200E5E5 + E500EBEBEB00EDEDED00F1F1F100F5F5F500F9F9F900FEFEFE00000000002F26 + 000050410000705B000090740000B08E0000CFA90000F0C30000FFD21100FFD8 + 3100FFDD5100FFE47100FFEA9100FFF0B100FFF6D100FFFFFF00000000002F14 + 00005022000070300000903E0000B04D0000CF5B0000F0690000FF791100FF8A + 3100FF9D5100FFAF7100FFC19100FFD2B100FFE5D100FFFFFF00000000002F03 + 0000500400007006000090090000B00A0000CF0C0000F00E0000FF201200FF3E + 3100FF5C5100FF7A7100FF979100FFB6B100FFD4D100FFFFFF00000000002F00 + 0E00500017007000210090002B00B0003600CF004000F0004900FF115A00FF31 + 7000FF518600FF719C00FF91B200FFB1C800FFD1DF00FFFFFF00000000002F00 + 20005000360070004C0090006200B0007800CF008E00F000A400FF11B300FF31 + BE00FF51C700FF71D100FF91DC00FFB1E500FFD1F000FFFFFF00000000002C00 + 2F004B0050006900700087009000A500B000C400CF00E100F000F011FF00F231 + FF00F451FF00F671FF00F791FF00F9B1FF00FBD1FF00FFFFFF00000000001B00 + 2F002D0050003F007000520090006300B0007600CF008800F0009911FF00A631 + FF00B451FF00C271FF00CF91FF00DCB1FF00EBD1FF00FFFFFF00000000000800 + 2F000E005000150070001B0090002100B0002600CF002C00F0003E11FF005831 + FF007151FF008C71FF00A691FF00BFB1FF00DAD1FF00FFFFFF00000000000000 + 0000000000000000000000000056554A483B3B484A5556000000000000000000 + 0000000000000000000000000000000000000000000000000000543B383D4246 + 4F52534E4B4339383B5400000000000000000000000000000000000000000000 + 00000000000000003B393D505E676666666666666667665E513D383C00000000 + 0000000000000000000000000000000000000000000040384B5E676766666666 + 666666666666666666665F4D3841000000000000000000000000000000000000 + 000000004938475F66666666666666666666666666666666666667675E453849 + 0000000000000000000000000000000000000041395767676767666666666666 + 66666666666666666666666666665A3941000000000000000000000000000000 + 0000394261676767676767676666666666666666666666666666666666676761 + 423B0000000000000000000000000000003846652923475F6767676767676766 + 6666666666666666666666666666666666463800000000000000000000000000 + 394C6667240807011F5266676767676666666666666666666666666666666667 + 6766463900000000000000000000004142656767242E7E6F25000C2B63676767 + 6766666666666666666666666666666666666642410000000000000000004939 + 62666767242E8F8F8F77360E0A47666766666666666666666666666666666666 + 6667676139490000000000000000385767676666262E8F8F8F8F8F7C34011662 + 67676766666666666666666666666666666666665A3800000000000000414766 + 66666767242E8F8F8F8F8F8F8F7414105B676666666666666666666666666666 + 66666667674541000000000000385D6767666666262E8F8F8F8F8F8F8F8F7A1C + 055B676767666666666666666666666666666666665F3800000000003B4D6666 + 66666667241A7B8F8F8F8F8F8F8F8F7E1B126567676767666666666666666666 + 6666666767674B3C00000000385E6767666666664D0C08347A7F8F8F8F8F8F8F + 790B26676767676767676766666666666666666666665F380000005442666666 + 666666666666430C026D8F8F8F8F8F8F8F70005E676767676767676766666666 + 666666666767673D5400003B4F67676666666666666666663C02688F8F8F8F8F + 8F7F0F2A67676767676767676767676666666666666666503B0000385E666666 + 6666666666666666674C01327F8F8F8F8F8F360C44444444444444475B666666 + 666666666667675C38005638676767666666666666666666666658026D8F8F8F + 8F8F75080B0707080B0808004467676666666666666666673956554366666666 + 6666666666666666666767270F7D8F8F8F8F8F8F8F8F8F8F8F8F8F0B47666666 + 666666666666676742554A466767666666666666666666666666666306688F8F + 8F8F8F8F8F8F8F8F8F8F8F0B446767666666666666666667464A484E67666666 + 6666666666666666666667673C06798F8F8F8F8F8F8F8F8F8F8F8F0B47666666 + 66666666666767674E483B5167676766666666666666666666666666660B698F + 8F8F8F8F8F8F8F8F8F8F8F08446767666666666666666666533B3B5366666666 + 66666666666666666666666767222F8F8F8F8F8F8F8F8F8F8F8F8F0847666666 + 6666666666666767513B484E6767676666666666666666666666666666440B8F + 8F8F8F8F712D2C2D2D2E2E024467666666666666666666674E484A4667676666 + 666666666666666666666667675A00748F8F8F8F730022262627272759666666 + 6666666666676767464A5542676767666666666666666666666666666667076B + 8F8F8F8F7F0E2A67676766666666666666666666666666674355563966676666 + 666666666666666666666667676720308F8F8F8F8F370A656766666666666666 + 6666666666676767385600385C6767676766666666666666666666666666400E + 8F8F8F8F8F79023F6767676766666666666666666666675B3800003B4F676767 + 66666666666666666666666666675A00738F8F8F8F8F69015267676666666666 + 666666666767674F3B0000543D67676767666666666666666666666666666610 + 687F8F8F8F8F8F330359676767676666666666666667663D54000000385E6767 + 66666666666666666666666666676727198F8F8F8F8F8F7F2E01285F67666666 + 6666666767675D38000000003C4B67676767666666666666666666666666665A + 026E8F8F8F8F8F8F7F6C0E000C3C66666666666667674B3C0000000000385E67 + 67666666666666666666666666666767280B798F8F8F8F8F8F8F7E721D1F6666 + 66676767675D3800000000000040456767676767666666666666666666666666 + 66111D7C8F8F8F8F8F8F8F8F331E67666667676767454100000000000000385A + 67676766666666666666666666666666675B0D18778F8F8F8F8F8F8F331E6767 + 6767676757380000000000000000493861676767676766666666666666666666 + 666663150E6A7E8F8F8F8F8F331E676767676761384900000000000000000041 + 3E656767676666666666666666666666666667662A021469768F8F8F331E6767 + 6767643E41000000000000000000000039466767676767676666666666666666 + 666666666661260C02183672311E676767674639000000000000000000000000 + 00384665676767676766666666666666666666666666666658281100001E6767 + 644638000000000000000000000000000000393E606767676767676767666666 + 6666666666666666666667635958676142390000000000000000000000000000 + 0000004138576767676767676767676767676767676767676767676767675738 + 41000000000000000000000000000000000000004938455D6767676767676767 + 6767676767676767676767675D45384900000000000000000000000000000000 + 00000000000040384B5D676767676767676767676767676767675D4B38400000 + 0000000000000000000000000000000000000000000000003B383D4F5C676767 + 676767676767675C4F3D383B0000000000000000000000000000000000000000 + 00000000000000000000543B38383E464E51514E464238383B54000000000000 + 000000000000000000000000000000000000000000000000000000000056554A + 483B3B484A555600000000000000000000000000000000000000FFFFE007FFFF + 0000FFFF0000FFFF0000FFFC00003FFF0000FFF000000FFF0000FFC0000003FF + 0000FF80000001FF0000FF00000000FF0000FE000000007F0000FC000000003F + 0000F8000000001F0000F0000000000F0000F0000000000F0000E00000000007 + 0000E000000000070000C000000000030000C000000000030000800000000001 + 0000800000000001000080000000000100000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000800000000001000080000000000100008000000000010000C00000000003 + 0000C000000000030000E000000000070000E000000000070000F0000000000F + 0000F0000000000F0000F8000000001F0000FC000000003F0000FE000000007F + 0000FF00000000FF0000FF80000001FF0000FFC0000003FF0000FFF000000FFF + 0000FFFC00003FFF0000FFFF0000FFFF0000FFFFE007FFFF0000280000002000 + 0000400000000100080000000000000000000000000000000000000000000000 + 000000000000030305000B0B14000C0C16000E0E1D0012121F000F0F22001313 + 220017172300101024001919270012122D0014142F00191928001D1D29001E1E + 2F001313340014143A0012123C0015153F00222231002A2A3A002C2C39003131 + 3D001212450010104B001616480012124E0013135200323243003A3A46001717 + 660012126A001414690012126E000F0F7D001111700013137E00454554004B4B + 570050505E005E5E6A0063636F00676772006D6D77007373780078787F000606 + 8400090987000A0A88000E0E8E0012128E0015158E000D0D95000E0E9D001010 + 92001919910010109A0010109C002E2E9B0031319F000E0EA8001010A3001010 + A6000F0FB7001010BA001010BF006262B4007A7ABE000D0DC2001212CE000F0F + D0001212D1001010DA001212E7001414E7001414E9001313EE001414EC001414 + F1001414F5001616FB001616FE00808085008C8C8F00969699009E9E9F00A0A0 + A100AEAEAE00B7B7B700BEBEBE00D6D6D600DADADA00E2E2E200E4E4E400E9E9 + E900EEEEEE00F0F0F000F6F6F600F8F8F800FEFEFE004CB0000059CF000067F0 + 000078FF11008AFF31009CFF5100AEFF7100C0FF9100D2FFB100E4FFD100FFFF + FF0000000000262F0000405000005A700000749000008EB00000A9CF0000C2F0 + 0000D1FF1100D8FF3100DEFF5100E3FF7100E9FF9100EFFFB100F6FFD100FFFF + FF00000000002F26000050410000705B000090740000B08E0000CFA90000F0C3 + 0000FFD21100FFD83100FFDD5100FFE47100FFEA9100FFF0B100FFF6D100FFFF + FF00000000002F1400005022000070300000903E0000B04D0000CF5B0000F069 + 0000FF791100FF8A3100FF9D5100FFAF7100FFC19100FFD2B100FFE5D100FFFF + FF00000000002F030000500400007006000090090000B00A0000CF0C0000F00E + 0000FF201200FF3E3100FF5C5100FF7A7100FF979100FFB6B100FFD4D100FFFF + FF00000000002F000E00500017007000210090002B00B0003600CF004000F000 + 4900FF115A00FF317000FF518600FF719C00FF91B200FFB1C800FFD1DF00FFFF + FF00000000002F0020005000360070004C0090006200B0007800CF008E00F000 + A400FF11B300FF31BE00FF51C700FF71D100FF91DC00FFB1E500FFD1F000FFFF + FF00000000002C002F004B0050006900700087009000A500B000C400CF00E100 + F000F011FF00F231FF00F451FF00F671FF00F791FF00F9B1FF00FBD1FF00FFFF + FF00000000001B002F002D0050003F007000520090006300B0007600CF008800 + F0009911FF00A631FF00B451FF00C271FF00CF91FF00DCB1FF00EBD1FF00FFFF + FF000000000008002F000E005000150070001B0090002100B0002600CF002C00 + F0003E11FF005831FF007151FF008C71FF00A691FF00BFB1FF00DAD1FF00FFFF + FF00000000000000000000000000433C382F2F383C4300000000000000000000 + 000000000000000000000043313945494A50504A494539314300000000000000 + 0000000000000000004431404F525252525252525252524F4031440000000000 + 00000000000000003B3F4F52525252525252525252525252524D3F3B00000000 + 0000000000000034414952525252525252525252525252525252524234000000 + 00000000000034474B0110324B52525252525252525252525252525247340000 + 00000000003B42524B0F5C2E0A1A485252525252525252525252525252423B00 + 00000000443F52524B0F6F6F6F5A0A3352525252525252525252525252523F44 + 00000000314D52524B0F6F6F6F6F6127184B5252525252525252525252524D31 + 00000043405252524B08626F6F6F6F6F55125252525252525252525252525240 + 430000314F52525250220553636F6F6F6F2B255252525252525252525252524F + 300000395252525252524E2017606F6F6F610451525252525252525252525252 + 390043455252525252525252370E616F6F6F281B1F1F1F1F2452525252525252 + 45433C49525252525252525252232C6F6F6F5E59595959590352525252525252 + 493C384A52525252525252525250065D6F6F6F6F6F6F6F6F0352525252525252 + 4A382F505252525252525252525236296F6F6F6F6F6F6F6F0352525252525252 + 502F2F50525252525252525252524E0D6F6F6F615B5C5B5B0352525252525252 + 502F384A52525252525252525252520B5F6F6F5B011313131952525252525252 + 4A383C49525252525252525252525221586F6F6F144952525252525252525252 + 493C434552525252525252525252523D2A6F6F6F542452525252525252525252 + 4543003952525252525252525252524E0D6F6F6F63163E525252525252525252 + 390000304F5252525252525252525252115C6F6F6F5F0E21465252525252524F + 300000434052525252525252525252523E266F6F6F6F6257151C525252525240 + 43000000314D52525252525252525252521B53646F6F6F6F610C525252524D31 + 00000000443F52525252525252525252524E1C1E5F6F6F6F610C525252523F44 + 00000000003B425252525252525252525252523A0756616F610C525252423B00 + 00000000000034475252525252525252525252524922091D2D0C525247340000 + 0000000000000034425252525252525252525252525252483532524234000000 + 00000000000000003B3F4D52525252525252525252525252524D3F3B00000000 + 0000000000000000004431404F525252525252525252524F4031440000000000 + 000000000000000000000043303945494A50504A494539304300000000000000 + 0000000000000000000000000000433C382F2F383C4300000000000000000000 + 0000FFF00FFFFF8001FFFE00007FFC00003FF800001FF000000FE0000007C000 + 0003C00000038000000180000001800000010000000000000000000000000000 + 000000000000000000000000000000000000800000018000000180000001C000 + 0003C0000003E0000007F000000FF800001FFC00003FFE00007FFF8001FFFFF0 + 0FFF280000001000000020000000010008000000000000000000000000000000 + 00000000000000000000000000003F3F69002A2A720044447700272784002323 + 8F002C2C8F003535870033338C0035358E002A2A91002D2D910023239A001F1F + A1001F1FB1001C1CBF002323A0002525A4003333BE0040408700515181005555 + 86005F5F80006363870062628E0066668E00696989004747B4004A4ABC001515 + C3001515D4001919D6002828C5001717E5001515F3001515FA001616FE006969 + C1007E7EC8009797AA00AFAFBB00BABAC700C2C2C800CDCDD400D1D1D300D5D5 + D800DDDDE000E4E4E500F1F1F100F9F9F900FFFFFF0000704C000090630000B0 + 790000CF8F0000F0A60011FFB40031FFBE0051FFC80071FFD30091FFDC00B1FF + E500D1FFF000FFFFFF0000000000002F0E00005018000070220000902C0000B0 + 360000CF400000F04A0011FF5B0031FF710051FF870071FF9D0091FFB200B1FF + C900D1FFDF00FFFFFF0000000000022F00000450000006700000089000000AB0 + 00000BCF00000EF0000020FF12003DFF31005BFF510079FF710098FF9100B5FF + B100D4FFD100FFFFFF0000000000142F000022500000307000003D9000004CB0 + 000059CF000067F0000078FF11008AFF31009CFF5100AEFF7100C0FF9100D2FF + B100E4FFD100FFFFFF0000000000262F0000405000005A700000749000008EB0 + 0000A9CF0000C2F00000D1FF1100D8FF3100DEFF5100E3FF7100E9FF9100EFFF + B100F6FFD100FFFFFF00000000002F26000050410000705B000090740000B08E + 0000CFA90000F0C30000FFD21100FFD83100FFDD5100FFE47100FFEA9100FFF0 + B100FFF6D100FFFFFF00000000002F1400005022000070300000903E0000B04D + 0000CF5B0000F0690000FF791100FF8A3100FF9D5100FFAF7100FFC19100FFD2 + B100FFE5D100FFFFFF00000000002F030000500400007006000090090000B00A + 0000CF0C0000F00E0000FF201200FF3E3100FF5C5100FF7A7100FF979100FFB6 + B100FFD4D100FFFFFF00000000002F000E00500017007000210090002B00B000 + 3600CF004000F0004900FF115A00FF317000FF518600FF719C00FF91B200FFB1 + C800FFD1DF00FFFFFF00000000002F0020005000360070004C0090006200B000 + 7800CF008E00F000A400FF11B300FF31BE00FF51C700FF71D100FF91DC00FFB1 + E500FFD1F000FFFFFF00000000002C002F004B0050006900700087009000A500 + B000C400CF00E100F000F011FF00F231FF00F451FF00F671FF00F791FF00F9B1 + FF00FBD1FF00FFFFFF00000000001B002F002D0050003F007000520090006300 + B0007600CF008800F0009911FF00A631FF00B451FF00C271FF00CF91FF00DCB1 + FF00EBD1FF00FFFFFF000000000008002F000E005000150070001B0090002100 + B0002600CF002C00F0003E11FF005831FF007151FF008C71FF00A691FF00BFB1 + FF00DAD1FF00FFFFFF000000000000251C12121C250000000000000000262023 + 2424242423202600000000001B0D0E23242424242424211B0000002621092C17 + 112424242424242126000020240832322B0724242424242420002523241F032E + 32280F242424242423251C24242424042D321A1515102424241C122424242424 + 143232323206242424121224242424240B313016180C242424121C2424242424 + 1D2A321324242424241C25232424242424153229052224242325002024242424 + 240C2E322F012424200000262124242424240A2731192421260000001B212424 + 2424241E0A02211B000000000026202324242424232026000000000000000025 + 1C12121C250000000000F81F0000E0070000C003000080010000800100000000 + 000000000000000000000000000000000000000000008001000080010000C003 + 0000E0070000F81F0000} + OldCreateOrder = False + OnActivate = FormActivate + OnCreate = FormCreate + PixelsPerInch = 96 + TextHeight = 13 + object tmrWatchDog: TTimer + OnTimer = tmrWatchDogTimer + Left = 16 + Top = 8 + end +end diff --git a/libsrc/FlashPlayer/uMain.pas b/libsrc/FlashPlayer/uMain.pas index ff2c42154..5c18c7102 100644 --- a/libsrc/FlashPlayer/uMain.pas +++ b/libsrc/FlashPlayer/uMain.pas @@ -1,451 +1,521 @@ -unit uMain; - -interface - -uses - Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, - Dialogs, OleCtrls, ShockwaveFlashObjects_TLB, StdCtrls, ExtCtrls; - -type - TfrmMain = class(TForm) - tmrWatchDog: TTimer; - - procedure FormActivate(Sender: TObject); - procedure FormCreate(Sender: TObject); - procedure FormDestroy(Sender: TObject); - procedure tmrWatchDogTimer(Sender: TObject); - private - { Private declarations } - public - { Public declarations } - end; - -type - TMySWF = class(TShockwaveFlash) - public - procedure CreateWnd; override; - end; - -type - TPipeThread = class(TThread) - protected - flashFile: string; - w: integer; - h: integer; - bgColor: TColor; - procedure Execute; override; - procedure displaySWF; - procedure freeSWF; - procedure setPos; - procedure setBGColor; - end; - - TBuf = array[0..255] of byte; - -var - frmMain: TfrmMain; - k: string; - t: TPipeThread; - flaPreview: TMySWF; - target: HWND = 0; - -implementation - -{$R *.dfm} - - - -procedure TMySWF.CreateWnd; -begin - inherited; -end; - -function arrToStr(k: TBuf; len: integer): string; -var - s: string; - i: integer; -begin - s := ''; - for i := 0 to len - 1 do - begin - if k[i] = 0 then - break; - s := s + '' + chr(k[i]); - end; - Result := s; -end; - -procedure ReadPipe(pipe: cardinal; var buffer: TBuf; bytesToRead: cardinal); -var - numBytesRead: DWORD; - readResult: longbool; -begin - numBytesRead := 0; - readResult := ReadFile(pipe, buffer, bytesToRead, numBytesRead, nil); - if (not readResult) or (numBytesRead <> bytesToRead) then - begin - Application.Terminate; - end; -end; - -procedure WritePipe(pipe: cardinal; var buffer: TBuf; bytesToWrite: cardinal); -var - written: cardinal; - writeResult: longbool; -begin - written := 0; - writeResult := WriteFile(pipe, buffer, bytesToWrite, written, nil); - if (not writeResult) or (written <> bytesToWrite) then - begin - Application.Terminate; - end; -end; - -procedure TPipeThread.freeSWF(); -begin - if Assigned(flaPreview) then - begin - try - flaPreview.Stop; - flaPreview.Movie := ''; - flaPreview.Free; - flaPreview := nil; - except - on E: Exception do - begin - end; - end; - end; -end; - -procedure TPipeThread.displaySWF(); -begin - Windows.SetParent(frmMain.Handle, target); - freeSWF(); - flaPreview := TMySWF.Create(frmMain); - flaPreview.Left := 0; - flaPreview.Top := 0; - flaPreview.Width := self.w; - flaPreview.Height := self.h; - frmMain.Caption := 'set movie:' + flashFile; - flaPreview.Parent := frmMain; - flaPreview.Movie := flashFile; - flaPreview.SetFocus; -end; - -procedure TPipeThread.setBGColor(); -begin - frmMain.Color := self.bgColor; -end; - - -procedure TPipeThread.setPos(); -begin - SetWindowPos(frmMain.Handle, 0, 0, 0, self.w, self.h, SWP_SHOWWINDOW); - flaPreview.Left := 0; - flaPreview.Top := 0; - flaPreview.Width := self.w; - flaPreview.Height := self.h; - flaPreview.CreateWnd; - //displaySWF(); -end; - -procedure TPipeThread.Execute(); -var - pipe: cardinal; - buffer: TBuf; - pipename: PAnsiChar; - len: integer; - cmd: integer; - val: cardinal; - vals: string; - vars: string; - -const - CMD_PLAY = 1; - CMD_RESIZE = 2; - CMD_BGCOLOR = 3; - CMD_CURRENT_FRAME = 4; - CMD_TOTAL_FRAMES = 5; - CMD_PAUSE = 6; - CMD_RESUME = 7; - CMD_PLAYING = 8; - CMD_REWIND = 9; - CMD_GOTO = 10; - CMD_CALL = 11; - CMD_GETVARIABLE = 12; - CMD_SETVARIABLE = 13; -begin - - try - pipename := PAnsiChar('\\.\\pipe\ffdec_flashplayer_' + ParamStr(1)); - begin - pipe := CreateFile(pipename, GENERIC_READ or GENERIC_WRITE, - FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); - - repeat - try - ReadPipe(pipe, buffer, 1); - cmd := buffer[0]; - case cmd of - CMD_PLAY: - begin - ReadPipe(pipe, buffer, 1); - len := buffer[0]; - ReadPipe(pipe, buffer, len); - self.flashFile := arrToStr(buffer, len); - try - Synchronize(displaySWF); - except - on E: Exception do - begin - freeSWF(); - end; - end; - end; - CMD_RESIZE: - begin - ReadPipe(pipe, buffer, 4); - self.w := buffer[0] * 256 + buffer[1]; - self.h := buffer[2] * 256 + buffer[3]; - Synchronize(setPos); - end; - CMD_BGCOLOR: - begin - ReadPipe(pipe, buffer, 3); - self.bgColor := RGB(buffer[0], buffer[1], buffer[2]); - Synchronize(setBGColor); - end; - CMD_CURRENT_FRAME: - begin - val := 0; - try - if flaPreview.ReadyState = 4 then - val := flaPreview.CurrentFrame - except - on E: Exception do - begin - freeSWF(); - end; - end; - buffer[0] := (val shr 8) mod 256; - buffer[1] := val mod 256; - WritePipe(pipe, buffer, 2); - end; - CMD_TOTAL_FRAMES: - begin - val := 0; - try - if flaPreview.ReadyState = 4 then - val := flaPreview.TotalFrames - except - on E: Exception do - begin - freeSWF(); - end; - end; - buffer[0] := (val shr 8) mod 256; - buffer[1] := val mod 256; - WritePipe(pipe, buffer, 2); - end; - CMD_PAUSE: - begin - try - flaPreview.Stop; - except - on E: Exception do - begin - freeSWF(); - end; - end; - end; - CMD_RESUME: - begin - try - flaPreview.Play; - except - on E: Exception do - begin - freeSWF(); - end; - end; - end; - CMD_PLAYING: - begin - buffer[0] := 0; - try - if flaPreview.ReadyState = 4 then - if flaPreview.IsPlaying then - buffer[0] := 1; - except - on E: Exception do - begin - freeSWF(); - end; - end; - - WritePipe(pipe, buffer, 1); - end; - CMD_REWIND: - begin - try - flaPreview.Rewind; - except - on E: Exception do - begin - freeSWF(); - end; - end; - end; - CMD_GOTO: - begin - ReadPipe(pipe, buffer, 2); - val := (buffer[0] shl 8) + buffer[1]; - try - flaPreview.GotoFrame(val); - except - on E: Exception do - begin - freeSWF(); - end; - end; - end; - CMD_CALL: - begin - ReadPipe(pipe, buffer, 2); - val := (buffer[0] shl 8) + buffer[1]; - ReadPipe(pipe, buffer, val); - SetString(vals, PChar(Addr(buffer)), val); - try - vals := flaPreview.CallFunction(vals); - except - on E: Exception do - begin - vals := ''; - freeSWF(); - end; - end; - val := length(vals); - buffer[0] := (val shr 8) mod 256; - buffer[1] := val mod 256; - WritePipe(pipe, buffer, 2); - Move(vals[1], buffer, val); - WritePipe(pipe, buffer, val); - end; - CMD_GETVARIABLE: - begin - ReadPipe(pipe, buffer, 2); - val := (buffer[0] shl 8) + buffer[1]; - ReadPipe(pipe, buffer, val); - SetString(vals, PChar(Addr(buffer)), val); - try - vals := flaPreview.GetVariable(vals); - except - on E: Exception do - begin - vals := ''; - freeSWF(); - end; - end; - val := length(vals); - buffer[0] := (val shr 8) mod 256; - buffer[1] := val mod 256; - WritePipe(pipe, buffer, 2); - Move(vals[1], buffer, val); - WritePipe(pipe, buffer, val); - end; - CMD_SETVARIABLE: - begin - ReadPipe(pipe, buffer, 2); - val := (buffer[0] shl 8) + buffer[1]; - ReadPipe(pipe, buffer, val); - SetString(vars, PChar(Addr(buffer)), val); - - ReadPipe(pipe, buffer, 2); - val := (buffer[0] shl 8) + buffer[1]; - ReadPipe(pipe, buffer, val); - SetString(vals, PChar(Addr(buffer)), val); - - try - flaPreview.SetVariable(vars, vals); - except - on E: Exception do - begin - freeSWF(); - end; - end; - end; - end; - except - on E: Exception do - begin - freeSWF(); - end; - end; - until False; - - CloseHandle(pipe); - end; - except - on E: Exception do - begin - end; - end; -end; - -procedure TfrmMain.FormActivate(Sender: TObject); -begin - - if (ParamCount >= 2) then - begin - flaPreview.Parent := frmMain; - - ShowWindow(Application.Handle, SW_HIDE); - SetWindowLong(Application.Handle, GWL_EXSTYLE, - getWindowLong(Application.Handle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW); - ShowWindow(Application.Handle, SW_SHOW); - - SetForegroundWindow(HWND(StrToInt(ParamStr(2)))); - frmMain.Caption := 'FlashPlayerWindow_' + ParamStr(2); - Application.Title := 'FlashPlayerWindow_' + ParamStr(2); - target := HWND(StrToInt(ParamStr(1))); - - SetWindowLong(frmMain.Handle, GWL_STYLE, 0); - ShowWindow(frmMain.Handle, SW_SHOW); - - frmMain.Left := 0; - frmMain.Top := 0; - Windows.SetParent(frmMain.Handle, target); - - t := TPipeThread.Create(True); - t.Resume; - end; -end; - -procedure TfrmMain.FormCreate(Sender: TObject); -begin - if (ParamCount >= 2) then - begin - flaPreview := TMySWF.Create(frmMain); - flaPreview.AllowScriptAccess := 'always'; - flaPreview.BackgroundColor := -1; - end; -end; - -procedure TfrmMain.FormDestroy(Sender: TObject); -begin - t.Free; -end; - -procedure TfrmMain.tmrWatchDogTimer(Sender: TObject); -begin - if target <> 0 then - begin - if not IsWindow(target) then - begin - Application.Terminate; - end; - end; -end; - -end. +unit uMain; + +interface + +uses + Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, + Dialogs, OleCtrls, ShockwaveFlashObjects_TLB, StdCtrls, ExtCtrls; + +type + TfrmMain = class(TForm) + tmrWatchDog: TTimer; + + procedure FormActivate(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure tmrWatchDogTimer(Sender: TObject); + private + procedure NoRightClick(var Msg:TMsg; var handled:Boolean); + public + { Public declarations } + end; + +type + TMySWF = class(TShockwaveFlash) + public + procedure CreateWnd; override; + end; + +type + TPipeThread = class(TThread) + protected + flashFile: string; + w: integer; + h: integer; + bgColor: integer; + bgTColor: TColor; + zoom: integer; + procedure Execute; override; + procedure displaySWF; + procedure freeSWF; + procedure setPos; + procedure setBGColor; + procedure setZoom; + end; + + TBuf = array[0..255] of byte; + +var + frmMain: TfrmMain; + k: string; + t: TPipeThread; + flaPreview: TMySWF; + target: HWND = 0; + clicked: integer = 0; + xpos : integer = 0; + ypos : integer = 0; + +implementation + +{$R *.dfm} + + + +procedure TfrmMain.NoRightClick(var Msg:TMsg; var handled:Boolean); +begin + if((Msg.message = WM_LBUTTONDOWN) and (Msg.wParam = MK_LBUTTON)) then + begin + clicked := 1; + xpos := LOWORD(Msg.lParam); + ypos := HIWORD(Msg.lParam); + end; + + if((Msg.message = WM_RBUTTONDOWN) and (Msg.wParam = MK_RBUTTON)) then + begin + clicked := 2; + xpos := LOWORD(Msg.lParam); + ypos := HIWORD(Msg.lParam); + handled := true; + end + else + handled := false; +end; + + +procedure TMySWF.CreateWnd; +begin + inherited; +end; + +function arrToStr(k: TBuf; len: integer): string; +var + s: string; + i: integer; +begin + s := ''; + for i := 0 to len - 1 do + begin + if k[i] = 0 then + break; + s := s + '' + chr(k[i]); + end; + Result := s; +end; + +procedure ReadPipe(pipe: cardinal; var buffer: TBuf; bytesToRead: cardinal); +var + numBytesRead: DWORD; + readResult: longbool; +begin + numBytesRead := 0; + readResult := ReadFile(pipe, buffer, bytesToRead, numBytesRead, nil); + if (not readResult) or (numBytesRead <> bytesToRead) then + begin + Application.Terminate; + end; +end; + +procedure WritePipe(pipe: cardinal; var buffer: TBuf; bytesToWrite: cardinal); +var + written: cardinal; + writeResult: longbool; +begin + written := 0; + writeResult := WriteFile(pipe, buffer, bytesToWrite, written, nil); + if (not writeResult) or (written <> bytesToWrite) then + begin + Application.Terminate; + end; +end; + +procedure TPipeThread.freeSWF(); +begin + if Assigned(flaPreview) then + begin + try + flaPreview.Stop; + flaPreview.Movie := ''; + flaPreview.Free; + flaPreview := nil; + except + on E: Exception do + begin + end; + end; + end; +end; + +procedure TPipeThread.displaySWF(); +begin + Windows.SetParent(frmMain.Handle, target); + freeSWF(); + flaPreview := TMySWF.Create(frmMain); + flaPreview.Left := 0; + flaPreview.Top := 0; + flaPreview.Width := self.w; + flaPreview.Height := self.h; + frmMain.Caption := 'set movie:' + flashFile; + flaPreview.Parent := frmMain; + flaPreview.Movie := flashFile; + flaPreview.SetFocus; +end; + +procedure TPipeThread.setBGColor(); +begin + flaPreview.BackgroundColor := self.bgColor; + frmMain.Color := self.bgTColor; +end; + + +procedure TPipeThread.setPos(); +begin + SetWindowPos(frmMain.Handle, 0, 0, 0, self.w, self.h, SWP_SHOWWINDOW); + flaPreview.Left := 0; + flaPreview.Top := 0; + flaPreview.Width := self.w; + flaPreview.Height := self.h; + flaPreview.CreateWnd; +end; + + + +procedure TPipeThread.setZoom(); +begin + flaPreview.Zoom(self.zoom); +end; + +procedure TPipeThread.Execute(); +var + pipe: cardinal; + buffer: TBuf; + pipename: PAnsiChar; + len: integer; + cmd: integer; + val: cardinal; + vals: string; + vars: string; + +const + CMD_PLAY = 1; + CMD_RESIZE = 2; + CMD_BGCOLOR = 3; + CMD_CURRENT_FRAME = 4; + CMD_TOTAL_FRAMES = 5; + CMD_PAUSE = 6; + CMD_RESUME = 7; + CMD_PLAYING = 8; + CMD_REWIND = 9; + CMD_GOTO = 10; + CMD_CALL = 11; + CMD_GETVARIABLE = 12; + CMD_SETVARIABLE = 13; + CMD_CHECKCLICK = 14; + CMD_ZOOM = 15; +begin + + try + pipename := PAnsiChar('\\.\\pipe\ffdec_flashplayer_' + ParamStr(1)); + begin + pipe := CreateFile(pipename, GENERIC_READ or GENERIC_WRITE, + FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); + + repeat + try + ReadPipe(pipe, buffer, 1); + cmd := buffer[0]; + case cmd of + + CMD_CHECKCLICK: + begin + buffer[0]:=clicked; + len := 1; + if clicked>0 then + begin + len := len + 4; + buffer[1] := (xpos shr 8) mod 256; + buffer[2] := xpos mod 256; + buffer[3] := (ypos shr 8) mod 256; + buffer[4] := ypos mod 256; + end; + clicked := 0; + xpos := 0; + ypos := 0; + + WritePipe(pipe,buffer,len); + end; + CMD_ZOOM: + begin + ReadPipe(pipe, buffer, 2); + self.zoom := buffer[0] * 256 + buffer[1]; + Synchronize(setZoom); + end; + CMD_PLAY: + begin + ReadPipe(pipe, buffer, 1); + len := buffer[0]; + ReadPipe(pipe, buffer, len); + self.flashFile := arrToStr(buffer, len); + try + Synchronize(displaySWF); + except + on E: Exception do + begin + freeSWF(); + end; + end; + end; + CMD_RESIZE: + begin + ReadPipe(pipe, buffer, 4); + self.w := buffer[0] * 256 + buffer[1]; + self.h := buffer[2] * 256 + buffer[3]; + Synchronize(setPos); + end; + CMD_BGCOLOR: + begin + ReadPipe(pipe, buffer, 3); + self.bgColor := (buffer[0] shl 16)+(buffer[1] shl 8)+(buffer[2]); + self.bgTColor := RGB(buffer[0],buffer[1],buffer[2]); + Synchronize(setBGColor); + end; + CMD_CURRENT_FRAME: + begin + val := 0; + try + if flaPreview.ReadyState = 4 then + val := flaPreview.CurrentFrame + except + on E: Exception do + begin + freeSWF(); + end; + end; + buffer[0] := (val shr 8) mod 256; + buffer[1] := val mod 256; + WritePipe(pipe, buffer, 2); + end; + CMD_TOTAL_FRAMES: + begin + val := 0; + try + if flaPreview.ReadyState = 4 then + val := flaPreview.TotalFrames + except + on E: Exception do + begin + freeSWF(); + end; + end; + buffer[0] := (val shr 8) mod 256; + buffer[1] := val mod 256; + WritePipe(pipe, buffer, 2); + end; + CMD_PAUSE: + begin + try + flaPreview.Stop; + except + on E: Exception do + begin + freeSWF(); + end; + end; + end; + CMD_RESUME: + begin + try + flaPreview.Play; + except + on E: Exception do + begin + freeSWF(); + end; + end; + end; + CMD_PLAYING: + begin + buffer[0] := 0; + try + if flaPreview.ReadyState = 4 then + if flaPreview.IsPlaying then + buffer[0] := 1; + except + on E: Exception do + begin + freeSWF(); + end; + end; + + WritePipe(pipe, buffer, 1); + end; + CMD_REWIND: + begin + try + flaPreview.Rewind; + except + on E: Exception do + begin + freeSWF(); + end; + end; + end; + CMD_GOTO: + begin + ReadPipe(pipe, buffer, 2); + val := (buffer[0] shl 8) + buffer[1]; + try + flaPreview.GotoFrame(val); + except + on E: Exception do + begin + freeSWF(); + end; + end; + end; + CMD_CALL: + begin + ReadPipe(pipe, buffer, 2); + val := (buffer[0] shl 8) + buffer[1]; + ReadPipe(pipe, buffer, val); + SetString(vals, PChar(Addr(buffer)), val); + try + vals := flaPreview.CallFunction(vals); + except + on E: Exception do + begin + vals := ''; + freeSWF(); + end; + end; + val := length(vals); + buffer[0] := (val shr 8) mod 256; + buffer[1] := val mod 256; + WritePipe(pipe, buffer, 2); + Move(vals[1], buffer, val); + WritePipe(pipe, buffer, val); + end; + CMD_GETVARIABLE: + begin + ReadPipe(pipe, buffer, 2); + val := (buffer[0] shl 8) + buffer[1]; + ReadPipe(pipe, buffer, val); + SetString(vals, PChar(Addr(buffer)), val); + try + vals := flaPreview.GetVariable(vals); + except + on E: Exception do + begin + vals := ''; + freeSWF(); + end; + end; + val := length(vals); + buffer[0] := (val shr 8) mod 256; + buffer[1] := val mod 256; + WritePipe(pipe, buffer, 2); + Move(vals[1], buffer, val); + WritePipe(pipe, buffer, val); + end; + CMD_SETVARIABLE: + begin + ReadPipe(pipe, buffer, 2); + val := (buffer[0] shl 8) + buffer[1]; + ReadPipe(pipe, buffer, val); + SetString(vars, PChar(Addr(buffer)), val); + + ReadPipe(pipe, buffer, 2); + val := (buffer[0] shl 8) + buffer[1]; + ReadPipe(pipe, buffer, val); + SetString(vals, PChar(Addr(buffer)), val); + + try + flaPreview.SetVariable(vars, vals); + except + on E: Exception do + begin + freeSWF(); + end; + end; + end; + end; + except + on E: Exception do + begin + freeSWF(); + end; + end; + until False; + + CloseHandle(pipe); + end; + except + on E: Exception do + begin + end; + end; +end; + +procedure TfrmMain.FormActivate(Sender: TObject); +begin + + if (ParamCount >= 2) then + begin + flaPreview.Parent := frmMain; + + ShowWindow(Application.Handle, SW_HIDE); + SetWindowLong(Application.Handle, GWL_EXSTYLE, + getWindowLong(Application.Handle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW); + ShowWindow(Application.Handle, SW_SHOW); + + SetForegroundWindow(HWND(StrToInt(ParamStr(2)))); + frmMain.Caption := 'FlashPlayerWindow_' + ParamStr(2); + Application.Title := 'FlashPlayerWindow_' + ParamStr(2); + target := HWND(StrToInt(ParamStr(1))); + + SetWindowLong(frmMain.Handle, GWL_STYLE, 0); + ShowWindow(frmMain.Handle, SW_SHOW); + + frmMain.Left := 0; + frmMain.Top := 0; + Windows.SetParent(frmMain.Handle, target); + + t := TPipeThread.Create(True); + t.Resume; + end; +end; + +procedure TfrmMain.FormCreate(Sender: TObject); +begin + if (ParamCount >= 2) then + begin + Application.OnMessage := NoRightClick; + try + flaPreview := TMySWF.Create(frmMain); + flaPreview.Scale := 'noscale'; + flaPreview.WMode := 'direct'; + flaPreview.Menu := false; + flaPreview.AllowScriptAccess := 'always'; + flaPreview.BackgroundColor := -1; + except + Application.Terminate; + end; + end; +end; + +procedure TfrmMain.FormDestroy(Sender: TObject); +begin + t.Free; +end; + +procedure TfrmMain.tmrWatchDogTimer(Sender: TObject); +begin + if target <> 0 then + begin + if not IsWindow(target) then + begin + Application.Terminate; + end; + end; +end; + +end. diff --git a/src/com/jpexs/decompiler/flash/gui/ImagePanel.java b/src/com/jpexs/decompiler/flash/gui/ImagePanel.java index ee170ad2a..a362885a7 100644 --- a/src/com/jpexs/decompiler/flash/gui/ImagePanel.java +++ b/src/com/jpexs/decompiler/flash/gui/ImagePanel.java @@ -79,12 +79,7 @@ import javax.swing.JPanel; public final class ImagePanel extends JPanel implements ActionListener, MediaDisplay { - static final String ACTION_SELECT_BKCOLOR = "SELECTCOLOR"; - static final String ACTION_ZOOMIN = "ZOOMIN"; - static final String ACTION_ZOOMOUT = "ZOOMOUT"; - static final String ACTION_ZOOMFIT = "ZOOMFIT"; - static final String ACTION_ZOOMNONE = "ZOOMNONE"; - static final String ACTION_SNAPSHOT = "SNAPSHOT"; + private Timelined timelined; private boolean stillFrame = false; @@ -101,12 +96,7 @@ public final class ImagePanel extends JPanel implements ActionListener, MediaDis private int time = 0; private int selectedDepth = -1; private double zoom = 1.0; - private double realZoom = 1.0; - private JLabel percentLabel = new JLabel("100%"); - private JPanel zoomPanel; - - public static final int ZOOM_DECADE_STEPS = 10; - public static final double ZOOM_MULTIPLIER = Math.pow(10, 1.0 / ZOOM_DECADE_STEPS); + public void selectDepth(int depth) { if (depth != selectedDepth) { @@ -332,52 +322,7 @@ public final class ImagePanel extends JPanel implements ActionListener, MediaDis iconPanel = new IconPanel(); //labelPan.add(label, new GridBagConstraints()); - add(iconPanel, BorderLayout.CENTER); - - JPanel bottomPanel = new JPanel(new BorderLayout()); - JPanel buttonsPanel = new JPanel(new FlowLayout()); - JButton selectColorButton = new JButton(View.getIcon("color16")); - selectColorButton.addActionListener(this); - selectColorButton.setActionCommand(ACTION_SELECT_BKCOLOR); - selectColorButton.setToolTipText(AppStrings.translate("button.selectbkcolor.hint")); - - JButton zoomInButton = new JButton(View.getIcon("zoomin16")); - zoomInButton.addActionListener(this); - zoomInButton.setActionCommand(ACTION_ZOOMIN); - zoomInButton.setToolTipText(AppStrings.translate("button.zoomin.hint")); - - JButton zoomOutButton = new JButton(View.getIcon("zoomout16")); - zoomOutButton.addActionListener(this); - zoomOutButton.setActionCommand(ACTION_ZOOMOUT); - zoomOutButton.setToolTipText(AppStrings.translate("button.zoomout.hint")); - - JButton zoomFitButton = new JButton(View.getIcon("zoomfit16")); - zoomFitButton.addActionListener(this); - zoomFitButton.setActionCommand(ACTION_ZOOMFIT); - zoomFitButton.setToolTipText(AppStrings.translate("button.zoomfit.hint")); - - JButton zoomNoneButton = new JButton(View.getIcon("zoomnone16")); - zoomNoneButton.addActionListener(this); - zoomNoneButton.setActionCommand(ACTION_ZOOMNONE); - zoomNoneButton.setToolTipText(AppStrings.translate("button.zoomnone.hint")); - - JButton snapshotButton = new JButton(View.getIcon("snapshot16")); - snapshotButton.addActionListener(this); - snapshotButton.setActionCommand(ACTION_SNAPSHOT); - snapshotButton.setToolTipText(AppStrings.translate("button.snapshot.hint")); - - zoomPanel = new JPanel(new FlowLayout()); - updateZoom(); - zoomPanel.add(percentLabel); - zoomPanel.add(zoomInButton); - zoomPanel.add(zoomOutButton); - zoomPanel.add(zoomNoneButton); - zoomPanel.add(zoomFitButton); - zoomPanel.add(selectColorButton); - buttonsPanel.add(zoomPanel); - buttonsPanel.add(snapshotButton); - bottomPanel.add(buttonsPanel, BorderLayout.EAST); - add(bottomPanel, BorderLayout.SOUTH); + add(iconPanel, BorderLayout.CENTER); add(debugLabel, BorderLayout.NORTH); iconPanel.addMouseListener(new MouseAdapter() { @@ -458,116 +403,27 @@ public final class ImagePanel extends JPanel implements ActionListener, MediaDis }); } - private static double roundZoom(double realZoom, int mantisa) { - double l10 = Math.log10(realZoom); - int lg = (int) (-Math.floor(l10) + mantisa - 1); - if (lg < 0) { - lg = 0; - } - BigDecimal bd = new BigDecimal(String.valueOf(realZoom)).setScale(lg, BigDecimal.ROUND_HALF_UP); - return bd.doubleValue(); - } - - private void updateZoom() { - double pctzoom = roundZoom(realZoom * 100, 3); - String r = "" + pctzoom; - zoom = pctzoom / 100.0; - if (r.endsWith(".0")) { - r = r.substring(0, r.length() - 2); - } - percentLabel.setText("" + r + "%"); + @Override + public void zoom(double zoom){ + this.zoom = zoom; drawFrame(); } - - private void putImageToClipBoard(BufferedImage img) { - if (img == null) { - return; - } - TransferableImage trans = new TransferableImage(img); - Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard(); - c.setContents(trans, new ClipboardOwner() { - @Override - public void lostOwnership(Clipboard clipboard, Transferable contents) { - } - }); - } - - private class TransferableImage implements Transferable { - - Image img; - - public TransferableImage(Image img) { - this.img = img; - } - - public Object getTransferData(DataFlavor flavor) - throws UnsupportedFlavorException, IOException { - if (flavor.equals(DataFlavor.imageFlavor) && img != null) { - return img; - } else { - throw new UnsupportedFlavorException(flavor); - } - } - - @Override - public DataFlavor[] getTransferDataFlavors() { - DataFlavor[] flavors = new DataFlavor[1]; - flavors[ 0] = DataFlavor.imageFlavor; - return flavors; - } - - @Override - public boolean isDataFlavorSupported(DataFlavor flavor) { - DataFlavor[] flavors = getTransferDataFlavors(); - for (int i = 0; i < flavors.length; i++) { - if (flavor.equals(flavors[ i])) { - return true; - } - } - - return false; - } - } + + @Override public void actionPerformed(ActionEvent e) { - switch (e.getActionCommand()) { - case ACTION_SELECT_BKCOLOR: - View.execInEventDispatch(new Runnable() { - @Override - public void run() { - Color newColor = JColorChooser.showDialog(null, AppStrings.translate("dialog.selectbkcolor.title"), View.swfBackgroundColor); - if (newColor != null) { - View.swfBackgroundColor = newColor; - setBackground(newColor); - repaint(); - } - } - }); - break; - case ACTION_ZOOMIN: - realZoom *= ZOOM_MULTIPLIER; - updateZoom(); - break; - case ACTION_ZOOMOUT: - realZoom /= ZOOM_MULTIPLIER; - updateZoom(); - break; - case ACTION_ZOOMNONE: - realZoom = 1.0; - updateZoom(); - break; - case ACTION_ZOOMFIT: - realZoom = zoomToFit(); - updateZoom(); - break; - case ACTION_SNAPSHOT: - putImageToClipBoard(iconPanel.getLastImage()); - break; - } + } - private double zoomToFit() { + @Override + public BufferedImage printScreen() { + return iconPanel.getLastImage(); + } + + + + public void zoomToFit() { if (timelined instanceof BoundedTag) { RECT bounds = ((BoundedTag) timelined).getRect(new HashSet()); double w1 = bounds.getWidth() / SWF.unitDivisor; @@ -585,9 +441,8 @@ public final class ImagePanel extends JPanel implements ActionListener, MediaDis } else { w = w2; } - return (double) w / (double) w1; - } - return 1; + zoom = (double) w / (double) w1; + } } public void setImage(byte[] data) { @@ -603,9 +458,15 @@ public final class ImagePanel extends JPanel implements ActionListener, MediaDis } catch (IOException ex) { Logger.getLogger(ImagePanel.class.getName()).log(Level.SEVERE, null, ex); } - zoomPanel.setVisible(false); } + @Override + public boolean zoomAvailable() { + return timelined!=null; + } + + + public synchronized void setTimelined(final Timelined drawable, final SWF swf, int frame) { pause(); if (drawable instanceof ButtonTag) { @@ -629,7 +490,6 @@ public final class ImagePanel extends JPanel implements ActionListener, MediaDis } time = 0; play(); - zoomPanel.setVisible(true); } public void setImage(SerializableImage image) { @@ -642,7 +502,6 @@ public final class ImagePanel extends JPanel implements ActionListener, MediaDis stillFrame = true; iconPanel.setImg(image); iconPanel.setOutlines(new ArrayList(), new ArrayList()); - zoomPanel.setVisible(false); } @Override @@ -905,4 +764,16 @@ public final class ImagePanel extends JPanel implements ActionListener, MediaDis public boolean isLoaded() { return loaded; } + + @Override + public boolean screenAvailable() { + return true; + } + + @Override + public double getZoom() { + return zoom; + } + + } diff --git a/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java b/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java index 1d4bc8649..57e45665f 100644 --- a/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java @@ -118,7 +118,6 @@ public class PreviewPanel extends JSplitPane implements ActionListener { private final MainPanel mainPanel; private final JPanel viewerCards; - private PlayerControls flashControls; private final FlashPlayerPanel flashPanel; private File tempFile; @@ -270,7 +269,7 @@ public class PreviewPanel extends JSplitPane implements ActionListener { JPanel flashPlayPanel = new JPanel(new BorderLayout()); flashPlayPanel.add(flashPanel, BorderLayout.CENTER); - JPanel bottomPanel = new JPanel(new BorderLayout()); + /*JPanel bottomPanel = new JPanel(new BorderLayout()); JPanel buttonsPanel = new JPanel(new FlowLayout()); JButton selectColorButton = new JButton(View.getIcon("color16")); selectColorButton.addActionListener(mainPanel); @@ -279,11 +278,11 @@ public class PreviewPanel extends JSplitPane implements ActionListener { buttonsPanel.add(selectColorButton); bottomPanel.add(buttonsPanel, BorderLayout.EAST); - flashPlayPanel.add(bottomPanel, BorderLayout.SOUTH); + flashPlayPanel.add(bottomPanel, BorderLayout.SOUTH);*/ JPanel flashPlayPanel2 = new JPanel(new BorderLayout()); flashPlayPanel2.add(flashPlayPanel, BorderLayout.CENTER); - flashPlayPanel2.add(flashControls = new PlayerControls(flashPanel), BorderLayout.SOUTH); + flashPlayPanel2.add(new PlayerControls(flashPanel), BorderLayout.SOUTH); leftComponent = flashPlayPanel2; } else { JPanel swtPanel = new JPanel(new BorderLayout()); diff --git a/src/com/jpexs/decompiler/flash/gui/SoundTagPlayer.java b/src/com/jpexs/decompiler/flash/gui/SoundTagPlayer.java index 491e7ef54..54d22e73c 100644 --- a/src/com/jpexs/decompiler/flash/gui/SoundTagPlayer.java +++ b/src/com/jpexs/decompiler/flash/gui/SoundTagPlayer.java @@ -23,6 +23,7 @@ import com.jpexs.decompiler.flash.tags.Tag; import com.jpexs.decompiler.flash.tags.base.SoundTag; import com.jpexs.helpers.SoundPlayer; import java.awt.Color; +import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -190,6 +191,34 @@ public class SoundTagPlayer implements MediaDisplay { return player.isPlaying(); } + @Override + public boolean screenAvailable() { + return false; + } + + @Override + public void zoom(double zoom) { + + } + + @Override + public boolean zoomAvailable() { + return false; + } + + @Override + public void zoomToFit() { + } + + @Override + public double getZoom() { + return 0; + } + + + + + @Override public synchronized void gotoFrame(int frame) { pause(); @@ -216,4 +245,11 @@ public class SoundTagPlayer implements MediaDisplay { return true; } + @Override + public BufferedImage printScreen() { + return null; + } + + + } diff --git a/src/com/jpexs/decompiler/flash/gui/player/FlashPlayerPanel.java b/src/com/jpexs/decompiler/flash/gui/player/FlashPlayerPanel.java index 5d6344a5c..24ba7ee38 100644 --- a/src/com/jpexs/decompiler/flash/gui/player/FlashPlayerPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/player/FlashPlayerPanel.java @@ -17,6 +17,7 @@ package com.jpexs.decompiler.flash.gui.player; import com.jpexs.decompiler.flash.gui.FlashUnsupportedException; +import com.jpexs.decompiler.flash.gui.View; import com.jpexs.helpers.CancellableWorker; import com.jpexs.helpers.utf8.Utf8Helper; import com.sun.jna.Native; @@ -29,21 +30,30 @@ import com.sun.jna.platform.win32.WinDef; import com.sun.jna.platform.win32.WinNT.HANDLE; import com.sun.jna.platform.win32.WinUser; import com.sun.jna.ptr.IntByReference; +import java.awt.AWTException; import java.awt.Color; import java.awt.Component; import java.awt.Graphics; import java.awt.Panel; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.Robot; import java.awt.event.ComponentEvent; import java.awt.event.ComponentListener; +import java.awt.image.BufferedImage; import java.io.Closeable; import java.io.File; import java.io.IOException; +import java.util.Timer; +import java.util.TimerTask; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import java.util.logging.Level; import java.util.logging.Logger; +import javax.swing.JPopupMenu; +import org.pushingpixels.substance.internal.contrib.jgoodies.looks.common.ShadowPopupFactory; /** * @@ -72,11 +82,81 @@ public class FlashPlayerPanel extends Panel implements Closeable, MediaDisplay { private static final int CMD_CALL = 11; private static final int CMD_GETVARIABLE = 12; private static final int CMD_SETVARIABLE = 13; + private static final int CMD_CHECKCLICK = 14; + private static final int CMD_ZOOM = 15; + private static final int PIPE_TIMEOUT_MS = 1000; private int frameRate; public boolean specialPlayback = false; private boolean specialPlaying = false; + private JPopupMenu rightClickMenu = null; + + private Timer rightClickTimer; + @Override + public boolean screenAvailable() { + return true; + } + + @Override + public boolean zoomAvailable() { + return true; + } + + + + @Override + public void zoomToFit() { + //TODO + } + + @Override + public double getZoom() { + return 0; + } + + + + + + + + private synchronized int checkClick(Point ret) throws IOException{ + if(pipe!=null){ + writeToPipe(new byte[]{CMD_CHECKCLICK}); + byte res[] = new byte[1]; + readFromPipe(res); + int button = res[0]; + if(button>0){ + res = new byte[4]; + readFromPipe(res); + ret.x = ((res[0] & 0xff) << 8) + (res[1] & 0xff); + ret.y = ((res[2] & 0xff) << 8) + (res[3] & 0xff); + } + return button; + } + return 0; + } + + private double zoom = 1.0; + + @Override + public synchronized void zoom(double zoom){ + if(pipe!=null){ + try { + long zoomint = Math.round(100/(zoom/this.zoom)); + if(zoom==1.0){ + zoomint = 0; + } + this.zoom = zoom; + writeToPipe(new byte[]{CMD_ZOOM}); + writeToPipe(new byte[]{(byte) ((zoomint >> 8) & 0xff), (byte) (zoomint & 0xff)}); + } catch (IOException ex) { + //ignore + } + } + } + public synchronized String getVariable(String name) throws IOException { if (pipe != null) { writeToPipe(new byte[]{CMD_GETVARIABLE}); @@ -181,16 +261,22 @@ public class FlashPlayerPanel extends Panel implements Closeable, MediaDisplay { public synchronized void setBackground(Color color) { try { writeToPipe(new byte[]{CMD_BGCOLOR}); - writeToPipe(new byte[]{(byte) color.getRed(), (byte) color.getGreen(), (byte) color.getBlue()}); - } catch (IOException ex) { + writeToPipe(new byte[]{(byte) color.getRed(), (byte) color.getGreen(), (byte) color.getBlue()}); + } catch (IOException ex) { } + } + public void setRightClickMenu(JPopupMenu menu){ + rightClickMenu = menu; + } + public FlashPlayerPanel(Component frame) { if (!Platform.isWindows()) { throw new FlashUnsupportedException(); } - this.frame = frame; + this.frame = frame; + //this.add(rightClickMenu); addComponentListener(new ComponentListener() { @Override public void componentResized(ComponentEvent e) { @@ -263,6 +349,10 @@ public class FlashPlayerPanel extends Panel implements Closeable, MediaDisplay { } public synchronized void stopSWF() { + if(rightClickTimer!=null){ + rightClickTimer.cancel(); + rightClickTimer = null; + } displaySWF("-", null, 1); stopped = true; } @@ -271,8 +361,21 @@ public class FlashPlayerPanel extends Panel implements Closeable, MediaDisplay { return stopped; } + @Override + public BufferedImage printScreen() { + Point screenloc = getLocationOnScreen(); + try { + return new Robot().createScreenCapture(new Rectangle(screenloc.x, screenloc.y, getWidth(), getHeight())); + } catch (AWTException ex) { + return null; + } + } + + + public synchronized void displaySWF(String flash, Color bgColor, int frameRate) { try { + zoom = 1.0; this.flash = flash; repaint(); this.frameRate = frameRate; @@ -292,12 +395,48 @@ public class FlashPlayerPanel extends Panel implements Closeable, MediaDisplay { if (specialPlayback) { play(); } + if(rightClickTimer!=null){ + rightClickTimer.cancel(); + } + rightClickTimer = new Timer(); + rightClickTimer.schedule(new TimerTask() { + + @Override + public void run() { + try { + final Point pt = new Point(); + final int button = checkClick(pt); + View.execInEventDispatch(new Runnable() { + + @Override + public void run() { + if(rightClickMenu!=null){ + if(button == 2){ + ShadowPopupFactory.uninstall(); + rightClickMenu.show(FlashPlayerPanel.this, pt.x, pt.y); + ShadowPopupFactory.install(); + } + if(button == 1){ + rightClickMenu.setVisible(false); + } + } + } + }); + } catch (IOException ex) { + //ignore + } + } + }, 100,100); } catch (IOException ex) { } } @Override public void close() throws IOException { + if(rightClickTimer!=null){ + rightClickTimer.cancel(); + rightClickTimer = null; + } Kernel32.INSTANCE.CloseHandle(pipe); Kernel32.INSTANCE.TerminateProcess(process, 0); } diff --git a/src/com/jpexs/decompiler/flash/gui/player/MediaDisplay.java b/src/com/jpexs/decompiler/flash/gui/player/MediaDisplay.java index 7190aa584..941d70e9a 100644 --- a/src/com/jpexs/decompiler/flash/gui/player/MediaDisplay.java +++ b/src/com/jpexs/decompiler/flash/gui/player/MediaDisplay.java @@ -1,46 +1,59 @@ -/* - * Copyright (C) 2010-2014 JPEXS - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package com.jpexs.decompiler.flash.gui.player; - -import java.awt.Color; - -/** - * - * @author JPEXS - */ -public interface MediaDisplay { - - public int getCurrentFrame(); - - public int getTotalFrames(); - - public void pause(); - - public void play(); - - public void rewind(); - - public boolean isPlaying(); - - public void gotoFrame(int frame); - - public void setBackground(Color color); - - public int getFrameRate(); - - public boolean isLoaded(); -} +/* + * Copyright (C) 2010-2014 JPEXS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.jpexs.decompiler.flash.gui.player; + +import java.awt.Color; +import java.awt.image.BufferedImage; + +/** + * + * @author JPEXS + */ +public interface MediaDisplay { + + public int getCurrentFrame(); + + public int getTotalFrames(); + + public void zoom(double zoom); + + public void pause(); + + public void play(); + + public void rewind(); + + public boolean isPlaying(); + + public void gotoFrame(int frame); + + public void setBackground(Color color); + + public int getFrameRate(); + + public boolean isLoaded(); + + public BufferedImage printScreen(); + + public boolean screenAvailable(); + + public boolean zoomAvailable(); + + public void zoomToFit(); + + public double getZoom(); +} diff --git a/src/com/jpexs/decompiler/flash/gui/player/PlayerControls.java b/src/com/jpexs/decompiler/flash/gui/player/PlayerControls.java index 478b85a9d..2ec2bb586 100644 --- a/src/com/jpexs/decompiler/flash/gui/player/PlayerControls.java +++ b/src/com/jpexs/decompiler/flash/gui/player/PlayerControls.java @@ -17,20 +17,33 @@ package com.jpexs.decompiler.flash.gui.player; import com.jpexs.decompiler.flash.gui.AppStrings; +import com.jpexs.decompiler.flash.gui.ImagePanel; import com.jpexs.decompiler.flash.gui.View; import java.awt.BorderLayout; +import java.awt.Color; import java.awt.Dimension; import java.awt.FlowLayout; +import java.awt.Image; import java.awt.Insets; +import java.awt.Toolkit; +import java.awt.datatransfer.Clipboard; +import java.awt.datatransfer.ClipboardOwner; +import java.awt.datatransfer.DataFlavor; +import java.awt.datatransfer.Transferable; +import java.awt.datatransfer.UnsupportedFlavorException; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.math.BigDecimal; import java.util.Timer; import java.util.TimerTask; import javax.swing.BoxLayout; import javax.swing.Icon; import javax.swing.JButton; +import javax.swing.JColorChooser; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JProgressBar; @@ -43,6 +56,12 @@ public class PlayerControls extends JPanel implements ActionListener { static final String ACTION_PAUSE = "PAUSE"; static final String ACTION_STOP = "STOP"; + static final String ACTION_SELECT_BKCOLOR = "SELECTCOLOR"; + static final String ACTION_ZOOMIN = "ZOOMIN"; + static final String ACTION_ZOOMOUT = "ZOOMOUT"; + static final String ACTION_ZOOMFIT = "ZOOMFIT"; + static final String ACTION_ZOOMNONE = "ZOOMNONE"; + static final String ACTION_SNAPSHOT = "SNAPSHOT"; private final JButton pauseButton; private boolean paused = false; @@ -53,17 +72,78 @@ public class PlayerControls extends JPanel implements ActionListener { private final JLabel totalTimeLabel; private static final Icon pauseIcon = View.getIcon("pause16"); private static final Icon playIcon = View.getIcon("play16"); - + + private JLabel percentLabel = new JLabel("100%"); + private JPanel zoomPanel; + private JPanel graphicControls; + private JPanel playbackControls; + private double realZoom = 1.0; + + private JButton zoomFitButton; + + public static final int ZOOM_DECADE_STEPS = 10; + public static final double ZOOM_MULTIPLIER = Math.pow(10, 1.0 / ZOOM_DECADE_STEPS); + public PlayerControls(MediaDisplay display) { + + setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); + + graphicControls = new JPanel(new BorderLayout()); + JPanel graphicButtonsPanel = new JPanel(new FlowLayout()); + JButton selectColorButton = new JButton(View.getIcon("color16")); + selectColorButton.addActionListener(this); + selectColorButton.setActionCommand(ACTION_SELECT_BKCOLOR); + selectColorButton.setToolTipText(AppStrings.translate("button.selectbkcolor.hint")); + + JButton zoomInButton = new JButton(View.getIcon("zoomin16")); + zoomInButton.addActionListener(this); + zoomInButton.setActionCommand(ACTION_ZOOMIN); + zoomInButton.setToolTipText(AppStrings.translate("button.zoomin.hint")); + + JButton zoomOutButton = new JButton(View.getIcon("zoomout16")); + zoomOutButton.addActionListener(this); + zoomOutButton.setActionCommand(ACTION_ZOOMOUT); + zoomOutButton.setToolTipText(AppStrings.translate("button.zoomout.hint")); + + zoomFitButton = new JButton(View.getIcon("zoomfit16")); + zoomFitButton.addActionListener(this); + zoomFitButton.setActionCommand(ACTION_ZOOMFIT); + zoomFitButton.setToolTipText(AppStrings.translate("button.zoomfit.hint")); + + JButton zoomNoneButton = new JButton(View.getIcon("zoomnone16")); + zoomNoneButton.addActionListener(this); + zoomNoneButton.setActionCommand(ACTION_ZOOMNONE); + zoomNoneButton.setToolTipText(AppStrings.translate("button.zoomnone.hint")); + + JButton snapshotButton = new JButton(View.getIcon("snapshot16")); + snapshotButton.addActionListener(this); + snapshotButton.setActionCommand(ACTION_SNAPSHOT); + snapshotButton.setToolTipText(AppStrings.translate("button.snapshot.hint")); + + zoomPanel = new JPanel(new FlowLayout()); + //updateZoom(); + zoomPanel.add(percentLabel); + zoomPanel.add(zoomInButton); + zoomPanel.add(zoomOutButton); + zoomPanel.add(zoomNoneButton); + zoomPanel.add(zoomFitButton); + zoomPanel.add(selectColorButton); + graphicButtonsPanel.add(zoomPanel); + graphicButtonsPanel.add(snapshotButton); + graphicControls.add(graphicButtonsPanel,BorderLayout.EAST); + + add(graphicControls); + graphicControls.setVisible(display.screenAvailable()); + + playbackControls = new JPanel(); this.display = display; JPanel controlPanel = new JPanel(new BorderLayout()); timeLabel = new JLabel("00:00.00"); totalTimeLabel = new JLabel("00:00.00"); controlPanel.add(timeLabel, BorderLayout.WEST); controlPanel.add(totalTimeLabel, BorderLayout.EAST); - setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); - JPanel buttonsPanel = new JPanel(); - buttonsPanel.setLayout(new FlowLayout()); + playbackControls.setLayout(new BoxLayout(playbackControls, BoxLayout.Y_AXIS)); + JPanel buttonsPanel = new JPanel(new FlowLayout()); pauseButton = new JButton(AppStrings.translate("preview.pause"), pauseIcon); pauseButton.setMargin(new Insets(0, 0, 0, 0)); @@ -93,8 +173,8 @@ public class PlayerControls extends JPanel implements ActionListener { } } }); - add(progress); - add(controlPanel); + playbackControls.add(progress); + playbackControls.add(controlPanel); timer = new Timer(); timer.schedule(new TimerTask() { @Override @@ -102,6 +182,7 @@ public class PlayerControls extends JPanel implements ActionListener { update(); } }, 100, 100); + add(playbackControls); } private String formatMs(long ms) { @@ -133,7 +214,12 @@ public class PlayerControls extends JPanel implements ActionListener { View.execInEventDispatch(new Runnable() { @Override - public void run() { + public void run() { + double zoom = display.getZoom(); + zoomFitButton.setVisible(zoom!=0.0); + percentLabel.setVisible(zoom!=0.0); + zoomPanel.setVisible(display.zoomAvailable()); + graphicControls.setVisible(display.screenAvailable()); int totalFrames = display.getTotalFrames(); int currentFrame = display.getCurrentFrame(); int frameRate = display.getFrameRate(); @@ -149,11 +235,11 @@ public class PlayerControls extends JPanel implements ActionListener { timeLabel.setText(formatMs((currentFrame * 1000) / frameRate)); totalTimeLabel.setText(formatMs(((totalFrames - 1) * 1000) / frameRate)); } - if (totalFrames <= 1 && isVisible()) { - setVisible(false); + if (totalFrames <= 1 && playbackControls.isVisible()) { + playbackControls.setVisible(false); } - if (totalFrames > 1 && !isVisible()) { - setVisible(true); + if (totalFrames > 1 && !playbackControls.isVisible()) { + playbackControls.setVisible(true); } if (display.isPlaying() == paused) { paused = !paused; @@ -171,6 +257,27 @@ public class PlayerControls extends JPanel implements ActionListener { } + private static double roundZoom(double realZoom, int mantisa) { + double l10 = Math.log10(realZoom); + int lg = (int) (-Math.floor(l10) + mantisa - 1); + if (lg < 0) { + lg = 0; + } + BigDecimal bd = new BigDecimal(String.valueOf(realZoom)).setScale(lg, BigDecimal.ROUND_HALF_UP); + return bd.doubleValue(); + } + + private void updateZoom() { + double pctzoom = roundZoom(realZoom * 100, 3); + String r = "" + pctzoom; + double zoom = pctzoom / 100.0; + if (r.endsWith(".0")) { + r = r.substring(0, r.length() - 2); + } + percentLabel.setText("" + r + "%"); + display.zoom(zoom); + } + @Override public void actionPerformed(ActionEvent e) { switch (e.getActionCommand()) { @@ -185,6 +292,88 @@ public class PlayerControls extends JPanel implements ActionListener { display.pause(); display.rewind(); break; + case ACTION_SELECT_BKCOLOR: + View.execInEventDispatch(new Runnable() { + @Override + public void run() { + Color newColor = JColorChooser.showDialog(null, AppStrings.translate("dialog.selectbkcolor.title"), View.swfBackgroundColor); + if (newColor != null) { + View.swfBackgroundColor = newColor; + display.setBackground(newColor); + } + } + }); + break; + case ACTION_ZOOMIN: + realZoom *= ZOOM_MULTIPLIER; + updateZoom(); + break; + case ACTION_ZOOMOUT: + realZoom /= ZOOM_MULTIPLIER; + updateZoom(); + break; + case ACTION_ZOOMNONE: + realZoom = 1.0; + updateZoom(); + break; + case ACTION_ZOOMFIT: + display.zoomToFit(); + //updateZoom(); + break; + case ACTION_SNAPSHOT: + putImageToClipBoard(display.printScreen()); + break; + } + } + + + private class TransferableImage implements Transferable { + + Image img; + + public TransferableImage(Image img) { + this.img = img; + } + + public Object getTransferData(DataFlavor flavor) + throws UnsupportedFlavorException, IOException { + if (flavor.equals(DataFlavor.imageFlavor) && img != null) { + return img; + } else { + throw new UnsupportedFlavorException(flavor); + } + } + + @Override + public DataFlavor[] getTransferDataFlavors() { + DataFlavor[] flavors = new DataFlavor[1]; + flavors[ 0] = DataFlavor.imageFlavor; + return flavors; + } + + @Override + public boolean isDataFlavorSupported(DataFlavor flavor) { + DataFlavor[] flavors = getTransferDataFlavors(); + for (int i = 0; i < flavors.length; i++) { + if (flavor.equals(flavors[ i])) { + return true; + } + } + + return false; } } + + private void putImageToClipBoard(BufferedImage img) { + if (img == null) { + return; + } + TransferableImage trans = new TransferableImage(img); + Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard(); + c.setContents(trans, new ClipboardOwner() { + @Override + public void lostOwnership(Clipboard clipboard, Transferable contents) { + } + }); + } }