Compare commits

...

16 Commits

Author SHA1 Message Date
David Given
60e5e35947 Merge pull request #124 from davidgiven/tweaks
Several index pulse fixes
2020-01-12 01:42:39 +01:00
David Given
86c4e959ca Mac error fix. 2020-01-12 01:38:19 +01:00
David Given
b0c675c589 Improved error messages when using fe-rpm and it doesn't work. 2020-01-12 01:34:12 +01:00
David Given
d77841c3b7 Add the ability to fake the index pulse source, allowing old drives to be used
with FluxEngine.
2020-01-12 01:23:47 +01:00
David Given
4ed1fb6bac Document the extra index pulses. 2020-01-10 21:23:33 +01:00
David Given
bcc9e9d9a5 Bump the protocol number (I forgot last time I changed the protocol). 2020-01-10 21:04:33 +01:00
David Given
ec327e25a4 Merge pull request #121 from davidgiven/amiga
Add support for writing Amiga disks.
2019-12-14 21:55:00 +01:00
David Given
d0ed5b32f7 Add support for 528-byte sectors. Adjust the post-index gap to (try?) and fit
all the data in one revolution. I think my write clock is a bit slow.
2019-12-14 21:49:31 +01:00
David Given
7c66e1b0d4 Don't recalibrate after drive errors --- it's really annoying and I don't think it helps. 2019-12-14 21:43:48 +01:00
David Given
4475e9f085 Increase the default bit-error-threshold to 0.4, because that's the value I
almost always end up using.
2019-12-14 21:33:39 +01:00
David Given
5c9639ec5a Document the Amiga write support. 2019-12-14 21:15:47 +01:00
David Given
792cc88192 The Amiga writer now generates valid flux files --- but it looks like the
writer's broken (both the Amiga and the Brother have failed).
2019-12-14 20:44:48 +01:00
David Given
5a0fb2761a Update OSX build instructions. 2019-12-14 11:37:43 +01:00
David Given
ef4581ed39 Merge from trunk. 2019-12-13 23:59:03 +01:00
David Given
d2f8c27cb6 Add checksum routine. 2019-12-01 09:11:36 +01:00
David Given
eaa3c57425 Non-functional boilerplate of Amiga write support. 2019-12-01 09:07:43 +01:00
30 changed files with 886 additions and 402 deletions

View File

