Gif decoder

Bare metal programming in PureBasic, for experienced users
User avatar
Michael Vogel
Addict
Addict
Posts: 2666
Joined: Thu Feb 09, 2006 11:27 pm
Contact:

Gif decoder

Post by Michael Vogel »

Hi, sometime ago I got a nice piece of code from here, but I am not able to find the thread anymore...
...it's a library free gif decoder which works quite fast. I wanted to tune it a little bit, but for now I could not speed it up significantly.

Using gif images and this decoder inside a code means the following adantages: a small exe file because no lib is needed and quick decoding!
Anyway, if some additional tuning could be done in the code, I would be happy!

Even I do not know the original author (there are to few assembler lines to say it's from wilbert :lol:), I'll post it here - hopefully the maker of the code has no problems with that.

Code: Select all

; Define
	Structure CodeTableEntry
		*prev
		color.l
		size.l
	EndStructure

	Structure MultiType
		l.l[0]
		u.u[0]
		a.a[0]
	EndStructure
	
	DataSection
		Bitmap:
Data.q $FF613938464947,$87013F,$309000008000800,$34242E39101A1908,$3935352559411E3C,$3241423633393F3F,$4E397F5A3573504D,$5576705D57514252,$C0A960AF7E5C779C,$C8A3B4A18E858F5E,$AAE8CCCCCBCEAAA2,$F5F3E7DEDED8E6E4,$FFF7F7F7F7DEDEED,$FFFFFFF7FF,0
Data.q 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,$4F9210000000000,$2C00FF000000,$800013F00FF0000,$A0B0481C080100FF,$70C85C20060083C1
Data.q $489C4A23100603A0,$DC6A33188BC5A2B1,$48200D06C441B1A8,$3A1B0C85C3015090,$3097CBA5B2C9587C,$9BC36673499CCA63,$1E1B38854080308,$22D44A1D0A83408E,$B29938542B220848,$69ECBEA350A7D3A6,$7C22A95601C2E790,$268F45AFD7ABB458,$D368B3D4A5528A5D,$6CAC556B304AD07E
Data.q $8EDDAE71EA258217,$DFAFB6AB3532C721,$21A02824EA0D7198,$38B8E5D6ED77AA5C,$4BFD36C924B14531,$D614058585E072B9,$F43A0C75B2DB839,$2B7C0E86A4F4AC85,$85CD55ADD81B46AB,$65C08050180615,$EEA2BBBC668B1A0C,$C3417A5C8E43208B,$30A81EDEA3C8D5E4,$80840B0A040A0436
Data.q $442F1B9C0ED8261,$677DBFDD44B81DB9,$E1F2DD3BF1FEEFFF,$F7F26CB26E1DE773,$F57A99A81427974F,$6D9D70C04C259AE8,$26FDE4771BCF280,$DE944E068111B79A,$49C35211F7AA0C63,$6B95454E147C1A96,$A759D4049D46C000,$B5CDD8745FB04D9,$DC6711A468A25682,$7599675818B61584
Data.q $7DC1100C04875588,$562DDB89E0A67DD2,$59020468E3C6357,$1EB77DC16FA457AA,$C52C93E2D5EC1749,$100386C0300A305,$A8E5FC8DDF795405,$6298E3F80DBC8395,$A3B791E378A3E802,$C11E9B2698F66480,$65E4F9424E4964B9,$A039FB8D61B009B0,$6882A6965E217EA5,$2875D23F4624950A
Data.q $89B9A26478FA4A80,$569F09D9C7699914,$E881FB00DF77D559,$E690DE9762818767,$261A3A0D901E1781,$41DB9828B9158FAA,$1C9A5A957B54A8FF,$541200DD6A69705B,$7F6209680904E207,$5706099B68B7FD5A,$46996CAA3A64B2A0,$ECFA1ED29C6669C2,$D9EEA4E10B2E3D8E,$AFEBC8D219AE297A
Data.q $87662F0161DB06E4,$D992AB0B591FB5EC,$6D4B1EAFBB6F0B26,$E9487AAECB2EF0BC,$A723265DC8B7A755,$B86638B9818B92E4,$6ABDEFBBB2EA4E13,$AF5BDA6FB3ACEA96,$91C2B4E6BAB316BE,$6155AC07006A2B44,$475B08C1B05C127B,$F6ABB0F78D0DC2DF,$244C62F4C4DDCA0E,$3283BB735B3260A1
Data.q $65321BFDA57AECCA,$2B0B28C9E80B8AB8,$6DB473AB5ED46222,$B3CCBB10D3B509CA,$B75ABDF4DD664998,$AD5289D2DB706D9A,$5AF69B017235AB43,$A05018A7F6BAFB0,$263CD719D532D7CF,$3646CE290B5B3FDD,$F80BE334D7F7DCFF,$6B66D9742A4EFD98,$4412C167C040045,$E0381096727E3D23
Data.q $AAE6E44A36EA4DE5,$F9EC3A07CF667A9A,$65A5E16F4E020DCD,$C1AE3C8F89E22DD0,$AC1E20D1D5866A59,$A6DDAD1D3F1067D9,$F77C4E6B9C77CB63,$7B85DDF76D7F3BE8,$7E56C543ACD914CC,$704509EDC05ED76C,$79D6D726759D9772,$FC7B2339F7FDDCCF,$BB3F83BDDDEBE4F7,$F362C595C4EA3DF9
Data.q $966FB0DA8025C54E,$DCE63DA6DBB5ED21,$B2DE1C009CAF1E0F,$BD6A701A013196A6,$ADD4BC9594F7186B,$102800991BCE7E0E,$1EBBF33A4F4D103D,$778D41E2AF927AB1,$DD2B061C040893E8,$7ADD59926E80AA3D,$5410456D89493607,$2409E9B6B828AE0E,$C0A2E27F20ABF300,$D5E11ACC84100A00
Data.q $69ED5DD03BA808FF,$B1962858F1A0FB5D,$3085A18BEF4567B4,$343400661E0D0145,$7021BCBE5698D2D8,$1703206C0A80C81,$E05E08105FA0540C,$88C11B21F2CD7D0,$4A28C505B8B6E024,$246ADAE0CBCF2571,$DBC25F4A90691B3B,$35005406ACF84D1A,$A01502EEA80EC88,$2CC198AAD884050
Data.q $142E2F30A1D14098,$E4C23BB2025206DB,$CA400A04182AC279,$E5C01B2A69002402,$4E89112A253BB218,$8C0EC892592740CB,$8960EFA34A1C9191,$9E4A6C5B12125742,$4A327A44C9C754F2,$6681857EA7402412,$88FF255B6D99B33A,$69A70200322EC5D8,$918E4412B9105989,$3E584662E5C94A8C
Data.q $D860640B9AB179CD,$230327A59CC5934,$4008B90022E45C58,$60220527A4F49EA0,$EB839AB34DFDC3FF,$52DC949689380422,$BE9A0139E7314829,$3B62799152510685,$184F27D14C47898F,$F5412792B0952555,$49B805137482898F,$897CD92960400481,$973199D54889BB3B,$99AD592D20E904BA
Data.q $C131E6E3636C5035,$E4D2A7CDC60C1065,$A055BBC8295F47E0,$F0100108200925,$7E9D13203652C0A,$E69C923E3346496A,$D239BE6A89565F54,$43E4D963B2DD24E9,$C083E580D3A18656,$13F97401B25805,$95C76297536A5801,$B53964855696F376,$DD38422641FFBE46,$ADC0049CBAC758A4
Data.q $B60AB91B9F33DBAC,$4221C16E02E4B00C,$31AEC716A700EA96,$2890D579C006A6F1,$4ABF579BCC85A1D4,$80A1F27592D6C14C,$20403C048044B205,$780500002007005,$131E133690306CFF,$1270054964D841D,$CE524F127400AC90,$B350FBEA881C02F5,$64ABC09C40564601,$6C758288CC2B4368
Data.q $A00436E9DEC1DA6,$2E024A44670016D4,$F2E801F6540A80E0,$44A8083E7B1559E8,$8049E30E08658725,$53AD72578B77DAFA,$4891B382E6152251,$61F69918E77AEB41,$F01E73CE5ADE7997,$800E028000E85B,$36F6BC0800F01E00,$FCDD028F9EF5CD4,$ED5C6B8A79BE585C,$8528C2A96255DC3B
Data.q $1802459A8B304C2A,$DA4B4735672246AB,$540199745D76A9C,$25011496F300901E,$7B095DD0137740AD,$CA8F306D033A8BF4,$6FBDC3BE64DED992,$B835C2E0C377ED7D,$6DCEE79965B13DC1,$648FF00DCFAAB2DA,$1CC6A25816883EBC,$923AFD64600A6DDA,$2C3177AEEE0094FF,$80D12CAD5256F65D
Data.q $20794F2919A270FE,$2C657CB188F40E58,$FC84C99DFC295655,$1C68A414264748CB,$19AA8201C24EACCB,$9B8B114980060EB1,$5C95CB29D1865F3,$C13052AAFB5F47E4,$192C681BEF88EE1D,$BBDF4B25A387A4F7,$F311109AF4C31749,$D38C8694C0EA6F08,$D69FAC9B0484DE9,$4A94ADF92BB1D107
Data.q $9682C45A0883E7FD,$596F088060090DF2,$D2F033AD644DCCB9,$69EAFC99D232EB00,$AD207B9B4E638B30,$F009120BA75F25E4,$9217A9F52C79BE25,$72CE52DEBB3C0265,$A744BAA7DFA36970,$5E469B3B6726F5A7,$17B9D4B553D12937,$B60C931C73B69DE,$F7D0DBD7001D2763,$ED1D07BDF5593930
Data.q $A2EB1164CB4FEEFA,$5081F75B48D79BFD,$636C53E467B862FF,$A93C361DEFA8E773,$B6F7DEC6D77A6CD4,$B956E1E81E71962F,$D76D65C25F76FDD0,$496A748E29519716,$2DD39CAB94EBE032,$C2DB8172559E3977,$AE37AB0CC51A4AF3,$7AFE56339C792C73,$29001C02F3800D5C,$26F02E8736F15992
Data.q $89D3F72F4D49B335,$558E02080B973E7D,$40EB7EF4CADB289,$F3AD56415EA51C36,$96342E81E79BE368,$7EC97DBB201000D,$2E5974AECE020030,$A03566C0DC9C4277,$574FA0279CAB8501,$AE16FA81D67A1B3A,$8D908EF8413BF003,$5BD6FC225EA34562,$7006B83B438DF1AD,$352C03806F1B7DFC
Data.q $EFFC5405ED554CCB,$CAD62A15D629365B,$76879EBFE6FAFF97,$12D797C39F391EEF,$4F5995B8AEA8CAFA,$77CECCF0495FE71F,$DC738EF5EDEDABFF,$ED501C0271E004FC,$22535C1C7970404,$F89D33E39C439E,$2405FFC016014C0B,$7FF7FC8017FD0120,$A3607D156616E801,$196CF71455364C4E
Data.q $1587801846826577,$E7E47B2651759235,$8719B1B50085F771,$F76462376375C7,$D0085F560C001008,$9860961D7280166F,$83383201C0150042,$C01A83679C833834,$E93BB1057AA6C101,$56E56C01840C7513,$541877F71B719811,$7E78719984A2575F,$73B7620087925F76,$5622006784788738
Data.q $4355159766E54C00,$8390142572176BF7,$783701C0141CF68E,$8075579C14855701,$1F6C85A280845C4,$984777D78981E017,$4F84D6537CD7DD6A,$78873978E00587F8,$F7C37F47EB6F5819,$9B4DB7095A75536F,$82B821485D7C75FF,$3200F7AF25979C45,$1A0157CD6428398,$87A78728717D0755
Data.q $197D77B65F284543,$7374A578787D7802,$66847848537B9652,$8B76B82C5966155C,$8BD14A0160176B56,$501C345196608770,$1601C89923317001,$3B889B89815884A0,$43707C401433A8A1,$A98D58A58A68A88A,$4A55F543822284B8,$C8B085088181C008,$185275AE25868573,$88B76B6694DC3EE0
Data.q $701614A7498BD7C6,$F2B83448C01C67C,$8C38398C661F01A0,$601401A004109815,$2346972D4E83FC80,$7606CE8A57D61665,$97582793DA81080E,$7E81C8DF0096AE84,$82B1CF5B16817646,$D4DE7F84DC4B47F8,$F58F148D8BD24D5C,$8F87C958249B5607,$D83286801016D67A,$CF8A08C445810A8C
Data.q $18255EF7121478FF,$8A84773E6CE8774F,$85A68587D1B09117,$68E76AD1B57FF7FF,$B76DA8ED76A5C959,$5D78BE9559268BC4,$117F8F67F759B3AA,$5515901000B00317,$5260031568C48342,$71489396BB32D904,$3976262267A32001,$84A5706F38107AB1,$C8282191B067D53D,$C66B054C1B58DF63
Data.q $9267488EF76A5CA1,$A7078F298A0168F3,$5C79C74C95A98E3A,$9311CC7CF95E17E9,$419F93516D937833,$A98746A11488A166,$90E1B38D693F73B7,$47C4AA84B25E75E,$B372262A79598168,$98A8F29569534B66,$C9599BB98E8908F3,$751692D69598F9B,$1CC6806428FD9311,$79A087199E188437
Data.q $8110D5926F56AA7A,$13C7375716557A96,$85C74A69001B567D,$BA5536B282D52C70,$59B898848E98B8FF,$EC79C9907079B995,$32291F9EC9BB9909,$99699339984AB2B8,$9E6C69FA12113D9C,$9CF5705F09091489,$29D419C97583C624,$DA7718885F91838B,$9B692565F17C1A94,$87F698C9549549B8
Data.q $2C9EF9BE9ED9ED5D,$9F510937195E2DF9,$D48696C8CE9F78C8,$FB67C624A027D649,$6D752682877F9D46,$874868C9E06B388A,$15A3A01898A01592,$99299182B9898BDA,$19BEA1BA1A8999EC,$339631058938C19F,$9FA9392A21558C98,$27358548444DD487,$4B7C157168099618,$5CE74659962B94F1
Data.q $4A66A13A3E9E5927,$9A9F012848B9B9A1,$7C7A1B9ECA191C67,$1718A1F1EF14C9B8,$7332BA248C9834A2,$1A01F75399F1473,$1900A0481F19A183,$768A723983A3998,$BA3E98B928A635FF,$6C2949E998BA3CA3,$24D9BC9EEA41A97A,$B1AD95D82C9E9A15,$CB9FA565A7AA22A4,$1F301612A9CD9FC9
Data.q $56D61B410775F7E3,$E2A0E3209DF9DE01,$956ABA7499545CD9,$DA39A3B9B88BCA90,$6801B695A6E1C5A3,$9BB79C959A6F8398,$29937F6890A65A9C,$CBAA4832A4C58815,$2FD8089FB4D710A1,$46F84AA6CA55379D,$DAADD5C75AD1F48A,$AB97C65CC88BA354,$3ABD9E8A6401148F,$2B92B1C5A3EAF0A1
Data.q $74C4C4992AC7A199,$1127ACFAF48BB48B,$22AD31696E474CB0,$AA71B8186A7B89BA,$700F4DC5273E957B,$848911CF97D760A0,$9E5012ABAA627C59,$18BEA3DA94ABCA8F,$F78F5A4492BAC399,$957AFEAFD92B992A,$16378F5B0098EACF,$652359C59635651F,$75694415A2AD95FF,$8859410254919352
Data.q $89E49B5779518C08,$F74AAEE5B100E48F,$4EA92A14AC174AAE,$AC7AF6AF6A1798AB,$DA9176E6DBB57B54,$BC46412B79CACAB2,$27A564AA04C52948,$266441CB098C3932,$E96E049842D44D66,$B7555265B6144B78,$763D0107C6AB549D,$B62BF48E6D65577C,$98DA95ABEB521259,$799179AA6CB54B26
Data.q $581268BD46648BB5,$5AA48F68D1C79BC9,$5B6658817D6965A5,$4D6917A5807B699C,$A0D88C3647076B04,$AAB25B614AA62A10,$131CF59500E5E13A,$7F6929ACD9569B70,$4B5886849B837B87,$8EB86A16A11464B5,$97F61648C4DD5A69,$4B33994BC21925B5,$A1BA06195889F69C,$6694513AA8E92B2B
Data.q $1017AFFB84BBDA0D,$31BAD0195CD5DD01,$EB814CD9B7455AFF,$BCB87A6DAC5BBBA9,$49DB57958B2CBD8B,$1852917B4701601A,$F2BCA636164A3100,$6BBBCE8FEBCC2541,$D7422DC468BD1C00,$95489079A59965,$17BBD7E9B7CA3AB,$C4CE125BE100E148,$B99B45D87F5B4D8B,$A15BD8AF6BEAB57B
Data.q $D4631A9AF6BC198D,$F697F81C4A497E48,$5641ACB9892A888B,$56E06C4B369998C6,$2FA5FAB54C431EC3,$B00BB5A3748DAB81,$90060154CE0164CD,$EF66CBAE011C0F00,$C4FBBBB28A17988A,$EBEF959A9EC1FB29,$E000B00FBC401C12,$A00900A85A1B58,$1127A39C17C2B005,$CDB077AF1F2180B3
Data.q $C38A64C350011CB7,$586A01D52A8ED9E1,$CFB00C0A8B56149E,$60094CDC41A3BA,$BB2CAB1C4986AB01,$52C0FB58C50C1D48,$A4B44DEBEF98DBFF,$F66E917BC6C2601,$5571227E9824C5E0,$2AD7411A488F39E5,$8299C896C5783786,$7C59E1C7217BA642,$7C75615C5948EA90,$92B90C7AC64A3992
Data.q $5E6127AB238CC0CA,$84B5992A65586B7A,$3095AA9EA72C89C8,$B7A36F01A9E2552B,$75738DF97F85A852,$FE7495B182414868,$56A6393ADC6574A9,$BB9D64EB468348FD,$A882D5EF6A177899,$52754D63B68DB29C,$259690214A527865,$CDC1576ECB47C7CB,$6D55E64C40141D04,$AEA92369552814B
Data.q $3995B1A6C7A4DFCC,$C5C009C265CD4DAC,$55AE7EA7FE00AC28,$9A573C6168ED0F01,$6721CBB05889C9BC,$BCDF00B014D1BABA,$F61DB77503000A4,$B95C3EB2B48C553A,$F5CE60C61554E54E,$41CF3D02C42CB148,$C46760C1D0125CFF,$ED55001FAF5D2E81,$A17C8BAFDC4FC1A4,$7D0889E01DC2E607
Data.q $957FE80491694873,$91666C63B0077FF3,$63A9D15D2B7E9614,$B7C6B7DEB3312EC6,$ACF9B4B7677810A1,$A927D2FD2BA39C48,$8C957C9060C5E1CE,$8BC9E7CF3CF3B909,$D7C38BB014C97851,$FD415D9AC683201,$D4865D5A5B91D70C,$ECBB9818DE63C014,$848FC1200B7EA00,$B737FF4A4927D8D0
Data.q $135C9DCA62FD748,$F58851B935935C3,$14ABA8B2A58F96E0,$DC3DAB948D86A5E5,$241A789EB7368E54,$4654654CED80C3D9,$A0055E7644466A3C,$1ECFF4B679983974,$CC6B2698F9BABECC,$ACCE8ADD09D85D07,$FF80000C595829C9,$1CFD85586DCD1227,$79E5CEBA645F5916,$56A207A1C9F167CD
Data.q $7A2856A10BA861FF,$685957F4D95CEC52,$1C5A63A63AEE14AD,$B8F8F35CEC5701F,$A31264CF465DB289,$D42CC054F66CCE94,$9C0812EB5898FC8B,$B554D7EABF46AED4,$5B2D8E0070094A35,$2CD3015D93595D8A,$32CD5D697F45F5C1,$5AFDAA103323AD2A,$B73200700EC6D640,$77B4BBAF7D560C1C
Data.q $A63D77B2B48F707D,$1A1492459BCEA615,$32AC0D70D34341C8,$C89DFC52668E525D,$BC571A9BBBD44D7F,$701094DC28DC7DA,$4A37F3D8A63C5260,$F526829148611007,$3873748F824CFABA,$D5A8E9DEB2FDA63D,$DD1010263D171515,$1400F1024A45E348,$1200DB0A75654C7,$5CB8CB9D27D8512D
Data.q $16D2F011954D9F92,$DF4DA7C7AC4CD2A6,$C9275E6126D35E37,$86DB3B2E7997C3E3,$E68D4B6AE9C8DBFF,$CC127EB8DF91897,$DCFD8F79463B6146,$1E507BD595611E4E,$61BF200E48DE4946,$528866CEBB4D826C,$1CFE67395181DDB,$86E68CF6E1200801,$7C401200CA1F60C5,$2465D78A725CED10
Data.q $FDCD154E9257487C,$E7FBB54F448CD336,$DDFCE56BAF925C41,$95582CBE560DF5BB,$E2F97F8E0DC6C252,$C67248F7FFBAED85,$49D8F824EDBBC566,$12500638C7BD00F7,$BDD75AD6445E2CEA,$AB1714326FECD586,$58660F60FEB2D21E,$8D6013D6F0D2C102,$8EC0AC4056A67977,$A9CB15DABDF2E714
Data.q $F4F74F648D7C7707,$79DAA76EDF7DB3C3,$12B700607C53CA6E,$95AED0A91660079A,$2782463CE79E0CCE,$5FAE48395B485955,$A6285E538CE4F824,$F600E395F25CD1B7,$6D969FEB1C7F36FF,$B4EAF181136A0C59,$EAF60F4583956421,$D137E6B0001CF852,$BF3919561A574396,$A37890C0FCB2C20E
Data.q $8ECFE36D80C9BE5B,$977706872FD14BE6,$C92E68B46553C2EB,$61154D467F21D8F,$1248E60CE68D10EB,$DD4917014DF9866C,$E7EB94985BC11F6B,$D9691EC1C136F648,$5B348EE60E5FAD1D,$2640B11B110035E8,$8E5EFB0F30260B61,$508121007014ABB6,$7D2D4FBC0BA9ED31,$11C7AD34B85C634F
Data.q $798D45687CEB0060,$7615829C28D4FD48,$BA395F9E527DA48E,$60C0075E55AE5E4C,$552760CD85610595,$ADC49C12F21BAE8B,$468C456445B1B7A5,$FC66528D966B8EC1,$9D7686E7FC932C22,$7B900CD38CADF654,$862FC0BEBCDA6012,$C4F55ABEA65B4A14,$763BCD15DE24DEFF,$168BC01952C430F6
Data.q $F22DE4FAF8AD5B26,$E5E500C63ECACD09,$1578D5867EB63BBA,$E91EE941478D4D70,$5100526259F1BD8A,$3024210207040120,$321812860400E060,$2E140A4301810074,$1D8E46C3E1D0D85C,$9248E4521900023B,$4AE5127004940721,$C0A0F0BC70370D94,$2100A85010030282,$70C05A78140B04A1
Data.q $AC561E140A85A2F1,$2D400AD1295490,$A090AD4AA551A15,$170D4742F03A4840,$458C0A08078428A,$1C1C1507C32CC09,$6D21403D942165B5,$C09075DA8A090652,$FABD141D0B084DC1,$20100B7BBD608120,$120A0E8181002010,$2D09C95EAF406028,$140844F1D990603B,$D24B237A18F466A0
Data.q $7F410C06E9F4DA5,$6700A9A03C080F0D,$7A0D02913C0966FF,$4D329738088427A1,$5A0B4EE270EA74FA,$F150C068361AA2C,$180A74C1F02B1D8A,$BC852D814AB8533A,$83C2B04CEDC6CC14,$F9B7F058240F578A,$189C3E13A607C158,$7C70171D57C462F1,$3E580904AB4280E0,$BA8886330823360
Data.q $B0634E8F34497832,$C00DA380CA1F0641,$1803224AC016B42,$5382AA02CA6A8A0C,$C2A7123890F442A,$4A328A9CAAE0843C,$A6B039C85BA4E8B0,$AE4EC22CAABC8BB3,$7C2EA300B1B21604,$C301E07308F23D0B,$2B1B2124492C43E6,$1207324CB2148145,$31CFD01885B10FFA,$41D05C148C3751B
Data.q $8DAB687A40954C33,$40AB5E0181F2703A,$46A9A9B0E2ECFD82,$230F38B3B44B11C,$BBA8FC3A1233C71F,$A42FF2322AC12D30,$E810043B2B5222FF,$B1028CF27004AD2B,$4C53E6042C4B03A6,$8C1BDEC83E52531,$D2E024AB4C00CD72,$F48AC700CBCBA4C8,$17A372F2340D02ED,$AC849959D6B5A567
Data.q $7517D6D262C6C3BE,$52E05ACCB2CA8C3D,$5BA1644A80400B5C,$4B45F65AC96759B4,$6033233F5AB6A59D,$4AB156724BA15DD1,$57566579715915ED,$CDB95CDBEB254B5C,$5157AE8C95775375,$C85C376BE8FA537,$FE87CBCD5D5D4401,$60AB43DF81603805,$4A1983E138101EB4,$C98160461B45ACA0
Data.q $38C2CD872E189016,$3F8DE3966ACD8D63,$BD361D878C5AB8CE,$CAF38CBD1906298D,$8C65B8863D91E258,$D9A6539465999E59,$5799E68B36779661,$3DF2F5608C02AEA6,$6697A5693A468FA3,$972CB94D8998695A,$7E37AB6ABAA653FF,$61EA988BD190EB18,$5A96C5A7EAF86E65,$320C02B84485B36C
Data.q $6E3B86DFA6C15A20,$3EA7A86A18AE53A6,$8E6FBB0EB7BD6F3B,$38D70084325BEBCF,$178A6F7BC65D8D67,$5FBB5AB19AEF7C47,$A467CB22BB7EE4D1,$9067D8961AB0693C,$CBDEA790743C76CB,$900753D474F28AC,$D897D6F39BE31A8F,$D713AAE63D7B1CF4,$A673358D5FA12B0B,$DA3F7DCC2A20E02B
Data.q $91D0F459FF718FF3,$7A3E879E09820037,$FEE9C2A75E87A7E9,$B7BA0881E05F1DA,$60471DC5BA608FBA,$67A3F880FD620D4B,$7954F7D4B92E4A9C,$97EEAB2C78D204B3,$FF7FBEA024036ADF,$EDB3C636FE5C1027,$5CF860440729E679,$D9372F6D5CC71656,$645CCEBF0342DB5D,$BEF82C454A8B423C
Data.q $955910742DC5E1FF,$6B2C4155C2140663,$D51FB026FED8CC02,$50B65E78072130B5,$843686D021EE3298,$AF9CCF3086F2CA8D,$A5B7DA5CA0DBEA77,$F800738E77CFBC0B,$1A866CDA2644B894,$B18DA96325001E6B,$564F13E18C2C6330,$9BA81129F1761BC3,$788D15DE1487CAD9,$344692A45A623342
Data.q $971C62600571CF12,$6AC92130AA2D3C68,$90C4FD9FB2150B21,$BDF02202D8943375,$F21EFC8581117807,$BE6DD194B4B086BC,$24A41EF4F80700A3,$6F71BA22B088D25,$DC548A6692763947,$7A0FFDFE42F8A2D4,$D945A8B264403012,$B84F65724602D20D,$C4A036053E24C5F8,$CF108F412685231A
Data.q $49A292E61A53EB22,$2B082C7193A55DBD,$A97A529884C7675F,$218A44F8190C4034,$BF35644AAC7BF2FF,$1B1A97118203BDB8,$F0740BCBE7D10563,$AAB742DBE731496D,$416254492C6558E8,$B52DD28D8C4AC7E8,$20094F99F0F44DA9,$99627A27A4009A24,$D8A3DD650609EE48,$22C518FC3668C140
Data.q $604C1528C1DDF4E3,$F0F648244883D44E,$3BFC9EB405FB44C3,$10C0C8BA885C5940,$1E8964F8242CCAA0,$ED4A7BE195CE2DBC,$9923B2F20A9066A8,$51423966E4738EBB,$A938C480533683EE,$1C13FC74D47A79C4,$A427EAA625085F1F,$ED80EA532B255AC9,$B68CD0B532020F71,$A9066C402807C837
Data.q $5061B948F4120588,$53E832F01A549728,$28E80C747C150E14,$5174C04E674A52CD,$29944849B8D4A015,$8AC0D5CC245C7192,$8BD66728E4EB193,$ADADCA4CD886935A,$3CE21151AA2C4DFF,$65E7E3FC02655C85,$A9015E23C012B33,$1DEF1D32CD382055,$E02A51881D828730,$DA458AB18DC6B243
Data.q $7E93C68DBF9B1D10,$91C7A3CF1DA144DF,$6D20A404019FEE0A,$34067B8C82AB8118,$2054CE9037E76E2D,$3C36916C9B946642,$64AB7CF0B68DC2E9,$193F4C68FD42A63F,$2ADFA4F632424062,$B2F2D8E5BC5FB853,$C9C5A9A19698F238,$6E16BDCC91BA6C05,$C8D6FB6AE8AD9DF6,$4CA2E3FBCE94547A
Data.q $3C7D61ACF529BCFA,$E41E6AD08B853529,$356B4F2BA6A90C63,$561CA3E9BE706A9A,$F9A7B255A45B0290,$BAFF3D93F11CE75D,$802642D7D384946C,$A2D5E56BEE01E7A5,$78E51A41A4502336,$EB90BA195726C99D,$4345F203F0BA1588,$BD01222B0EDBC4BC,$340C191A8B7719FF,$6B8D761580C2120
Data.q $54FC8937AF7EA963,$B94F780A48850B5F,$9DE3FB5675C88BF3,$C176262CC4CCB24E,$C007BB976B30B1F7,$CC3995476951345B,$4B1796DD9BF453A4,$7B4D84DD8BF2D630,$648C99870A43A8BF,$1E619606E48E1B8E,$FB2509725D908911,$CBEBD101A01A2BE6,$64AFCB12400B3ACC,$F397286D40CD84B1
Data.q $D84E343156CBF2BE,$353C6172669DDAD6,$331EFDB67CD057A7,$25052CB66CA6939E,$33553B82BC2FF006,$D68C12D592C28C13,$A686506AF60522F4,$C68C4C6E8EAC977A,$9BDCEA9D2459E1D8,$D7D6D1BA5D9D6D9A,$CA5802578770199,$87A5C0600DDC30AD,$7C86AF74A5B2D79D,$B7C48A6A8D4FBBA5
Data.q $28488B2629C537B0,$B6E62E8EB1A522FB,$7A9145F96DDB21FF,$993827A7C21E8CFF,$C117B51405AA8FCA,$B94DDEA7E1AAF0D7,$CFB7595F17E04737,$44BE04E85F858922,$3E27DEBD011405FC,$264B13E394F09855,$3A4DC84DE12CD627,$BDF99065EDAC02DB,$612379C41B5CF246,$7531E2ED69281BD0
Data.q $993D99596DDD570B,$7A433306F3B43177,$C1EFC8304EE79493,$9A12ED324A8DD5EF,$354C00426CB9DFA5,$95B88DA364AD9FA8,$F8E706FBA9735AFB,$791A771A788DBABE,$275F3D1D7363807A,$18C16B3F76ED1DE5,$75CE95AFC4F70E7E,$4EC276A0E31A34D5,$E9B42E7662A1AC6F,$337C326D7AC0F93E
Data.q $37073D4816559B30,$17961BD7595B6079,$383CED41012C5D7D,$ADA1C03AF1D707B3,$21FCF21609E53C92,$BCBEC5D947A2F0CF,$27B7647E36DC7BFF,$DE438B329F7D5C31,$D14429399B8F564C,$94996C0D6CCFABE5,$656A6CDBEA33E62B,$51B3F9567CD42317,$AF49EB3E833773FC,$9FAFA1FA1031EC97
Data.q $CCC721A6FC8D9FB3,$493BA6C5DC522B4D,$C4608A530F63AC71,$F32A63AC2002B1C2,$7D08A98E1E3BEC2A,$8EF09B80A8B90EF1,$794621324B280BFD,$A293D8B298F0BB0E,$BF4BBC2869869670,$19CAB0C38C9A138B,$E71CB93E28737D8F,$BE691B1482E6A618,$409C8044051AB1B9,$47C054178A3116BC
Data.q $3EE0CE91A39E8EF1,$59228BF80240522D,$9622D0CE94941080,$C188A88888109C1,$741D14A2318A4189,$2288A8B0AD480B80,$24ABC7A3A11D0C19,$D1030084102C3157,$AF00800D09EA4B30,$91C00D2228A2AE68,$81AB9A3B0E09EFF,$115C388CF37E0B4A,$DC1343B1480D809C,$2080A943A0828F1C
Data.q $C01404948257805C,$C915C320078AC9AA,$838DF09890BA0BA9,$B0070AC0F1C140,$F10F09C42D190186,$B43B4333F68E940,$1DD43B420A4B1ED8,$F9CFB9F93894110E,$22A9D0058A30F1C2,$808C564149424452,$48AC4382FF1640F1,$7A0EF43611A8BF8B,$B30A41360B493DA,$B0F240411C8E7434
Data.q $D73E215288AC1243,$3F6C2529B10F3313,$28E0B7D80791B0B5,$578F189EBFA09C43,$F29AF3210B98A2A,$A0B511A44A43C405,$D614211608189C3F,$91AC538BF8F2ABCB,$144A8C12A90B08BB,$A9DC8AC0CF43D44,$E9C6C43A09C8028,$BC683C0C1DC4990E,$1B80F80A0D0B558D,$A744591F7AE9A464
Data.q $64C758B92728B9FF,$B070AB98FC54A4AC,$F43F9150B009CC20,$F1C74C3B0AF8C18D,$947C03C4B27A2698,$9BD2227A618C7147,$2C829464580820B,$30D24B499448414C,$B48548E920A080F2,$B83F8C87C8710537,$C37BBABD94339E19,$7191A13409965991,$98197BD145B9AF98,$CAB8B4945BA5A139
Data.q $FCAA3FB4AABD2CAA,$A340ECA244BCA9BF,$A8B30F9F536508E4,$FBCBC3739F1A33D9,$C5BEB97D197CBA1C,$1F2CBE2074AC3BE1,$EB3128DA2799E190,$A695008D4A38D112,$3E13D21AA471A8AC,$2B3D3D04BE22733D,$AD3C29C4B4E9E544,$C0F37F46548EAD11,$64888C188B80FC87,$D2CB8087BE69CC24
Data.q $24618190A1F5985C,$82014C93CD4CD478,$CEBC0CDAB2FBAECD,$B50018A28D14A2C,$921FA18BBFB40DFF,$9AF1DB33CCB01AF9,$94BF4DC4011D6BE1,$E19AABCCBD4ABF2C,$8F4861A129E3FEB,$6CEE9308B4890002,$D99D69D19DB8C610,$CCA9E41BB4F24BAC,$8FCEC0A6CDD38A,$F88010914EF13589
Data.q $CAC4FBCF34F0092C,$125E44D4F5A37CF4,$895D004EF13189,$B82503CFC2BCCEF8,$A08CF5ADA4E3CC6,$94F7CF9890CFA0D,$4E51D0CFB4FA5095,$24604AD5044E9CE7,$82090E51568DE8F,$D01092D088C3D095,$E3F39941ABD0B8D3,$BCD17CFD19B996D0,$51197E0A4D104EA9,$F00C008501001930
Data.q $9250ACF98C3B71D1,$16A4F0D158D2D020,$50041D8CF24BDAAF,$564E69971EC80500,$CC13D3528187BD22,$5120D1CF6C2DD0F,$DD00C80CD1F0098A,$9B1502D0A5208A30,$FC2AF3524DD240FF,$5191CDD35AA0805C,$AD39BB9A1E1629D1,$2D085079A1D069F,$2E68C800100900C8,$34FF929D1FD31531
Data.q $4680E00D00A3EED2,$8055038F180D5465,$65485470AE80E0B4,$4AD46A46D37CF236,$9CB4EAA2D43F9E0D,$700C80A51240F51B,$80FFD55D5500100,$894CED00C5309FE0,$BA489AA523892514,$27D4808BD5CD4680,$88BD45A8F4B296B5,$BD2780A00E1E0D4E,$6255D2B52ED16B52,$4FE2AFD6055F9495
Data.q $20A08024F8D2ED2E,$CC1F50AD2150A80,$A1194D5B1070098,$4573A9E41154ED62,$5D566D5DC6C219C8,$50CA1D11D577D73D,$D72562D499891B3,$693D441D577D731E,$51490729B2B14EB5,$53D700100A00C807,$C93258555580055,$D7C0BB534D700080,$8B58B00D572589FF,$54EC6C22D5368F1D
Data.q $47BA4958FD8A546,$8ED8AD900079D0CE,$D51D7F162D4858BD,$C8090014EF53E4C2,$9C1F55380100280,$56C80C809D6D09D0,$84771E01891AB534,$8E280C351CB5A1D7,$5A3551DA25A14775,$5D77DA5D7D592A7A,$2FD974F5AC145FAD,$135801113D40CEE9,$BD6C8E69B5D53CED,$44D1D893DAE009D6
Data.q $5645272AED5C9B35,$3D3C1575645B6568,$B0D27D640B088B9C,$C443A5CD11F2DB71,$EDBFD24DBFDBB0AA,$15984CFDAB2865B,$800585801D870080,$858200055408B1E6,$93D708D34F7DAE00,$2D59C41BC8D68BB1,$FBEF1D957598CDB9,$34D5ED92591DD018,$CEB5C25480C1BCE5,$42E7555130CF75AB
Data.q $9DD9EDAE09189D0C,$AD5D88DCB5218035,$E55DF2351AB574FF,$5CF575C0108B8059,$6DAADE49C75C198C,$1D828035ACDC35D,$5AE0FF002008D3F0,$E9B35DDDDD56F556,$5DE23BD5BA1ED5D,$9BDDD3DBE5955DFD,$FD6A24AD960AAD92,$DC801587DC4CF880,$80700900C00CD825,$F52158700600156C
Data.q $EFBB25E09A11ABD9,$BC26025F3DF0AA95,$5C38B0A5E5BEC5C1,$B090DB3906580DF,$582E090ABD13D9E0,$B8D255A002530555,$8DE011C55EE98FDC,$D49A14611A1DE035,$DB0D2AFDD5E04DD5,$4CF9890607D52C2,$D1DD0988600053F8,$15EDDED5B189A9E6,$A7098DE19BD60F9B,$E13A565E31B3612D
Data.q $60829AB6155F3DF4,$250A1070D1510E1,$DEA88B80000300A0,$20065C4D85584D9C,$1F18DE0E89660809,$600575A27E10DCDE,$251F29FCE21A1AFF,$156C3C38AE051BD6,$35C58B55838D3E17,$DC89C80C9B58C409,$E2F5004ED51F5555,$23EEE3118D630095,$4F634E22643D7563,$E383E26469B3E373
Data.q $A0EB5FA107E0751B,$ED5429E7540D84D9,$98CE41CEED4053F4,$2E22A01644D7A642,$B1647986DE380BE0,$DAC3F5E48C8EE559,$5DFB65A51F0070D3,$4DC4CF9E2BE4C5C,$E105CD5FF61E61D8,$16625DFE45A65620,$8AE36636E246359D,$30D3E49C2DA4B3,$F5DADFC0EB66965A,$5118C650130E3B51
Data.q $1AA6633DAE52534E,$FE721C7623A27E53,$91305F60A543C2A,$584D8600A6696698,$462E6D13062CDC9,$E2E201F966F61FE6,$6731B3E64DD36705,$930105552441AC1,$AE555DADE76D1E80,$BB67ACEF62A2E75,$EF67EAD1D7A661FF,$2A955046C3A86615,$7681BC7656BB2E14,$84DEAD229072F9AE
Data.q $D860095825AE5FC6,$7D24DBC8D6E51E4F,$BB80ADEF6339575B,$5D10AEC0BE97D275,$552769C5B7DBE9D1,$91609681A99E65E5,$5C9E5A6845AE1316,$91B350B62B002D55,$9ADA2D7DDA8C350D,$EA9C63DA980527A6,$4240A1457EC35573,$37D8D5A9D786ADA3,$D22906682CB4C586,$75309E7001E5BD1D
Data.q $D5E226A7DFDD5388,$54C594D4AD9358F2,$458B6BF6BD246A8F,$518A5CF548D8BD9,$D4AEBBD4BEBC4328,$11589DD8AF673D48,$4267600752150158,$A1DE87E9580700BD,$1A6A6B2BB9EB129C,$499D1699D77ECEA3,$A4EC6C3DD73ED15,$A62BD08D08627A47,$649976880006D759,$400654AA0EA069FD
Data.q $9A27A3B3EDBEDBFF,$553B5A69C5B6DBF9,$9D14DED13012F6B4,$DD3CE4E7D1560DE7,$625D79D17BAFDD0E,$69F439BD45BC0EEA,$886D76CCE186D95F,$E35519CDB3CD9E5E,$A130DD7CCFD61262,$FAEE6514D218920F,$CAC4F2ED23D1CA7C,$BBB5D0C6F999A24F,$BD8B11F2011231A,$802C6389158108E3
Data.q $D0DF1B3D5AEF7E07,$ADC064B1BF28813F,$1400C10BC404AA94,$D5F13F1BFB14191A,$B14E08994562081B,$9879AC9BF407417C,$EEB4ED6553C4BF12,$C18000F20000EC4E,$8E98018B00C58048,$BDBD3CB5B4640D0A,$B41C088CD1C6545,$1471D86FC46542AC,$A5FF950141C6D8BB,$C6257A19C25419F0
Data.q $804941083CB77110,$7BD742A8B36D080B,$15EEDEED0E56A1BD,$48014936551D8047,$C065F65EC1E8B9FF,$A2BB9F2343B18C4,$DEEB43C4418B0470,$518F08B4A0BF22F0,$9AB73A481148C53D,$CC47626E3873242F,$32C6C41373C242BF,$EED72E89BBDF10BC,$AF17C256D99494F8,$5A56B00791F09008
Data.q $3464650AF88143A3,$95A3C5E1CB8A20B1,$BB08A2870BE20BF0,$467F3F5AA40411C0,$1681C178AA9B4916,$161458A4DEAC6533,$53DC022FEC1B4809,$A0F4629004F481F4,$5900A8E88AAF6180,$D10453083D7A66CD,$9116F26B6936530D,$AD4560AAB78A80F0,$32309CCA4A0BC49E,$AC047588A40839F9
Data.q $208AC5E1F230E4F2,$3E1F2D76C45D30D4,$79847017151C908B,$EF11D5E93654ED8B,$9CB19EC16E2FF038,$E1150B41380BB9F2,$712A33D70E9C6E0E,$476C909234B8C054,$2C881948227F56FF,$42A09B947F4BC3B3,$4D1F7093E78053B,$156AF00103BD74C,$6BA71BCF7D228907,$FBC0F06213F129B2
Data.q $8B96298EA7A4E470,$3AE3C2795DBC7121,$34E21BECE18BD4AA,$58DF60AC78FD2C4B,$1AFD5B51DEEE6EE6,$C4E8D3A7A54FBEE8,$A9FA2F47AF921E68,$9ACEE892CA3FFA3F,$F99A3F38C2FA6529,$57201CCCBCBBD5A4,$7A85F3CE8BB24CDF,$893FA2FA9F00EF4,$B21680CB0E888480,$15F16A13F15B3F20
Data.q $D1727BC96D6DE969,$9698E96596AFBE16,$F9D79BF9AA29966F,$9CB03D33FBFBC7BF,$4A3C2998F9C8AB16,$AEEFA2FB67A921E9,$4F02A9C8F73BEBBE,$80919184CD6B7A89,$CD6210FD33A11A51,$E1648CB0FF8BC942,$C592497B0C80FA95,$97A5AE9769798B18,$251D4A680C414CFF,$96E8CB124FDA7DC1
Data.q $5D557E2FA3E0D61C,$D97CBFCB77814F93,$FA8FE827D9368096,$FBE380209000488D,$E580DFED80EB5580,$FF11108E0139D8B8,$20A10DC93A90EFF1,$FD1800870A2D42D4,$8062A7114B148F98,$1B2700716C0008BC,$D60AB1290AB7DDCD,$180E038803308FFF,$4030381C1082040,$85C1C1C068501408
Data.q $C322205048140B0F,$B0B8CC2C060402,$E1F0E86C2E150A44,$E96CB0001F94CA24,$7CD2673298CC25F2,$742F399CCE024109,$28000100008199E8,$4A0A51E44159EC9C,$A4542974DA684295,$62AF560B54EA615,$EBF5BAED66B6170C,$90403D3431610C85,$4B681AD2070301C1,$30040C0C06C081A0
Data.q $26D76D815BADA080,$E975B683E1F0D8E8,$859AD96AB5812FF,$30254DC601A3520,$619168A45A136A02,$417A9C8411168FE5,$6D2E926BA2954983,$BE843212D4CEA69A,$3C2A1D94042852C0,$97B8A55442214080,$60ACD5AB5580AD52,$6417215BE2F1387,$F3A096C0772AD7CA,$6120CC3826178284
Data.q $B1285456291A8741,$484D340F73B5736D,$3016D21088012F11,$3C0BDC8E4763108B,$4FA3D16824751DA8,$5357F007FE01E93,$50415499AC4E9AA0,$F6F55205D290392C,$5657E13719576F60,$8090314D5394B6F5,$C96C75DCA5A16659,$5A0095B1750390F5,$277DDC5ED084096B,$C8A010024044759
Data.q $D0C435D24156A5C0,$F40F4800E60D0E61,$7D5EA02408771FF5,$B7E81B06818055F6,$503C0B7FD31805F,$20480D2F94600800,$54B81049E4E4EFF,$C18059220641F978,$3C168515683E6755,$952499CA49041518,$95E1CE5AE47025F5,$7878D105CE364227,$8074117B729855C9,$1D9277A470090B46
Data.q $40D92034065D00D9,$D91805008025B586,$F01C08010010068,$647909BA6D915528,$A24F6852448D4A92,$681503DFE4C2594,$597136AC11B8341A,$44B0010000F98C1,$1C46F81B4F41F05C,$2C0F9C6196E61706,$B4AD302809B3D080,$B9CE750280B02ED4,$940DE09E90891C0,$E1C5B50E7940D411
Data.q $110CA39CC72E9D01,$A2232A740801C020,$501A9EA780402176,$803DB5662F142DD,$9F5051546D9B5918,$355B522A5C22CD6D,$7F92CAE52BABAAD9,$850317A89B406810,$1D6841881137AE65,$6CB4A415AFE09014,$2DCB3029DC0EB3FF,$333CCAD30200ACB3,$DE719CB0702F32CD,$9C5D773AE89E9D19
Data.q $9779925AAF863507,$EFA26897A2324090,$A2A409DFA7AF942E,$A80FCE153839B953,$C401CC399E6E5F6C,$37FE0D02B14C4F11,$5CC771C0401A03C0,$AC450F6C06927B0E,$DF797CC08CB98A49,$B5ED9CD6DCB4B32D,$C03D4DC0304B66D8,$69CA9E301007885C,$626C0801429D3A59,$576D1F95A778F
Data.q $D5DBCC1008D4698B,$EAAB58A9549E8A10,$27C46630701A57F5,$80A8341000C00D8D,$7B13AE015ACC047F,$C9D366B928065AAC,$1B4F7FCC7C3DDE9F,$73F3381CCE77B4B8,$1DE88D86725CA926,$3AFABE351D350AF5,$E79DB456BF50A314,$305D549BBE3E8FA5,$AA71BE6F955BAAD2,$15F051FED8FADEB3
Data.q $13C8D5B0701450FF,$81449DAC6A7BB007,$534055568094004B,$9B3C5668CB599B2F,$303404B7E790F31,$3D001E025672CE7,$A6308918C72C01D1,$A31734B057C16931,$515100E53F0914E,$1038C6F615BE37C4,$4DF83EF33EFB0E22,$6000ED0078177E4C,$1023FB572FE491BB,$77A01497ABE342AF
Data.q $983C47884680B926,$2304206B7D5AEF15,$428720E9D5C03CC8,$262D1618B0024354,$902730B021224089,$6F9F3C2B8590A924,$2D386FA61726C37C,$DF892A75A935874,$2890ACD60B017E60,$40492724AAED28B7,$8A2CB80E126586AC,$45C52708F3A06C51,$248C5161E567304A,$C002228A39951693
Data.q $F19DD094F3E85F9B,$26C4269B80BC9E7C,$844AFC6D6B07140B,$7586AD89B0B0F386,$A9BF623605D5A4FF,$364A1B72B93FC958,$625525051097B1B0,$CB31C3384614E159,$9F598F230FAAD759,$65C87AE751B06565,$666B909D95426004,$250A4A438C851D14,$261E7161895B7505,$61C4368F67F094C7
Data.q $970AC1D84B58F2ED,$614C07832F12BC47,$9531E4694E4E7226,$F2FC60E524FBB5C9,$EE9D199ED2105B60,$C2F8D929DF43EC9A,$8523795C7C451D09,$754AEAC157CE33F2,$EC8D9230129CA1BC,$803EB100D25C3F91,$80A01F28A03C98A0,$9EF3DA7AADA6608C,$14B569FA6F0A648E,$BED5D0CC27464902
Data.q $649D557366705099,$CFA90AC6B2C142E8,$29F4B345289C716B,$9664011C7F12AA1B,$DD800498931AA4B6,$180B263010B00963,$D6BB3DA3252C3390,$21795041CE81084D,$E5826CBEA9B69AFF,$9C556B5C2B651094,$2B0FC26F33C70133,$7E9412C9F9AB98E5,$E1FE2B0AF91EA345,$2530AF89393D02A4
Data.q $12337077A0123000,$9B141A7DD5FA56B7,$6F4A8B334326F53A,$D741A1859EAE083E,$25175D522891557,$495A4F5094ACFCD0,$554B0C04AC2259B0,$4840B42523B0E804,$3193731244A4203B,$65875ABB2F662CAD,$F56CEA2B6D3C9493,$154C294E141A9ED9,$A2F6A55857AAF2AD,$D54ED7712C9F3C6E
Data.q $48D3D7993F24E4F0,$E30929EC1CD09448,$71B6344DFB90F8E7,$2123895B6E25C3AC,$36DF2D7FB975AAA0,$772109C93826F2AF,$4E199226060259DA,$93EDA21B80F5734,$D2D1D28E4700A16,$BC30940B81D7FD6C,$B130C02A49EF1AC0,$53706E13E89B8E8E,$43A8B892FB5CA7FF,$19AD2192A10B2505
Data.q $DC5F8B98162DC029,$D2CC73B4A48D5462,$4ACFB2EB36600A00,$90E1134983C07B69,$E03C00E167B0056,$2D80B3B86C0B81FB,$588329E25BDEE9B1,$5FE3EB3552495074,$80700B2C01D7FD95,$BC8C84219DE2E80D,$2C0D475C713931B2,$5C1A026543F32380,$60001D4BC6AA5BC0,$2515694EDB6B1600
Data.q $5AE52AE194A9CB6A,$F995ACFE23AE3A11,$7E5D534C08845FDB,$8F0EFFE5F676CAF4,$D159C7749F9A72CB,$924051FE01054F1C,$B235469320C763FE,$A696164AA51E23D,$2CA9886F6AC603F2,$90C3EBBED36AB962,$6B4AA2FFA476B58A,$2EE64D79AF953CD4,$BCCAB30630657973,$3E69CD0AD19CE96A
Data.q $6D9F203E70167FAD,$9A9775831F980A00,$B01958A4A733FF,$B3DAC4943262354D,$65575B3FAD342683,$BBA527A3CE70D0A5,$168C5BD3552133B5,$852123996DE3BE36,$6CEBBA6F27DB5B02,$A5DF400B7618E2D3,$AD7FB90B5260C2B7,$B5F381B24CD849EA,$72C1A1B72DECC14A,$77B27398B7EEEBE8
Data.q $D82B7B18658CB196,$90ADD5BD8CF8FEBD,$6AB1D64B0DB2ED77,$C0105830D6D2E045,$ADB65B67102937CF,$64BA426B588D5440,$73F96E55D6571E9F,$65E43BD53B2DD4ED,$6DE6F6CB99672C6,$88576FF0DB04DDAD,$742019035292B514,$244011D83F1C0BA6,$90BBC627CF1DA3E7,$7BA040E263C97D01
Data.q $EBB2A5853B76544A,$D64FA82766B4DA80,$15461930B5EA739E,$536CB147C4341EE3,$B0D37C1381C7E6BF,$A7B54ECA392928BB,$E32E55ACE3F166FF,$FCC89E8862B2717E,$8C22FEE6C036FDAA,$BA2A0AAAA14DBCF4,$662CDD6F7CD6726D,$49F18EAF422B6B2D,$2652123493D92D3D,$2F2DB6C9AF0CD3C9
Data.q $9D35767506CB89C7,$E433D7BD6BEC578A,$801B6010B1926BCE,$51719ABF00D526D5,$57FB8566ABA954C,$7D7EFA99EF61C5F1,$EE97EDB43C6FB695,$6A499FBF6475C8CF,$A8251F1095761278,$3BBF7CCDDDBBB76F,$CAD4C6696907EFFF,$D5509B99504C5DE1,$EA9F1D421EC5F897,$5BA11ACF9CB1DD11
Data.q $A5DF4C4DD89FCC49,$84CEB5F09FC4965D,$CE19E95C9C6284A5,$B932CCE5E79191D3,$F9470D28537DE0D7,$57B1D9950166D370,$B17051BCC1885D95,$C49F9D929CC9BA0F,$4FF0EBDB55B54EBC,$549DC08EB606C06,$212CB3199557C9FF,$B189D7BD508554E8,$548F9D4ED2954EA0,$48391A1680AA97B0
Data.q $C9FB1421299EA15B,$DC8AE60F20EDF415,$84E1CF5E4CD9CC70,$2E121B9049169481,$ACA0C96FD4E0530C,$12911A213A152021,$7188D440C34E8C9B,$4DF41AC60CCC35E,$4500DC88058DE0F2,$916159D0C510E8AC,$D650A0DC1481E5E1,$CFAD88D3659420D1,$E1E5D75F855ACFA,$164C19EBDE6D5D97
Data.q $1C0E050EACEA9ECA,$504C46D84B1868AC,$8D96C84E8D8CF7C0,$97B572987D865FD5,$91295C6A1E5FB216,$934712185F709A12,$D2A17A57BE028AD8,$A9BA00596FD271C5,$4888060F622224A2,$4C8C440001B804B0,$C0388CC000455F5,$AC4A2075B384ED6,$C9B5EC1C6E31A0BA,$9457DE89ACDBA1AC
Data.q $467D93E3B988C4FF,$C5AC1E1D1BA1D97C,$7EA35218D1C1C594,$C0246D091805160C,$51D9405A2C86D0C1,$638EEC9459CC0384,$899D27C49CDBD9A1,$28EA97C23D5CE187,$3BA47DF420AD5C97,$A2506FA3C248806E,$5E2EDFAE488EA5D7,$50572129A1611C21,$2401C40682495945,$89F4DD2441C80494
Data.q $547D62C86296D0A,$644A2504E51F16D0,$7188A461A08C5CAB,$4A5AB9ECDC423CC0,$DD7CAD648DD74ADA,$152AA3F8FDDD7C56,$4FA3E93F54EE325A,$A4D63460E10C559D,$FA2C9D9635A2264D,$CE91222C87D1831B,$A2AC4E6066505015,$A97C8B1948467C7E,$488074D81D7A04D2,$DE8868253A470B16
Data.q $F8EA6619E89CCA3C,$675C4C494C3A54A3,$A32067A57E205661,$A8EA63D87DCF8DD9,$19C496640659E2FF,$1200A880008C845,$23003C8CC00E37CC,$6C8AD9C0E2464E2,$411F9F95BA1D7A34,$6E65F5A120E6619C,$C58A601C40818582,$9DAD26E64A248A55,$2EC7E17A215A61D8,$DD823E1F7A4B587E
Data.q $9C4B622A35667634,$4C060C784B8EBE1,$20E992E2E138E59A,$3A6C9ABA488B10DD,$3C86CA10C06406E6,$261E63E6CE626702,$391A5FAE78858670,$FA60B965DA162821,$A46E3DA72D0C55C8,$A275E0FA74A744EA,$68A80A48E7A16146,$A821C41448DC2394,$A660684610E4A661,$10C06249E605C6A4
Data.q $260161E631C4E602,$763163AA1897A560,$8291C6635939A222,$1FBC69623E752676,$D9D7C92CD54C784D,$488B14515E8A11A5,$1E8A04E62648DD7E,$7C495FB249E10E7A,$4C3E7BE729B7DDFF,$C8588FB20B28EE6D,$800F9A4757D5A1E3,$21E95160A55FA7E6,$5C7F093E74949A4D,$C1612CFF1545EE15
Data.q $279C98D11E34C67C,$28FE21A7C49363C,$AD6840ADA6028229,$28728E6822916870,$20B1284E9C9FB27E,$6563215A972A1DA3,$1C6A3D1B96564072,$BE8164DE97677262,$6C07F298000E9806,$4B907285C85344E5,$866686C9D784A665,$60284E608B152AC5,$259A9BA5528F69CA,$704F654E70929270
Data.q $39D1B61EDDE26064,$586316A12186A0A,$3006E63D1C23C2A9,$F76A3EA3AA361125,$5389723886BCB00,$6805C6758B5066A6,$9C26DA6DA8FEA7A8,$95FA539552929F96,$BC56E3027C5DE138,$C6A63DC6E6C58A27,$9A14EADED1C6E9E9,$3A8F6AC2532488FB,$4D2A3DA6AB0A6FF,$3486404AA544C68C
Data.q $1D8B88A4882A600,$655093A86C684C98,$16ACA8EAA89E8858,$92085806AAC647E6,$C85631C55A3C278E,$AE9120A9C4A6C603,$BB6A1ABB5E8A85E9,$2BC68AC6CA04A88E,$E2BDE75D562BCE5A,$75C736BF2BEEA5C4,$6B7E3CA184DC12F4,$5255EA81F9648D2E,$9EA21EA8150AACA2,$1ECEC2A7015AE2FA
Data.q $EB76A0D2829267E,$F9EC9221EBB2A9EC,$2CAACA4002D42C99,$40736CB6D5ABE804,$70679E2A8589CFC0,$27A67015F9ABA826,$90C3A918AAC588B1,$31C5895CA5466CA7,$27FA82678A63EB9A,$8253A04AC0A18868,$4BED46BC65D944CD,$6A589725D2B18430,$A4042D5EBEED5AD5,$D8E9DA3C69C26169
Data.q $A5566CAC6E90A906,$A67A90CAAF24A6B5,$A85A3FAB7AABCEFF,$3ADF2DEE606CCAD1,$9145640404B6DFAD,$6E16D5A992E0EB21,$F69BA6F0B1111AE1,$8F27C5C6E7A1D7A8,$1BA11FA482656642,$29C4E3C070EDB6B7,$F0A6E69CA8F69D69,$6E96A36E8C93EC8D,$E43E508060B24C9,$536A5CB90B306AAE
Data.q $67069F65E1550C80,$1263A7A29295B263,$F904929FEB628D5A,$276E60893A0E6D12,$28092B1B76B06A7,$92CA76D4574ED3A6,$6F51548805540564,$9192DA9C8668CAF5,$55EAEA55AAEA8744,$EE6EA95E5AC15516,$FA6CDA1EF1E84702,$78AFC9E32AB26DEE,$297AFD65146C9B76,$6402C535092E04AC
Data.q $FFA6B2E06EA0FECF,$282700E2D8B32F52,$6ECE61F2E4527A88,$3A4A2EDAB6AF7E7,$4F285A622AF24A3,$3CC86C8AF99522FC,$894667B075CFDCFF,$52EA2FE4E48AFD62,$C36A4309CC8C6100,$59D804ACAB0AB0A5,$5E27AD1E84CAD006,$729D770BE18EDBA5,$C57E6E1DE286EF1D,$3EC8E352A86B7684
Data.q $124AC0ABB11A8E5C,$4E6D86B131CC3097,$430A715314CA604C,$B7D7E62FA5EA6F40,$6D7A849552D0A856,$90AB2CEE9F30E66E,$CCC529DE20F30FF1,$4D8EB0AF3253049D,$76E9CA75016FE400,$FFB1F30A31440245,$6A9EFA2C106B5DDE,$CF17D88ECD9E2E9B,$DC1E3325AE6B0D23,$646CDD278D4986F1
Data.q $42B3C004FEA9772C,$A53280B271310940,$7178496C031F728A,$8A6FDD796033223C,$6DA8F136E7C663ED,$C05A192676FC660E,$8807005CFFE5FC02,$11F1C1DB1E60684A,$4576FE0B0046B07F,$8EB273121ACE6857,$E90C9B23D9779BFF,$9684A92EDB10CA47,$2233EF06B357349F,$549CFDC4F7376192
Data.q $32E4EB1FD58D455,$6D8567274F768164,$AFFB3B184330B304,$AA84210C67F16700,$9984FAA9E87E8527,$803F3F9EDB41C4AA,$C007C5286CE50005,$35347E0ED48349DD,$240071D801ABCE,$FC69908004186AEA,$AD807CFFAF534450,$EF1F34AED1DB26F8,$5895120EA374B10C,$48F49CACEEC40700
Data.q $469EDF6F28C42B00,$6727F3A080D474F7,$D4C69CA759331332,$7016CF584F4EF4E6,$DC0F389692D0E73,$5FC02992E6D403D2,$44B10FAFDB59B382,$352691800533A001,$FCB44757469A6AC5,$341AED6CE588A451,$706D2A1B5A359B51,$69D2B75BE97244F3,$4BB55F1305D583C,$9B0B33B35EDFBF28
Data.q $120EB0B62F4FA9FF,$6AAC44A6118A89A8,$91560AFF54B38F6,$DB31472FB130021,$2ACD561AF534E765,$C8B2573F768AF2F6,$68BDB3F6D27876DE,$774BF2FAFE11804B,$6544D6A4F2825045,$B66F6EB1B898F3B3,$5C9676EB24F68310,$A7743241853402C4,$EBD44BC02C575468,$F5BF72F4EB6BA2B
Data.q $B3F266FF2FD760F1,$3704AFCBC85673A2,$73778AEB77000459,$7EB3870777824449,$577302FF28B378C,$C698B4DAFE769898,$9D95E711B7D0AEF7,$89604D674F812D36,$B74C84B77A9B088C,$8273BB31371CD8F7,$57B2D7AFC66FB1B3,$2B56F07F5BF541D7,$80B3AD0F6FE764B1,$592A40385F6C04E7
Data.q $3DCC6130B2406407,$B1A9804B55476D32,$6AB89E2D343B5CE,$36881F9F8AAFB005,$F9853CE209094FF,$A7266BCF7E77E2A9,$D08FF78EF30F43F7,$91A278B6CB47B8FD,$16F5C878BECDE0CE,$C9B72F952A90D78C,$F573935916B3CA7A,$1A7738AB945FC793,$408658CA94378BB2,$79768CC8D88789DC
Data.q $484CA97F68B3F2F2,$7C37BEFEC05F7FAA,$B8B794B9A561799F,$639CD8B6B309C615,$DB702C92F97396ED,$B84F1E116AD43741,$1CB1772FA138A3A0,$A82D60409AF041FA,$394B3E456BA3BA37,$AF2E799F89AF39FA,$7AF8BDB7B4AD9A34,$2BEBAD3A83A79064,$9FA9938B975614B3,$1B3A5DB69399CD7A
Data.q $CBC573ED9B1B2392,$B6E1BA33AD0BA0BE,$AEF1979778A063EE,$3853AA046B637AF3,$75436ACAC937CF3B,$B2C5CACB7B27A2BA,$6E87B3E2D7ADEE1B,$9173C02069F82BB4,$B62793FAA45F46FF,$7B9C9B17AC279F35,$B6FA36F5BB8BB2BB,$BBA3B9F91FA9054D,$290E89C4EDB7F75E,$777A009B89C44305
Data.q $7A19C47AADCDFB03,$27A2F9647545C143,$102993B33B8BB87B,$A19BBFF686AEBBF1,$19CE803A5C002583,$A5EEAA385D964364,$BA22A1381A0738A7,$93B2FC5FAD7C55B0,$843A3FC6EE1053A9,$1CEA68E987793922,$4AD48CE04B10A098,$FC974B723B5AFF2F,$BCC8919B274D3BCA,$8BB37CDACAFC5FB7
Data.q $AC3C7F822ED90B72,$D193D7A41A5C58B8,$B44E7B016BD10C50,$D43A2BA23B12F2E1,$AD57CD08DABEBA87,$6F1F3D546A4B92B2,$F48AE781387BC75F,$3C110E8D6B6A34D5,$92D4BC287D000045,$8D216DB7B196BE3D,$7D4BDB3DACBA1980,$EFDDBD23DCFCDBDC,$3D8BD6EC97BFFCFF,$E39B686B313D22D4
Data.q $D53DBFBDFBDBDB5F,$F97BCEBBEFE72A57,$5FCABAFAA3F6EFE5,$E43DBBE8AD57E97A,$29C791BDD7E9FEC7,$DC4C3E12E9711BCF,$CD0882D5EE1777BE,$1612E1212FC66EB7,$DFEAFEABE577C7DD,$B86CABE1BBBBAA1E,$C4EBCDFA8BF1BF13,$3FAEBF37F4EBE3F2,$EAFF4FD8FF47F43F,$293B4E7F93E97CD6
Data.q $A3287F8BF87F83B4,$F03153D52D52A5BF,$BF83D66907C7380B,$67ADFF2BFC3AFFFB,$8341B02810484008,$6190B8541C210381,$2170BC442B078743,$B8D07C3A1B0D8643,$1486411F8F476391,$A65127930023D239,$5F26018025402954,$3787C264D33994B6,$9F4F67336084DE71,$C622D140C446213F
Data.q $3F4BA552691248C,$80398CC25800A74D,$4F2674FA8C9EAFF,$562339AF576B95BA,$D167A651E2F15A18,$A020100758AC532,$AD4D2D7550202016,$D122560BD5E6F15F,$26575916070169B2,$21A0BC4C34150855,$B9AE12632FB98431,$35FA8412CB657297,$BA6192A6E773982A,$1E0B07E94291307C
Data.q $93D063C298C0A03C,$8A862C33FD96C72F,$6BED5BBCF5983B45,$42FA60A85C3814AA,$80A0A8701E08AA70,$581747A1B3BBE4AE,$6E4B7BD7DE6E735B,$3B8408E544F8215B,$9910485F8A14B6E,$9BB27532FEBE973F,$5F1781BE927C7B1,$C116D085BC2A14,$D8F5340B9B83DD05,$3E00D228EA2F302B
Data.q $13BA0835E90418F9,$EF3F008028E6C02E,$70EC0D022D6F402A,$3F11C1AEAAC4B0AB,$34A0E38AC5008D02,$7834C545202A5202,$438AC0029325C0FF,$B4148AA24BE4710F,$C4B7EC22351FC48E,$AF00010D3CEE5038,$A11CB9D0CB8AE534,$4AD20370B1C40A04,$74900A48AEE00721,$F2BEED502E048069
Data.q $734CA31BA9EE6816,$85124AD1F2C8F73A,$AA893CCCE1A26054,$94BB2E38AD2CB6E4,$DD3DF044A3354D09,$E0783805C8506CDE,$1EEF48A04CBD3AAD,$A174AD013F4FB155,$650B4222CA202CB0,$ABC58D6C2CE4B250,$4AAB95144500AA60,$4D1052D4B5295200,$B84F4CE14EAFEDBD,$8CB2953FA0501407
Data.q $A55562E8E14230,$91ED35583D9574FE,$1605820E5D3F1FD6,$C9CC554EEE578F38,$9D35644D563588B5,$22ADF44309435975,$6AACF76ACE53AC63,$87583676D58A9452,$10C94476FD94A22,$9B21755252D4CA0E,$5DABACF9263EABFF,$A2315922729BDB77,$26DA93A2A8BADEB7,$8E03BB3BBD002821
Data.q $783DE10F608F4B9,$B1571834F4E17855,$654D1551CAA2532D,$5356102E336CA674,$E01BB4F8E3D05D93,$4034F2B932E02,$39A07BBD5EAA31A8,$8B6ABD65B81A5561,$FF5134FDC199E3B7,$202000AB4580BBBC,$D7A3C6D60C32E031,$3E5A64DD59533583,$9E853C4CAE046AD0,$BAB5C898160B8218
Data.q $BB14DB415DFAE658,$A78B3F6E0006D056,$DD6FED4C07BFCAA2,$4D3310363B96E296,$867B2163FBB6130,$6E3B21328280502F,$3382F0CD835FA935,$A512C3B1C6538BF3,$A3555C8298781001,$8DAF7CDF35CCBF76,$ABA6194F7416F229,$A90156EC622731F2,$F3FC560DD7F5D27E,$1008AA30AED3AFD9
Data.q $ABFDFF5BD65D5CFF,$1AA5DAF1BE26EBE0,$AEF9DE6F992F6FDD,$894EF1A6FA5C5EE8,$33BA79FEDF1FECE8,$46A01308DE7BFE18,$E7CD8C7AF52707EC,$42D7DA7D7E8FA0A,$9276780A00002832,$FD5DF1AD29EFF804,$637F2FE0C51614A4,$1002BFF386014BAB,$442A0580280F0200,$5158048340240480
Data.q $604638019AA02801,$E9C0D73C5F50FC08,$420221693B012539,$71A501D0B4084218,$C7E6108090108580,$A6C27D099ADA3334,$B4C219D854FA94D,$8A01C054049C3001,$9A1A81427708188A,$F88101D532328424,$8BABA188AEC9FB90,$1D0800D8090010E,$B00F4C20009D9FD,$C855191A989A964
Data.q $9B7421B165C29588,$2499E496B81D1757,$C1A8388C9AAC156D,$A299E3FE0091F9AA,$7BCFA1F33465B077,$3A20F7C8C319A478,$226724744491843A,$430621924CACC999,$40025149A7C125D8,$BC5940D862DBAE91,$CC9EEB9B94B2AE51,$7295B28E55BEC952,$D2599BB9632C23B3,$94AAC71101039392
Data.q $996CB59332EE47CB,$9885A66149650727,$6523D7EEC126349A,$B927262CCD2D132E,$10133B3525C23C5,$3B00
	EndDataSection

; EndDefine

Procedure.i GifSkipBlock(*m)

	CompilerIf #PB_Compiler_Processor=#PB_Processor_x64
		!mov rax,[p.p_m]
		!gifdecoder_GifSkipBlock_loop:
		!movzx rcx,byte [rax]
		!lea rax,[rax + rcx + 1]
	CompilerElse
		!mov eax,[p.p_m]
		!gifdecoder_GifSkipBlock_loop:
		!movzx ecx,byte [eax]
		!lea eax,[eax + ecx + 1]
	CompilerEndIf
	!and cl,cl
	!jnz gifdecoder_GifSkipBlock_loop
	ProcedureReturn

EndProcedure
Procedure.l GifCopyPattern(*ct,*ptr_output_buffer)

	CompilerIf #PB_Compiler_Processor=#PB_Processor_x64
		!mov rcx,[p.p_ct]
		!mov rdx,[p.p_ptr_output_buffer]
		!movzx rax,word [rcx + 12]
		!add [rdx],rax
		!mov rdx,[rdx]
		!gifdecoder_copypattern_loop:
		!sub rdx,4
		!mov eax,[rcx + 8]
		!mov [rdx],eax
		!mov rcx,[rcx]
		!and rcx,rcx
	CompilerElse
		!mov ecx,[p.p_ct]
		!mov edx,[p.p_ptr_output_buffer]
		!movzx eax,word [ecx + 8]
		!add [edx],eax
		!mov edx,[edx]
		!gifdecoder_copypattern_loop:
		!sub edx,4
		!mov eax,[ecx + 4]
		!mov [edx],eax
		!mov ecx,[ecx]
		!and ecx,ecx
	CompilerEndIf
	!jnz gifdecoder_copypattern_loop
	ProcedureReturn

EndProcedure
Procedure GifCopySwapRB(*src,*dst,num_pix)

	!mov ecx,[p.v_num_pix]
	!shl ecx,2
	!jz gifdecoder_copyswaprb_exit
	!sub ecx,4
	CompilerIf #PB_Compiler_Processor=#PB_Processor_x64
		!mov rax,[p.p_src]
		!mov rdx,[p.p_dst]
		!push rsi
		!mov rsi,rax
		!gifdecoder_copyswaprb_loop:
		!mov eax,[rsi + rcx]
		!bswap eax
		!ror eax,8
		!mov [rdx + rcx],eax
		!sub rcx,4
		!jnc gifdecoder_copyswaprb_loop
		!pop rsi
	CompilerElse
		!mov eax,[p.p_src]
		!mov edx,[p.p_dst]
		!push esi
		!mov esi,eax
		!gifdecoder_copyswaprb_loop:
		!mov eax,[esi + ecx]
		!bswap eax
		!ror eax,8
		!mov [edx + ecx],eax
		!sub ecx,4
		!jnc gifdecoder_copyswaprb_loop
		!pop esi
	CompilerEndIf

	!gifdecoder_copyswaprb_exit:

EndProcedure
Procedure.i GifCopyLine(*buffer.Long,y,width,height,*db,fmt,pitch)

	Protected.i x
	If fmt & (#PB_PixelFormat_32Bits_RGB | #PB_PixelFormat_32Bits_BGR)
		If fmt & #PB_PixelFormat_ReversedY
			y=height - y - 1
		EndIf
		If fmt & #PB_PixelFormat_32Bits_RGB
			CopyMemory(*buffer,*db+y*pitch,width<<2)
		Else
			GifCopySwapRB(*buffer,*db+y*Pitch,width)
		EndIf
		*buffer+width<<2
	Else
		While x<width
			Plot(x,y,*buffer\l)
			x+1
			*buffer+4
		Wend
	EndIf

	ProcedureReturn *buffer

EndProcedure
Procedure GifDecode(*image_data.MultiType,Array ct.CodeTableEntry(1),*output_buffer.Long)

	Protected.i min_code_size=*image_data\a[0]
	Protected.i bits_left,bytes_left=*image_data\a[1]
	Protected.i code_size=min_code_size + 1
	Protected.i localcode,clrcode=1 << min_code_size
	Protected.i code=clrcode,endcode=clrcode + 1
	Protected.i lastcode=endcode
	Protected.i bits,bit_mask=1 << code_size - 1

	*image_data + 2

	Repeat
		; get next code
		While bits_left < code_size
			If bytes_left > 1
				bits | *image_data\u[0] << bits_left
				bits_left + 16
				bytes_left - 2
				*image_data + 2
				Break
			Else
				If bytes_left=1
					bits | *image_data\a[0] << bits_left
					bits_left + 8
					*image_data + 1
				EndIf
				bytes_left=*image_data\a[0]
				*image_data + 1
				If bytes_left=0
					Break 2
				EndIf
			EndIf
		Wend

		localcode=code
		code=bits & bit_mask
		bits >> code_size
		bits_left - code_size

		If code <= lastcode
			; code in table
			If code <> endcode
				If code <> clrcode
					If localcode <> clrcode
						; handle code in table
						If lastcode<4095
							lastcode + 1
							ct(lastcode)\prev=@ct(localcode)
							ct(lastcode)\color=GifCopyPattern(@ct(code),@*output_buffer)
							ct(lastcode)\size=ct(localcode)\size + 4
						Else
							GifCopyPattern(@ct(code),@*output_buffer)
						EndIf
					Else
						; handle first code after clear code
						*output_buffer\l=ct(code)\color
						*output_buffer + 4
					EndIf
				Else
					; handle clear code
					lastcode=endcode
					code_size=min_code_size + 1
					bit_mask=1 << code_size - 1
				EndIf
			Else
				; handle end code
				Break
			EndIf
		Else
			; code not in table
			lastcode + 1
			ct(lastcode)\prev=@ct(localcode)
			ct(lastcode)\color=GifCopyPattern(@ct(localcode),@*output_buffer)
			ct(lastcode)\size=ct(localcode)\size + 4
			*output_buffer\l=ct(lastcode)\color
			*output_buffer + 4
		EndIf

		; increase code_size if required
		If lastcode=bit_mask And code_size < 12
			code_size + 1
			bit_mask=1 << code_size - 1
		EndIf

	ForEver

EndProcedure
Procedure.i CatchGifImage(Image,*GIF_Data)

	Protected ImageWidth,ImageHeight
	Protected a.a,*buffer.Long,*palette.Long,*d.MultiType=*GIF_Data
	Protected.i i,x,y,check,entries,current_frame,loop_cnt,transp_idx=-1
	Protected.i *db,fmt,pitch
	Dim ct.CodeTableEntry(4095)

	If *d\l[0] & $FFFFFF=$464947; 'GIF'
		a=*d\a[10]
		*d+13
		If a & $80; global color table present ?
			*palette=*d
			entries=2 << (a & 7)
			*d + entries * 3
		EndIf

		Repeat
			Select *d\a[0]
			Case $21; extension
				Select *d\a[1]
				Case $F9; graphic control extension
					If current_frame=#Null
						a=*d\a[3]
						If a & 1
							transp_idx=*d\a[6]
						EndIf
					EndIf
					*d + 8
				Case $FE; comment extension -> skip
					*d=GifSkipBlock(*d + 2)
				Case $01; plain text extension
					If current_frame <> #Null
						*d=GifSkipBlock(*d + 15)
						current_frame + 1
					Else
						*d + 3
						ImageWidth=*d\u[2]
						ImageHeight=*d\u[3]
						CreateImage(Image,ImageWidth,ImageHeight,32)
						Break
					EndIf
				Default
					Break
				EndSelect
			Case $2C; image
				If current_frame=#Null
					*d + 1
					ImageWidth=*d\u[2]
					ImageHeight=*d\u[3]
					a=*d\a[8]
					*d + 9
					If a & $80; local color table present ?
						*palette=*d
						entries=2 << (a & 7)
						*d + entries * 3
					EndIf
					While i < entries
						ct(i)\color=$FF000000 | *palette\l
						ct(i)\size=4
						*palette + 3
						i + 1
					Wend
					If transp_idx >= 0
						ct(transp_idx)\color=0
					EndIf
					*buffer=AllocateMemory(ImageWidth*ImageHeight<<2,#PB_Memory_NoClear)
					If *buffer
						GifDecode(*d,ct(),*buffer)
						If CreateImage(Image,ImageWidth,ImageHeight,32)
							check=StartDrawing(ImageOutput(Image))
						EndIf
						If check
							*db=DrawingBuffer()
							If *db
								fmt=DrawingBufferPixelFormat()
								pitch=DrawingBufferPitch()
							EndIf
							DrawingMode(#PB_2DDrawing_AllChannels)
							If a&64;							a >> 6 & 1
								; interlaced
								For i=0 To 3
									y=(8>>i)&7;				1 << (3 - i) & 7
									While y<ImageHeight
										*buffer=GifCopyLine(*buffer,y,ImageWidth,ImageHeight,*db,fmt,pitch)
										y+(16>>i-1)&7+1;	(2 << (3 - i) - 1) & 7 + 1
									Wend
								Next
							Else
								; non-interlaced
								y=0
								While y<ImageHeight
									*buffer=GifCopyLine(*buffer,y,ImageWidth,ImageHeight,*db,fmt,pitch)
									y + 1
								Wend
							EndIf
							*buffer-ImageWidth*ImageHeight<< 2
							StopDrawing()
						EndIf

						FreeMemory(*buffer)
					EndIf
					Break
				EndIf
			Default
				Break
			EndSelect
		ForEver
	EndIf

EndProcedure

t-ElapsedMilliseconds()
For i=0 To 99
	CatchGifImage(0,?Bitmap)
Next i
t+ElapsedMilliseconds()

w=ImageWidth(0) : h=ImageHeight(0)
OpenWindow(0,0,0,w,h,"Image decoded in "+StrF(t/100,2)+" ms")
ImageGadget(0,0,0,w,h,ImageID(0))
Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow
davido
Addict
Addict
Posts: 1890
Joined: Fri Nov 09, 2012 11:04 pm
Location: Uttoxeter, UK

Re: Gif decoder

Post by davido »

@Michael Vogel,

Please take a little look at this masterpiece by netmaestro:
http://www.purebasic.fr/english/viewtop ... 67#p430967
DE AA EB
wilbert
PureBasic Expert
PureBasic Expert
Posts: 3870
Joined: Sun Aug 08, 2004 5:21 am
Location: Netherlands

Re: Gif decoder

Post by wilbert »

Michael Vogel wrote:Even I do not know the original author (there are to few assembler lines to say it's from wilbert :lol:)
It seems to be based on my code :wink:
http://www.purebasic.fr/english/viewtop ... 12&t=57617
Windows (x64)
Raspberry Pi OS (Arm64)
User avatar
Michael Vogel
Addict
Addict
Posts: 2666
Joined: Thu Feb 09, 2006 11:27 pm
Contact:

Re: Gif decoder

Post by Michael Vogel »

Thanks for your replies, I must have missed netmaestros masterpeace and did not find wilbert's thread as well (never search for "Gif Decoder" in this forum if you want to find a "GifDecoder" :P)

I will check for differences to wilbert's updated code and try to find a possibility to speed it up (maybe by using some global variables). Every millisecond counts :lol: - I am use this routine thousands of time in a program to "expand" an image in memory, grab a small part of it and free it immediately, therefore my programm only needs a small amount of memory in general.
User avatar
Keya
Addict
Addict
Posts: 1891
Joined: Thu Jun 04, 2015 7:10 am

Re: Gif decoder

Post by Keya »

Michael Vogel wrote:(never search for "Gif Decoder" in this forum if you want to find a "GifDecoder" :P)
phpBB's Search really sucks unfortunately :( it's still good for some things, searching by Author for example, but 99% of the time i just use google with inurl:purebasic (which also is handy in finding code from the German/French/Russian etc forums, and sometimes they were the only place i found a solution!):
https://www.google.com/search?q=gif+dec ... Apurebasic
User avatar
Michael Vogel
Addict
Addict
Posts: 2666
Joined: Thu Feb 09, 2006 11:27 pm
Contact:

Re: Gif decoder

Post by Michael Vogel »

Meantime I stripped off some "unneeded" things (because my image won't have transparency, interlace mode etc.), but this saves just few milliseconds. There are two procedures which are responsible for around 60% of the complete calculation time, GifCopyPattern (~35%) and GifCopySwapRB (~25%). I fear, there's no chance to speed this up :cry:

Another (failed) attempt to make it a little bit quicker:

Code: Select all

DataSection
	Compressed:
	;IncludeBinary "Gif.dat"
	CompressedEnd:
EndDataSection

Procedure CompressImage(image)

	Protected *zip,*ori
	Protected ziposize,zipsize
	Protected ImageWidth,ImageHeight

	UseLZMAPacker()

	ImageWidth=ImageWidth(image)
	ImageHeight=ImageHeight(image)

	StartDrawing(ImageOutput(Image))
	*ori=DrawingBuffer()

	ziposize=4*ImageWidth*ImageHeight
	*zip=AllocateMemory(ziposize)
	zipsize=CompressMemory(*ori,ziposize,*zip,ziposize,#PB_PackerPlugin_Lzma)
	If zipsize>0 And zipsize<ziposize
		CreateFile(0,"Gif.dat")
		WriteData(0,*zip,zipsize)
		CloseFile(0)
	EndIf

	StopDrawing()

EndProcedure
Procedure UnCompressImage(image)

	UseLZMAPacker()
	
	If CreateImage(image,1664,1404,32)
		If StartDrawing(ImageOutput(Image))
			UncompressMemory(?Compressed,?CompressedEnd-?Compressed,DrawingBuffer(),1664*1404<<2,#PB_PackerPlugin_Lzma)
			StopDrawing()
		EndIf
	EndIf

EndProcedure
I compressed the image (and the result was 8% smaller than the original gif file), included it and decompressed it - everything works fine, the compressing takes a while but this wouldn't be done in the program, so decompressing is the main point: and, it is more than 20% slower than Wilbert's gif decompressor.
User avatar
Keya
Addict
Addict
Posts: 1891
Joined: Thu Jun 04, 2015 7:10 am

Re: Gif decoder

Post by Keya »

LZMA is very slow though, thats the price you pay for its excellent compression ratio; maybe Zip is better for this?
User avatar
Michael Vogel
Addict
Addict
Posts: 2666
Joined: Thu Feb 09, 2006 11:27 pm
Contact:

Re: Gif decoder

Post by Michael Vogel »

Keya wrote:LZMA is very slow though, thats the price you pay for its excellent compression ratio; maybe Zip is better for this?
Tried zip first, but the resulting size was "horrible" - 30% larger than the original gif file. On the other hand, it would uncompress around 10 to 15% quicker than doing gif decoding. So it could be an alternative, but hopefully even more optimization can be done :wink:
User avatar
Michael Vogel
Addict
Addict
Posts: 2666
Joined: Thu Feb 09, 2006 11:27 pm
Contact:

Re: Gif decoder

Post by Michael Vogel »

Some updated information as the newest PureBasic version includes a GIF Decoder :wink:

- the PureBasic's internal GIF decoder has a small footprint (exe grows only by around 10K) but is relatively slow (around twice the time of Wilbert's solution)
- I've removed some features from Wilbert's original code (now it will work only for non interlaced single images using a palettes)
- I've also eliminated the Start/StopDrawing commands (faster and smaller exe)
- I don't believe a lot of tuning can be done (except there's another trick to speed up the GifCopyPattern routine, which needs most of the calculation time)

Code: Select all

EnableExplicit
#G=1

CompilerIf #G
	Structure CodeTableEntry
		*prev
		color.l
		size.l
	EndStructure
	Structure MultiType
		l.l[0]
		u.u[0]
		a.a[0]
	EndStructure

	Procedure.l GifCopyPattern(*ct,*ptr_output_buffer)
		
		CompilerIf #PB_Compiler_Processor=#PB_Processor_x64
			!mov rcx,[p.p_ct]
			!mov rdx,[p.p_ptr_output_buffer]
			!movzx rax,word [rcx+12]
			!add [rdx],rax
			!mov rdx,[rdx]
			!gifdecoder_copypattern_loop:
			!sub rdx,4
			!mov eax,[rcx+8]
			!mov [rdx],eax
			!mov rcx,[rcx]
			!and rcx,rcx
			!jnz gifdecoder_copypattern_loop
		CompilerElse
			!mov ecx,[p.p_ct]
			!mov edx,[p.p_ptr_output_buffer]
			!movzx eax,word [ecx+8]
			!add [edx],eax
			!mov edx,[edx]
			!gifdecoder_copypattern_loop:
			!sub edx,4
			!mov eax,[ecx+4]
			!mov [edx],eax
			!mov ecx,[ecx]
			!Jcxz gifdecoder_exit
			
			!sub edx,4
			!mov eax,[ecx+4]
			!mov [edx],eax
			!mov ecx,[ecx]
			!Jcxz gifdecoder_exit
			
			!jmp gifdecoder_copypattern_loop
			;!and ecx,ecx
			;!jnz gifdecoder_copypattern_loop
			!gifdecoder_exit:
		CompilerEndIf
		ProcedureReturn

	EndProcedure
	Procedure GifCopySwapRB(*src,*dst,num_pix)

		!mov ecx,[p.v_num_pix]
		!shl ecx,2
		!jz gifdecoder_copyswaprb_exit
		!sub ecx,4
		CompilerIf #PB_Compiler_Processor=#PB_Processor_x64
			!mov rax,[p.p_src]
			!mov rdx,[p.p_dst]
			!push rsi
			!mov rsi,rax
			!gifdecoder_copyswaprb_loop:
			!mov eax,[rsi + rcx]
			!bswap eax
			!ror eax,8
			!mov [rdx + rcx],eax
			!sub rcx,4
			!jnc gifdecoder_copyswaprb_loop
			!pop rsi
			!gifdecoder_copyswaprb_exit:
		CompilerElse
			!mov eax,[p.p_src]
			!mov edx,[p.p_dst]
			!push esi
			!mov esi,eax
			!gifdecoder_copyswaprb_loop:
			!mov eax,[esi + ecx]
			!bswap eax
			!ror eax,8
			!mov [edx + ecx],eax
			!sub ecx,4
			!jnc gifdecoder_copyswaprb_loop
			!pop esi
			!gifdecoder_copyswaprb_exit:
		CompilerEndIf


	EndProcedure
	Procedure.i CatchGifImage(Image,*Gif.MultiType)

		Protected *buffer.long
		Protected *color.long
		Protected *image.long
		Protected width,height,entries,y
		Protected code,codeend,codelast
		Protected codeclr,codesize,codemin
		Protected bits,bitsleft,bitmask,bytes
		Protected Bitmap.Bitmap
		Protected Dim ct.CodeTableEntry(4095)

		*color=*Gif+13
		entries=2<<(*Gif\a[10]&7)
		*Gif+entries*3+22

		width=*Gif\u[2]
		height=*Gif\u[3]

		*Gif+9
		While y<entries
			ct(y)\color=$FF000000|*color\l
			ct(y)\size=4
			*color+3
			y+1
		Wend

		*buffer=AllocateMemory(width*height<<2,#PB_Memory_NoClear)
		If *buffer
			codemin=*Gif\a[0]
			bytes=*Gif\a[1]
			codesize=codemin+1
			codeclr=1<<codemin
			code=codeclr
			codeend=codeclr+1
			codelast=codeend
			bitmask=1<<codesize-1
			*image.long=*buffer

			*Gif+2
			Repeat
				While bitsleft<codesize
					If bytes>1
						bits|*Gif\u[0]<<bitsleft
						bitsleft+16
						bytes-2
						*Gif+2
						Break
					Else
						If bytes=1
							bits|*Gif\a[0]<<bitsleft
							bitsleft+8
							*Gif+1
						EndIf
						bytes=*Gif\a[0]
						*Gif+1
						If bytes=0
							Break 2
						EndIf
					EndIf
				Wend

				y=code
				code=bits & bitmask
				bits>>codesize
				bitsleft-codesize

				If code <= codelast
					If code <> codeclr
						If y <> codeclr
							If codelast<4095
								codelast + 1
								ct(codelast)\prev=@ct(y)
								ct(codelast)\color=GifCopyPattern(@ct(code),@*image)
								ct(codelast)\size=ct(y)\size+4
							Else
								GifCopyPattern(@ct(code),@*image)
							EndIf
						Else
							*image\l=ct(code)\color
							*image+4
						EndIf
					ElseIf code<>codeend
						codelast=codeend
						codesize=codemin+1
						bitmask=1<<codesize-1
					EndIf
				Else
					codelast + 1
					ct(codelast)\prev=@ct(y)
					ct(codelast)\color=GifCopyPattern(@ct(y),@*image)
					ct(codelast)\size=ct(y)\size+4
					*image\l=ct(codelast)\color
					*image + 4
				EndIf

				If codelast=bitmask And codesize<12
					codesize+1
					bitmask=1<<codesize-1
				EndIf

			ForEver

			If CreateImage(Image,width,height,32)
				GetObject_(ImageID(Image),SizeOf(Bitmap),@Bitmap)
				entries=Bitmap\bmWidthBytes
				*image=Bitmap\bmBits+(height-1)*entries
				y=0
				bits=width<<2
				*color=*buffer
				While y<height
					GifCopySwapRB(*color,*image,width)
					*color+bits
					*image-entries
					y+1
				Wend
			EndIf

			FreeMemory(*buffer)
		EndIf


	EndProcedure

CompilerElse
	UseGIFImageDecoder()
	
CompilerEndIf

DataSection
	image:
	IncludeBinary "Wonderbar.gif"
EndDataSection

Define m
m-ElapsedMilliseconds()
CompilerIf #G
	CatchGifImage(1,?Image)
CompilerElse
	CatchImage(1,?Image)
CompilerEndIf
m+ElapsedMilliseconds()

OpenWindow(0,0,0,999,999,Str(m)+"ms")
ImageGadget(0,0,0,999,999,ImageID(1))
Repeat
Until WaitWindowEvent()=#PB_Event_CloseWindow
Post Reply