@@ -1,245 +1,245 @@
:4000000000800020110000003510000035100000064A08B5136843F020031360044B1A6803F53F5302331A6001F022F8E8460040FA46004010B5054C237833B9044B13B181
:400040000448AFF300800123237010BD6881FF1F0000000098380000084B10B51BB108490848AFF300800848036803B910BD074B002BFBD0BDE81040184700BF0000000071
:400080006C81FF1F98380000C880FF1F0000000072B6034A13680133136062B6704700BF8881FF1F0A4A0B4B516801310B40002BBEBF03F1FF3363F00F0301335360516800
:4000C0009368994202BF024B01221A73704700BF8881FF1F0F0000800A4A0B4B916801310B40002BBEBF03F1FF3363F00F030133936091685368994202BF024B01221A7379
:40010000704700BF8881FF1F0F000080024B012200205A7302F052B98881FF1F10B5C4B2204601F067F90128FAD110BD10B50446094B9A7B987382421CBF0022DA7310F0CE
:40014000010F14BF0220012002F064FE6008BDE8104002F059BE00BF8881FF1F70B5C4B220460E4601F04EF9314605460246204601F00AFA204601F03DF90128FAD02846D9
:4001800070BD000038B50B4C257C55B9A07BFFF7CDFF012002F0A8F84FF47A7002F0BAFAE5732368636101232374BDE8384002F0EFBA00BF8881FF1F38B50446C5B22846A0
:4001C00002F09EF8062002F0BBFA44F00200C0B202F096F8062002F0B3FA284602F090F8BDE83840062002F095BA10B5642402F081F820B10120BDE81040FFF7DDBF0120FF
:40020000FFF7DAFF013CF2D1F4E7000038B5044D0024285D013402F043FA102CF9D138BDA081FF1F08B502F05DFC002002F066FC02F078FC02F082FC80B208BD10B5044637
:40024000012002F075F8642002F064FAFFF7EAFF2080002002F06CF8642002F05BFAFFF7E1FF608010BD08B502F068FD002002F071FD02F083FD02F08DFD80B208BD10B5A9
:400280000446FFF7B2FF322002F044FAFFF7EBFF20800020FFF790FF322002F03BFAFFF7E2FF608010BD0FB400B593B014AB53F8042B402102A8019302F0D6FE02A802F0B4
:4002C00084F802F08EF813B05DF804EB04B0704710B5044601780648FFF7E5FF0420FFF71DFF62782146BDE81040042001F0DAB8AA38000007B50023ADF804308DF80600B0
:40030000032301A88DF80530FFF7E2FF03B05DF804FB0000F8B51D4C0646FFF733FFE37B03B156B91A48FFF7BEFFFFF75EFF01200023E073A36202F003FA3246A16A1548D8
:40034000FFF7B1FF114D0027A36A9E4216D001F0D1FF00B1AF62A36A9E4205DD0020FFF72BFFAB6A013305E005DA0120FFF724FFAB6A013BAB6202F00BFAE5E7322002F041
:40038000C9F9BDE8F8400448FFF78DBF8881FF1FB7380000BE380000DB3800002DE9F04F9BB062B602F05EFABE49042002F082FABD4801F0ABFFBD4802F04EFDBC4801F07F
:4003C000DFFF02F02FFC02F001FB002002F022FD01F0FAFF0221002000F0C2FFB54D0321084602F0B5F92E462C4602F0D1F92B7C73B16A692B689B1A41F28832934207D9C7
:40040000002001F071FF002002F004FD00232B7400F0DEFF18B9A848FFF745FF04E000F0DDFF0028F7D109E000F0D2FF0028FBD0A248FFF738FF032001F0FAF8032000F031
:40044000D9FF0128D1D1A07BFFF770FE9C490320FFF784FE94F82C109A48FFF724FF94F82C30023B122B00F2DF83DFE813F01300DD031C00DD032200DD033A00DD035E002E
:40048000DD039301DD031E03DD033D03DD034303DD034F0303238DF828308DF8293008238DF82A302EE394F82E00FFF733FF864B25E3FFF767FE00236373637B002BFCD06F
:4004C000002373733268637B002BFCD0336807218DF828109B1A04218DF82910ADF82A3010E30220FFF71AFE4FF000090DF1280A4FF480780027C8EB0903DA1907F80A2095
:400500000137402FF9D10220FFF708FE3A465146022000F0C7FFB8F10108EBD109F10109B9F1400FE4D1694BBAE294F82E0001F0FFFEA06AFFF7EEFE02F002FD644BDFF8C2
:4005400094811A78002742F004021A701A7842F001021A701A7802F0FE021A701A7802F0FE021A7002F0F0FC0220FFF7D7FD41F6FF734FF480420121022002F051FC84F807
:400580006C0002F073F808F807000137102FF8D1DFF844A100270AF159081FFA88F90137102F14BF3A4600221AF8010F22440623127E402102F08EF84A4646F243419AF86E
:4005C000000002F099F809F14009102F1FFA89F9E5D100237373637B002BFCD00027142239460AA8777302F00BFD40230D934FF0FF337760B36037737368DFF8E0903344B4
:40060000197E96F86C00CDF8309001F0E7FF96F86C0001F0A5FF012196F86C0001F078FF636813B96B7B002BFAD0002794F82FA0A76094F80CB0BBF1000F6AD102F0A8F8EF
:400640006B7B43B1BAF1010A85F80DB003D160E02B7B002B5DD1A26863689A42F8D04FF0000BA3680AA808EB83135B440A93CBF140030B9300F0F8FA0B9B0137C3F1400304
:400680009B440D9B5FFA8BFB9BBB022000F0B2FE012825D0637B002B3BD12B7B002BF4D037E000BF910000000D010000A5000000D90000008881FF1FE9380000FC38000085
:4006C000B481FF1F063900009C3800009E38000093640040A081FF1F9F81FF1FF885FF1F4022B849022000F0DDFE4023CDF830900D93BBF13F0FB4D9A268B34B0132134082
:40070000002BBEBF03F1FF3363F00F030133A3608FE7042194F86C0001F06CFF94F86C0001F078FF0028F9D10AA800F0D1FA0220FFF7F4FC337B63B90D9A402A06D0C2F135
:40074000400292B29F49022000F0ACFE0220FFF7E5FC0D9A32F0400203D11146022000F0A1FEFFF753FD237B33B19848FFF79BFD0220FFF7BFFD06E0954B09A81B88ADF8A6
:400780002430FFF7A5FD627B3946237B9148FFF78AFD4CE29048FFF786FD276B17F03F0701D0032041E2012001F0C8FD95F82E0001F0BEFD02F0C4FB884BDFF824821A78B7
:4007C00002F0FB021A701A7842F001021A701A7802F0FE021A701A7802F0FE021A7002F0B3FBA86AFFF796FD01214FF4804341F6FF72084601F0A8FD85F86C0001F036FF15
:4008000008F807000137102FF8D1DFF8D891002709F159031FFA83F807930137102F14BF3A46002219F8010F22440523127E402101F050FF414646F2475299F8000001F0E0
:400840005BFF08F14008102F1FFA88F8E5D10027BB46B946BA46336B4FF0FF389B09142239460AA877600593C6F80880377302F0C7FB402301200D9300F0DAFECDF81880AD
:400880006268514B01321340002BBCBF03F1FF3363F00F03A168B8BF01338B4200F0A480BAF1000F07D0237B002B40F0B0806B7B002B40F0AC800B9B002B34D1B9F1000FD0
:4008C0000BD07F223F495A540133402BFAD10A910B9328E0BAF1000F06D1012000F08AFD01288046F6D107E0237B002B40F08F806B7B002BF1D08AE03249FFF72FFC81462E
:40090000304B0B9040460A9300F092FEB9F13F0F07F1010706DD059BDB1BD3F1000949EB030900E0C1460B9BDBB16368079A0AA802EB83120D9BC3F1400313440C9300F042
:40094000D6F90D9B6BB96A681F4B01321340002BBEBF03F1FF3363F00F030133636040230D93A36801333FD16B680F2B3CD14FF00008C5F8088001F015FD85F80C80AB68D9
:4009800095F86C002B44197E01F028FE95F86C0001F0E6FD012195F86C0001F0B9FD85F80D80637B002BFCD04FF00008012086F80D8001F003FD404601F0C0FCCDF81880BF
:4009C00015E000BFF885FF1F0F00008015390000A03800002F3900004239000097650040A081FF1F9F81FF1FBAF1000F05D0237B6BB96B7B5BB94FF0010AA368069A934242
:400A00003FF43EAFAB680BF1010B069338E701F0CFFC012001F092FC002001F0CFFC042194F86C0001F0E6FD94F86C0001F0F2FD0028F9D196F86C0001F080FD737B327BCD
:400A40000293012303920193CDF800905B463A4605997B48FFF727FCB9F1000F16D1059BBB420ADD012000F0C5FC01288046F6D17449FFF773FB3F2803DC012000F0ECFD97
:400A800004E0404600F0D4FD0137E8E7FFF7BEFB6D48FFF708FC237B0BB10220C5E06B4B1B8809A8ADF824302DE094F82E0001F03FFCA06AFFF72EFC6548FFF7F4FB0023B0
:400AC0006373637B002BFCD0012001F077FC00237373637B002BFCD0002001F06FFC5D48FFF7E1FB5C4B0AE00020E073FFF712FC5A4B04E094F82E00FFF718FB584B1B885B
:400B0000ADF828300AA8FFF7E3FB90E0237C3BB1002001F0E9FB002002F07CF900232B7402F0FEF8002002F0A1F82A2701F0CCFF002001F06FFF3A4600210AA802F060FA3B
:400B400015238DF828308DF8297001F021FE002001F0CAFB002002F05DF9C82001F0DAFD0DEB0700FFF76AFB0DF13E00FFF787FB01F00EFE012002F04DF9322001F0CAFDD6
:400B80000DF12E00FFF75AFB0DF14200FFF777FB012001F0A9FB4FF4967001F0BBFD01F0F7FD0DF13600FFF749FB0DF14A00FFF766FB002001F098FB4FF4967001F0AAFDF7
:400BC00001F0E6FD022002F025F9322001F0A2FD0DF13200FFF732FB0DF14600FFF74FFB012001F081FB4FF4967001F093FD01F0CFFD0DF13A00FFF721FB0DF14E00FFF795
:400C00003EFB002001F070FB4FF4967001F082FD01F0BEFD002002F0FDF80023E37302F001F801F0D3FE6DE70120FFF763FB032000F0FEFC0B48FFF736FBFFF7D6BB00BFD7
:400C40004C390000F885FF1F7C390000A23800008B39000099390000A4380000A6380000A8380000A639000010B54268002A2ED0C368002B2BD00368048A591C01601B786C
:400C8000013A13F0800F817C42601DBF03F0010242EA84030231083114BF43F0020343EA0423817414BF03820382837C072BDCD9028A083B42FA03F38268511C8160137004
:400CC000C368013BC360837C083B8374CDE710BD07B5827C42B102AA002102F8011D026001224260FFF7C0FF03B05DF804FB30B543686BB3C2685AB3827C072A0CD80468D7
:400D000090F91050611C01602178013B41EA05210832018243608274827C018AA2F108042141CBB2090608D5C3F3801363F07F03023A03F08103827402E08474002BD7D00A
:400D40008268511C81601370C368013BC360CFE730BD00002DE9F04172B644F21A118E4B61221A70A3F5F06301221A8019244FF443729C709A80894A1B231370518044F633
:400D80001F611371D1801372854A864B92E80300062283F8002283E80300522203F580731A70814B814A1B78814EDBB2137040F61802804B00251A8041F2512223F8022C4E
:400DC00033784FF4F07003F0010343EA450502F0AFF8013C05F003052ED0032DF0D1764B4FF480721A8007221A70744A002548211570917002221D705D7103F8032C042291
:400E0000DA716F4A6F4C13786F4E43F00F03137012F8013C062743F0030302F8013C2378012243F0800323705B4B1A70674A137843F02003137000E0FEE707FB0563002163
:400E40009A881868013502F0DBF8072DF5D16048604E002550F8041F05F1105303F1560221F0FF075733C9B20B4452005B0002329A4206D012F802EC12F801CC0EF807C0B6
:400E8000F5E7B0420D44E5D1534A00231360936013619361514B524F1A68524BDFF890811A60514B1A68514B1A60514A137843F002031370137C43F0020313742378A2F57C
:400EC000863243F040032370413A137843F010031370484A484B07CA03C31A80474A2833106843F8250C127903F8212C444A07CA03C31A80434AE83B07CA03C31A80424A3D
:400F0000083307CA03C31A80404A414BA2F5616203CBC2F8100EC2F8141E1378042043F0080313703B4B02F5AA521B783D78DBB298F80060EDB203F007010C321B09117018
:400F4000F6B2537045F003033B7046F0030388F80030314B48221A70304A402313703049937013729372082382F81F3220220A7048710A722B4A0A20137001F0E1FB2A4B13
:400F800088F8006044223D70284D1A7094E80F0007C52B80BDE8F081004800408640004070100048004100400F010049A1460040254200402242004004400040064000407B
:400FC000A2430040A0430040AB390000E8460040FCFFFF47A80000480076004078100048F8460040207600407C100048287600400350014030100048C05100403C10004899
:4010000044100048501000485C1000483251004068100048CF0100491D51004001590040235B0040585B004076580040B0430040F946004008B501F0B7FF03680C2B00D18C
:40104000FEE7FEE7084908B50B68084A1844821A802A01DC086005E001F0A6FF0C2303604FF0FF33184608BDCC80FF1F4887FF1F80B51148114B0025C0B1A3F1100192C974
:4010800022460439161BB74204D051F8046F42F8046BF7E7114653F8046C8C1AA64202D041F8045BF9E701381033E5E701F082FFFFF774F9FEE700BF010000007C3B0000E7
:4010C000124A134B10B51A60124A134C1368134843F4007313600023032B98BF54F823204FEA830188BF0E4A0133302B4250F3D10C4B1A780C4B1A700C4B084A1A60FFF7EE
:4011000029FEBDE8104001F0EDB900BF0004FA050CED00E014ED00E0000000000080FF1F35100000BC760040C080FF1F08ED00E0F8B501F005FF4B4A01271378022643F0B3
:4011400001031370137C484C43F001031374474B02F5E3521F700B3203F8946C1378054603F07F031370002001F0EAFA2378404A03F0F90323701378384603F0DF031370B7
:4011800023783B43237001F0DBFA282001F0D8FA384B30461A7802F07F021A701A7802F0BF021A7023783343237001F0C9FA2378314A43F0040323700023137053702F4A3E
:4011C000FF2199540133092BFBD1284601F0BCFE0721172001F0FCFA2949172001F0EAFA0721182001F0F4FA2649182001F0E2FA0721152001F0ECFA2349152001F0DAFA84
:401200000721052001F0E4FA2049052001F0D2FA0721062001F0DCFA1D49062001F0CAFA0721084601F0D4FA1A49072001F0C2FA0721082001F0CCFA1749082001F0BAFA51
:401240000021162001F0C4FA1449162001F0B2FA07210C2001F0BCFABDE8F84010490C2001F0A8BAA5430040944300409D60004012600040F8510040846000406D86FF1F9C
:40128000FF1A000039190000FD1A0000311A00005D1A00008D1A0000C51A0000051B0000791B0000214B224A10B5187000231370204A40201370204A0F2413701F4A13708C
:4012C0001F4A13701F4A13701F4A13701F4B4FF400021A604FF080721A604FF400121A6020221A601860802018604FF480701860174804704FF480001860164B1A70933BC9
:4013000019B91A7802F0FE0202E01A7842F001021A70114B03221A70802203F8202C012001F006FE0D4B04221A7010BD8886FF1F8E86FF1F8C86FF1F8D86FF1F8986FF1F59
:401340007886FF1F8B86FF1F0087FF1F00E100E09E6000409C600040286000401260004070B5074C054623780E461BB9FFF7E0FE0123237031462846BDE87040FFF792BF36
:401380003886FF1F0A4A002313700A4A13700A4A13700A4A13700A4A13700A4A13700A4A13700A4B03221A70802203F8202C70478E86FF1F8C86FF1F8D86FF1F8986FF1FE9
:4013C0007886FF1F8B86FF1F0087FF1F28600040014B1878704700BF8D86FF1F044B1A7802F0FF001AB118780022C0B21A7070478C86FF1F024A0C2303FB00204078704778
:401400009486FF1F431E072B0CD8074A064B00010344805C5B7800F00F0043EA0020023880B2704700207047FC5F00401A4A38B50C2303FB00231B79090C13F0800F00F1B6
:40144000FF35044619BF8AB24FF480438BB24FF48042032D18D8DFE805F002070C110021084601F01BF80DE00021084600F0FAFF08E00021084600F0D9FF03E00021084667
:4014800000F0B8FF054B1855EDB2072D03D801F0EDF8034B185538BD9486FF1F6486FF1F6D86FF1F431E072B2DE9F0470446894615465CD82F4F0C2202FB0072D388DFF86E
:4014C000B8A09BB2C3F500739D424FF00C0303FB007388BFD588DB7884BFC5F50075ADB2254A43EA15230601B354B244EBB28AF80130224B1A5C9846FF2A01D1FFF796FF47
:401500000C2303FB047200215170B9F1000F28D03DB31B4F385D01F011F811232946FE2218F8040001F0D6F806F5C04278321FFA89F118F8040001F0DFF8124D18F804105D
:40154000385D01F04BF80121385D00F0E1FF735D43F002037355735D03F0FD037355BDE8F08703FB04746379DBB28AF80230BDE8F08700BF9486FF1FFC5F00406D86FF1F52
:401580006486FF1F706000402DE9F047044615468846002940D0431E072B3FD8FFF732FFA84203D22046FFF72DFF05461D4E335DFF2B03D141462046FFF738FFDFF868A0C5
:4015C00027011AF8040000F0B9FF1223FE222946305D01F07FF807F5C0411FFA88F27831305D01F089F8DFF84490315D1AF8040000F0F4FF01211AF8040000F089FF17F823
:40160000093043F0020307F8093017F8093003F0FD0307F8093002E00D4600E000252846BDE8F0876D86FF1F6486FF1F70600040431E072B0AD8064A0C2303FB002300226A
:401640005A705A79034BD2B200011A54704700BF9486FF1FFE5F0040431E072B9FBF024B000108221A547047FE5F004030B51A4A1A491B4D0878138803449BB21380194A5D
:4016800000231488D8B2A4B27CB1082B0CD050680078C0B2E85450680133013050601088013880B21080ECE718460B780E4C082B0E4A00D040B10E4D2B7883F080032B7028
:4016C0000F232370022301E0022323701370094B1870087030BD00BF0487FF1F0087FF1F006000407C86FF1F7986FF1F8E86FF1F8A86FF1F0187FF1F074B02221A70074B61
:4017000080221A70064B0F221A70064A00231370054A0120137070478E86FF1F8A86FF1F7986FF1F0087FF1F0187FF1F30B5164B16491B780A8803F00F03023BDBB21A4412
:4017400092B20A80124C134A0020118889B279B173B15568215C013BC9B229705168DBB20131516011880130013989B21180ECE7094A1370094A137883F080031370084BC8
:401780000B221A7030BD00BF296000400487FF1F006000407C86FF1F0187FF1F8A86FF1F7986FF1F064A06231370064A01201370054B80221A70054B00221A70704700BFC5
:4017C0008E86FF1F7986FF1F8A86FF1F0187FF1F054B9A683AB19A68044910709A680988518000229A6070477C86FF1F0487FF1F08B5124B1A78D2B21A701B78DBB21A06C0
:4018000002D50F4A137008BD0220FFF7E1FF0D4B1B7803F06003202B05D0402B06D043B900F012FC04E001F093FB01E000F046FD10B9034B03221A7008BD00BF2860004013
:401840007986FF1F0060004008B5084A084B0120197813880B449BB21380064B00221A70FFF7B6FF044B03221A7008BD0487FF1F0087FF1F8E86FF1F7986FF1F08B50C4BB1
:401880001B78DBB2042B07D0062B09D0022B0DD1BDE80840FFF7D8BFBDE80840FFF746BF0320FFF795FF034B03221A7008BD00BF8E86FF1F7986FF1F08B5054B00220120BE
:4018C0001A70FFF785FF034B03221A7008BD00BF8E86FF1F7986FF1F08B50A4B1A7832B11A78094942F080020A7000221A70074B002201201A70FFF76BFF054B03221A7051
:4019000008BD00BF7886FF1F086000408E86FF1F7986FF1F074B1B78DBB2042B05D0062B05D0022B05D1FFF7A1BEFFF7C5BFFFF7D3BF70478E86FF1F38B51D4C2378DBB2D3
:40194000DD0634D518060AD503F00F03012B2ED1FFF74EFF174B1B78190609D538BD5A0602D5FFF7D7FF03E09D0620D5FFF786FF23781B061BD4104B1A78104B1B7813434F
:401980000F4A13701278934211D10A4A0849154613782078DBB2000605D41378DBB20B700B7803F00F0328788342F1D138BD38BD286000407986FF1F8A86FF1F0187FF1F96
:4019C00029600040054A00231380054A916819B191680B7092685380704700BF0487FF1F7C86FF1F0E4808B503889BB213B9FFF783FE13E00B4B02221A700B4B00221A7060
:401A0000FFF7E0FF094AD1799379028843EA012392B2934238BF0380FFF728FE012008BD7C86FF1F8E86FF1F8A86FF1F00600040084B01221A700F3B9B7C074B1A7B02F05E
:401A40000302012A1EBFDA7B82F08002DA7301225A7370470B6000409486FF1F094B02221A700F3B93F82230074B1A7E02F00302012A1EBFDA7E82F08002DA7601225A7698
:401A8000704700BF0B6000409486FF1F0B4B04221A700F3B93F83230094B93F8242002F00302012A1EBF93F8272082F0800283F82720012283F82520704700BF0B600040E2
:401AC0009486FF1F0B4B08221A700F3B93F84230094B93F8302002F00302012A1EBF93F8332082F0800283F83320012283F83120704700BF0B6000409486FF1F7047FFF79A
:401B000041BC0000F0B5184B184E19780C27C9B201234FF0000C31B3CA0720D5144A4FEA031E7244947850782040C5070DD507FB03652C79240608D5147804F0FE04147076
:401B40006D790C4CEDB204F80E50840706D507FB036425792D0658BF84F801C090700133DBB24908D7E7F0BD9F6000409486FF1F70600040FE5F004000F0ACBC70B50446D2
:401B8000184B88B003AA03F11006154618685968083303C5B3422A46F7D11B782B70FCB12223237001AD03232846637000F08AFE002220461146AB5C08AC04EB131414F80B
:401BC000144C03F00F03847008AC234413F8143C0132082AC1700371417100F10400EAD108B070BDD53900002DE9F0431C4D01222E460C201F274FF0800E4FF0080C194B78
:401C000000FB02581401234418705F70164998F805902144B9F1000F07D098F8044024064CBF887081F802C001E081F802E000FB0261CC880132E4B29C71CC88092AC4F3C5
:401C40000724DC71CC88E4B21C71C988C1F307215971D4D1054BFF221A70BDE8F08300BF9486FF1F70600040FC5F00400A600040064B074A1B7802EBC30253681A7C82427E
:401C800086BF03EBC0035869002070478886FF1F383A00002DE9F84F424B1A78002A7ED01878414D0138C0B2FFF7E2FFA8463F4AC3681478007ADFF800C1E4B203EBC000E0
:401CC0000C2600274FF0010E834268D01A78A24263D11CF80420597891425ED19A7893F8039002F07F0206FB02FA05EB0A01CF7093F802B009F0030981F804B093F803B004
:401D000005F80AB0B3F804A0A1F808A093F902A0BAF1000F0BDAB9F1010F0CBF4FF007094FF00D0981F8059081F801E009E0B9F1010F0CBF4FF005094FF0090981F80590E4
:401D40004F704FEA02191A4906FB0282494481F802E0B2F808A0CAF3072A81F800A0B2F808A05FFA8AFA81F801A0B2F806A011495FFA8AFA494481F806A0B2F80690C9F3AF
:401D8000072981F80790B2F806905FFA89F981F80490D288C2F307224A71083394E7BDE8F88F00BF8D86FF1F9486FF1F8986FF1FFC5F0040706000407A86FF1F08B5064BBA
:401DC00018780138C0B2FFF753FF20B143681B7900EBC300406908BD8D86FF1F00212DE9F84F0B464E4E0C2707FB01F401313219092933554FF000059370494CD370138184
:401E0000937253705371EFD118B1464B1D70464B1D70464B1A78002A7FD0187801250138C0B2FFF725FFA8464368DFF8F8E0DB790C2713F0400F3E4B4FF0000C1A7814BFE0
:401E400042F0010202F0FE021A70027AD20007FB0541C36803EB02094B4531D093F802A00AF07F06AE4229D10E89B3F804B0B6B25E4538BFA1F808B01E7893F801B01EF89F
:401E80000660B3451AD181F804A0DE780E7093F902A0DE78BAF1000F06F0030607DA012E0CBF07260D264E7181F8018006E0012E0CBF052609264E7181F801C00833CBE797
:401EC0000135092DC3D1C1680A328B1C0A440C200833934209D013F8081C13F80A5C01F07F0100FB01418D72F2E7FFF767FF114B0121186000230C2000FB0142D380128980
:401F0000013113449BB203F00102134409299BB2F2D1BDE8F84FFFF767BEBDE8F88F00BF9486FF1F7A86FF1F0287FF1F8D86FF1F8B86FF1F9086FF1F114B1B7903F07F0354
:401F40005A1E072A19D80F490C2202FB031291781B0141F0010191700021D170517841F002015170127912F0800F074A1A4414BF8D2389239370FFF715BC0020704700BF5C
:401F8000006000409486FF1FFC5F004030B4194B1A7902F07F02531E072B27D8164B0C2404FB02339978154D01F0FE0199700021D97029461201505D114400F07F0050558B
:401FC0005A7802F0FD025A701A795B78120605D5012B01D18C7006E00D2303E0012B0CBF082309238B7030BCFFF7DCBB002030BC704700BF006000409486FF1FFC5F004052
:4020000010B50D4B0D4C21791878C9B20138C0B2FFF72EFE43681B798B4201D2012909D8074A0848535CDBB24354A3780120DBB2535410BD002010BD8D86FF1F006000405F
:402040007A86FF1F0287FF1F38B58A4A8A4C13780021DBB221801806517840F18D800A2900F20581DFE811F05D00030103010301030103010B0003017E0003018200D378C3
:402080007C49012B09D17D4B1A787D4B03EBC2035B685B686360122310E0CB78022B12D18878FFF7E5FD002800F0E180436863606368DA7863689B7843EA02232380BDE86B
:4020C0003840FFF78FBCCB78032B26D16D4B00228878D5B2854209D3664A91786A4AEE2908BF1346634A917881B106E0187801320028F1D018780344EAE764499278097CB9
:40210000914203D16248FFF739FD614B1A78002A00F0AD801A78228018E0BDE8384000F017BF13F0030313D0022B40F0A0802380504B0C211B7903F07F02564B01FB0233E0
:402140009A78554BD2B21A7000225A706360B6E702222280514A11784F4AC9B2117053706260ACE7012323804D4BEFE70123238013794C4A1344E9E701390A2977D8DFE8F4
:4021800001F037764F76067676760A7620009378454ADBB25AE0937803F0FF0153B9404B1A7891425FD01970404B01201870FFF715FE58E0481EC0B2FFF75AFD0028EED120
:4021C00055E0FFF71DFF002851D02A4A384913791279DBB2D2B20A70364A3249D25CCB5C9A4240D0314B01221A70FFF753FD3AE003F00303012B2BD009D3022B37D11D4B5A
:402200009B78002B33D1BDE83840FFF7BFBE194B9B78012B2BD1214A137803F0FD0315E003F00303012B13D008D3022B1FD1114B9B78E3B9BDE83840FFF77EBE0D4B9B788A
:40224000012B14D1154A137843F0020313700AE0084B1A795AB998781B791749DBB2CA5C22EA0002CA54BDE83840FFF79BBA002038BD00BF006000407C86FF1F8886FF1FBA
:40228000383A00009C3A0000243A00000F3B00002087FF1F9486FF1F3986FF1F8B86FF1F8D86FF1F7A86FF1F7886FF1F8C86FF1F8986FF1F0287FF1F8F86FF1F074B1A789F
:4022C000120609D55B78012B06D1054B054A5A6012781A80FFF786BB00207047006000407C86FF1FFC390000014B1870704700BF72640040014B1878704700BF6D640040CF
:40230000014B1870704700BF7A650040064A0123136002F688321268E0211064034A1170A2F540721360704780E100E000E400E0014B1870704700BF76650040014B18702D
:40234000704700BF7965004073B515461E460B4C05230022019200920A4601461846237000F064F932462946207800F01FF90221207800F009F9207802B070BDD080FF1F2E
:40238000064A0423136002F688321268E0219064034A1170A2F202321360704780E100E002E400E0014B04221A60704700E100E0014B04221A60704780E100E0014B18702F
:4023C000704700BF7C640040704738B505460078012428B100F054FD285D0134E4B2F8E738BD08B50D2000F04BFDBDE808400A2000F046BDF7B516461F460B4C0023032542
:40240000019300930A4601462846257000F00EF93A463146207800F0C9F80221207800F0B3F8207803B0F0BDE080FF1FF7B516461F460B4C00230225019300930A4601460C
:402440002846257000F0F2F83A463146207800F0ADF82946207800F097F8207803B0F0BDE180FF1FF7B516461F460B4C00230125019300930A4601462846257000F0D6F8D2
:402480003A463146207800F091F80221207800F07BF8207803B0F0BDE280FF1F73B515461E460B4C0023019300930A4601461846237000F0BBF832462946207800F076F8EE
:4024C0000221207800F060F8207802B070BD00BFE380FF1F024B1878C0F38010704700BF8F450040074A7F23802113705170064A013BDBB202F80839002BF9D1034A137087
:40250000704700BFE480FF1FF87B00400078004017280FD8084B0001C25C11B142F0200201E002F0DF02C254C25C42F00102C25400207047012070471070004017280BD8C6
:40254000064B0001C25C02F0FE02C254C25C02F0DF02C25400207047012070471070004017280DD8074900010B4603441A7942F004021A71435C43F00103435400207047C6
:40258000012070471070004017280BD8064A0001835C490003F0F10301F00E011943815400207047012070471070004041F6FF73994208BF4FF400519A4208BF4FF400524A
:4025C00017289FBFC00000F1804000F5EC4081809ABFC280002001207047000017289FBF034B00011954002088BF0120704700BF1970004017289FBF054B00011A5C01F0A3
:4026000007019DBF1143195400200120704700BF1470004017289FBF034B0001185C00F0070088BFFF20704714700040172810B51AD8C00001F07F0100F1804441EAC212E7
:4026400004F5EC44D2B222709DF8082003F00F0343EA0213DBB263709DF80C30002003F00F03A370E07010BD012010BD10B500F067FC0A4A5378182B0AD91478013B5370BB
:40268000E30003F1804303F5F0431B78137000E0FF2400F059FC204610BD00BFE480FF1F030610B5044611D400F04AFC084AE300117803F1804303F5F043197053781470D8
:4026C00001335370BDE8104000F03EBC10BD00BFE480FF1F30B504060CD411F4704509D1C40004F1804404F5F0442180A270E370284630BD012030BD03065FBFC00000F1A2
:40270000804000F5F04081805ABFC280002001207047000038B50446084DB4F5004F05D9286800F005FCA4F50044F6E7034B58686043BDE8384000F0FBBB00BFEC80FF1F06
:40274000024B1B7A584300F0F3BB00BFEC80FF1F0E4B00F003001A78490102F0FC02104318701A7801F0600142F080021A701A7802F07F021A701A7802F09F020A431A7055
:402780001A7842F010021A70704700BF83430040014B01221A70704784430040044B00F00F021B6853F8220043F82210704700BF08ED00E0054A00F01F00126800F11003B2
:4027C00052F8230042F82310704700BF08ED00E000F01F0000F16040490100F56440C9B2017070470F4B10B50F4900240F205C609C60DC601C615C61FFF7D0FF0B4A136801
:4028000043F0040313600A4B4FF47A72DB68B3FBF2F3084A1360084B4FF400421C60C3F8E82010BD3C86FF1F9128000010E000E0EC80FF1F14E000E018E000E0024A136882
:4028400043F002031360704710E000E008B5FFF7F5FF034A136843F00103136008BD00BF10E000E010B5054CA3691BB9FFF7BAFF0123A361BDE81040FFF7E8BF3C86FF1F7A
:40288000024B1868C0F30040704700BF10E000E038B5FFF7F5FF012808D1054D002455F8243003B198470134052CF8D138BD00BF4086FF1F024B03EB8003586859607047DA
:4028C0003C86FF1F134B144A1B78DBB20360127843EA0223114A0360127843EA0243104A0360127843EA026303600E4B0E4A1B78DBB24360127843EA02230C4A4360127814
:4029000043EA02430A4A4360127843EA02634360704700BF0301004904010049EC460040020100490101004900010049050100490601004910B500F003FB204A044613787A
:402940000A2043F002031370137C43F00203137412F80A3C43F0010302F80A3C937943F00103937102F5AB52137843F003031370134B18221A7013F8012C42F0400203F812
:40298000012C13F8012C02F0FC0203F8012CCE2203F8062CA3F597530222183B1A70094A137843F008031370FFF7CAFE064B10222046BDE810401A6000F0C6BAAB430040A7
:4029C0000E5900402F5B004080E200E008B500F0B7FA0F4A137803F0FE031370A2F5AA521D3A137803F0FD031370137C03F0FD03137412F80A3C03F0FE0302F80A3C9379E7
:402A000003F0FE039371BDE8084000F09DBA00BF08590040044A137803F03F0343EA8010C0B21070704700BF08590040082804D00A280CBF8223C22300E0422308380E4ACE
:402A4000C0B20428137098BF0C4B4FF0000298BF33F910100A4B88BF11461A8042F210734B4341F2883103F6C41393FBF1F305490B60054B1A8070470A590040E639000087
:402A80000A87FF1F0C87FF1F1087FF1F08B5102000F0A6F907210420FFF79AFE07490420FFF788FE064A0C20137843F006031370FFF7BCFF034B00221A8008BD852B0000C5
:402AC000095900400887FF1F10B5054C23781BB9FFF7DCFF01232370BDE81040FFF72ABF5886FF1F044B1A7802F0FB021A701A7842F001021A7070470859004010B5084B8F
:402B00001C7814F0010403D10028F9D0002404E02046FFF715FE024B1B78204610BD00BF09590040034A044B1B881088181A00B2704700BF1087FF1FA25B00400E4A138832
:402B40001BB223B111880A2309B2594301E00B4B19680B4B1B88C01A42F2107300B203FB00F2022391FBF3F30028D8BF5B42134493FBF1F000B270470A87FF1F0C87FF1F31
:402B80000887FF1F7047000010B500F0D9F9214A044613780A2043F001031370137C43F00103137412F80A3C43F0020302F80A3C937943F00203937102F5AA5218321378E1
:402BC00043F003031370144B18221A7013F8012C42F0400203F8012C13F8012C02F0FC0203F8012CCE2203F8062CA3F597530222123B1A70094A137843F008031370FFF7A3
:402C00009FFD074B08222046BDE810401A6000F09BB900BFAB43004006590040275B004080E200E008B500F08BF90F4A137803F0FE031370A2F5AA52153A137803F0FE03E6
:402C40001370137C03F0FE03137412F80A3C03F0FD0302F80A3C937903F0FD039371BDE8084000F071B900BF00590040044A137803F03F0343EA8010C0B21070704700BFAF
:402C800000590040082804D00A280CBF8223C22300E0422308380E4AC0B20428137098BF0C4B4FF0000298BF33F910100A4B88BF11461A8042F210734B4341F2883103F6A9
:402CC000C41393FBF1F305490B60054B1A80704702590040F03900001687FF1F1C87FF1F1487FF1F08B5102000F084F807210320FFF76EFD07490320FFF75CFD064A0C20F5
:402D0000137843F006031370FFF7BCFF034B00221A8008BDDD2D0000015900401887FF1F10B5054C23781BB9FFF7DCFF01232370BDE81040FFF728BF5986FF1F044B1A78AB
:402D400002F0FB021A701A7842F001021A7070470059004010B5084B1C7814F0010403D10028F9D0002404E02046FFF7E9FC024B1B78204610BD00BF01590040034A044B6E
:402D80001B881088181A00B2704700BF1487FF1FA05B00400E4A13881BB223B111880A2309B2594301E00B4B19680B4B1B88C01A42F2107300B203FB00F2022391FBF3F35E
:402DC0000028D8BF5B42134493FBF1F000B270471687FF1F1C87FF1F1887FF1F70470000034A00F0F800137803431370704700BF02410040034A00F0F8001378034313704D
:402E0000704700BF06410040014B1870704700BF78650040014B1870704700BF7564004073B515461E460B4C04230022019200920A46014618462370FFF7F8FB32462946C7
:402E40002078FFF7B3FB02212078FFF79DFB207802B070BDFC80FF1F074A0223136002F688321268E0215064044A11706FF440710A441360704700BF80E100E001E400E0D2
:402E8000FEB5494652465B460EB40746244909688A46244A12682448022100F071F8030020480068C018204900F06AF8143883460121C9430C460125002600F041F88146D3
:402EC00051460B7823400B705846013000F030F83800F04028400B78234003430B70584600F026F80136072EF2D9002001300138013001200B78234003430B705846043044
:402F000000F016F8484600F01FF800BF00BF00BF0EBC894692469B46FEBD00BFAFF30080D480FF1FF880FF1F00C20100000000000230800803D000BF01380046FCD17047B9
:402F4000EFF3108072B6704780F31088704700BF094A137803F00303012B0AD0022B09D113790C2103F07F02044B01FB02339B7A00E0137900207047006000409486FF1FBE
:402F8000002902D0B0FBF1F0704708B14FF0FF3000F008B80029F8D00246B0FBF1F000FB11217047704700BF014B1868704700BF6081FF1F0E4B70B51E460E4C0025E41A3D
:402FC000A410A54204D056F8253098470135F8E700F0BAFD084B094C1E46E41AA4100025A54204D056F8253098470135F8E770BD543B0000543B0000543B00005C3B00007E
:4030000003460244934202D003F8011BFAE7704730B5141E05469BB0184604DA8B232B604FF0FF301DE04FF40273ADF80C300CBF234604F1FF33029305934FF6FF730091B5
:403040000491ADF80E3002461E9B6946284600F073F8431CBCBF8B232B6014B1009B00221A701BB030BD000007B5009313460A46014603480068FFF7CBFF03B05DF804FBCF
:403080006081FF1F2DE9F0478E6882469E420C46914698463ED88A8912F4906F3AD02568096902236F1A656905EB450595FBF3F57B1C43449D4238BF1D4653050FD52946B8
:4030C00000F04AFB064698B13A46216900F0D2FAA38923F4906343F08003A38113E02A4600F098FB064670B92169504600F0E8FA0C23CAF80030A3894FF0FF3043F04003B2
:40310000A381BDE8F08726613E44266046466561ED1BA560464528BF464649463246206800F0B3FAA36800209B1BA36023681E442660BDE8F08700002DE9F04F9DB003938C
:403140008B8980461C060D4616460DD50B695BB9402100F001FB2860286118B90C23C8F80030CDE040236B610023099320238DF82930DFF89CB130238DF82A3037463C46DB
:4031800014F8013B1BB9B7EB060910D003E0252BF9D02746F3E74B46324629464046FFF771FF013000F0A780099B4B4409933B78002B00F0A08000234FF0FF3204930793F2
:4031C000059206938DF853301A930126052221784E4800F041FA671C049B38B14B4A3C46801A06FA00F018430490EFE7D90644BF20228DF853201A0744BF2B228DF853204C
:4032000022782A2A03D0079A00210A200BE0039A111D12680391002A10DA524243F00200079204900BE027463B780134303B092B03D800FB02320121F5E701B107923B782E
:403240002E2B1ED17B782A2B0AD1039B02371A1D1B680392002BB8BF4FF0FF33059310E0002319460593781C0A2407463A780130303A092A03D804FB01210123F5E703B1C9
:40328000059103223978224800F0E6F940B14023CBEB000003FA00F0049B013718430490397806221B487E1C8DF8281000F0D4F988B1194B33B9039B073323F007030833A3
:4032C000039314E003AB00932A46144B04A94046AFF3008007E003AB00932A460F4B04A9404600F093F8B0F1FF3F824603D0099B5344099342E7AB895B0601D4099801E0D9
:403300004FF0FF301DB0BDE8F08F00BF233B0000293B00002D3B000000000000853000002DE9F04791461F460A698B6806469342B8BF1346C9F8003091F843200C46DDF8AC
:40334000208012B10133C9F800302368990642BFD9F800300233C9F80030256815F0060510D104F1190A07E00123524639463046C04701301AD00135E368D9F800209B1AFC
:403380009D42F1DB94F843302268003318BF012392060FD5E118302081F843005A1C94F845102244023382F8431003E04FF0FF30BDE8F08704F1430239463046C047013097
:4033C000F4D02268D9F80050E36802F00602042A08BF5D1B2269A3680CBF25EAE57500259342C4BF9B1AED184FF000091A344D4509D00123224639463046C0470130D5D04C
:4034000009F10109F3E70020BDE8F0872DE9F04317460A7E85B06E2A984606460C460C9B01F1430E00F0AE8011D8632A22D009D8002A00F0BB80582A40F0CA8081F845207B
:40344000834955E0642A1ED0692A1CD0C0E0732A00F0B08009D86F2A2ED0702A40F0B8800A6842F020020A603EE0752A24D0782A3AD0ADE01A6801F14205111D1960136882
:4034800084F84230A8E021681A6811F0800F02D0111D196008E011F0400F02F10401196002D0B2F9003000E01368002B3CDA2D225B4284F8432037E021681A6811F0800F13
:4034C00002D0111D196007E011F0400F02F10401196001D0138800E01368227E5C496F2A14BF0A2208221BE078225A4984F845202268186812F0800F00F104051D6003D1DE
:40350000550601D5038800E00368D00744BF42F0200222601BB9226822F0200222601022002084F8430001E049490A226568002DA56008DB206820F0040020602BB9002D01
:403540007DD175460CE0002B79D07546B3FBF2F002FB1033CB5C05F8013D03460028F5D1082A0BD12368DA0708D5236962689A42DEBF302305F8013C05F1FF35C5EB0E0320
:4035800023612EE008681A6810F0800F496903D0101D1860136808E010F0400F02F104001860136801D0198000E0196000232361754616E01A68111D196015680021626886
:4035C000284600F049F808B1401B6060636804E004F1420584F8422001232361002384F84330CDF800803B4603AA21463046FFF797FE013002D14FF0FF3026E023692A4686
:4036000039463046C0470130F5D023689B0710D5002504F1190907E001234A4639463046C0470130E7D00135E368039A9B1A9D42F2DBE068039B9842B8BF184605E00B784F
:4036400004F1420584F842308AE705B0BDE8F083D5390000343B000010B5C9B202449042034605D01C7801308C42F8D1184610BD002010BD10B5431E0A44914204D011F857
:40368000014B03F8014FF8E710BD884210B501EB020301D8421E0BE09842FBD28118D21AD34204D013F8014D01F8014DF8E710BD994204D011F8014B02F8014FF8E710BDC8
:4036C00038B50546002944D051F8043C0C1F002BB8BFE41800F0D4F81E4A1368114613B96360146030E0A3420DD92268A018834201BF18685B681218226063600C6023E047
:40370000A24203D813465A68002AF9D118681918A1420BD12168014458188242196013D110685268014419605A600DE002D90C232B6009E021686018824201BF1068526820
:403740000918216062605C602846BDE8384000F098B838BD6086FF1F70B5CD1C25F0030508350C2D38BF0C25002D064601DBA94202D90C23336046E000F082F8234B1C683D
:403780001A462146A1B10B685B1B0ED40B2B03D90B60CC18CD501EE08C420BBF63684B681360636018BF0C4615E00C464968E9E7174C23681BB9304600F052F8206029460B
:4037C000304600F04DF8431C18D0C41C24F00304A0420DD12560304600F053F804F10B00231D20F00700C31A0ED05A42E25070BD211A304600F034F80130EBD10C2333605D
:40380000304600F03EF8002070BD00BF6086FF1F5C86FF1FF8B5074615460E4621B91146BDE8F840FFF798BF1AB9FFF749FF2846F8BD00F027F885420ED929463846FFF704
:403840008BFF044650B131462A46FFF713FF31463846FFF735FF01E03046F8BD2046F8BD38B5064C0023054608462360FDF7EAFB431C02D1236803B12B6038BD4487FF1F0D
:403880007047704751F8040C0028BEBF091851F8043CC0180438704700000000050209020B020D020F02110213027265706C792030782530327800686F6D696E6700626584
:4038C00067696E6E696E67207365656B2066726F6D20256420746F2025640066696E6973686564207365656B0057616974696E6720666F72205553422E2E2E005553422003
:40390000726561647900636F6D6D616E642030782530327800756E64657272756E206166746572202564207061636B65747300636F756E743D256420693D256420643D254F
:403940006400636D645F777269746500703D25642063723D25642063773D256420663D256420773D256420696E6465783D256420756E64657272756E3D25640077726974AE
:40398000652066696E69736865640073746172742065726173696E670073746F702065726173696E670069646C65000051004010004051004030000000014000100014018C
:4039C00040000800400140000A004C0140000200500140200030313233343536373839414243444546000001000000040000001000010000000400000010000028000000C0
:403A0000000104000100000000000000000157494E5553420000303030303100000000000000000012034D005300460054003100300030000100000001000000403A00005A
:403A4000010000000F3B0000000000000000000001000000583A000001000000E13A0000040000007A3A0000000000000000000000000000783A0000FF00000001024000A0
:403A8000FF00000082024000FF00000003034000FF00000084034000FF00020304030904160346006C007500780045006E00670069006E0065002A0343006F0077006C0050
:403AC000610072006B00200054006500630068006E006F006C006F0067006900650073000009022E0001010080320904000004FF0000010705010240000007058202400067
:403B0000000705030340000A0705840340000A12010002FF0001080912006E0100020180014300232D302B2000686C4C00656667454647003031323334353637383961621F
:403B40006364656600000000F8B500BFF8BC08BC9E46704759000000C1100000F8B500BFF8BC08BC9E46704735000000803B0000C880FF1FA0000000E005000000000000B0
:403B8000000000004887FF1FFF000000675000400C00000007000000FFFFFFFF7F8000003F0000000000007D00FA0000400000000090D003FF0000000000000000000000BC
:403BC000000000000000000000000000000000000000000000000000213B000000000000000000000000000000000000000000000000000000000000000000000000000069
:403C00000000000000000000000000000000000000000000000000000081FF1F000000000000000000000000000000000000000000000000000000000000000000000000E5
:403C40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044
:4000000000800020110000007910000079100000064A08B5136843F020031360044B1A6803F53F5302331A6001F044F8E8460040FA46004010B5054C237833B9044B13B1D7
:400040000448AFF300800123237010BD6881FF1F00000000F8380000084B10B51BB108490848AFF300800848036803B910BD074B002BFBD0BDE81040184700BF0000000011
:400080006C81FF1FF8380000C880FF1F000000000A4A0B4B116801310B40002BBEBF03F1FF3363F00F030133136011685368994202BF024B01221A72704700BF8881FF1FBC
:4000C0000F0000800A4A0B4B516801310B40002BBEBF03F1FF3363F00F030133536051681368994202BF024B01221A72704700BF8881FF1F0F000080024B012200205A7223
:4001000002F07EB98881FF1F10B5C4B2204601F093F90128FAD110BD08B572B60F4B0F49DA680132DA601A690132C82A08BF00221A615A6918690132A72A08BF00224A6162
:400140005B69002B0CBF02230023002814BF184643F0010002F0BCFE62B608BD8881FF1F10B504460D4B8278997E91421CBF00225A7702689A610279094B1A718378002B42
:4001800014BF0220012002F067FEE07802F05EFE2079BDE8104002F095BE00BF8881FF1FA081FF1F70B5C4B220460E4601F04CF9314605460246204601F008FA204601F0EF
:4001C0003BF90128FAD0284670BD000038B50B4CA57F5DB904F11800FFF7C2FF012002F0A5F84FF47A7002F0B7FA6577E36823620123A377BDE8384002F0ECBA8881FF1FB5
:4002000038B50446C5B2284602F09CF8062002F0B9FA44F00200C0B202F094F8062002F0B1FA284602F08EF8BDE83840062002F093BA10B5642402F07FF820B10120BDE8B3
:400240001040FFF7DDBF0120FFF7DAFF013CF2D1F4E7000038B5044D0024285D013402F041FA102CF9D138BDAC81FF1F08B502F05BFC002002F064FC02F076FC02F080FCF8
:4002800080B208BD10B50446012002F073F8642002F062FAFFF7EAFF2080002002F06AF8642002F059FAFFF7E1FF608010BD08B502F066FD002002F06FFD02F081FD02F0B7
:4002C0008BFD80B208BD10B50446FFF7B2FF322002F042FAFFF7EBFF20800020FFF790FF322002F039FAFFF7E2FF608010BD0FB400B593B014AB53F8042B402102A8019396
:4003000002F0E2FE02A802F082F802F08CF813B05DF804EB04B0704710B5044601780648FFF7E5FF0420FFF7EFFE62782146BDE81040042001F0D8B80A39000007B5002339
:40034000ADF804308DF80600032301A88DF80530FFF7E2FF03B05DF804FB0000F8B51D4C0646FFF733FF637F03B156B91A48FFF7BEFFFFF75EFF012000236077636302F048
:4003800001FA3246616B1548FFF7B1FF114D0027636B9E4216D001F0CFFF00B16F63636B9E4205DD0020FFF72BFF6B6B013305E005DA0120FFF724FF6B6B013B6B6302F0F6
:4003C00009FAE5E7322002F0C7F9BDE8F8400448FFF78DBF8881FF1F173900001E3900003B3900002DE9F04F9BB062B602F05CFAAF49042002F080FAAE4801F0A9FFAE4870
:4004000002F04CFDAD4801F0DDFF02F02DFC02F0FFFA002002F020FD01F0F8FF0221002000F0C0FFA64D0321084602F0B3F92E462C4602F0CFF9AB7F73B12A6AEB689B1A23
:4004400041F28832934207D9002001F06FFF002002F002FD0023AB7700F0DCFF18B99948FFF745FF04E000F0DBFF0028F7D109E000F0D0FF0028FBD09348FFF738FF0320EA
:4004800001F0F8F8032000F0D7FF0128D1D18F48FFF766FE8E490320FFF784FE94F838108C48FFF724FF94F83830023B122B00F2EE83DFE813F01300EC031C00EC03220079
:4004C000EC034400EC036800EC039F01EC032E03EC034D03EC035303EC035E0303238DF828308DF829300A238DF82A303DE394F83A00FFF733FF784B34E3FFF767FE00239C
:400500006372E068627A02F0FF0132B9EB681B1AB3F57A7FF6DD0B4608E03BB100227272F168627A12B9EB685B1AFAE707228DF8282004228DF82920ADF82A3015E3022012
:40054000FFF7E2FD4FF000090DF1280A4FF480780027C8EB0903DA1907F80A200137402FF9D10220FFF7D0FD3A465146022000F0BBFFB8F10108EBD109F10109B9F1400F4D
:40058000E4D1564BC0E294F83A0001F0F3FE606BFFF7E4FE02F004FD514BDFF848811A78002742F004021A701A7842F001021A701A7802F0FE021A701A7802F0FE021A70E1
:4005C00002F0F2FC0220FFF79FFD41F6FF734FF480420121022002F045FC84F8780002F067F808F807000137102FF8D1DFF8F8A000270AF15D081FFA88F90137102F14BFDC
:400600003A4600221AF8010F2244062392F82420402102F081F84A4646F24F419AF8000002F08CF809F14009102F1FFA89F9E4D100237372637A002BFCD0002714223946E3
:400640000AA8777202F00CFD40230D934FF0FF333760736037723368DFF89090334493F8241096F87800CDF8309001F0D9FF96F8780001F097FF012196F8780001F06AFF32
:40068000236813B96B7A002BFAD0002794F83BA0676094F808B0BBF1000F6AD102F09AF86B7A43B3BAF1010A85F809B023D160E019010000F900000091000000C500000092
:4006C0008881FF1F493900005C390000A081FF1FC081FF1F66390000FC380000FE3800009F640040AC81FF1FAB81FF1F0886FF1F2B7A002B3DD1626823689A42F8D04FF07B
:40070000000B63680AA808EB83135B440A93CBF140030B9300F0DCFA0B9B0137C3F140039B440D9B5FFA8BFB9BB9022000F084FE012805D0637AE3B92B7A002BF5D018E0E2
:400740004022BA49022000F0CFFE4023CDF830900D93BBF13F0FD4D96268B54B01321340002BBEBF03F1FF3363F00F03013363608FE7042194F8780001F05EFF94F878009B
:4007800001F06AFF0028F9D10AA800F0D5FA0220FFF7BAFC337A63B90D9A402A06D0C2F1400292B2A149022000F09EFE0220FFF7ABFC0D9A32F0400203D11146022000F026
:4007C00093FEFFF747FD237A33B19A48FFF78FFD0220FFF7B3FD06E0974B09A81B88ADF82430FFF799FD627A3946237A9348FFF77EFD4FE29248FFF77AFDE76B17F03F0785
:4008000001D0032044E2012001F0BAFD95F83A0001F0B0FD02F0C4FB8A4BDFF82C821A7802F0FB021A701A7842F001021A701A7802F0FE021A701A7802F0FE021A7002F0FB
:40084000B3FB686BFFF78AFD01214FF4804341F6FF72084601F09AFD85F8780001F028FF08F807000137102FF8D1DFF8E091002709F15D031FFA83F807930137102F14BF3F
:400880003A46002219F8010F2244052392F82420402101F041FF414646F2445299F8000001F04CFF08F14008102F1FFA88F8E4D10027BB46B946BA46F36B4FF0FF389B09F8
:4008C000142239460AA837600593C6F80480377202F0C6FB402301200D9300F0CBFECDF8188001F077FF2268514B01321340002BBCBF03F1FF3363F00F036168B8BF0133D2
:400900008B4200F0A580BAF1000F07D0237A002B40F0B1806B7A002B40F0AD800B9B002B34D1B9F1000F0BD07F2240495A540133402BFAD10A910B9328E0BAF1000F06D130
:40094000012000F079FD01288046F6D107E0237A002B40F090806B7A002BF1D08BE03349FFF720FC8146314B0B9040460A9300F081FEB9F13F0F07F1010706DD059BDB1BA0
:40098000D3F1000949EB030900E0C1460B9BDBB12368079A0AA802EB83120D9BC3F1400313440C9300F0D7F90D9B6BB92A68204B01321340002BBEBF03F1FF3363F00F03DA
:4009C0000133236040230D936368013340D12B680F2B3DD14FF00008C5F8048001F004FD85F808806B6895F878002B4493F8241001F016FE95F8780001F0D4FD012195F852
:400A0000780001F0A7FD85F80980637A002BFCD04FF00008012086F8098001F0F1FC404601F0AEFCCDF8188015E000BF0886FF1F0F00008075390000003900008F39000066
:400A4000A239000094650040AC81FF1FAB81FF1FBAF1000F05D0237A6BB96B7A5BB94FF0010A6368069A93423FF43BAF6B680BF1010B069335E701F0BDFC012001F080FC15
:400A8000002001F0BDFC042194F8780001F0D4FD94F8780001F0E0FD0028F9D196F8780001F06EFD737A327A0293012303920193CDF800905B463A4605997A48FFF717FC01
:400AC000B9F1000F16D1059BBB420ADD012000F0B3FC01288046F6D17349FFF763FB3F2803DC012000F0DAFD04E0404600F0C2FD0137E8E7FFF7AEFB6C48FFF7F8FB237A25
:400B00000BB10220C4E06A4B1B8809A8ADF824302CE094F83A0001F02DFC606BFFF71EFC6448FFF7E4FB00236372637A002BFCD0012001F065FC00237372637A002BFCD0CE
:400B4000002001F05DFC5C48FFF7D1FB5B4B09E000206077FFF702FC594B03E05948FFF7FFFA594B1B88ADF828300AA8FFF7D4FB90E0A37F3BB1002001F0D8FB002002F0E5
:400B80006BF90023AB7702F0EDF8002002F090F82A2701F0BBFF002001F05EFF3A4600210AA802F05DFA15238DF828308DF8297001F010FE002001F0B9FB002002F04CF9C7
:400BC000C82001F0C9FD0DEB0700FFF75BFB0DF13E00FFF778FB01F0FDFD012002F03CF9322001F0B9FD0DF12E00FFF74BFB0DF14200FFF768FB012001F098FB4FF496704B
:400C000001F0AAFD01F0E6FD0DF13600FFF73AFB0DF14A00FFF757FB002001F087FB4FF4967001F099FD01F0D5FD022002F014F9322001F091FD0DF13200FFF723FB0DF1FF
:400C40004600FFF740FB012001F070FB4FF4967001F082FD01F0BEFD0DF13A00FFF712FB0DF14E00FFF72FFB002001F05FFB4FF4967001F071FD01F0ADFD002002F0ECF8D0
:400C80000023637701F0F0FF01F0C2FE6DE70120FFF754FB032000F0EDFC0C48FFF727FBFFF7C7BBAC3900000886FF1FDC39000002390000EB390000F93900000439000098
:400CC00006390000C081FF1F08390000063A000010B54268002A2ED0C368002B2BD00368048A591C01601B78013A13F0800F817C42601DBF03F0010242EA8403023108312E
:400D000014BF43F0020343EA0423817414BF03820382837C072BDCD9028A083B42FA03F38268511C81601370C368013BC360837C083B8374CDE710BD07B5827C42B102AA43
:400D4000002102F8011D026001224260FFF7C0FF03B05DF804FB30B543686BB3C2685AB3827C072A0CD8046890F91050611C01602178013B41EA05210832018243608274B0
:400D8000827C018AA2F108042141CBB2090608D5C3F3801363F07F03023A03F08103827402E08474002BD7D08268511C81601370C368013BC360CFE730BD00002DE9F0419E
:400DC00072B6884B61221A70A3F5F06301221A801924854A9C7092E803008033062283F8002283E80300522203F580731A707F4B7F4A1B787F4EDBB2137040F618027E4BC3
:400E000000251A8041F2512223F8022C33784FF4F07003F0010343EA450502F0B9F8013C05F003052ED0032DF0D1744B4FF480721A8007221A70724A00254821157091706B
:400E400002221D705D7103F8032C0422DA716D4A6D4C13786D4E43F00103137012F8013C062743F0030302F8013C2378012243F0800323705B4B1A70654A137843F020033D
:400E8000137000E0FEE707FB056300219A881868013502F0E5F8072DF5D15E485E4E002550F8041F05F1105303F1560221F0FF075733C9B20B4452005B0002329A4206D039
:400EC00012F802EC12F801CC0EF807C0F5E7B0420D44E5D1514A002313609360136193614F4B504F1A68504BDFF888811A604F4B1A684F4B1A604F4A137843F00203137036
:400F0000137C43F0020313742378A2F5863243F040032370413A137843F010031370464A464B07CA03C31A80454A2833106843F8250C127903F8212C424A07CA03C31A80F1
:400F4000414AE83B07CA03C31A80404A083307CA03C31A803E4A3F4BA2F5616203CBC2F8100EC2F8141E1378042043F008031370394B02F5AA521B783D78DBB298F80060F2
:400F8000EDB203F007010C321B091170F6B2537045F003033B7046F0030388F800302F4B48221A702E4A402313702E49937013729372082382F81F3220220A7048710A72C0
:400FC000294A0A20137001F0DDFB284B88F8006044223D70264D1A7094E80F0007C52B80BDE8F08100480040F01000480F010049A14600402542004022420040044000406E
:4010000006400040A2430040A04300400B3A0000E8460040FCFFFF47A800004800760040F8100048F846004020760040FC1000482876004003500140B0100048C051004085
:40104000BC100048C4100048D0100048DC10004832510040E8100048CF0100491D51004001590040235B0040585B004076580040B0430040F946004008B501F0C5FF036832
:401080000C2B00D1FEE7FEE7084908B50B68084A1844821A802A01DC086005E001F0B4FF0C2303604FF0FF33184608BDCC80FF1F5887FF1F80B51148114B0025C0B1A3F17A
:4010C000100192C922460439161BB74204D051F8046F42F8046BF7E7114653F8046C8C1AA64202D041F8045BF9E701381033E5E701F090FFFFF776F9FEE700BF01000000E2
:40110000DC3B0000124A134B10B51A60124A134C1368134843F4007313600023032B98BF54F823204FEA830188BF0E4A0133302B4250F3D10C4B1A780C4B1A700C4B084A06
:401140001A60FFF73BFEBDE8104001F0EDB900BF0004FA050CED00E014ED00E0000000000080FF1F79100000BC760040C080FF1F08ED00E0F8B501F013FF4B4A01271378FA
:40118000022643F001031370137C484C43F001031374474B02F5E3521F700B3203F8946C1378054603F07F031370002001F0EAFA2378404A03F0F90323701378384603F081
:4011C000DF03137023783B43237001F0DBFA282001F0D8FA384B30461A7802F07F021A701A7802F0BF021A7023783343237001F0C9FA2378314A43F00403237000231370D5
:4012000053702F4AFF2199540133092BFBD1284601F0CAFE0721172001F0FCFA2949172001F0EAFA0721182001F0F4FA2649182001F0E2FA0721152001F0ECFA23491520BE
:4012400001F0DAFA0721052001F0E4FA2049052001F0D2FA0721062001F0DCFA1D49062001F0CAFA0721084601F0D4FA1A49072001F0C2FA0721082001F0CCFA17490820F1
:4012800001F0BAFA0021162001F0C4FA1449162001F0B2FA07210C2001F0BCFABDE8F84010490C2001F0A8BAA5430040944300409D60004012600040F851004084600040C8
:4012C0007D86FF1F431B00007D190000411B0000751A0000A11A0000D11A0000091B0000491B0000BD1B0000214B224A10B5187000231370204A40201370204A0F241370B0
:401300001F4A13701F4A13701F4A13701F4A13701F4B4FF400021A604FF080721A604FF400121A6020221A601860802018604FF480701860174804704FF480001860164BF4
:401340001A70933B19B91A7802F0FE0202E01A7842F001021A70114B03221A70802203F8202C012001F014FE0D4B04221A7010BD9886FF1F9E86FF1F9C86FF1F9D86FF1FA0
:401380009986FF1F8886FF1F9B86FF1F1087FF1F00E100E09E6000409C600040286000401260004070B5074C054623780E461BB9FFF7E0FE0123237031462846BDE87040D0
:4013C000FFF792BF4886FF1F0A4A002313700A4A13700A4A13700A4A13700A4A13700A4A13700A4A13700A4B03221A70802203F8202C70479E86FF1F9C86FF1F9D86FF1F4F
:401400009986FF1F8886FF1F9B86FF1F1087FF1F28600040014B1878704700BF9D86FF1F044B1A7802F0FF001AB118780022C0B21A7070479C86FF1F024A0C2303FB002019
:4014400040787047A486FF1F431E072B0CD8074A064B00010344805C5B7800F00F0043EA0020023880B2704700207047FC5F00401A4A38B50C2303FB00231B79090C13F077
:40148000800F00F1FF35044619BF8AB24FF480438BB24FF48042032D18D8DFE805F002070C110021084601F01BF80DE00021084600F0FAFF08E00021084600F0D9FF03E016
:4014C0000021084600F0B8FF054B1855EDB2072D03D801F0EDF8034B185538BDA486FF1F7486FF1F7D86FF1F431E072B2DE9F0470446894615465CD82F4F0C2202FB0072C1
:40150000D388DFF8B8A09BB2C3F500739D424FF00C0303FB007388BFD588DB7884BFC5F50075ADB2254A43EA15230601B354B244EBB28AF80130224B1A5C9846FF2A01D15F
:40154000FFF796FF0C2303FB047200215170B9F1000F28D03DB31B4F385D01F011F811232946FE2218F8040001F0D6F806F5C04278321FFA89F118F8040001F0DFF8124DB6
:4015800018F80410385D01F04BF80121385D00F0E1FF735D43F002037355735D03F0FD037355BDE8F08703FB04746379DBB28AF80230BDE8F08700BFA486FF1FFC5F0040EF
:4015C0007D86FF1F7486FF1F706000402DE9F047044615468846002940D0431E072B3FD8FFF732FFA84203D22046FFF72DFF05461D4E335DFF2B03D141462046FFF738FF33
:40160000DFF868A027011AF8040000F0B9FF1223FE222946305D01F07FF807F5C0411FFA88F27831305D01F089F8DFF84490315D1AF8040000F0F4FF01211AF8040000F09A
:4016400089FF17F8093043F0020307F8093017F8093003F0FD0307F8093002E00D4600E000252846BDE8F0877D86FF1F7486FF1F70600040431E072B0AD8064A0C2303FBB8
:40168000002300225A705A79034BD2B200011A54704700BFA486FF1FFE5F0040431E072B9FBF024B000108221A547047FE5F004030B51A4A1A491B4D0878138803449BB2BE
:4016C0001380194A00231488D8B2A4B27CB1082B0CD050680078C0B2E85450680133013050601088013880B21080ECE718460B780E4C082B0E4A00D040B10E4D2B7883F010
:4017000080032B700F232370022301E0022323701370094B1870087030BD00BF1487FF1F1087FF1F006000408C86FF1F8986FF1F9E86FF1F9A86FF1F1187FF1F074B02226E
:401740001A70074B80221A70064B0F221A70064A00231370054A0120137070479E86FF1F9A86FF1F8986FF1F1087FF1F1187FF1F30B5164B16491B780A8803F00F03023B91
:40178000DBB21A4492B20A80124C134A0020118889B279B173B15568215C013BC9B229705168DBB20131516011880130013989B21180ECE7094A1370094A137883F0800373
:4017C0001370084B0B221A7030BD00BF296000401487FF1F006000408C86FF1F1187FF1F9A86FF1F8986FF1F064A06231370064A01201370054B80221A70054B00221A70D5
:40180000704700BF9E86FF1F8986FF1F9A86FF1F1187FF1F054B9A683AB19A68044910709A680988518000229A6070478C86FF1F1487FF1F08B5124B1A78D2B21A701B7856
:40184000DBB21A0602D50F4A137008BD0220FFF7E1FF0D4B1B7803F06003202B05D0402B06D043B900F012FC04E001F0A1FB01E000F046FD10B9034B03221A7008BD00BFE0
:40188000286000408986FF1F0060004008B5084A084B0120197813880B449BB21380064B00221A70FFF7B6FF044B03221A7008BD1487FF1F1087FF1F9E86FF1F8986FF1F6D
:4018C00008B50C4B1B78DBB2042B07D0062B09D0022B0DD1BDE80840FFF7D8BFBDE80840FFF746BF0320FFF795FF034B03221A7008BD00BF9E86FF1F8986FF1F08B5054B8D
:40190000002201201A70FFF785FF034B03221A7008BD00BF9E86FF1F8986FF1F08B50A4B1A7832B11A78094942F080020A7000221A70074B002201201A70FFF76BFF054B5C
:4019400003221A7008BD00BF8886FF1F086000409E86FF1F8986FF1F074B1B78DBB2042B05D0062B05D0022B05D1FFF7A1BEFFF7C5BFFFF7D3BF70479E86FF1F38B51D4CCC
:401980002378DBB2DD0634D518060AD503F00F03012B2ED1FFF74EFF174B1B78190609D538BD5A0602D5FFF7D7FF03E09D0620D5FFF786FF23781B061BD4104B1A78104BD0
:4019C0001B7813430F4A13701278934211D10A4A0849154613782078DBB2000605D41378DBB20B700B7803F00F0328788342F1D138BD38BD286000408986FF1F9A86FF1FF3
:401A00001187FF1F29600040054A00231380054A916819B191680B7092685380704700BF1487FF1F8C86FF1F0E4808B503889BB213B9FFF783FE13E00B4B02221A700B4BF5
:401A400000221A70FFF7E0FF094AD1799379028843EA012392B2934238BF0380FFF728FE012008BD8C86FF1F9E86FF1F9A86FF1F00600040084B01221A700F3B9B7C074BC9
:401A80001A7B02F00302012A1EBFDA7B82F08002DA7301225A7370470B600040A486FF1F094B02221A700F3B93F82230074B1A7E02F00302012A1EBFDA7E82F08002DA76B4
:401AC00001225A76704700BF0B600040A486FF1F0B4B04221A700F3B93F83230094B93F8242002F00302012A1EBF93F8272082F0800283F82720012283F82520704700BF4A
:401B00000B600040A486FF1F0B4B08221A700F3B93F84230094B93F8302002F00302012A1EBF93F8332082F0800283F83320012283F83120704700BF0B600040A486FF1F3B
:401B40007047FFF741BC0000F0B5184B184E19780C27C9B201234FF0000C31B3CA0720D5144A4FEA031E7244947850782040C5070DD507FB03652C79240608D5147804F00F
:401B8000FE0414706D790C4CEDB204F80E50840706D507FB036425792D0658BF84F801C090700133DBB24908D7E7F0BD9F600040A486FF1F70600040FE5F004000F0ACBC6B
:401BC00070B50446184B88B003AA03F11006154618685968083303C5B3422A46F7D11B782B70FCB12223237001AD03232846637000F08AFE002220461146AB5C08AC04EB8F
:401C0000131414F8144C03F00F03847008AC234413F8143C0132082AC1700371417100F10400EAD108B070BD353A00002DE9F0431C4D01222E460C201F274FF0800E4FF01B
:401C4000080C194B00FB02581401234418705F70164998F805902144B9F1000F07D098F8044024064CBF887081F802C001E081F802E000FB0261CC880132E4B29C71CC88F7
:401C8000092AC4F30724DC71CC88E4B21C71C988C1F307215971D4D1054BFF221A70BDE8F08300BFA486FF1F70600040FC5F00400A600040064B074A1B7802EBC30253689E
:401CC0001A7C824286BF03EBC0035869002070479886FF1F983A00002DE9F84F424B1A78002A7ED01878414D0138C0B2FFF7E2FFA8463F4AC3681478007ADFF800C1E4B284
:401D000003EBC0000C2600274FF0010E834268D01A78A24263D11CF80420597891425ED19A7893F8039002F07F0206FB02FA05EB0A01CF7093F802B009F0030981F804B053
:401D400093F803B005F80AB0B3F804A0A1F808A093F902A0BAF1000F0BDAB9F1010F0CBF4FF007094FF00D0981F8059081F801E009E0B9F1010F0CBF4FF005094FF0090974
:401D800081F805904F704FEA02191A4906FB0282494481F802E0B2F808A0CAF3072A81F800A0B2F808A05FFA8AFA81F801A0B2F806A011495FFA8AFA494481F806A0B2F8B3
:401DC0000690C9F3072981F80790B2F806905FFA89F981F80490D288C2F307224A71083394E7BDE8F88F00BF9D86FF1FA486FF1F9986FF1FFC5F0040706000408A86FF1FF6
:401E000008B5064B18780138C0B2FFF753FF20B143681B7900EBC300406908BD9D86FF1F00212DE9F84F0B464E4E0C2707FB01F401313219092933554FF000059370494CFC
:401E4000D3701381937253705371EFD118B1464B1D70464B1D70464B1A78002A7FD0187801250138C0B2FFF725FFA8464368DFF8F8E0DB790C2713F0400F3E4B4FF0000C2E
:401E80001A7814BF42F0010202F0FE021A70027AD20007FB0541C36803EB02094B4531D093F802A00AF07F06AE4229D10E89B3F804B0B6B25E4538BFA1F808B01E7893F8C1
:401EC00001B01EF80660B3451AD181F804A0DE780E7093F902A0DE78BAF1000F06F0030607DA012E0CBF07260D264E7181F8018006E0012E0CBF052609264E7181F801C07D
:401F00000833CBE70135092DC3D1C1680A328B1C0A440C200833934209D013F8081C13F80A5C01F07F0100FB01418D72F2E7FFF767FF114B0121186000230C2000FB014240
:401F4000D3801289013113449BB203F00102134409299BB2F2D1BDE8F84FFFF767BEBDE8F88F00BFA486FF1F8A86FF1F1287FF1F9D86FF1F9B86FF1FA086FF1F114B1B793B
:401F800003F07F035A1E072A19D80F490C2202FB031291781B0141F0010191700021D170517841F002015170127912F0800F074A1A4414BF8D2389239370FFF715BC00201D
:401FC000704700BF00600040A486FF1FFC5F004030B4194B1A7902F07F02531E072B27D8164B0C2404FB02339978154D01F0FE0199700021D97029461201505D114400F0E9
:402000007F0050555A7802F0FD025A701A795B78120605D5012B01D18C7006E00D2303E0012B0CBF082309238B7030BCFFF7DCBB002030BC704700BF00600040A486FF1F78
:40204000FC5F004010B50D4B0D4C21791878C9B20138C0B2FFF72EFE43681B798B4201D2012909D8074A0848535CDBB24354A3780120DBB2535410BD002010BD9D86FF1F14
:40208000006000408A86FF1F1287FF1F38B58A4A8A4C13780021DBB221801806517840F18D800A2900F20581DFE811F05D00030103010301030103010B0003017E00030190
:4020C0008200D3787C49012B09D17D4B1A787D4B03EBC2035B685B686360122310E0CB78022B12D18878FFF7E5FD002800F0E180436863606368DA7863689B7843EA0223A6
:402100002380BDE83840FFF78FBCCB78032B26D16D4B00228878D5B2854209D3664A91786A4AEE2908BF1346634A917881B106E0187801320028F1D018780344EAE76449BF
:402140009278097C914203D16248FFF739FD614B1A78002A00F0AD801A78228018E0BDE8384000F025BF13F0030313D0022B40F0A0802380504B0C211B7903F07F02564B34
:4021800001FB02339A78554BD2B21A7000225A706360B6E702222280514A11784F4AC9B2117053706260ACE7012323804D4BEFE70123238013794C4A1344E9E701390A2999
:4021C00077D8DFE801F037764F76067676760A7620009378454ADBB25AE0937803F0FF0153B9404B1A7891425FD01970404B01201870FFF715FE58E0481EC0B2FFF75AFDB1
:402200000028EED155E0FFF71DFF002851D02A4A384913791279DBB2D2B20A70364A3249D25CCB5C9A4240D0314B01221A70FFF753FD3AE003F00303012B2BD009D3022BA2
:4022400037D11D4B9B78002B33D1BDE83840FFF7BFBE194B9B78012B2BD1214A137803F0FD0315E003F00303012B13D008D3022B1FD1114B9B78E3B9BDE83840FFF77EBE45
:402280000D4B9B78012B14D1154A137843F0020313700AE0084B1A795AB998781B791749DBB2CA5C22EA0002CA54BDE83840FFF79BBA002038BD00BF006000408C86FF1F2B
:4022C0009886FF1F983A0000FC3A0000843A00006F3B00003087FF1FA486FF1F4986FF1F9B86FF1F9D86FF1F8A86FF1F8886FF1F9C86FF1F9986FF1F1287FF1F9F86FF1FD7
:40230000074B1A78120609D55B78012B06D1054B054A5A6012781A80FFF786BB00207047006000408C86FF1F5C3A0000014B1870704700BF77650040014B1878704700BF44
:4023400068650040014B1870704700BF7A650040064A0123136002F688321268E0211064034A1170A2F540721360704780E100E000E400E0014B1870704700BF79650040B1
:40238000014B1870704700BF7565004073B515461E460B4C05230022019200920A4601461846237000F064F932462946207800F01FF90221207800F009F9207802B070BD8C
:4023C000D080FF1F064A0423136002F688321268E0219064034A1170A2F202321360704780E100E002E400E0014B04221A60704700E100E0014B04221A60704780E100E055
:40240000014B1870704700BF7B650040704738B505460078012428B100F062FD285D0134E4B2F8E738BD08B50D2000F059FDBDE808400A2000F054BDF7B516461F460B4C4E
:4024400000230325019300930A4601462846257000F00EF93A463146207800F0C9F80221207800F0B3F8207803B0F0BDE080FF1FF7B516461F460B4C002302250193009318
:402480000A4601462846257000F0F2F83A463146207800F0ADF82946207800F097F8207803B0F0BDE180FF1FF7B516461F460B4C00230125019300930A46014628462570B9
:4024C00000F0D6F83A463146207800F091F80221207800F07BF8207803B0F0BDE280FF1F73B515461E460B4C0023019300930A4601461846237000F0BBF83246294620784E
:4025000000F076F80221207800F060F8207802B070BD00BFE380FF1F024B1878C0F38010704700BF8F450040074A7F23802113705170064A013BDBB202F80839002BF9D1B8
:40254000034A1370704700BFE480FF1FF87B00400078004017280FD8084B0001C25C11B142F0200201E002F0DF02C254C25C42F00102C254002070470120704710700040D8
:4025800017280BD8064B0001C25C02F0FE02C254C25C02F0DF02C25400207047012070471070004017280DD8074900010B4603441A7942F004021A71435C43F0010343543B
:4025C00000207047012070471070004017280BD8064A0001835C490003F0F10301F00E011943815400207047012070471070004041F6FF73994208BF4FF400519A4208BFC8
:402600004FF4005217289FBFC00000F1804000F5EC4081809ABFC280002001207047000017289FBF034B00011954002088BF0120704700BF1970004017289FBF054B000134
:402640001A5C01F007019DBF1143195400200120704700BF1470004017289FBF034B0001185C00F0070088BFFF20704714700040172810B51AD8C00001F07F0100F180443F
:4026800041EAC21204F5EC44D2B222709DF8082003F00F0343EA0213DBB263709DF80C30002003F00F03A370E07010BD012010BD10B500F075FC0A4A5378182B0AD914786D
:4026C000013B5370E30003F1804303F5F0431B78137000E0FF2400F067FC204610BD00BFE480FF1F030610B5044611D400F058FC084AE300117803F1804303F5F0431970CC
:402700005378147001335370BDE8104000F04CBC10BD00BFE480FF1F30B504060CD411F4704509D1C40004F1804404F5F0442180A270E370284630BD012030BD03065FBFB5
:40274000C00000F1804000F5F04081805ABFC280002001207047000038B50446084DB4F5004F05D9286800F013FCA4F50044F6E7034B58686043BDE8384000F009BC00BF82
:40278000EC80FF1F024B1B7A584300F001BC00BFEC80FF1F0E4B00F003001A78490102F0FC02104318701A7801F0600142F080021A701A7802F07F021A701A7802F09F0253
:4027C0000A431A701A7842F010021A70704700BF83430040014B01221A70704784430040044B00F00F021B6853F8220043F82210704700BF08ED00E0054A00F01F0012689F
:4028000000F1100352F8230042F82310704700BF08ED00E000F01F0000F16040490100F56440C9B2017070470F4B10B50F4900240F205C609C60DC601C615C61FFF7D0FF8C
:402840000B4A136843F0040313600A4B4FF47A72DB68B3FBF2F3084A1360084B4FF400421C60C3F8E82010BD4C86FF1FD528000010E000E0EC80FF1F14E000E018E000E0E5
:40288000024A136843F002031360704710E000E008B5FFF7F5FF034A136843F00103136008BD00BF10E000E010B5054CA3691BB9FFF7BAFF0123A361BDE81040FFF7E8BF53
:4028C0004C86FF1F024B1868C0F30040704700BF10E000E038B5FFF7F5FF012808D1054D002455F8243003B198470134052CF8D138BD00BF5086FF1F024B03EB800358680A
:40290000596070474C86FF1F134B144A1B78DBB20360127843EA0223114A0360127843EA0243104A0360127843EA026303600E4B0E4A1B78DBB24360127843EA02230C4A80
:402940004360127843EA02430A4A4360127843EA02634360704700BF0301004904010049EC460040020100490101004900010049050100490601004910B500F011FB204AD4
:40298000044613780A2043F002031370137C43F00203137412F80A3C43F0010302F80A3C937943F00103937102F5AB52137843F003031370134B18221A7013F8012C42F03A
:4029C000400203F8012C13F8012C02F0FC0203F8012CCE2203F8062CA3F597530222183B1A70094A137843F008031370FFF7CAFE064B10222046BDE810401A6000F0D4BA4A
:402A0000AB4300400E5900402F5B004080E200E008B500F0C5FA0F4A137803F0FE031370A2F5AA521D3A137803F0FD031370137C03F0FD03137412F80A3C03F0FE0302F8BC
:402A40000A3C937903F0FE039371BDE8084000F0ABBA00BF08590040044A137803F03F0343EA8010C0B21070704700BF08590040082804D00A280CBF8223C22300E04223C6
:402A800008380E4AC0B20428137098BF0C4B4FF0000298BF33F910100A4B88BF11461A8042F210734B4341F2883103F6C41393FBF1F305490B60054B1A8070470A590040CE
:402AC000463A00001A87FF1F1C87FF1F2087FF1F08B5102000F0A6F907210420FFF79AFE07490420FFF788FE064A0C20137843F006031370FFF7BCFF034B00221A8008BD85
:402B0000C92B0000095900401887FF1F10B5054C23781BB9FFF7DCFF01232370BDE81040FFF72ABF6886FF1F044B1A7802F0FB021A701A7842F001021A7070470859004052
:402B400010B5084B1C7814F0010403D10028F9D0002404E02046FFF715FE024B1B78204610BD00BF09590040034A044B1B881088181A00B2704700BF2087FF1FA25B0040BD
:402B80000E4A13881BB223B111880A2309B2594301E00B4B19680B4B1B88C01A42F2107300B203FB00F2022391FBF3F30028D8BF5B42134493FBF1F000B270471A87FF1F9F
:402BC0001C87FF1F1887FF1F7047000010B500F0E7F9214A044613780A2043F001031370137C43F00103137412F80A3C43F0020302F80A3C937943F00203937102F5AA5297
:402C00001832137843F003031370144B18221A7013F8012C42F0400203F8012C13F8012C02F0FC0203F8012CCE2203F8062CA3F597530222123B1A70094A137843F0080306
:402C40001370FFF79FFD074B08222046BDE810401A6000F0A9B900BFAB43004006590040275B004080E200E008B500F099F90F4A137803F0FE031370A2F5AA52153A137805
:402C800003F0FE031370137C03F0FE03137412F80A3C03F0FD0302F80A3C937903F0FD039371BDE8084000F07FB900BF00590040044A137803F03F0343EA8010C0B21070E3
:402CC000704700BF00590040082804D00A280CBF8223C22300E0422308380E4AC0B20428137098BF0C4B4FF0000298BF33F910100A4B88BF11461A8042F210734B4341F2A5
:402D0000883103F6C41393FBF1F305490B60054B1A80704702590040503A00002687FF1F2C87FF1F2487FF1F08B5102000F084F807210320FFF76EFD07490320FFF75CFDED
:402D4000064A0C20137843F006031370FFF7BCFF034B00221A8008BD212E0000015900402887FF1F10B5054C23781BB9FFF7DCFF01232370BDE81040FFF728BF6986FF1F6B
:402D8000044B1A7802F0FB021A701A7842F001021A7070470059004010B5084B1C7814F0010403D10028F9D0002404E02046FFF7E9FC024B1B78204610BD00BF01590040E9
:402DC000034A044B1B881088181A00B2704700BF2487FF1FA05B00400E4A13881BB223B111880A2309B2594301E00B4B19680B4B1B88C01A42F2107300B203FB00F20223E4
:402E000091FBF3F30028D8BF5B42134493FBF1F000B270472687FF1F2C87FF1F2887FF1F70470000034A00F0F800137803431370704700BF02410040034A00F0F800137833
:402E400003431370704700BF06410040014B1870704700BF79640040014B1870704700BF7665004073B515461E460B4C04230022019200920A46014618462370FFF7F8FBA3
:402E8000324629462078FFF7B3FB02212078FFF79DFB207802B070BDFC80FF1F074A0223136002F688321268E0215064044A11706FF440710A441360704700BF80E100E070
:402EC00001E400E0014B1870704700BF72640040014B1870704700BF7064004000000000FEB5494652465B460EB40746244909688A46244A12682448022100F071F8030044
:402F000020480068C018204900F06AF8143883460121C9430C460125002600F041F8814651460B7823400B705846013000F030F83800F04028400B78234003430B70584669
:402F400000F026F80136072EF2D9002001300138013001200B78234003430B705846043000F016F8484600F01FF800BF00BF00BF0EBC894692469B46FEBD00BFAFF30080F9
:402F8000D480FF1FF880FF1F00C20100000000000230800803D000BF01380046FCD17047EFF3108072B6704780F31088704700BF094A137803F00303012B0AD0022B09D141
:402FC00013790C2103F07F02044B01FB02339B7A00E013790020704700600040A486FF1F002902D0B0FBF1F0704708B14FF0FF3000F008B80029F8D00246B0FBF1F000FB0F
:4030000011217047704700BF014B1868704700BF6081FF1F0E4B70B51E460E4C0025E41AA410A54204D056F8253098470135F8E700F0BAFD084B094C1E46E41AA410002501
:40304000A54204D056F8253098470135F8E770BDB43B0000B43B0000B43B0000BC3B000003460244934202D003F8011BFAE7704730B5141E05469BB0184604DA8B232B6006
:403080004FF0FF301DE04FF40273ADF80C300CBF234604F1FF33029305934FF6FF7300910491ADF80E3002461E9B6946284600F073F8431CBCBF8B232B6014B1009B0022B6
:4030C0001A701BB030BD000007B5009313460A46014603480068FFF7CBFF03B05DF804FB6081FF1F2DE9F0478E6882469E420C46914698463ED88A8912F4906F3AD025681F
:40310000096902236F1A656905EB450595FBF3F57B1C43449D4238BF1D4653050FD5294600F04AFB064698B13A46216900F0D2FAA38923F4906343F08003A38113E02A46EA
:4031400000F098FB064670B92169504600F0E8FA0C23CAF80030A3894FF0FF3043F04003A381BDE8F08726613E44266046466561ED1BA560464528BF464649463246206879
:4031800000F0B3FAA36800209B1BA36023681E442660BDE8F08700002DE9F04F9DB003938B8980461C060D4616460DD50B695BB9402100F001FB2860286118B90C23C8F894
:4031C0000030CDE040236B610023099320238DF82930DFF89CB130238DF82A3037463C4614F8013B1BB9B7EB060910D003E0252BF9D02746F3E74B46324629464046FFF7AA
:4032000071FF013000F0A780099B4B4409933B78002B00F0A08000234FF0FF3204930793059206938DF853301A930126052221784E4800F041FA671C049B38B14B4A3C46A6
:40324000801A06FA00F018430490EFE7D90644BF20228DF853201A0744BF2B228DF8532022782A2A03D0079A00210A200BE0039A111D12680391002A10DA524243F002002C
:40328000079204900BE027463B780134303B092B03D800FB02320121F5E701B107923B782E2B1ED17B782A2B0AD1039B02371A1D1B680392002BB8BF4FF0FF33059310E0D0
:4032C000002319460593781C0A2407463A780130303A092A03D804FB01210123F5E703B1059103223978224800F0E6F940B14023CBEB000003FA00F0049B01371843049013
:40330000397806221B487E1C8DF8281000F0D4F988B1194B33B9039B073323F007030833039314E003AB00932A46144B04A94046AFF3008007E003AB00932A460F4B04A9F6
:40334000404600F093F8B0F1FF3F824603D0099B5344099342E7AB895B0601D4099801E04FF0FF301DB0BDE8F08F00BF833B0000893B00008D3B000000000000E530000069
:403380002DE9F04791461F460A698B6806469342B8BF1346C9F8003091F843200C46DDF8208012B10133C9F800302368990642BFD9F800300233C9F80030256815F00605B2
:4033C00010D104F1190A07E00123524639463046C04701301AD00135E368D9F800209B1A9D42F1DB94F843302268003318BF012392060FD5E118302081F843005A1C94F80E
:4034000045102244023382F8431003E04FF0FF30BDE8F08704F1430239463046C0470130F4D02268D9F80050E36802F00602042A08BF5D1B2269A3680CBF25EAE5750025EB
:403440009342C4BF9B1AED184FF000091A344D4509D00123224639463046C0470130D5D009F10109F3E70020BDE8F0872DE9F04317460A7E85B06E2A984606460C460C9BA3
:4034800001F1430E00F0AE8011D8632A22D009D8002A00F0BB80582A40F0CA8081F84520834955E0642A1ED0692A1CD0C0E0732A00F0B08009D86F2A2ED0702A40F0B88060
:4034C0000A6842F020020A603EE0752A24D0782A3AD0ADE01A6801F14205111D1960136884F84230A8E021681A6811F0800F02D0111D196008E011F0400F02F104011960A2
:4035000002D0B2F9003000E01368002B3CDA2D225B4284F8432037E021681A6811F0800F02D0111D196007E011F0400F02F10401196001D0138800E01368227E5C496F2AFF
:4035400014BF0A2208221BE078225A4984F845202268186812F0800F00F104051D6003D1550601D5038800E00368D00744BF42F0200222601BB9226822F020022260102226
:40358000002084F8430001E049490A226568002DA56008DB206820F0040020602BB9002D7DD175460CE0002B79D07546B3FBF2F002FB1033CB5C05F8013D03460028F5D1F1
:4035C000082A0BD12368DA0708D5236962689A42DEBF302305F8013C05F1FF35C5EB0E0323612EE008681A6810F0800F496903D0101D1860136808E010F0400F02F1040047
:403600001860136801D0198000E0196000232361754616E01A68111D1960156800216268284600F049F808B1401B6060636804E004F1420584F8422001232361002384F868
:403640004330CDF800803B4603AA21463046FFF797FE013002D14FF0FF3026E023692A4639463046C0470130F5D023689B0710D5002504F1190907E001234A4639463046B8
:40368000C0470130E7D00135E368039A9B1A9D42F2DBE068039B9842B8BF184605E00B7804F1420584F842308AE705B0BDE8F083353A0000943B000010B5C9B202449042A1
:4036C000034605D01C7801308C42F8D1184610BD002010BD10B5431E0A44914204D011F8014B03F8014FF8E710BD884210B501EB020301D8421E0BE09842FBD28118D21A01
:40370000D34204D013F8014D01F8014DF8E710BD994204D011F8014B02F8014FF8E710BD38B50546002944D051F8043C0C1F002BB8BFE41800F0D4F81E4A1368114613B9D1
:403740006360146030E0A3420DD92268A018834201BF18685B681218226063600C6023E0A24203D813465A68002AF9D118681918A1420BD12168014458188242196013D1B2
:4037800010685268014419605A600DE002D90C232B6009E021686018824201BF106852680918216062605C602846BDE8384000F098B838BD7086FF1F70B5CD1C25F003051E
:4037C00008350C2D38BF0C25002D064601DBA94202D90C23336046E000F082F8234B1C681A462146A1B10B685B1B0ED40B2B03D90B60CC18CD501EE08C420BBF63684B6856
:403800001360636018BF0C4615E00C464968E9E7174C23681BB9304600F052F820602946304600F04DF8431C18D0C41C24F00304A0420DD12560304600F053F804F10B001D
:40384000231D20F00700C31A0ED05A42E25070BD211A304600F034F80130EBD10C233360304600F03EF8002070BD00BF7086FF1F6C86FF1FF8B5074615460E4621B9114619
:40388000BDE8F840FFF798BF1AB9FFF749FF2846F8BD00F027F885420ED929463846FFF78BFF044650B131462A46FFF713FF31463846FFF735FF01E03046F8BD2046F8BD00
:4038C00038B5064C0023054608462360FDF7DCFB431C02D1236803B12B6038BD5487FF1F7047704751F8040C0028BEBF091851F8043CC018043870470000000005020902A2
:403900000B020D020F02110213027265706C792030782530327800686F6D696E6700626567696E6E696E67207365656B2066726F6D20256420746F2025640066696E697302
:40394000686564207365656B0057616974696E6720666F72205553422E2E2E0055534220726561647900636F6D6D616E642030782530327800756E64657272756E20616661
:40398000746572202564207061636B65747300636F756E743D256420693D256420643D256400636D645F777269746500703D25642063723D25642063773D256420663D2529
:4039C0006420773D256420696E6465783D256420756E64657272756E3D25640077726974652066696E69736865640073746172742065726173696E670073746F7020657226
:403A00006173696E670069646C650000510040100040510040300000000140001000140140000800400140000A004C0140000200500140200030313233343536373839416D
:403A40004243444546000001000000040000001000010000000400000010000028000000000104000100000000000000000157494E555342000030303030310000000000D0
:403A80000000000012034D005300460054003100300030000100000001000000A03A0000010000006F3B0000000000000000000001000000B83A000001000000413B00002F
:403AC00004000000DA3A0000000000000000000000000000D83A0000FF00000001024000FF00000082024000FF00000003034000FF00000084034000FF0002030403090474
:403B0000160346006C007500780045006E00670069006E0065002A0343006F0077006C00610072006B00200054006500630068006E006F006C006F00670069006500730073
:403B40000009022E0001010080320904000004FF00000107050102400000070582024000000705030340000A0705840340000A12010002FF0001080912006E0100020180C5
:403B8000014300232D302B2000686C4C00656667454647003031323334353637383961626364656600000000F8B500BFF8BC08BC9E4670475900000005110000F8B500BF16
:403BC000F8BC08BC9E46704735000000E03B0000C880FF1FA0000000F005000000000000000000005887FF1FFF000000675000400C00000007000000FFFFFFFF7F80000066
:403C00003F0000000000007D00FA0000400000000090D003FF0000000000000000000000000000000000000000000000000000000000000000000000813B00000000000070
:403C400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000081FF1F00000000A5
:403C80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004
:403CC00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C4
:403D00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083
@@ -4098,74 +4098,74 @@
:40FF80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041
:40FFC0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
:0200000480007A
:400000000145004008520040015B00400164004001650040410001403E0101404102014054030140470401404C0501404A0601404E0701404A08014051090140430A01409A
:40004000500B0140520C0140560D0140500E01403A0F0140461401404C1501404A1601405C170140521801405F1901403D1A0140561B01400D4001400E4101400D4201408A
:400080000C430140074401400C450140074601400F4701400A4801400D490140164C0140044D014008500140045101407E0208420901100211821901600C610A7C40272171
:4000C0003F01290A0006010302010310050C06010703080509030A020B1C0E010F20110F12011601174019801A011E011F0F2201230A260127052A012C032D402E04300152
:4001000033C03406353F3B203E115608580459045B045C905D905F0183018AA08C709402980E9B029C40A205A502A650AA0AB0C0B20CB303B403B630D608D80BD904DB0470
:40014000DC99DD90DF010180020803600440070409220A110E2A10891104134016A01720188019101C401E2A1F1021382304272028022A042B402F10300131083220334088
:400180003720388039283A013F0158405B105D4061806220668067017D0280C0823084028A108C108D448F40C0CFC2EFC47FCA4BCC2FCE8FD61CD81CDE80E040E205E40512
:4001C000E622023F043F0A3F0E3F103F16021A101E042001243F2A202E08363F3E4058045B045F01817F820484088701880189018A088B288D318E108F029001953196024A
:40020000974E98289D409E019F3DA008A201A501A601A714A809AC01B007B10FB218B372B420B620BA0ABE10C206C70EC810C9FFCAFFCBFFCF83D804D904DA04DB04DC9961
:40024000DD09DF010040010803880492050408100AA20E840F1110011120130A151016801788188019441A901B2D1F8020802104220C23402A0432043340382039043A0193
:400280003B4049105008588859216004628263206D40812082048408854889048A808D018E108F289020950C9740989099109E259F44A080A104A203A501A608A888A98090
:4002C000AD02AE01B050B180B202B304B508B730C0FFC2FFC4FFCA02CC0ACE0FD204D60FD80FE241E408E601EA1FEE0100C0010D0440050D090D0A070C180D010E010F185B
:400300001002110412181312150D162018181B071F0D2218230D2404250D26102804290D2A082C1F2D0D32803303343F351C36403E403F14580459045C095F0181018501E5
:40034000870289018F019006920993019409950196069B019D01A101A501A901AD01AE03AF02B002B103B204B408B601B8AABE55BF01D804D904DB04DF0100810128080616
:400380000A080C0A1080110812051540180219A81A021B101D411E201F10202022102440288029042B062C012D112E0430013288332036A1370A388039243B023E403F191C
:4003C0006C0A800281018340840489408B4090809140920894529510962697119A049C019EA19FCEA0C0A104A30CA511A640A710A80CAA01AF01B040B104C00FC23EC48F76
:40040000CAFFCCFFCEFFE004E288E681EA04EC08EE0400100101040805010601080209010C020F011002130214021704180319011A041C1C1D011E032202240225012802B9
:4004400029012C022F01341F3507370739A03E10580459045C905F0180488210837F86498710893F8A028C408D018E308F40900193089401953F98489A209B029C499D3F71
:40048000A204A320A449A73FAA01AB3FAE01AF04B038B407B540B640B73FBA20BF50D804D904DC09DF010061010804820528080509400B040C200D8A0F081020120113125A
:4004C00014881584184919201B201E0822202302240425D026C0284429682D102E44311032813308340135503604380239083A813B103C043D013E803F10811882108512C5
:40050000881289049082940195359644979399809C819EA09F8CA010A210A30CA511A6E8A722AA01AF10B201B410B504B601C0FFC2FFC4FFCA7FCCFFCEFFE081E208E60EAE
:40054000EA0401020501062009020A180F02101F1103140215021618181819021A011E072004210222102502281829022C042E082F033503363F3F10580459045C095F01DA
:400580008201831385138604884089038A068E028F02905691039221931096019708987F99039C069F04A007A103A208A406A678A701A806AB03AC11AD03AE26B10FB31078
:4005C000B47FB50FBE10BF04D608D804D904DB04DC90DD90DF010004010102010308050407040A850B200E420F24111212321404158016801A081E0221052220251028111D
:400600002B882C022F64302231013204334034013719380139403A143C083D813E1059405C085D0462C0800181028202884089418C208D40918092C09324952096209824F0
:4006400099279A869B049C81A004A101A208A310A408A510A683AA40B005B310B661C06FC2FFC4DFCAFFCCEFCEFFD608D808E080E228E60AE820EA10000104080519080106
:400680000B090E1010011504160219011A081C012208262029122A042C013007330334383518370438203F4056085804590B5B045C995D905F0182018301860187018904CD
:4006C0008A018B038D038E018F04900193019601970198019B019C019F01A101A201A304A601A701AA01AB01AE01AF02B201B507B601BE44BF10D804D904DB04DF010166A1
:400700000486078808410A240C800E400F641120122213021601171519031A841B101C211D041E201F40200221242208262029202CA02EA02F0130083120379539283C045F
:400740003D813F3058805D045F0463016D406E407A80831087C0908691819306940196409751986499209A269B1F9D04A0A0A141A380A410A520A691A710A980AB04AC20E9
:40078000B084B140B304C0FFC2FFC4FFCAF4CCF6CEF6D608D808DE01E004E408ECA00318051806200701081809020B180C040D040E100F10101F110413081402161817070A
:4007C00018181A011B201C041E08211822182A072C402D1F323F333F36403E40580459045B045C995F0181228220853386188A078B028D028F20901F912893509418958288
:400800009705981899109A019B089C409D019F80A004A122A208A344A733A802A913AA18AB20AC04AE10B170B23FB307B580B640B708BB0ABE40BF50D804D904DB04DC9924
:40084000DF01001103100514060108040A400B050D400F6412011312140815401701181019401B041F84200C21582241230225042608280429102B502C802E4031283281A0
:400880003618370239A03A013B063C803D013F244FC05940640867086D4081408201844088048B048D058E049082910193029680974499A09A229B1D9C049D04A060A410BC
:4008C000A680A710A810AB14ACA0B120B401B680C0EEC2FFC4DBCA97CCEFCEFFD608E010E2A0E410E640E820EAD0EC10EE400328053807010A200B070D3F100412081418FD
:40090000174018181A011C041D041E101F30213422072308250226182738280229082A182B102C1F337F363F580459045C995F0181608205850B87F0880D89188BC38D0210
:400940008F04981099029B059C019E10A101A80AA9F1AB0AAF02B010B180B307B403B540B60CB738B980BB08BE01BF50C024C9FFCAFFCBFFD004D601D80BD904DA04DB0429
:40098000DC99DD09DF01E080E240E440E56400200510068008040A800B060C100E0A106011101340160819801C801D111E421F512010252126042702280429012B102C04B8
:4009C0002F4131043240341038123B443D123F6445204702584059806C416D016F1474A0762077097E808040822A87108E40C052C2CFC44FCAB7CC2ACEFFD0A0DE80E08003
:400A0000E660003F013F063F073F083F0B200D010E3F10011308160217021A101B101C3F1D3F2208233F26042704293F2A202E3F2F3F333F363F3E403F04580459045F0101
:400A4000810582028406852C86018702880689108E018F05900391139208932095059606980799059C019D0F9E069F10A105A201A401A505A60CA806A905AC06AD08AF0286
:400A8000B13FB40FBE10BF01D804D904DF01018102200308040805860604084409400A040B500C410F28111012011309142A15011B401F202204260129822A082B0C2D11AD
:400AC0002E4430443201331034453510380839103B413C043F6189408C088D048E208F05900491119246935196089702982399929A0D9B189C089F04A140A318A601A760CD
:400B0000A880A966AA05AB10AC10AE80B040B111C0FFC2FFC4FFCAFFCCFFCEFFE402E640E80FEC04EE01000604060A060D020E04110112061602180619021C0120012406CE
:400B4000250228062C06300132063302340137013A223B0C3E043F40580459045B045C995F01800181808580860289A98D808E01915695809601990C9A049B409D3D9E010B
:400B80009FC0A001A180A401A580AB03AC01AD30B007B1FFBA02BF01C001C50CC60EC805C9FFCAFFCBFFD004D601D804D904DA04DB04DC09DD09DF01E2C00182022004800A
:400BC00005290A280B010C240E8210011290140A1502161019021B021C041D031E201F102101258C2608281029822A102B082F203001310832903610370138883B223F80B0
:400C00004001442045044B045340681069596A466B906F01701071507288735979807B02822083028421858087108A208C108D018F01908992209599964697979816998874
:400C40009CC99D509EA09F8CA140A2C0A308A50BA608A702B120B210C0FDC2F7C4FDCA4FCCAFCE1FD008E00CE202E422E601EA80EE0802100301050409080D0F100411080B
:400C800015081A081B0F1C011D031F0C21082203270229082C082F083004310F3201341836023E053F015608580459045B045C095D905F018027842788278B018C208E0CA7
:400CC000903792C09501962798209A029C209E01A0F3A208A427A837A902AA40AC10AE87B2F0B40FB503BE14C034C620C808C9FFCAFFCBFFCD20CEF0D110D608D804D90455
:400D0000DA04DB04DC90DD99DF01E108E240E340E480E640E7400004011002010384058006800701082009080A820C020D200E021226130216421A201B101CA01D281E0268
:400D40001F082110274029202C212F4430403248344035013620370839203C083E5140404104501059405F80628064026A406B036C0278047A2082018310854086048709E0
:400D800089208B808C028D018E108F109108928293209404953196359788982899209A469E019F59A004A101A22AA468A540A7A8A880B010B104B201C01FC2DFC49FCAF44B
:400DC000CCF2CEF4D003D618D818E210E472E688E820EE09000E0270060409020A0E0E02102E124116011A011C7F1D01200F2210240E2A082C212E4E307F310235013E01EF
:400E00003F11580459045B045F018108820885048603880389018E048F089003930F95089603980399089C039D0FA003A108A602A702A908AA01AD03AF0CB60FB70FBF40A7
:400E4000D608D804D904DB04DC09DD90DF0100040201038805020604072108410A800B280C210D080E021024110212021428170219021E031F802040221027012C212E10D7
:400E80002F403280344035803601371838203C283D8158805A205C105F40652066806701680A80108740888089208B208C028E408F8190249101929093A894409601982C55
:400EC00099809A059B1A9E80A034A149A282A308A408A780A824AB2CAC01AD41B344B410C0FFC2FFC47FCAF0CCF8CEF4D63CD830E250E420E651E880EC801A401F083210ED
:400F0000330837123A106A406B108A108E04C630CCF0CE10300431803440350839013D8085408E109620A604B702CCF0CE60E2405280570889018A80928095019C449D08FB
:400F4000A580A604AA40D460EE80844485808A1092809C449D08A580A604AF08E210E650EE4014407B028A06C404DC01E001E6045602620296449A02A70AB040B640B708E3
:400F8000D604D802EA09EE021B08830286809644A602A70AC6080A010B200E200F02861187108A0296449840A280A602B040C20FE404E801238026148B8092809902A6145F
:400FC000AD08B102C8E0EE101A025A807220750286018E2092809902C640D480DC80DE20E44004100A800E400F021E045280548058405D0485048701941096449840A280E3
:40100000A810AF01C001C20DC601D407D60182409280B480EC02010109010B010D010F0111011B011D0100FF01AB020211050000BF0000A09F001F000000000000000000E5
:40104000100000004000000000000000C0000000FF0000B8470047000001000080000002820082000000000000010100010000002700180127001801000400000005000008
:401080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030
:4010C00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F0
:400000000145004008520040015B00400164004001650040450001403A01014048020140530301404504014057050140500601404E070140460801405B0901404C0A014076
:400040005F0B0140570C0140550D0140460E01403C0F0140441401405B1501404716014054170140541801405C190140461A0140601B01400E4001400E410140094201406E
:400080000C430140054401400445014007460140114701400A48014010490140174C0140084D014008500140045101407E02080209441080180219016013611A7C40272152
:4000C0003C01290A0207030507400804090F0A100F0A141815031601171019401A201C041D0C1E081F032018232024022618270F281F29032B1C2D802E18303F33C0353FA3
:400100003B20580459045B045C995F0180208108840188108C0190109302950A96019704980C9A029B019C08A101A202A40AA604AA10AB04AD0CAE04AF02B430B50FB60F0E
:40014000D608D80BD904DB04DC99DD90DF01012204080550064009940B010D020E240F021098120217A519021D701F80210422282320261028102A422B182E902F803088C8
:4001800031103610370538A039083B013F025E406640680269206A106B017F40821083808502864289808B01C0FAC2F7C4FFCABFCCEECE8FD610D810DE80E009E206E408D2
:4001C000E60401080401050C07020A0112021401150A17041A011B011C01210F26012A042B042C012F0232073407350F3A285804590B5B045C995F0180068318860287203B
:4002000088068A018B078C068D048F08911F920694079540980699029B189C039D189E08A140A201A401A504A60CA710A918AA01AB01AC01AD40AE06B00FB140B33FB54083
:40024000BB33BE01D608D804D904DB04DC90DD90DF0100100110028103200414080D09400B090C040F851101120A13081548172019011C041E081F0820A0231824082520DD
:4002800029092B062C022D082E102F9030A031063610370439803A063B103E043F02598063026F057F4080408202868487018F0C9120921094889644978099809D209E80F6
:4002C0009F04A002A210A380A488A590A711A810A906AE02B120B220B308B608C06FC2FFC4EFCABFCC6FCECFD608D808DE80E002E201E606EA05EE0802020408050A0705B7
:40030000080309020A0C0E010F02120814081502170419011A0F1B081C08200824082703280429012B022C0F2D03320F350737083B203E043F40580459045C905F018210A4
:400340008308862087208A3F8B028D018E089001913F9602973F9A049B109C3F9F04A03FA33FA53FA63FAA3FAB3FAC3FAD3FB23FB33FBE04BF04D608D804D904DB04DD9016
:40038000DF01000801100291055106100A040B590E030F541181120813041551170819081D04200621C02720281429802B102C402D402E082F08300831203540360937109D
:4003C000380439803B203C083D013F5049104A085F80668082408380848488018A048D908E049120932095D99640978C99229B0D9C099D049E059F20A042A120A204A309CE
:40040000A408A5D2A68AA772A820A902AC80AF01B050B120B310B704C0FFC2FFC4FFCAFECCF6CEFED610D810E24DEA09EC08EE0401010407050109010A070C060D010E01E6
:400440000F02120113011407150119011A021C041F01200721012405250126022A082B012D012F02300F3303340F3A223F04580459045C095F0182C984098540880989C0D4
:400480008A808C098D048F0890FC920293079408951F964398C999029B189CCD9D189E10A0C9A318A4C9A720A8CDA904AA30AB10AC04AD18AEE1AF01B0C0B13FB23CB34013
:4004C000B403B580BE15BF04D804D904DC90DF0100810328051407010A650B020C020D100E200F02115812821440172418201B121D101F11200421042209272029A22A04C0
:400500002D112E082F013098320135043752381439803C083E403F117C087F108002838086108A1A8E0891A09204955996039755981099A29A849B059C499D419E099F10E7
:40054000A0CBA204A309A404A540A68AA762AB10AC08AD0AAF40B201C0EFC2FFC47FCAFFCCFFCEFEE60AEA0FEC08EE01000701080501060809010A420C070D011101121082
:400580001501162118C61A211B011C071F0420A522422302248425012B012C072D0130E03108321F34E0370739803E013F015608580459045B045C995D905F0180028218D2
:4005C000830586078A208D08901892019504961898049A109C1F9D02A004A208A418B104B23FB301B502B708BF51D608D804D904DB04DC99DD90DF01010803440502060402
:400600000712081009400A400B100D080E020F84128013081420168219081A101E201F25208621032207244027032D802E042F483244340835603702380139803D183F41BF
:4006400048044A0858405C80600362406701698080048502872088018A018B018C808E018F84901A912C92409334948095419633978A983199419A849B0C9C029E519F4169
:40068000A148A280A454A624A780AB40AD40AE40AF01B302C0FEC2FFC4BCCAF0CCFACEF9D618D818E004E4C0E622E820EA05000201030402050308020B080D030E0210020D
:4006C000130314021503180819031A011C101F03201C22032302240326042701280229032C022F04310F330F350F361F3E40580459045C905F0180F282048301840A860528
:40070000870188138AE08B018D018ED390139101922095019A129B019F01A001A208A301A412A680A701A812AA40AB01AF01B0F0B207B408B501BA08BE10BF10D804D904F6
:40074000DB04DC09DF0100800120021003A004820504070808010A210B080E44104411401220132014101518164019401C401D051E44201021102202232024082704288493
:400780002B212C822E2430403211330835113748382039023B883DA63F10444047016C016D806F02840485018708880889108AA28B088D018F059020910C932494C0957116
:4007C0009636970898A199309AA49B089C4A9D019E019F46A082A119A414A540A624A702A840AB80AC20AF08B005B340B440C0FFC25FC47FCAFFCCFFCEFFE080E245E67024
:40080000EA60ECA000040203060108010A040C030E0411011202130E150E16011701190C1A011D031E011F08220126012A012E0134073508370739803E103F50402149FFC2
:400840004AFF4BFF50045601580459045A045B045D095F0160806240644065648101820183088406853187C2887F8D0A8E018F0592049406972298569A219C409D809E0606
:400880009F33A011A133A226A340A407A608A806AA78AB10ADF2AE02AF04B108B27FB308B5F0B707BB80BE04BF05D804D904DC90DF010028010102010448074808010A2285
:4008C0000B080C880E040F4010401140122013101504160A170118201F10200421442206234825A0280829012B0232043340350136103748380639A03B103D023E0245A070
:400900006C066D266F817488751076288110820287048C808D208E8090029488951C961497409A049C0E9D019E0A9F4FA108A210A488A540A604A801A921AF20B080B101A6
:40094000B340B620C0FFC2FFC4FFCA0DCCFACE0BD030E010E410E602E820ECC00002023803070504071009040A400B080D020E070F181034111F12081404163017201838E7
:400980001A011C3F1F18211822282301240826102918367F373F580459045C995F0180058102820A8601880B8A048B018C0C8E03920196019A019E01A103A201A601AA0119
:4009C000AE01B202B401B60CB703BE50C201C60EC804C9FFCAFFCBFFCF83D804D90BDA04DB04DC99DD09DF0101800344048805110708080809600A020B400C880D010E0490
:400A00001040130814401504160A170119801D801E201F202301240329112F40308032013304388039183B013E21458057405D805E185F026484650867017C0282048340AD
:400A40008408850886018908C0FBC2FFC4FCCA85CC0BCEAFD010D6F0D8F0DE80E420E684013F0208063F07020A3F0B100C3F0D01103F13081602173F1A101B201D3F1E3FE1
:400A8000203F233F253F26042A202B3F2C012F04323F373F3E043F404003450E47C0482149FF4AFF4BFF50045601580459045A045B045D095F0162C082028A048E0190010F
:400AC00095019601970298019C01AA01AC01AD02AF01B102B407B501B922BA20BF11D804D904DB04DC09DF010101020A032004200542084009080A880D840E48100813455F
:400B00001510160118201D101E081F2021402488284829442C0231803259370439203A093B404010411043104A2051016203681C69016A2A6B126D806E406F027001714CBB
:400B40007208735580418302840485408A818B068D198E208F10901091189408958396409755984899029B049D419E089F12A002A180A20AA414A540A680A722A914AA01A0
:400B8000B109B340B404B604C0DFC2FFC4CFCA1FCC4FCE0FD002E214E40FEA05EE020102050209020E030F06100211021201150117041902200421022401250226022B0300
:400BC0002D033104320434023503360138A03E543F11580459045B045F018037814883208430860C87018A628B018C378F04901391019248954896119710983799019C374E
:400C00009D409F30A037A349A637A702A837A949AD49AE37B00FB340B507B670B738BB20BE41D804D904DB04DC90DF010080028003280701080809800A640B020C0210600B
:400C4000112012021680170419021B401D181F802010211022542404274028412A102B102D112E082F023254330236083712398A3B103C083F51640167026B016C026F040C
:400C80008110881089108C04911892049302941095019660975598409A909D419E099F52A060A20EA318A404A544A680A7E0A821A904AC41AD10B001B110B310B410C08F69
:400CC000C21FC43FCAFFCCEFCEFFE080E210E404EA03EE290008030106020A080C080F021101120F1403160C18081C0F1F0120012408270428082C04300F310739023E0196
:400D0000580459045B045C905F0182028303848F850386108A088B088D108E0192049304940E9503982E9AC19B019C7F9D03A021A103A2CEA601A702A80EA903AA70AE0E87
:400D4000AF03B10FB27FB30FB480B510BE14BF10C026C602C804C9FFCAFFCBFFCD20CEF0D110D804D904DA04DB04DC90DD09DF01E108E240E340E480E640E7400010022159
:400D8000038005AE08010A210B080D020E271090124A130314081502162518241F022008210A22082480274028202A422B042F1030203184330235013740382039823B08AE
:400DC0003D803F024004480451405C406A807A087B04886089018A108D518F10905A912E93289480955196A497C0980199019A019B0A9C489DA09E109F40A040A1C0A2329F
:400E0000A301A410A504A60DA74CA902AB02AD02AE12B180B220B301B710C0FFC2FFC4FFCA4FCC9FCE9FD004D204D610E080E4A4E8A0EC40013D03C0050C074009800D80F7
:400E400011801580180219801C021F0321302580280129A92D563202340135FF3A083E103F105608580459045B045C095D905F01803E8113832085058640883089058C0426
:400E80008D108E30900191059408952C9620970299059A0E9C089D089E109F02A10FA310A630A705A830A905AA02AD05B001B47EB73FBE01BF40D804D904DB04DC09DF0169
:400EC000048A070809600C020D040E080F0210081504171019181A201B041E081F0121202540282029802A012B042C802D202E802F20302131883410350A374039603B09B6
:400F00003C803E2758805E805F20600268086A406C0278027A4082408368841085128740881089A88A058B408C808D448EA48F80908A912C93099550962597C298219A019D
:400F40009B389C109D1A9E26A0E0A188A301A410A504A604A788A908AA08AB01B1A0B320B420B740C0F0C2F3C462CAFFCCFFCEFFD638D808E060E280E4F0E860ECE4EE029E
:400F80001B011F0831103308350836803B4081088340C630CCF0CE10E220E6203010320137143A083F80860197409D10A340AE80AF01CCF0CE60E640518057208D109740C9
:400FC0009C109D109E089F14D46082408320841097409C109E08A580A720AB14E220E660EAA0150880408904C404E6015D0284809440D60118408140824094409C809D02DB
:40100000C60808800B200F818201871089028C109580964097019C809D02A740AB41C20FE001E20826808A808D80924097409A109E08A580B210C82056105A4079807F02B2
:40104000814083028E0892409A109E08AF40D4C0DC80DE20E2A0EE40041008020D400E401F10538056805820620181028E808F809410958096409A01C001C20DC601D4077D
:40108000D802E002E40875028C0298029902A820AF10DE04E208010109010B010D010F0111011B011D0100FF01AB020211050000BF0000A09F001F00000000000000000097
:4010C000100000004000000000000000C0000000FF0000B8470047000001000080000000800080000000000000030300030000002700180127001801000400000005000088
:4011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000AF
:40114000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006F
:40118000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002F
@@ -4615,12 +4615,12 @@
:0200000490105A
:04000000BC90ACAF55
:0200000490303A
:020000006F2D62
:02000000C51623
:0200000490402A
:4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C0
:400040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080
:400080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040
:4000C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
:0200000490501A
:0C00000000012E16106900002E317F96C2
:0C00000000012E16106900002E31D57F83
:00000001FF

View File

@@ -2555,20 +2555,20 @@
<CyGuid_ebc4f06d-207f-49c2-a540-72acf4adabc0 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtFolderSerialize" version="3">
<CyGuid_2f73275c-45bf-46ba-b3b1-00a2fe0c8dd8 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtBaseContainerSerialize" version="1">
<CyGuid_31768f72-0253-412b-af77-e7dba74d1330 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtItemSerialize" version="2" name="CLOCK8" persistent="">
<Hidden v="False" />
<Hidden v="True" />
</CyGuid_31768f72-0253-412b-af77-e7dba74d1330>
<CyGuid_0820c2e7-528d-4137-9a08-97257b946089 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtItemListSerialize" version="2">
<dependencies>
<CyGuid_8b8ab257-35d3-4473-b57b-36315200b38b type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtFileSerialize" version="3" xml_contents_version="1">
<CyGuid_31768f72-0253-412b-af77-e7dba74d1330 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtItemSerialize" version="2" name="CLOCK8.c" persistent="Generated_Source\PSoC5\CLOCK8.c">
<Hidden v="False" />
<Hidden v="True" />
</CyGuid_31768f72-0253-412b-af77-e7dba74d1330>
<build_action v="SOURCE_C;CortexM3;;;" />
<PropertyDeltas />
</CyGuid_8b8ab257-35d3-4473-b57b-36315200b38b>
<CyGuid_8b8ab257-35d3-4473-b57b-36315200b38b type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtFileSerialize" version="3" xml_contents_version="1">
<CyGuid_31768f72-0253-412b-af77-e7dba74d1330 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtItemSerialize" version="2" name="CLOCK8.h" persistent="Generated_Source\PSoC5\CLOCK8.h">
<Hidden v="False" />
<Hidden v="True" />
</CyGuid_31768f72-0253-412b-af77-e7dba74d1330>
<build_action v="HEADER;;;;" />
<PropertyDeltas />
@@ -2614,20 +2614,20 @@
<CyGuid_ebc4f06d-207f-49c2-a540-72acf4adabc0 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtFolderSerialize" version="3">
<CyGuid_2f73275c-45bf-46ba-b3b1-00a2fe0c8dd8 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtBaseContainerSerialize" version="1">
<CyGuid_31768f72-0253-412b-af77-e7dba74d1330 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtItemSerialize" version="2" name="RPM300" persistent="">
<Hidden v="False" />
<Hidden v="True" />
</CyGuid_31768f72-0253-412b-af77-e7dba74d1330>
<CyGuid_0820c2e7-528d-4137-9a08-97257b946089 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtItemListSerialize" version="2">
<dependencies>
<CyGuid_8b8ab257-35d3-4473-b57b-36315200b38b type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtFileSerialize" version="3" xml_contents_version="1">
<CyGuid_31768f72-0253-412b-af77-e7dba74d1330 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtItemSerialize" version="2" name="RPM300.c" persistent="Generated_Source\PSoC5\RPM300.c">
<Hidden v="False" />
<Hidden v="True" />
</CyGuid_31768f72-0253-412b-af77-e7dba74d1330>
<build_action v="SOURCE_C;CortexM3;;;" />
<PropertyDeltas />
</CyGuid_8b8ab257-35d3-4473-b57b-36315200b38b>
<CyGuid_8b8ab257-35d3-4473-b57b-36315200b38b type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtFileSerialize" version="3" xml_contents_version="1">
<CyGuid_31768f72-0253-412b-af77-e7dba74d1330 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtItemSerialize" version="2" name="RPM300.h" persistent="Generated_Source\PSoC5\RPM300.h">
<Hidden v="False" />
<Hidden v="True" />
</CyGuid_31768f72-0253-412b-af77-e7dba74d1330>
<build_action v="HEADER;;;;" />
<PropertyDeltas />
@@ -2640,20 +2640,20 @@
<CyGuid_ebc4f06d-207f-49c2-a540-72acf4adabc0 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtFolderSerialize" version="3">
<CyGuid_2f73275c-45bf-46ba-b3b1-00a2fe0c8dd8 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtBaseContainerSerialize" version="1">
<CyGuid_31768f72-0253-412b-af77-e7dba74d1330 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtItemSerialize" version="2" name="RPM360" persistent="">
<Hidden v="False" />
<Hidden v="True" />
</CyGuid_31768f72-0253-412b-af77-e7dba74d1330>
<CyGuid_0820c2e7-528d-4137-9a08-97257b946089 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtItemListSerialize" version="2">
<dependencies>
<CyGuid_8b8ab257-35d3-4473-b57b-36315200b38b type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtFileSerialize" version="3" xml_contents_version="1">
<CyGuid_31768f72-0253-412b-af77-e7dba74d1330 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtItemSerialize" version="2" name="RPM360.c" persistent="Generated_Source\PSoC5\RPM360.c">
<Hidden v="False" />
<Hidden v="True" />
</CyGuid_31768f72-0253-412b-af77-e7dba74d1330>
<build_action v="SOURCE_C;CortexM3;;;" />
<PropertyDeltas />
</CyGuid_8b8ab257-35d3-4473-b57b-36315200b38b>
<CyGuid_8b8ab257-35d3-4473-b57b-36315200b38b type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtFileSerialize" version="3" xml_contents_version="1">
<CyGuid_31768f72-0253-412b-af77-e7dba74d1330 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtItemSerialize" version="2" name="RPM360.h" persistent="Generated_Source\PSoC5\RPM360.h">
<Hidden v="False" />
<Hidden v="True" />
</CyGuid_31768f72-0253-412b-af77-e7dba74d1330>
<build_action v="HEADER;;;;" />
<PropertyDeltas />
@@ -2696,6 +2696,72 @@
</CyGuid_2f73275c-45bf-46ba-b3b1-00a2fe0c8dd8>
<filters />
</CyGuid_ebc4f06d-207f-49c2-a540-72acf4adabc0>
<CyGuid_ebc4f06d-207f-49c2-a540-72acf4adabc0 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtFolderSerialize" version="3">
<CyGuid_2f73275c-45bf-46ba-b3b1-00a2fe0c8dd8 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtBaseContainerSerialize" version="1">
<CyGuid_31768f72-0253-412b-af77-e7dba74d1330 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtItemSerialize" version="2" name="INDEX_REG" persistent="">
<Hidden v="False" />
</CyGuid_31768f72-0253-412b-af77-e7dba74d1330>
<CyGuid_0820c2e7-528d-4137-9a08-97257b946089 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtItemListSerialize" version="2">
<dependencies>
<CyGuid_8b8ab257-35d3-4473-b57b-36315200b38b type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtFileSerialize" version="3" xml_contents_version="1">
<CyGuid_31768f72-0253-412b-af77-e7dba74d1330 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtItemSerialize" version="2" name="INDEX_REG.h" persistent="Generated_Source\PSoC5\INDEX_REG.h">
<Hidden v="False" />
</CyGuid_31768f72-0253-412b-af77-e7dba74d1330>
<build_action v="HEADER;;;;" />
<PropertyDeltas />
</CyGuid_8b8ab257-35d3-4473-b57b-36315200b38b>
<CyGuid_8b8ab257-35d3-4473-b57b-36315200b38b type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtFileSerialize" version="3" xml_contents_version="1">
<CyGuid_31768f72-0253-412b-af77-e7dba74d1330 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtItemSerialize" version="2" name="INDEX_REG.c" persistent="Generated_Source\PSoC5\INDEX_REG.c">
<Hidden v="False" />
</CyGuid_31768f72-0253-412b-af77-e7dba74d1330>
<build_action v="SOURCE_C;CortexM3;;;" />
<PropertyDeltas />
</CyGuid_8b8ab257-35d3-4473-b57b-36315200b38b>
<CyGuid_8b8ab257-35d3-4473-b57b-36315200b38b type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtFileSerialize" version="3" xml_contents_version="1">
<CyGuid_31768f72-0253-412b-af77-e7dba74d1330 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtItemSerialize" version="2" name="INDEX_REG_PM.c" persistent="Generated_Source\PSoC5\INDEX_REG_PM.c">
<Hidden v="False" />
</CyGuid_31768f72-0253-412b-af77-e7dba74d1330>
<build_action v="SOURCE_C;CortexM3;;;" />
<PropertyDeltas />
</CyGuid_8b8ab257-35d3-4473-b57b-36315200b38b>
</dependencies>
</CyGuid_0820c2e7-528d-4137-9a08-97257b946089>
</CyGuid_2f73275c-45bf-46ba-b3b1-00a2fe0c8dd8>
<filters />
</CyGuid_ebc4f06d-207f-49c2-a540-72acf4adabc0>
<CyGuid_ebc4f06d-207f-49c2-a540-72acf4adabc0 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtFolderSerialize" version="3">
<CyGuid_2f73275c-45bf-46ba-b3b1-00a2fe0c8dd8 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtBaseContainerSerialize" version="1">
<CyGuid_31768f72-0253-412b-af77-e7dba74d1330 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtItemSerialize" version="2" name="FAKE_INDEX_GENERATOR_REG" persistent="">
<Hidden v="False" />
</CyGuid_31768f72-0253-412b-af77-e7dba74d1330>
<CyGuid_0820c2e7-528d-4137-9a08-97257b946089 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtItemListSerialize" version="2">
<dependencies>
<CyGuid_8b8ab257-35d3-4473-b57b-36315200b38b type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtFileSerialize" version="3" xml_contents_version="1">
<CyGuid_31768f72-0253-412b-af77-e7dba74d1330 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtItemSerialize" version="2" name="FAKE_INDEX_GENERATOR_REG.h" persistent="Generated_Source\PSoC5\FAKE_INDEX_GENERATOR_REG.h">
<Hidden v="False" />
</CyGuid_31768f72-0253-412b-af77-e7dba74d1330>
<build_action v="HEADER;;;;" />
<PropertyDeltas />
</CyGuid_8b8ab257-35d3-4473-b57b-36315200b38b>
<CyGuid_8b8ab257-35d3-4473-b57b-36315200b38b type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtFileSerialize" version="3" xml_contents_version="1">
<CyGuid_31768f72-0253-412b-af77-e7dba74d1330 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtItemSerialize" version="2" name="FAKE_INDEX_GENERATOR_REG.c" persistent="Generated_Source\PSoC5\FAKE_INDEX_GENERATOR_REG.c">
<Hidden v="False" />
</CyGuid_31768f72-0253-412b-af77-e7dba74d1330>
<build_action v="SOURCE_C;CortexM3;;;" />
<PropertyDeltas />
</CyGuid_8b8ab257-35d3-4473-b57b-36315200b38b>
<CyGuid_8b8ab257-35d3-4473-b57b-36315200b38b type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtFileSerialize" version="3" xml_contents_version="1">
<CyGuid_31768f72-0253-412b-af77-e7dba74d1330 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtItemSerialize" version="2" name="FAKE_INDEX_GENERATOR_REG_PM.c" persistent="Generated_Source\PSoC5\FAKE_INDEX_GENERATOR_REG_PM.c">
<Hidden v="False" />
</CyGuid_31768f72-0253-412b-af77-e7dba74d1330>
<build_action v="SOURCE_C;CortexM3;;;" />
<PropertyDeltas />
</CyGuid_8b8ab257-35d3-4473-b57b-36315200b38b>
</dependencies>
</CyGuid_0820c2e7-528d-4137-9a08-97257b946089>
</CyGuid_2f73275c-45bf-46ba-b3b1-00a2fe0c8dd8>
<filters />
</CyGuid_ebc4f06d-207f-49c2-a540-72acf4adabc0>
</dependencies>
</CyGuid_0820c2e7-528d-4137-9a08-97257b946089>
</CyGuid_2f73275c-45bf-46ba-b3b1-00a2fe0c8dd8>

View File

Binary file not shown.

View File

@@ -17,14 +17,14 @@
#define STEP_TOWARDS0 1
#define STEP_AWAYFROM0 0
static volatile uint32_t clock = 0;
static volatile uint32_t clock = 0; /* ms */
static volatile bool index_irq = false;
static bool motor_on = false;
static uint32_t motor_on_time = 0;
static bool homed = false;
static int current_track = 0;
static uint8_t current_drive_flags = 0;
static struct set_drive_frame current_drive_flags;
#define BUFFER_COUNT 16
#define BUFFER_SIZE 64
@@ -45,6 +45,21 @@ static void system_timer_cb(void)
{
CyGlobalIntDisable;
clock++;
static int counter300rpm = 0;
counter300rpm++;
if (counter300rpm == 200)
counter300rpm = 0;
static int counter360rpm = 0;
counter360rpm++;
if (counter360rpm == 167)
counter360rpm = 0;
FAKE_INDEX_GENERATOR_REG_Write(
((counter300rpm == 0) ? 1 : 0)
| ((counter360rpm == 0) ? 2 : 0));
CyGlobalIntEnable;
}
@@ -85,21 +100,22 @@ static void print(const char* msg, ...)
UART_PutCRLF();
}
static void set_drive_flags(uint8_t flags)
static void set_drive_flags(struct set_drive_frame* flags)
{
if (current_drive_flags != flags)
if (current_drive_flags.drive != flags->drive)
homed = false;
current_drive_flags = flags;
DRIVESELECT_REG_Write((flags & 1) ? 2 : 1); /* select drive 1 or 0 */
DENSITY_REG_Write(flags >> 1); /* density bit */
current_drive_flags = *flags;
DRIVESELECT_REG_Write(flags->drive ? 2 : 1); /* select drive 1 or 0 */
DENSITY_REG_Write(flags->high_density); /* density bit */
INDEX_REG_Write(flags->index_mode);
}
static void start_motor(void)
{
if (!motor_on)
{
set_drive_flags(current_drive_flags);
set_drive_flags(&current_drive_flags);
MOTOR_REG_Write(1);
CyDelay(1000);
homed = false;
@@ -236,17 +252,29 @@ static void cmd_measure_speed(struct any_frame* f)
{
start_motor();
index_irq = false;
while (!index_irq)
;
index_irq = false;
int start_clock = clock;
int elapsed = 0;
while (!index_irq)
;
int end_clock = clock;
{
elapsed = clock - start_clock;
if (elapsed > 1000)
{
elapsed = 0;
break;
}
}
if (elapsed != 0)
{
index_irq = false;
start_clock = clock;
while (!index_irq)
elapsed = clock - start_clock;
}
DECLARE_REPLY_FRAME(struct speed_frame, F_FRAME_MEASURE_SPEED_REPLY);
r.period_ms = end_clock - start_clock;
r.period_ms = elapsed;
send_reply((struct any_frame*) &r);
}
@@ -479,6 +507,8 @@ static void cmd_write(struct write_frame* f)
int old_reading_from_td = -1;
for (;;)
{
CyWdtClear();
/* Read data from USB into the buffers. */
if (NEXT_BUFFER(dma_writing_to_td) != dma_reading_from_td)
@@ -635,7 +665,7 @@ static void cmd_erase(struct erase_frame* f)
static void cmd_set_drive(struct set_drive_frame* f)
{
set_drive_flags(f->drive_flags);
set_drive_flags(f);
DECLARE_REPLY_FRAME(struct any_frame, F_FRAME_SET_DRIVE_REPLY);
send_reply((struct any_frame*) &r);
@@ -824,7 +854,7 @@ int main(void)
if (USBFS_GetEPState(FLUXENGINE_CMD_OUT_EP_NUM) == USBFS_OUT_BUFFER_FULL)
{
set_drive_flags(current_drive_flags);
set_drive_flags(&current_drive_flags);
handle_command();
USBFS_EnableOutEP(FLUXENGINE_CMD_OUT_EP_NUM);
print("idle");

101
arch/amiga/amiga.cc Normal file
View File

@@ -0,0 +1,101 @@
#include "globals.h"
#include "record.h"
#include "decoders/decoders.h"
#include "amiga.h"
#include "bytes.h"
#include "fmt/format.h"
uint32_t amigaChecksum(const Bytes& bytes)
{
ByteReader br(bytes);
uint32_t checksum = 0;
assert((bytes.size() & 3) == 0);
while (!br.eof())
checksum ^= br.read_be32();
return checksum & 0x55555555;
}
static uint8_t everyother(uint16_t x)
{
/* aabb ccdd eeff gghh */
x &= 0x6666; /* 0ab0 0cd0 0ef0 0gh0 */
x >>= 1; /* 00ab 00cd 00ef 00gh */
x |= x << 2; /* abab cdcd efef ghgh */
x &= 0x3c3c; /* 00ab cd00 00ef gh00 */
x >>= 2; /* 0000 abcd 0000 efgh */
x |= x >> 4; /* 0000 abcd abcd efgh */
return x;
}
Bytes amigaInterleave(const Bytes& input)
{
Bytes output;
ByteWriter bw(output);
/* Write all odd bits. (Numbering starts at 0...) */
{
ByteReader br(input);
while (!br.eof())
{
uint16_t x = br.read_be16();
x &= 0xaaaa; /* a0b0 c0d0 e0f0 g0h0 */
x |= x >> 1; /* aabb ccdd eeff gghh */
x = everyother(x); /* 0000 0000 abcd efgh */
bw.write_8(x);
}
}
/* Write all even bits. */
{
ByteReader br(input);
while (!br.eof())
{
uint16_t x = br.read_be16();
x &= 0x5555; /* 0a0b 0c0d 0e0f 0g0h */
x |= x << 1; /* aabb ccdd eeff gghh */
x = everyother(x); /* 0000 0000 abcd efgh */
bw.write_8(x);
}
}
return output;
}
Bytes amigaDeinterleave(const uint8_t*& input, size_t len)
{
assert(!(len & 1));
const uint8_t* odds = &input[0];
const uint8_t* evens = &input[len/2];
Bytes output;
ByteWriter bw(output);
for (size_t i=0; i<len/2; i++)
{
uint8_t o = *odds++;
uint8_t e = *evens++;
/* This is the 'Interleave bits with 64-bit multiply' technique from
* http://graphics.stanford.edu/~seander/bithacks.html#InterleaveBMN
*/
uint16_t result =
(((e * 0x0101010101010101ULL & 0x8040201008040201ULL)
* 0x0102040810204081ULL >> 49) & 0x5555) |
(((o * 0x0101010101010101ULL & 0x8040201008040201ULL)
* 0x0102040810204081ULL >> 48) & 0xAAAA);
bw.write_be16(result);
}
input += len;
return output;
}
Bytes amigaDeinterleave(const Bytes& input)
{
const uint8_t* ptr = input.cbegin();
return amigaDeinterleave(ptr, input.size());
}

View File

@@ -1,12 +1,17 @@
#ifndef AMIGA_H
#define AMIGA_H
#include "encoders/encoders.h"
#define AMIGA_SECTOR_RECORD 0xaaaa44894489LL
#define AMIGA_TRACKS_PER_DISK 80
#define AMIGA_SECTORS_PER_TRACK 11
#define AMIGA_RECORD_SIZE 0x21f
class Sector;
class Fluxmap;
class SectorSet;
class AmigaDecoder : public AbstractDecoder
{
@@ -17,4 +22,20 @@ public:
void decodeSectorRecord();
};
class AmigaEncoder : public AbstractEncoder
{
public:
virtual ~AmigaEncoder() {}
public:
std::unique_ptr<Fluxmap> encode(int physicalTrack, int physicalSide, const SectorSet& allSectors);
};
extern FlagGroup amigaEncoderFlags;
extern uint32_t amigaChecksum(const Bytes& bytes);
extern Bytes amigaInterleave(const Bytes& input);
extern Bytes amigaDeinterleave(const uint8_t*& input, size_t len);
extern Bytes amigaDeinterleave(const Bytes& input);
#endif

View File

@@ -21,47 +21,6 @@
static const FluxPattern SECTOR_PATTERN(48, AMIGA_SECTOR_RECORD);
static Bytes deinterleave(const uint8_t*& input, size_t len)
{
assert(!(len & 1));
const uint8_t* odds = &input[0];
const uint8_t* evens = &input[len/2];
Bytes output;
ByteWriter bw(output);
for (size_t i=0; i<len/2; i++)
{
uint8_t o = *odds++;
uint8_t e = *evens++;
/* This is the 'Interleave bits with 64-bit multiply' technique from
* http://graphics.stanford.edu/~seander/bithacks.html#InterleaveBMN
*/
uint16_t result =
(((e * 0x0101010101010101ULL & 0x8040201008040201ULL)
* 0x0102040810204081ULL >> 49) & 0x5555) |
(((o * 0x0101010101010101ULL & 0x8040201008040201ULL)
* 0x0102040810204081ULL >> 48) & 0xAAAA);
bw.write_be16(result);
}
input += len;
return output;
}
static uint32_t checksum(const Bytes& bytes)
{
ByteReader br(bytes);
uint32_t checksum = 0;
assert((bytes.size() & 3) == 0);
while (!br.eof())
checksum ^= br.read_be32();
return checksum & 0x55555555;
}
AbstractDecoder::RecordType AmigaDecoder::advanceToNextRecord()
{
_sector->clock = _fmr->seekToPattern(SECTOR_PATTERN);
@@ -78,22 +37,22 @@ void AmigaDecoder::decodeSectorRecord()
const uint8_t* ptr = bytes.begin() + 3;
Bytes header = deinterleave(ptr, 4);
Bytes recoveryinfo = deinterleave(ptr, 16);
Bytes header = amigaDeinterleave(ptr, 4);
Bytes recoveryinfo = amigaDeinterleave(ptr, 16);
_sector->logicalTrack = header[1] >> 1;
_sector->logicalSide = header[1] & 1;
_sector->logicalSector = header[2];
uint32_t wantedheaderchecksum = deinterleave(ptr, 4).reader().read_be32();
uint32_t gotheaderchecksum = checksum(rawbytes.slice(6, 40));
uint32_t wantedheaderchecksum = amigaDeinterleave(ptr, 4).reader().read_be32();
uint32_t gotheaderchecksum = amigaChecksum(rawbytes.slice(6, 40));
if (gotheaderchecksum != wantedheaderchecksum)
return;
uint32_t wanteddatachecksum = deinterleave(ptr, 4).reader().read_be32();
uint32_t gotdatachecksum = checksum(rawbytes.slice(62, 1024));
uint32_t wanteddatachecksum = amigaDeinterleave(ptr, 4).reader().read_be32();
uint32_t gotdatachecksum = amigaChecksum(rawbytes.slice(62, 1024));
_sector->data.clear();
_sector->data.writer().append(deinterleave(ptr, 512)).append(recoveryinfo);
_sector->data.writer().append(amigaDeinterleave(ptr, 512)).append(recoveryinfo);
_sector->status = (gotdatachecksum == wanteddatachecksum) ? Sector::OK : Sector::BAD_CHECKSUM;
}

126
arch/amiga/encoder.cc Normal file
View File

@@ -0,0 +1,126 @@
#include "globals.h"
#include "record.h"
#include "decoders/decoders.h"
#include "encoders/encoders.h"
#include "amiga.h"
#include "crc.h"
#include "sectorset.h"
#include "writer.h"
FlagGroup amigaEncoderFlags;
static DoubleFlag clockRateUs(
{ "--clock-rate" },
"Encoded data clock rate (microseconds).",
2.00);
static DoubleFlag postIndexGapMs(
{ "--post-index-gap" },
"Post-index gap before first sector header (milliseconds).",
0.5);
static int charToInt(char c)
{
if (isdigit(c))
return c - '0';
return 10 + tolower(c) - 'a';
}
static void write_bits(std::vector<bool>& bits, unsigned& cursor, const std::vector<bool>& src)
{
for (bool bit : src)
{
if (cursor < bits.size())
bits[cursor++] = bit;
}
}
static void write_bits(std::vector<bool>& bits, unsigned& cursor, uint64_t data, int width)
{
cursor += width;
for (int i=0; i<width; i++)
{
unsigned pos = cursor - i - 1;
if (pos < bits.size())
bits[pos] = data & 1;
data >>= 1;
}
}
static void write_interleaved_bytes(std::vector<bool>& bits, unsigned& cursor, const Bytes& bytes)
{
assert(!(bytes.size() & 3));
Bytes interleaved = amigaInterleave(bytes);
encodeMfm(bits, cursor, interleaved);
}
static void write_interleaved_bytes(std::vector<bool>& bits, unsigned& cursor, uint32_t data)
{
Bytes b(4);
ByteWriter bw(b);
bw.write_be32(data);
write_interleaved_bytes(bits, cursor, b);
}
static void write_sector(std::vector<bool>& bits, unsigned& cursor, const Sector* sector)
{
if ((sector->data.size() != 512) && (sector->data.size() != 528))
Error() << "unsupported sector size --- you must pick 512 or 528";
write_bits(bits, cursor, AMIGA_SECTOR_RECORD, 6*8);
std::vector<bool> headerBits(20*16);
unsigned headerCursor = 0;
Bytes header =
{
0xff, /* Amiga 1.0 format byte */
(uint8_t) ((sector->logicalTrack<<1) | sector->logicalSide),
(uint8_t) sector->logicalSector,
(uint8_t) (AMIGA_SECTORS_PER_TRACK - sector->logicalSector)
};
write_interleaved_bytes(headerBits, headerCursor, header);
Bytes recoveryInfo(16);
if (sector->data.size() == 528)
recoveryInfo = sector->data.slice(512, 16);
write_interleaved_bytes(headerBits, headerCursor, recoveryInfo);
std::vector<bool> dataBits(512*16);
unsigned dataCursor = 0;
write_interleaved_bytes(dataBits, dataCursor, sector->data);
write_bits(bits, cursor, headerBits);
uint32_t headerChecksum = amigaChecksum(toBytes(headerBits));
write_interleaved_bytes(bits, cursor, headerChecksum);
uint32_t dataChecksum = amigaChecksum(toBytes(dataBits));
write_interleaved_bytes(bits, cursor, dataChecksum);
write_bits(bits, cursor, dataBits);
}
std::unique_ptr<Fluxmap> AmigaEncoder::encode(
int physicalTrack, int physicalSide, const SectorSet& allSectors)
{
if ((physicalTrack < 0) || (physicalTrack >= AMIGA_TRACKS_PER_DISK))
return std::unique_ptr<Fluxmap>();
int bitsPerRevolution = 200000.0 / clockRateUs;
std::vector<bool> bits(bitsPerRevolution);
unsigned cursor = 0;
fillBitmapTo(bits, cursor, postIndexGapMs * 1000 / clockRateUs, { true, false });
for (int sectorId=0; sectorId<AMIGA_SECTORS_PER_TRACK; sectorId++)
{
const auto& sectorData = allSectors.get(physicalTrack, physicalSide, sectorId);
write_sector(bits, cursor, sectorData);
}
if (cursor >= bits.size())
Error() << "track data overrun";
fillBitmapTo(bits, cursor, bits.size(), { true, false });
std::unique_ptr<Fluxmap> fluxmap(new Fluxmap);
fluxmap->appendBits(bits, clockRateUs*1e3);
return fluxmap;
}

View File

@@ -154,7 +154,7 @@ std::unique_ptr<Fluxmap> BrotherEncoder::encode(
write_sector_data(bits, cursor, sectorData->data);
}
if (cursor > bits.size())
if (cursor >= bits.size())
Error() << "track data overrun";
fillBitmapTo(bits, cursor, bits.size(), { true, false });

View File

@@ -10,7 +10,7 @@ Bizarrely, the data in each sector is stored with all the odd bits first, and
then all the even bits. This is tied into the checksum algorithm, which is
distinctly subpar and not particularly good at detecting errors.
Reading discs
Reading disks
-------------
Just do:
@@ -34,6 +34,28 @@ You will end up with a 929280 byte long image which you probably _can't_ use
in an emulator; each sector will contain the 512 bytes of user payload
followed by the 16 bytes of metadata.
Writing disks
-------------
Just do:
```
fluxengine write amiga -i amiga.adf
```
This will rake a normal 901120 byte long ADF file and write it to a DD disk.
Note that writing to an HD disk will probably not work (this will depend on
your drive and disk and potential FluxEngine bugs I'm still working on ---
please [get in touch](https://github.com/davidgiven/fluxengine/issues/new) if
you have any insight here).
If you want to write the metadata as well, specify a 528 byte sector size for
the output image and supply a 929280 byte long file as described above.
```
fluxengine write amiga -i amiga.adf:b=528
```
Useful references
-----------------

View File

@@ -84,6 +84,11 @@ contributed](Index_sensor_mod_FDD_1.1.pdf) on how to do this. I've never done
it myself; if you try this and it works/doesn't work, as always, [get in
touch](https://github.com/davidgiven/fluxengine/issues/new).
Another option is to fake the index signal to the drive completely. The
FluxEngine emits suitable pulses for a 300RPM drive on pin 3[0] and the
equivalent pulses for a 360RPM drive on pin 3[1]. Disclaimer: I have never used
these.
**Q.** Is this like Supercard Pro / KryoFlux / Catweasel / DiskFerret? Do you
*support KryoFlux
stream files?

View File

@@ -64,6 +64,16 @@ In order to do anything useful, you have to plug it in to a floppy disk drive (o
9. Profit!
## Bonus hardware features
For advanced users, the board has a few extra signals which are useful for special purposes.
- Pin 3[0] produces short pulses every 200ms. This is useful for spoofing
index signals to 300 RPM drives; for example, to read flippy disks.
- Pin 3[1] is the same, but produces the pulses every 166ms; this works with
360 RPM drives.
## The programs
I'm sorry to say that the client program is very badly documented --- it's
@@ -176,6 +186,23 @@ case, and reading the disk label is much more reliable.
[Lots more information on high density vs double density disks can be found
here.](http://www.retrotechnology.com/herbs_stuff/guzis.html)
### Other important flags
These flags apply to many operations and are useful for modifying the overall
behaviour.
- `--revolutions=X`: when reading, spin the disk X times. Many formats
require `--revolutions=2` (which should happen automatically); or you can
increase the number to sample more data.
- `--index-source=X`, `--write-index-source=X`: set the source of index
pulses when reading or writing respectively. This is for use with drives
which don't produce index pulse data. Use 0 to get index pulses from the
drive, 1 to fake 300RPM pulses, or 2 to fake 360RPM pulses. Note this has
no effect on the _drive_, so it doesn't help with flippy disks, but is
useful for using very old drives with FluxEngine itself. If you use this
option, then any index marks in the sampled flux are, of course, garbage.
### The commands
The FluxEngine client software is a largely undocumented set of small tools.

View File

@@ -20,6 +20,7 @@ extern void setDecoderManualClockRate(double clockrate_us);
extern Bytes decodeFmMfm(std::vector<bool>::const_iterator start,
std::vector<bool>::const_iterator end);
extern void encodeMfm(std::vector<bool>& bits, unsigned& cursor, const Bytes& input);
static inline Bytes decodeFmMfm(const std::vector<bool> bits)
{ return decodeFmMfm(bits.begin(), bits.end()); }

View File

@@ -18,7 +18,7 @@ DoubleFlag pulseDebounceThreshold(
static DoubleFlag clockDecodeThreshold(
{ "--bit-error-threshold" },
"Amount of error to tolerate in pulse timing, in fractions of a clock.",
0.20);
0.40);
static DoubleFlag clockIntervalBias(
{ "--clock-interval-bias" },

View File

@@ -51,3 +51,25 @@ Bytes decodeFmMfm(
return bytes;
}
void encodeMfm(std::vector<bool>& bits, unsigned& cursor, const Bytes& input)
{
bool lastBit = false;
unsigned len = bits.size()-1;
for (uint8_t b : input)
{
for (int i=0; i<8; i++)
{
bool bit = b & 0x80;
b <<= 1;
if (cursor >= len)
return;
bits[cursor++] = !lastBit && !bit;
bits[cursor++] = bit;
lastBit = bit;
}
}
}

View File

@@ -157,6 +157,8 @@ Flag::Flag(const std::vector<std::string>& names, const std::string helptext):
_names(names),
_helptext(helptext)
{
if (!currentFlagGroup)
Error() << "no flag group defined for " << *names.begin();
_group.addFlag(this);
}

View File

@@ -1,6 +1,10 @@
#ifndef FLUXSINK_H
#define FLUXSINK_H
#include "flags.h"
extern FlagGroup hardwareFluxSinkFlags;
class Fluxmap;
class FluxSpec;

View File

@@ -4,8 +4,15 @@
#include "usb.h"
#include "fluxsink/fluxsink.h"
FlagGroup hardwareFluxSinkFlags;
static bool high_density = false;
static IntFlag indexMode(
{ "--write-index-mode" },
"index pulse source (0=drive, 1=300 RPM fake source, 2=360 RPM fake source",
0);
void setHardwareFluxSinkDensity(bool high_density)
{
::high_density = high_density;
@@ -26,7 +33,7 @@ public:
public:
void writeFlux(int track, int side, Fluxmap& fluxmap)
{
usbSetDrive(_drive, high_density);
usbSetDrive(_drive, high_density, indexMode);
usbSeek(track);
Bytes crunched = fluxmap.rawBytes().crunch();

View File

@@ -11,6 +11,11 @@ static IntFlag revolutions(
"read this many revolutions of the disk",
1);
static IntFlag indexMode(
{ "--index-mode" },
"index pulse source (0=drive, 1=300 RPM fake source, 2=360 RPM fake source",
0);
static bool high_density = false;
void setHardwareFluxSourceDensity(bool high_density)
@@ -33,7 +38,7 @@ public:
public:
std::unique_ptr<Fluxmap> readFlux(int track, int side)
{
usbSetDrive(_drive, high_density);
usbSetDrive(_drive, high_density, indexMode);
usbSeek(track);
Bytes crunched = usbRead(side, revolutions);
auto fluxmap = std::make_unique<Fluxmap>();

View File

@@ -219,10 +219,7 @@ void readDiskCommand(AbstractDecoder& decoder)
std::cout << "giving up" << std::endl
<< " ";
else
{
std::cout << retry << " retries remaining" << std::endl;
track->fluxsource->recalibrate();
}
}
if (dumpRecords)

View File

@@ -253,13 +253,15 @@ void usbErase(int side)
await_reply<struct any_frame>(F_FRAME_ERASE_REPLY);
}
void usbSetDrive(int drive, bool high_density)
void usbSetDrive(int drive, bool high_density, int index_mode)
{
usb_init();
struct set_drive_frame f = {
{ .type = F_FRAME_SET_DRIVE_CMD, .size = sizeof(f) },
.drive_flags = (uint8_t)((drive ? DRIVE_1 : DRIVE_0) | (high_density ? DRIVE_HD : DRIVE_DD)),
.drive = (uint8_t) drive,
.high_density = high_density,
.index_mode = (uint8_t) index_mode
};
usb_cmd_send(&f, f.f.size);
await_reply<struct any_frame>(F_FRAME_SET_DRIVE_REPLY);

View File

@@ -12,7 +12,7 @@ extern void usbTestBulkTransport();
extern Bytes usbRead(int side, int revolutions);
extern void usbWrite(int side, const Bytes& bytes);
extern void usbErase(int side);
extern void usbSetDrive(int drive, bool high_density);
extern void usbSetDrive(int drive, bool high_density, int index_mode);
extern void usbMeasureVoltages(struct voltages_frame* voltages);
#endif

View File

@@ -15,7 +15,7 @@
#include "sector.h"
#include "sectorset.h"
FlagGroup writerFlags { &hardwareFluxSourceFlags };
FlagGroup writerFlags { &hardwareFluxSourceFlags, &hardwareFluxSinkFlags };
static DataSpecFlag dest(
{ "--dest", "-d" },

View File

@@ -145,6 +145,8 @@ buildlibrary libbackend.a \
lib/imagewriter/ldbsimagewriter.cc \
arch/aeslanier/decoder.cc \
arch/amiga/decoder.cc \
arch/amiga/encoder.cc \
arch/amiga/amiga.cc \
arch/apple2/decoder.cc \
arch/brother/decoder.cc \
arch/brother/encoder.cc \
@@ -214,6 +216,7 @@ buildlibrary libfrontend.a \
src/fe-testbulktransport.cc \
src/fe-testvoltages.cc \
src/fe-upgradefluxfile.cc \
src/fe-writeamiga.cc \
src/fe-writebrother.cc \
src/fe-writeflux.cc \
src/fe-writetestpattern.cc \
@@ -251,3 +254,4 @@ runtest fluxpattern-test tests/fluxpattern.cc
runtest fmmfm-test tests/fmmfm.cc
runtest kryoflux-test tests/kryoflux.cc
runtest ldbs-test tests/ldbs.cc
runtest amiga-test tests/amiga.cc

View File

@@ -3,7 +3,7 @@
enum
{
FLUXENGINE_VERSION = 8,
FLUXENGINE_VERSION = 10,
FLUXENGINE_VID = 0x1209,
FLUXENGINE_PID = 0x6e00,
@@ -75,6 +75,13 @@ enum
F_ERROR_INTERNAL,
};
enum
{
F_INDEX_REAL,
F_INDEX_300,
F_INDEX_360
};
enum
{
F_OP_PULSE = 0x80,
@@ -145,7 +152,9 @@ struct erase_frame
struct set_drive_frame
{
struct frame_header f;
uint8_t drive_flags;
uint8_t drive;
uint8_t high_density;
uint8_t index_mode;
};
struct voltages

View File

@@ -2,6 +2,7 @@
#include "flags.h"
#include "usb.h"
#include "dataspec.h"
#include "protocol.h"
static FlagGroup flags;
@@ -15,9 +16,18 @@ int mainRpm(int argc, const char* argv[])
flags.parseFlags(argc, argv);
FluxSpec spec(source);
usbSetDrive(spec.drive, false);
usbSetDrive(spec.drive, false, F_INDEX_REAL);
nanoseconds_t period = usbGetRotationalPeriod();
std::cout << "Rotational period is " << period/1000 << " ms (" << 60e6/period << " rpm)" << std::endl;
if (period != 0)
std::cout << "Rotational period is " << period/1000 << " ms (" << 60e6/period << " rpm)" << std::endl;
else
{
std::cout << "No index pulses detected from the disk. Common causes of this are:\n"
" - no drive is connected\n"
" - the drive doesn't have an index sensor (e.g. BBC Micro drives)\n"
" - the disk has no index holes (e.g. reversed flippy disks)\n"
" - (most common) no disk is inserted in the drive!\n";
}
return 0;
}

View File

@@ -1,6 +1,7 @@
#include "globals.h"
#include "flags.h"
#include "usb.h"
#include "protocol.h"
static FlagGroup flags;
@@ -18,7 +19,7 @@ int mainSeek(int argc, const char* argv[])
{
flags.parseFlags(argc, argv);
usbSetDrive(drive, false);
usbSetDrive(drive, false, F_INDEX_REAL);
usbSeek(track);
return 0;
}

23
src/fe-writeamiga.cc Normal file
View File

@@ -0,0 +1,23 @@
#include "globals.h"
#include "flags.h"
#include "decoders/decoders.h"
#include "amiga/amiga.h"
#include "writer.h"
#include "fmt/format.h"
#include "image.h"
#include <fstream>
static FlagGroup flags { &writerFlags, &amigaEncoderFlags };
int mainWriteAmiga(int argc, const char* argv[])
{
setWriterDefaultInput(":c=80:h=2:s=11:b=512");
setWriterDefaultDest(":d=0:t=0-79:s=0-1");
flags.parseFlags(argc, argv);
AmigaEncoder encoder;
writeDiskCommand(encoder);
return 0;
}

View File

@@ -29,6 +29,7 @@ extern command_cb mainSeek;
extern command_cb mainTestBulkTransport;
extern command_cb mainTestVoltages;
extern command_cb mainUpgradeFluxFile;
extern command_cb mainWriteAmiga;
extern command_cb mainWriteBrother;
extern command_cb mainWriteFlux;
extern command_cb mainWriteTestPattern;
@@ -81,6 +82,7 @@ static std::vector<Command> readables =
static std::vector<Command> writeables =
{
{ "amiga", mainWriteAmiga, "Writes Amiga disks.", },
{ "brother", mainWriteBrother, "Writes 120kB and 240kB Brother word processor disks.", },
};

38
tests/amiga.cc Normal file
View File

@@ -0,0 +1,38 @@
#include "globals.h"
#include "bytes.h"
#include "record.h"
#include "decoders/decoders.h"
#include "arch/amiga/amiga.h"
#include <assert.h>
static const Bytes testData = {
0x52, /* 0101 0010 */
0xff, /* 1111 1111 */
0x4a, /* 0100 1010 */
0x22, /* 0010 0010 */
};
static const Bytes testDataInterleaved = {
0x1f, /* 0001 1111 */
0x35, /* 0011 0101 */
0xcf, /* 1100 1111 */
0x80, /* 1000 0000 */
};
static void testInterleave(void)
{
Bytes interleaved = amigaInterleave(testData);
assert(interleaved == testDataInterleaved);
}
static void testDeinterleave(void)
{
Bytes deinterleaved = amigaDeinterleave(testDataInterleaved);
assert(deinterleaved == testData);
}
int main(int argc, const char* argv[])
{
testDeinterleave();
testInterleave();
return 0;
}